From 7409dfb144cf2a06210400134d822a1393462b1f Mon Sep 17 00:00:00 2001 From: Vidisha Date: Thu, 20 Sep 2018 19:05:00 +0530 Subject: [PATCH] vFW and vDNS support added to azure-plugin Change-Id: I5c7b08382d87ff17d75259885f00dfceb5486f07 Issue-ID: MULTICLOUD-354 Signed-off-by: Vidisha --- azure/aria/aria-extension-cloudify/.DS_Store | Bin 0 -> 8196 bytes azure/aria/aria-extension-cloudify/.flake8 | 2 + azure/aria/aria-extension-cloudify/.gitignore | 64 + azure/aria/aria-extension-cloudify/.travis.yml | 54 + azure/aria/aria-extension-cloudify/LICENCE | 201 ++ azure/aria/aria-extension-cloudify/README.md | 47 + .../aria-extension-cloudify/adapters/__init__.py | 15 + .../adapters/context_adapter.py | 461 +++++ .../aria-extension-cloudify/adapters/extension.py | 92 + azure/aria/aria-extension-cloudify/appveyor.yml | 40 + .../aria_extension_tests/__init__.py | 15 + .../aria_extension_tests/adapters/__init__.py | 15 + .../adapters/test_context_adapter.py | 541 ++++++ .../aria_extension_tests/requirements.txt | 9 + .../examples/aws-hello-world/aws-helloworld.yaml | 101 + .../examples/aws-hello-world/images/aria-logo.png | Bin 0 -> 23601 bytes .../examples/aws-hello-world/index.html | 14 + .../examples/aws-hello-world/scripts/configure.sh | 22 + .../examples/aws-hello-world/scripts/start.sh | 50 + .../examples/aws-hello-world/scripts/stop.sh | 14 + .../openstack-hello-world/images/aria-logo.png | Bin 0 -> 23601 bytes .../examples/openstack-hello-world/index.html | 14 + .../openstack-helloworld.yaml | 144 ++ .../openstack-hello-world/scripts/configure.sh | 20 + .../openstack-hello-world/scripts/start.sh | 50 + .../examples/openstack-hello-world/scripts/stop.sh | 14 + .../plugins/aws/plugin.yaml | 1754 +++++++++++++++++ .../plugins/openstack/plugin.yaml | 1174 ++++++++++++ .../aria/aria-extension-cloudify/requirements.txt | 1 + azure/aria/aria-extension-cloudify/setup.py | 44 + .../aria-extension-cloudify/src/aria/.gitignore | 64 + .../aria-extension-cloudify/src/aria/.rat-excludes | 24 + .../aria-extension-cloudify/src/aria/.travis.yml | 64 + .../aria/aria-extension-cloudify/src/aria/=35.0.0 | 0 .../aria/aria-extension-cloudify/src/aria/=35.0.0, | 0 .../aria-extension-cloudify/src/aria/CHANGELOG.rst | 16 + .../aria-extension-cloudify/src/aria/CONTRIBUTING | 3 + .../aria-extension-cloudify/src/aria/DISCLAIMER | 10 + .../aria/aria-extension-cloudify/src/aria/LICENSE | 191 ++ .../aria-extension-cloudify/src/aria/MANIFEST.in | 12 + .../aria/aria-extension-cloudify/src/aria/Makefile | 63 + azure/aria/aria-extension-cloudify/src/aria/NOTICE | 5 + .../aria-extension-cloudify/src/aria/README.rst | 167 ++ .../aria/aria-extension-cloudify/src/aria/VERSION | 1 + .../aria-extension-cloudify/src/aria/appveyor.yml | 41 + .../src/aria/aria/.pylintrc | 423 +++++ .../src/aria/aria/__init__.py | 89 + .../src/aria/aria/cli/__init__.py | 18 + .../src/aria/aria/cli/ascii_art.py | 24 + .../src/aria/aria/cli/color.py | 108 ++ .../src/aria/aria/cli/commands/__init__.py | 30 + .../src/aria/aria/cli/commands/executions.py | 246 +++ .../src/aria/aria/cli/commands/logs.py | 72 + .../src/aria/aria/cli/commands/node_templates.py | 100 + .../src/aria/aria/cli/commands/nodes.py | 94 + .../src/aria/aria/cli/commands/plugins.py | 111 ++ .../src/aria/aria/cli/commands/reset.py | 45 + .../aria/aria/cli/commands/service_templates.py | 244 +++ .../src/aria/aria/cli/commands/services.py | 238 +++ .../src/aria/aria/cli/commands/workflows.py | 111 ++ .../src/aria/aria/cli/config/__init__.py | 18 + .../src/aria/aria/cli/config/config.py | 93 + .../src/aria/aria/cli/config/config_template.yaml | 42 + .../src/aria/aria/cli/core/__init__.py | 18 + .../src/aria/aria/cli/core/aria.py | 507 +++++ .../src/aria/aria/cli/csar.py | 187 ++ .../src/aria/aria/cli/defaults.py | 30 + .../src/aria/aria/cli/env.py | 127 ++ .../src/aria/aria/cli/exceptions.py | 24 + .../src/aria/aria/cli/execution_logging.py | 243 +++ .../src/aria/aria/cli/helptexts.py | 62 + .../src/aria/aria/cli/inputs.py | 124 ++ .../src/aria/aria/cli/logger.py | 134 ++ .../src/aria/aria/cli/main.py | 65 + .../src/aria/aria/cli/service_template_utils.py | 129 ++ .../src/aria/aria/cli/table.py | 125 ++ .../src/aria/aria/cli/utils.py | 117 ++ .../aria-extension-cloudify/src/aria/aria/core.py | 133 ++ .../src/aria/aria/exceptions.py | 73 + .../src/aria/aria/extension.py | 154 ++ .../src/aria/aria/logger.py | 186 ++ .../src/aria/aria/modeling/__init__.py | 54 + .../src/aria/aria/modeling/constraints.py | 31 + .../src/aria/aria/modeling/exceptions.py | 63 + .../src/aria/aria/modeling/functions.py | 140 ++ .../src/aria/aria/modeling/mixins.py | 333 ++++ .../src/aria/aria/modeling/models.py | 427 +++++ .../src/aria/aria/modeling/orchestration.py | 715 +++++++ .../src/aria/aria/modeling/relationship.py | 395 ++++ .../src/aria/aria/modeling/service_changes.py | 253 +++ .../src/aria/aria/modeling/service_common.py | 601 ++++++ .../src/aria/aria/modeling/service_instance.py | 1695 +++++++++++++++++ .../src/aria/aria/modeling/service_template.py | 1758 +++++++++++++++++ .../src/aria/aria/modeling/types.py | 318 ++++ .../src/aria/aria/modeling/utils.py | 185 ++ .../src/aria/aria/orchestrator/__init__.py | 32 + .../src/aria/aria/orchestrator/context/__init__.py | 21 + .../src/aria/aria/orchestrator/context/common.py | 217 +++ .../aria/aria/orchestrator/context/exceptions.py | 27 + .../aria/aria/orchestrator/context/operation.py | 174 ++ .../src/aria/aria/orchestrator/context/toolbelt.py | 59 + .../src/aria/aria/orchestrator/context/workflow.py | 135 ++ .../src/aria/aria/orchestrator/decorators.py | 85 + .../src/aria/aria/orchestrator/events.py | 34 + .../src/aria/aria/orchestrator/exceptions.py | 85 + .../aria/orchestrator/execution_plugin/__init__.py | 39 + .../aria/orchestrator/execution_plugin/common.py | 154 ++ .../orchestrator/execution_plugin/constants.py | 57 + .../execution_plugin/ctx_proxy/__init__.py | 20 + .../execution_plugin/ctx_proxy/client.py | 114 ++ .../execution_plugin/ctx_proxy/server.py | 244 +++ .../execution_plugin/environment_globals.py | 57 + .../orchestrator/execution_plugin/exceptions.py | 47 + .../orchestrator/execution_plugin/instantiation.py | 217 +++ .../aria/orchestrator/execution_plugin/local.py | 128 ++ .../orchestrator/execution_plugin/operations.py | 75 + .../orchestrator/execution_plugin/ssh/__init__.py | 18 + .../execution_plugin/ssh/operations.py | 195 ++ .../orchestrator/execution_plugin/ssh/tunnel.py | 107 ++ .../src/aria/aria/orchestrator/plugin.py | 171 ++ .../aria/aria/orchestrator/topology/__init__.py | 16 + .../src/aria/aria/orchestrator/topology/common.py | 69 + .../aria/orchestrator/topology/instance_handler.py | 671 +++++++ .../aria/orchestrator/topology/template_handler.py | 609 ++++++ .../aria/aria/orchestrator/topology/topology.py | 223 +++ .../src/aria/aria/orchestrator/topology/utils.py | 48 + .../src/aria/aria/orchestrator/workflow_runner.py | 194 ++ .../aria/aria/orchestrator/workflows/__init__.py | 21 + .../aria/orchestrator/workflows/api/__init__.py | 20 + .../aria/aria/orchestrator/workflows/api/task.py | 272 +++ .../aria/orchestrator/workflows/api/task_graph.py | 295 +++ .../orchestrator/workflows/builtin/__init__.py | 36 + .../workflows/builtin/execute_operation.py | 101 + .../aria/orchestrator/workflows/builtin/heal.py | 179 ++ .../aria/orchestrator/workflows/builtin/install.py | 34 + .../aria/orchestrator/workflows/builtin/start.py | 31 + .../aria/orchestrator/workflows/builtin/stop.py | 31 + .../orchestrator/workflows/builtin/uninstall.py | 34 + .../orchestrator/workflows/builtin/workflows.py | 149 ++ .../aria/orchestrator/workflows/core/__init__.py | 20 + .../aria/orchestrator/workflows/core/engine.py | 185 ++ .../orchestrator/workflows/core/events_handler.py | 170 ++ .../orchestrator/workflows/core/graph_compiler.py | 118 ++ .../aria/orchestrator/workflows/events_logging.py | 85 + .../aria/aria/orchestrator/workflows/exceptions.py | 91 + .../orchestrator/workflows/executor/__init__.py | 22 + .../aria/orchestrator/workflows/executor/base.py | 75 + .../aria/orchestrator/workflows/executor/celery.py | 97 + .../aria/orchestrator/workflows/executor/dry.py | 54 + .../orchestrator/workflows/executor/process.py | 350 ++++ .../aria/orchestrator/workflows/executor/thread.py | 79 + .../src/aria/aria/parser/__init__.py | 34 + .../src/aria/aria/parser/consumption/__init__.py | 84 + .../src/aria/aria/parser/consumption/consumer.py | 93 + .../src/aria/aria/parser/consumption/context.py | 106 ++ .../src/aria/aria/parser/consumption/exceptions.py | 23 + .../src/aria/aria/parser/consumption/inputs.py | 53 + .../src/aria/aria/parser/consumption/modeling.py | 198 ++ .../aria/aria/parser/consumption/presentation.py | 137 ++ .../src/aria/aria/parser/consumption/validation.py | 30 + .../src/aria/aria/parser/exceptions.py | 33 + .../src/aria/aria/parser/loading/__init__.py | 80 + .../src/aria/aria/parser/loading/context.py | 33 + .../src/aria/aria/parser/loading/exceptions.py | 35 + .../src/aria/aria/parser/loading/file.py | 64 + .../src/aria/aria/parser/loading/literal.py | 31 + .../src/aria/aria/parser/loading/loader.py | 34 + .../src/aria/aria/parser/loading/location.py | 82 + .../src/aria/aria/parser/loading/request.py | 88 + .../src/aria/aria/parser/loading/source.py | 44 + .../src/aria/aria/parser/loading/uri.py | 97 + .../src/aria/aria/parser/modeling/__init__.py | 26 + .../src/aria/aria/parser/modeling/context.py | 107 ++ .../src/aria/aria/parser/presentation/__init__.py | 158 ++ .../src/aria/aria/parser/presentation/context.py | 65 + .../aria/aria/parser/presentation/exceptions.py | 29 + .../aria/parser/presentation/field_validators.py | 164 ++ .../src/aria/aria/parser/presentation/fields.py | 757 ++++++++ .../src/aria/aria/parser/presentation/null.py | 67 + .../aria/aria/parser/presentation/presentation.py | 248 +++ .../src/aria/aria/parser/presentation/presenter.py | 70 + .../src/aria/aria/parser/presentation/source.py | 55 + .../src/aria/aria/parser/presentation/utils.py | 187 ++ .../src/aria/aria/parser/reading/__init__.py | 60 + .../src/aria/aria/parser/reading/context.py | 31 + .../src/aria/aria/parser/reading/exceptions.py | 44 + .../src/aria/aria/parser/reading/jinja.py | 55 + .../src/aria/aria/parser/reading/json.py | 33 + .../src/aria/aria/parser/reading/locator.py | 119 ++ .../src/aria/aria/parser/reading/raw.py | 24 + .../src/aria/aria/parser/reading/reader.py | 44 + .../src/aria/aria/parser/reading/source.py | 59 + .../src/aria/aria/parser/reading/yaml.py | 113 ++ .../src/aria/aria/parser/specification.py | 69 + .../src/aria/aria/parser/validation/__init__.py | 25 + .../src/aria/aria/parser/validation/context.py | 36 + .../src/aria/aria/parser/validation/issue.py | 190 ++ .../src/aria/aria/storage/__init__.py | 41 + .../src/aria/aria/storage/api.py | 186 ++ .../aria/storage/collection_instrumentation.py | 314 ++++ .../src/aria/aria/storage/core.py | 160 ++ .../src/aria/aria/storage/exceptions.py | 31 + .../src/aria/aria/storage/filesystem_rapi.py | 165 ++ .../src/aria/aria/storage/sql_mapi.py | 439 +++++ .../src/aria/aria/utils/__init__.py | 65 + .../src/aria/aria/utils/archive.py | 66 + .../src/aria/aria/utils/argparse.py | 118 ++ .../src/aria/aria/utils/caching.py | 137 ++ .../src/aria/aria/utils/collections.py | 303 +++ .../src/aria/aria/utils/console.py | 132 ++ .../src/aria/aria/utils/exceptions.py | 120 ++ .../src/aria/aria/utils/file.py | 46 + .../src/aria/aria/utils/formatting.py | 235 +++ .../src/aria/aria/utils/http.py | 66 + .../src/aria/aria/utils/imports.py | 96 + .../src/aria/aria/utils/openclose.py | 36 + .../src/aria/aria/utils/plugin.py | 24 + .../src/aria/aria/utils/process.py | 51 + .../src/aria/aria/utils/specification.py | 57 + .../src/aria/aria/utils/threading.py | 286 +++ .../src/aria/aria/utils/type.py | 156 ++ .../src/aria/aria/utils/uris.py | 48 + .../src/aria/aria/utils/uuid.py | 70 + .../src/aria/aria/utils/validation.py | 97 + .../src/aria/aria/utils/versions.py | 163 ++ .../src/aria/docs/.gitignore | 1 + .../src/aria/docs/_static/.gitkeep | 0 .../src/aria/docs/aria.cli.rst | 100 + .../src/aria/docs/aria.modeling.models.rst | 21 + .../src/aria/docs/aria.modeling.rst | 56 + .../src/aria/docs/aria.orchestrator.context.rst | 46 + ...ria.orchestrator.execution_plugin.ctx_proxy.rst | 31 + .../docs/aria.orchestrator.execution_plugin.rst | 56 + .../aria.orchestrator.execution_plugin.ssh.rst | 31 + .../src/aria/docs/aria.orchestrator.rst | 46 + .../aria/docs/aria.orchestrator.workflows.api.rst | 31 + .../docs/aria.orchestrator.workflows.builtin.rst | 57 + .../docs/aria.orchestrator.workflows.executor.rst | 46 + .../src/aria/docs/aria.orchestrator.workflows.rst | 51 + .../src/aria/docs/aria.parser.consumption.rst | 21 + .../src/aria/docs/aria.parser.loading.rst | 21 + .../src/aria/docs/aria.parser.modeling.rst | 21 + .../src/aria/docs/aria.parser.presentation.rst | 21 + .../src/aria/docs/aria.parser.reading.rst | 21 + .../src/aria/docs/aria.parser.rst | 31 + .../src/aria/docs/aria.parser.validation.rst | 21 + .../aria-extension-cloudify/src/aria/docs/aria.rst | 40 + .../src/aria/docs/aria.storage.rst | 51 + .../src/aria/docs/aria.utils.rst | 121 ++ .../docs/aria_extension_tosca.simple_nfv_v1_0.rst | 20 + .../aria_extension_tosca.simple_v1_0.modeling.rst | 75 + ...ia_extension_tosca.simple_v1_0.presentation.rst | 40 + .../aria/docs/aria_extension_tosca.simple_v1_0.rst | 20 + .../aria-extension-cloudify/src/aria/docs/cli.rst | 57 + .../aria-extension-cloudify/src/aria/docs/conf.py | 441 +++++ .../src/aria/docs/index.rst | 86 + .../src/aria/docs/requirements.txt | 15 + .../aria-extension-cloudify/src/aria/docs/rest.rst | 20 + .../clearwater/clearwater-live-test-existing.yaml | 54 + .../clearwater/clearwater-single-existing.yaml | 147 ++ .../examples/clearwater/scripts/bono/create.sh | 20 + .../examples/clearwater/scripts/bono/delete.sh | 17 + .../examples/clearwater/scripts/dime/create.sh | 21 + .../examples/clearwater/scripts/dime/delete.sh | 17 + .../examples/clearwater/scripts/ellis/configure.sh | 29 + .../examples/clearwater/scripts/ellis/create.sh | 19 + .../examples/clearwater/scripts/ellis/delete.sh | 17 + .../examples/clearwater/scripts/homer/create.sh | 27 + .../examples/clearwater/scripts/homer/delete.sh | 17 + .../clearwater/scripts/homestead/create.sh | 25 + .../clearwater/scripts/homestead/delete.sh | 17 + .../clearwater/scripts/host-base/configure.sh | 23 + .../examples/clearwater/scripts/host/configure.sh | 183 ++ .../clearwater/scripts/live-test/create.sh | 69 + .../clearwater/scripts/live-test/delete.sh | 23 + .../examples/clearwater/scripts/memento/create.sh | 20 + .../examples/clearwater/scripts/memento/delete.sh | 17 + .../examples/clearwater/scripts/ralf/create.sh | 15 + .../examples/clearwater/scripts/ralf/delete.sh | 17 + .../examples/clearwater/scripts/sprout/create.sh | 19 + .../examples/clearwater/scripts/sprout/delete.sh | 17 + .../examples/clearwater/scripts/vellum/create.sh | 23 + .../examples/clearwater/scripts/vellum/delete.sh | 17 + .../aria/examples/clearwater/types/cassandra.yaml | 30 + .../aria/examples/clearwater/types/clearwater.yaml | 728 +++++++ .../src/aria/examples/clearwater/types/ims.yaml | 446 +++++ .../src/aria/examples/clearwater/types/smtp.yaml | 35 + .../src/aria/examples/hello-world/hello-world.yaml | 38 + .../aria/examples/hello-world/images/aria-logo.png | Bin 0 -> 23601 bytes .../src/aria/examples/hello-world/index.html | 14 + .../aria/examples/hello-world/scripts/configure.sh | 36 + .../src/aria/examples/hello-world/scripts/start.sh | 64 + .../src/aria/examples/hello-world/scripts/stop.sh | 28 + .../use-cases/block-storage-1/block-storage-1.yaml | 68 + .../use-cases/block-storage-1/inputs.yaml | 3 + .../use-cases/block-storage-2/block-storage-2.yaml | 75 + .../use-cases/block-storage-2/inputs.yaml | 3 + .../use-cases/block-storage-3/block-storage-3.yaml | 68 + .../use-cases/block-storage-3/inputs.yaml | 2 + .../use-cases/block-storage-4/block-storage-4.yaml | 96 + .../use-cases/block-storage-4/inputs.yaml | 2 + .../use-cases/block-storage-5/block-storage-5.yaml | 109 ++ .../use-cases/block-storage-5/inputs.yaml | 3 + .../use-cases/block-storage-6/block-storage-6.yaml | 102 + .../use-cases/block-storage-6/inputs.yaml | 3 + .../use-cases/compute-1/compute-1.yaml | 42 + .../use-cases/compute-1/inputs.yaml | 1 + .../use-cases/container-1/container-1.yaml | 68 + .../multi-tier-1/custom_types/collectd.yaml | 10 + .../multi-tier-1/custom_types/elasticsearch.yaml | 8 + .../multi-tier-1/custom_types/kibana.yaml | 12 + .../multi-tier-1/custom_types/logstash.yaml | 12 + .../multi-tier-1/custom_types/rsyslog.yaml | 10 + .../use-cases/multi-tier-1/inputs.yaml | 1 + .../use-cases/multi-tier-1/multi-tier-1.yaml | 237 +++ .../use-cases/network-1/inputs.yaml | 1 + .../use-cases/network-1/network-1.yaml | 49 + .../use-cases/network-2/inputs.yaml | 1 + .../use-cases/network-2/network-2.yaml | 46 + .../use-cases/network-3/inputs.yaml | 1 + .../use-cases/network-3/network-3.yaml | 81 + .../use-cases/network-4/network-4.yaml | 70 + .../use-cases/non-normative-types.yaml | 177 ++ .../use-cases/object-storage-1/inputs.yaml | 1 + .../object-storage-1/object-storage-1.yaml | 24 + .../use-cases/software-component-1/inputs.yaml | 1 + .../software-component-1/software-component-1.yaml | 54 + .../webserver-dbms-1/webserver-dbms-1.yaml | 122 ++ .../custom_types/paypalpizzastore_nodejs_app.yaml | 15 + .../webserver-dbms-2/webserver-dbms-2.yaml | 115 ++ .../extensions/aria_extension_tosca/__init__.py | 56 + .../profiles/aria-1.0/aria-1.0.yaml | 97 + .../profiles/azure-plugin/azureplugin.yaml | 1981 ++++++++++++++++++++ .../profiles/tosca-simple-1.0/artifacts.yaml | 121 ++ .../profiles/tosca-simple-1.0/capabilities.yaml | 322 ++++ .../profiles/tosca-simple-1.0/data.yaml | 268 +++ .../profiles/tosca-simple-1.0/groups.yaml | 28 + .../profiles/tosca-simple-1.0/interfaces.yaml | 107 ++ .../profiles/tosca-simple-1.0/nodes.yaml | 525 ++++++ .../profiles/tosca-simple-1.0/policies.yaml | 71 + .../profiles/tosca-simple-1.0/relationships.yaml | 158 ++ .../tosca-simple-1.0/tosca-simple-1.0.yaml | 24 + .../profiles/tosca-simple-nfv-1.0/artifacts.yaml | 84 + .../tosca-simple-nfv-1.0/capabilities.yaml | 70 + .../profiles/tosca-simple-nfv-1.0/data.yaml | 318 ++++ .../profiles/tosca-simple-nfv-1.0/nodes.yaml | 260 +++ .../tosca-simple-nfv-1.0/relationships.yaml | 43 + .../tosca-simple-nfv-1.0/tosca-simple-nfv-1.0.yaml | 21 + .../simple_nfv_v1_0/__init__.py | 19 + .../simple_nfv_v1_0/presenter.py | 43 + .../aria_extension_tosca/simple_v1_0/__init__.py | 199 ++ .../simple_v1_0/assignments.py | 453 +++++ .../aria_extension_tosca/simple_v1_0/data_types.py | 561 ++++++ .../simple_v1_0/definitions.py | 518 +++++ .../aria_extension_tosca/simple_v1_0/filters.py | 107 ++ .../aria_extension_tosca/simple_v1_0/misc.py | 444 +++++ .../simple_v1_0/modeling/__init__.py | 750 ++++++++ .../simple_v1_0/modeling/artifacts.py | 44 + .../simple_v1_0/modeling/capabilities.py | 220 +++ .../simple_v1_0/modeling/constraints.py | 144 ++ .../simple_v1_0/modeling/copy.py | 32 + .../simple_v1_0/modeling/data_types.py | 514 +++++ .../simple_v1_0/modeling/functions.py | 681 +++++++ .../simple_v1_0/modeling/interfaces.py | 530 ++++++ .../simple_v1_0/modeling/parameters.py | 230 +++ .../simple_v1_0/modeling/policies.py | 79 + .../simple_v1_0/modeling/requirements.py | 364 ++++ .../simple_v1_0/modeling/substitution_mappings.py | 167 ++ .../simple_v1_0/presentation/__init__.py | 14 + .../simple_v1_0/presentation/extensible.py | 33 + .../simple_v1_0/presentation/field_getters.py | 37 + .../simple_v1_0/presentation/field_validators.py | 588 ++++++ .../simple_v1_0/presentation/types.py | 63 + .../aria_extension_tosca/simple_v1_0/presenter.py | 83 + .../aria_extension_tosca/simple_v1_0/templates.py | 736 ++++++++ .../aria_extension_tosca/simple_v1_0/types.py | 892 +++++++++ .../src/aria/release/asf-release.sh | 283 +++ .../src/aria/requirements.in | 41 + .../src/aria/requirements.txt | 43 + .../aria/aria-extension-cloudify/src/aria/setup.py | 174 ++ .../aria-extension-cloudify/src/aria/test_ssh.py | 528 ++++++ .../src/aria/tests/.pylintrc | 422 +++++ .../src/aria/tests/__init__.py | 20 + .../src/aria/tests/cli/__init__.py | 14 + .../src/aria/tests/cli/base_test.py | 77 + .../src/aria/tests/cli/runner.py | 27 + .../src/aria/tests/cli/test_node_templates.py | 133 ++ .../src/aria/tests/cli/test_nodes.py | 101 + .../src/aria/tests/cli/test_service_templates.py | 273 +++ .../src/aria/tests/cli/test_services.py | 227 +++ .../src/aria/tests/cli/utils.py | 101 + .../src/aria/tests/conftest.py | 47 + .../src/aria/tests/end2end/__init__.py | 14 + .../src/aria/tests/end2end/test_hello_world.py | 61 + .../src/aria/tests/end2end/test_nodecellar.py | 42 + .../src/aria/tests/end2end/testenv.py | 102 + .../src/aria/tests/fixtures.py | 70 + .../src/aria/tests/helpers.py | 82 + .../src/aria/tests/instantiation/__init__.py | 14 + .../aria/tests/instantiation/test_configuration.py | 172 ++ .../src/aria/tests/mock/__init__.py | 16 + .../src/aria/tests/mock/context.py | 57 + .../src/aria/tests/mock/models.py | 358 ++++ .../src/aria/tests/mock/operations.py | 59 + .../src/aria/tests/mock/topology.py | 96 + .../src/aria/tests/mock/workflow.py | 26 + .../src/aria/tests/modeling/__init__.py | 34 + .../src/aria/tests/modeling/test_mixins.py | 215 +++ .../src/aria/tests/modeling/test_models.py | 872 +++++++++ .../src/aria/tests/orchestrator/__init__.py | 14 + .../aria/tests/orchestrator/context/__init__.py | 32 + .../context/test_context_instrumentation.py | 108 ++ .../tests/orchestrator/context/test_operation.py | 498 +++++ .../orchestrator/context/test_resource_render.py | 72 + .../tests/orchestrator/context/test_serialize.py | 104 + .../tests/orchestrator/context/test_toolbelt.py | 164 ++ .../tests/orchestrator/context/test_workflow.py | 126 ++ .../orchestrator/execution_plugin/__init__.py | 14 + .../orchestrator/execution_plugin/test_common.py | 193 ++ .../execution_plugin/test_ctx_proxy_server.py | 285 +++ .../execution_plugin/test_global_ctx.py | 28 + .../orchestrator/execution_plugin/test_local.py | 598 ++++++ .../orchestrator/execution_plugin/test_ssh.py | 523 ++++++ .../tests/orchestrator/test_workflow_runner.py | 726 +++++++ .../aria/tests/orchestrator/workflows/__init__.py | 16 + .../tests/orchestrator/workflows/api/__init__.py | 14 + .../tests/orchestrator/workflows/api/test_task.py | 223 +++ .../orchestrator/workflows/api/test_task_graph.py | 745 ++++++++ .../orchestrator/workflows/builtin/__init__.py | 70 + .../workflows/builtin/test_execute_operation.py | 64 + .../orchestrator/workflows/builtin/test_heal.py | 100 + .../orchestrator/workflows/builtin/test_install.py | 46 + .../workflows/builtin/test_uninstall.py | 47 + .../tests/orchestrator/workflows/core/__init__.py | 14 + .../orchestrator/workflows/core/test_engine.py | 564 ++++++ .../orchestrator/workflows/core/test_events.py | 171 ++ .../tests/orchestrator/workflows/core/test_task.py | 153 ++ .../core/test_task_graph_into_execution_graph.py | 172 ++ .../orchestrator/workflows/executor/__init__.py | 98 + .../workflows/executor/test_executor.py | 149 ++ .../workflows/executor/test_process_executor.py | 172 ++ ...st_process_executor_concurrent_modifications.py | 167 ++ .../executor/test_process_executor_extension.py | 99 + .../test_process_executor_tracked_changes.py | 168 ++ .../aria/tests/orchestrator/workflows/helpers.py | 37 + .../src/aria/tests/parser/__init__.py | 14 + .../src/aria/tests/parser/service_templates.py | 86 + .../src/aria/tests/parser/test_reqs_caps.py | 29 + .../parser/test_tosca_simple_v1_0/__init__.py | 14 + .../presentation/__init__.py | 0 .../presentation/test_types.py | 23 + .../parser/test_tosca_simple_v1_0/test_end2end.py | 112 ++ .../src/aria/tests/parser/utils.py | 67 + .../src/aria/tests/requirements.txt | 22 + .../src/aria/tests/resources/__init__.py | 19 + .../resources/plugins/mock-plugin1/mock_plugin1.py | 27 + .../tests/resources/plugins/mock-plugin1/setup.py | 28 + .../src/aria/tests/resources/scripts/test_ssh.sh | 96 + .../tosca-simple-1.0/node-cellar/inputs.yaml | 3 + .../tosca-simple-1.0/node-cellar/node-cellar.yaml | 357 ++++ .../node-cellar/types/mongodb.yaml | 72 + .../tosca-simple-1.0/node-cellar/types/nginx.yaml | 29 + .../tosca-simple-1.0/node-cellar/types/nodejs.yaml | 69 + .../node-cellar/types/openstack.yaml | 201 ++ .../tosca-simple-1.0/node-cellar/types/os.yaml | 74 + .../tosca-simple-1.0/node-cellar/workflows.py | 40 + .../tosca-simple-1.0/reqs_caps/reqs_caps1.yaml | 40 + .../types/shorthand-1/shorthand-1.yaml | 23 + .../types/typequalified-1/typequalified-1.yaml | 23 + .../src/aria/tests/storage/__init__.py | 53 + .../storage/test_collection_instrumentation.py | 257 +++ .../src/aria/tests/storage/test_model_storage.py | 213 +++ .../aria/tests/storage/test_resource_storage.py | 280 +++ .../src/aria/tests/test_extension.py | 156 ++ .../src/aria/tests/test_logger.py | 129 ++ .../src/aria/tests/utils/__init__.py | 14 + .../src/aria/tests/utils/test_exceptions.py | 73 + .../src/aria/tests/utils/test_plugin.py | 58 + .../src/aria/tests/utils/test_threading.py | 33 + .../src/aria/tests/utils/test_validation.py | 35 + .../src/aria/tests/utils/test_versions.py | 85 + .../aria-extension-cloudify/src/aria/tox.ini.bkp | 116 ++ azure/aria/aria-extension-cloudify/tox.ini.bkp | 56 + azure/assembly.xml | 1 + azure/docker/Dockerfile | 17 + azure/docker/build_image.sh | 4 +- ...y_azure_plugin-1.4.2-py27-none-linux_x86_64.wgn | Bin 0 -> 4357947 bytes azure/multicloud_azure/pub/aria/__init__.py | 11 + azure/multicloud_azure/pub/aria/service.py | 159 ++ azure/multicloud_azure/pub/aria/util.py | 40 + azure/multicloud_azure/settings.py | 3 + azure/multicloud_azure/swagger/urls.py | 14 +- .../swagger/views/infra_workload/__init__.py | 11 + .../swagger/views/infra_workload/views.py | 82 + azure/multicloud_azure/tests/test_aria_view.py | 171 ++ azure/requirements.txt | 9 +- azure/tox.ini | 7 +- pom.xml | 2 +- 498 files changed, 65876 insertions(+), 11 deletions(-) create mode 100644 azure/aria/aria-extension-cloudify/.DS_Store create mode 100644 azure/aria/aria-extension-cloudify/.flake8 create mode 100644 azure/aria/aria-extension-cloudify/.gitignore create mode 100644 azure/aria/aria-extension-cloudify/.travis.yml create mode 100644 azure/aria/aria-extension-cloudify/LICENCE create mode 100644 azure/aria/aria-extension-cloudify/README.md create mode 100644 azure/aria/aria-extension-cloudify/adapters/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/adapters/context_adapter.py create mode 100644 azure/aria/aria-extension-cloudify/adapters/extension.py create mode 100644 azure/aria/aria-extension-cloudify/appveyor.yml create mode 100644 azure/aria/aria-extension-cloudify/aria_extension_tests/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/aria_extension_tests/adapters/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/aria_extension_tests/adapters/test_context_adapter.py create mode 100644 azure/aria/aria-extension-cloudify/aria_extension_tests/requirements.txt create mode 100644 azure/aria/aria-extension-cloudify/examples/aws-hello-world/aws-helloworld.yaml create mode 100644 azure/aria/aria-extension-cloudify/examples/aws-hello-world/images/aria-logo.png create mode 100644 azure/aria/aria-extension-cloudify/examples/aws-hello-world/index.html create mode 100644 azure/aria/aria-extension-cloudify/examples/aws-hello-world/scripts/configure.sh create mode 100644 azure/aria/aria-extension-cloudify/examples/aws-hello-world/scripts/start.sh create mode 100644 azure/aria/aria-extension-cloudify/examples/aws-hello-world/scripts/stop.sh create mode 100644 azure/aria/aria-extension-cloudify/examples/openstack-hello-world/images/aria-logo.png create mode 100644 azure/aria/aria-extension-cloudify/examples/openstack-hello-world/index.html create mode 100644 azure/aria/aria-extension-cloudify/examples/openstack-hello-world/openstack-helloworld.yaml create mode 100644 azure/aria/aria-extension-cloudify/examples/openstack-hello-world/scripts/configure.sh create mode 100644 azure/aria/aria-extension-cloudify/examples/openstack-hello-world/scripts/start.sh create mode 100644 azure/aria/aria-extension-cloudify/examples/openstack-hello-world/scripts/stop.sh create mode 100644 azure/aria/aria-extension-cloudify/plugins/aws/plugin.yaml create mode 100644 azure/aria/aria-extension-cloudify/plugins/openstack/plugin.yaml create mode 100644 azure/aria/aria-extension-cloudify/requirements.txt create mode 100644 azure/aria/aria-extension-cloudify/setup.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/.gitignore create mode 100644 azure/aria/aria-extension-cloudify/src/aria/.rat-excludes create mode 100644 azure/aria/aria-extension-cloudify/src/aria/.travis.yml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/=35.0.0 create mode 100644 azure/aria/aria-extension-cloudify/src/aria/=35.0.0, create mode 100644 azure/aria/aria-extension-cloudify/src/aria/CHANGELOG.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/CONTRIBUTING create mode 100644 azure/aria/aria-extension-cloudify/src/aria/DISCLAIMER create mode 100644 azure/aria/aria-extension-cloudify/src/aria/LICENSE create mode 100644 azure/aria/aria-extension-cloudify/src/aria/MANIFEST.in create mode 100644 azure/aria/aria-extension-cloudify/src/aria/Makefile create mode 100644 azure/aria/aria-extension-cloudify/src/aria/NOTICE create mode 100644 azure/aria/aria-extension-cloudify/src/aria/README.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/VERSION create mode 100644 azure/aria/aria-extension-cloudify/src/aria/appveyor.yml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/.pylintrc create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/ascii_art.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/color.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/executions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/logs.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/node_templates.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/nodes.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/plugins.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/reset.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/service_templates.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/services.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/workflows.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/config/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/config/config.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/config/config_template.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/core/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/core/aria.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/csar.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/defaults.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/env.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/execution_logging.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/helptexts.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/inputs.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/logger.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/main.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/service_template_utils.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/table.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/cli/utils.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/core.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/extension.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/logger.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/constraints.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/functions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/mixins.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/models.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/orchestration.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/relationship.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_changes.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_common.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_instance.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_template.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/types.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/modeling/utils.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/common.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/operation.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/toolbelt.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/workflow.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/decorators.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/events.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/common.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/constants.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ctx_proxy/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ctx_proxy/client.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ctx_proxy/server.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/environment_globals.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/instantiation.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/local.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/operations.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ssh/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ssh/operations.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ssh/tunnel.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/plugin.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/common.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/instance_handler.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/template_handler.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/topology.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/utils.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflow_runner.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/api/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/api/task.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/api/task_graph.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/execute_operation.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/heal.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/install.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/start.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/stop.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/uninstall.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/workflows.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/engine.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/events_handler.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/graph_compiler.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/events_logging.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/base.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/celery.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/dry.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/process.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/thread.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/consumer.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/context.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/inputs.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/modeling.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/presentation.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/validation.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/context.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/file.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/literal.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/loader.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/location.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/request.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/source.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/uri.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/modeling/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/modeling/context.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/context.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/field_validators.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/fields.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/null.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/presentation.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/presenter.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/source.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/utils.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/context.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/jinja.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/json.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/locator.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/raw.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/reader.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/source.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/yaml.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/specification.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/validation/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/validation/context.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/parser/validation/issue.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/storage/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/storage/api.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/storage/collection_instrumentation.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/storage/core.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/storage/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/storage/filesystem_rapi.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/storage/sql_mapi.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/archive.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/argparse.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/caching.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/collections.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/console.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/file.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/formatting.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/http.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/imports.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/openclose.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/plugin.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/process.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/specification.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/threading.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/type.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/uris.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/uuid.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/validation.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/aria/utils/versions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/.gitignore create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/_static/.gitkeep create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.cli.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.modeling.models.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.modeling.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.context.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.execution_plugin.ctx_proxy.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.execution_plugin.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.execution_plugin.ssh.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.api.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.builtin.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.executor.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.consumption.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.loading.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.modeling.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.presentation.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.reading.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.validation.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.storage.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria.utils.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_nfv_v1_0.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_v1_0.modeling.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_v1_0.presentation.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_v1_0.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/cli.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/conf.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/index.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/requirements.txt create mode 100644 azure/aria/aria-extension-cloudify/src/aria/docs/rest.rst create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/clearwater-live-test-existing.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/clearwater-single-existing.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/bono/create.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/bono/delete.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/dime/create.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/dime/delete.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ellis/configure.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ellis/create.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ellis/delete.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homer/create.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homer/delete.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homestead/create.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homestead/delete.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/host-base/configure.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/host/configure.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/live-test/create.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/live-test/delete.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/memento/create.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/memento/delete.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ralf/create.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ralf/delete.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/sprout/create.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/sprout/delete.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/vellum/create.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/vellum/delete.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/cassandra.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/clearwater.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/ims.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/smtp.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/hello-world.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/images/aria-logo.png create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/index.html create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/scripts/configure.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/scripts/start.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/scripts/stop.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-1/block-storage-1.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-1/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-2/block-storage-2.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-2/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-3/block-storage-3.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-3/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-4/block-storage-4.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-4/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-5/block-storage-5.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-5/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-6/block-storage-6.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-6/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/compute-1/compute-1.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/compute-1/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/container-1/container-1.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/collectd.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/elasticsearch.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/kibana.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/logstash.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/rsyslog.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/multi-tier-1.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-1/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-1/network-1.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-2/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-2/network-2.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-3/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-3/network-3.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-4/network-4.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/non-normative-types.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/object-storage-1/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/object-storage-1/object-storage-1.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/software-component-1/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/software-component-1/software-component-1.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/webserver-dbms-1/webserver-dbms-1.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/webserver-dbms-2/custom_types/paypalpizzastore_nodejs_app.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/webserver-dbms-2/webserver-dbms-2.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/azure-plugin/azureplugin.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/artifacts.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/data.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/groups.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/interfaces.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/nodes.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/policies.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/relationships.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/tosca-simple-1.0.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/artifacts.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/capabilities.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/data.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/nodes.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/relationships.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/tosca-simple-nfv-1.0.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_nfv_v1_0/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_nfv_v1_0/presenter.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/assignments.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/data_types.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/definitions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/filters.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/misc.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/artifacts.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/constraints.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/copy.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/functions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/interfaces.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/parameters.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/policies.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/requirements.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/substitution_mappings.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/extensible.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/field_getters.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/field_validators.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/types.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presenter.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/templates.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/types.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/release/asf-release.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/requirements.in create mode 100644 azure/aria/aria-extension-cloudify/src/aria/requirements.txt create mode 100644 azure/aria/aria-extension-cloudify/src/aria/setup.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/test_ssh.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/.pylintrc create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/cli/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/cli/base_test.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/cli/runner.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_node_templates.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_nodes.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_service_templates.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_services.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/cli/utils.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/conftest.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/end2end/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/end2end/test_hello_world.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/end2end/test_nodecellar.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/end2end/testenv.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/fixtures.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/helpers.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/instantiation/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/instantiation/test_configuration.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/mock/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/mock/context.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/mock/models.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/mock/operations.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/mock/topology.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/mock/workflow.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/modeling/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/modeling/test_mixins.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/modeling/test_models.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_context_instrumentation.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_operation.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_resource_render.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_serialize.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_toolbelt.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_workflow.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_common.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_ctx_proxy_server.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_global_ctx.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_local.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_ssh.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/test_workflow_runner.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/api/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/api/test_task.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/api/test_task_graph.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_execute_operation.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_heal.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_install.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_uninstall.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_engine.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_events.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_task.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_task_graph_into_execution_graph.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_executor.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor_concurrent_modifications.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor_extension.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/helpers.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/parser/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/parser/service_templates.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_reqs_caps.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/presentation/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/presentation/test_types.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/test_end2end.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/parser/utils.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/requirements.txt create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/plugins/mock-plugin1/mock_plugin1.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/plugins/mock-plugin1/setup.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/scripts/test_ssh.sh create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/inputs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/mongodb.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/nginx.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/nodejs.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/openstack.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/os.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/workflows.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/reqs_caps/reqs_caps1.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/types/shorthand-1/shorthand-1.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/types/typequalified-1/typequalified-1.yaml create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/storage/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/storage/test_collection_instrumentation.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/storage/test_model_storage.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/storage/test_resource_storage.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/test_extension.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/test_logger.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/utils/__init__.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_exceptions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_plugin.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_threading.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_validation.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_versions.py create mode 100644 azure/aria/aria-extension-cloudify/src/aria/tox.ini.bkp create mode 100644 azure/aria/aria-extension-cloudify/tox.ini.bkp create mode 100644 azure/docker/cloudify_azure_plugin-1.4.2-py27-none-linux_x86_64.wgn create mode 100644 azure/multicloud_azure/pub/aria/__init__.py create mode 100644 azure/multicloud_azure/pub/aria/service.py create mode 100644 azure/multicloud_azure/pub/aria/util.py create mode 100644 azure/multicloud_azure/swagger/views/infra_workload/__init__.py create mode 100644 azure/multicloud_azure/swagger/views/infra_workload/views.py create mode 100644 azure/multicloud_azure/tests/test_aria_view.py diff --git a/azure/aria/aria-extension-cloudify/.DS_Store b/azure/aria/aria-extension-cloudify/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d3c7e50c37f3e050c6fbde03338f60c3a3548d1f GIT binary patch literal 8196 zcmeHM-EI;=6h6~ZS*k`7o0QAFG4TQkq^(>S6QuN_i5eqDFVwWV1=~%Qot0gR6*1iS z4(c2DC_aG?;sfY6KO(bGy)ZFNJJZa3!_0Ti&U|~=a0+|H(rC1`Q7^k& z_3F6nj_UPl+1=c@JsuaF^&7RjyZgP9x1)FC_n+iei0S7ET~nW@?dL@sJ#P1-kVl7@ z6LwdmXfYk**yDsajy@{D9);onWJbU*;LZx@!mdvN+C5mlk+MgWV1!eIu>%Ux8{nn{ z^a>s;U>)M`7CuK9;iiAKp7Fo-7ysgzCc#zZLCx=VvJV+QE97Gp0anw=T=9E`nUiaU zPm?D@=c5riV!s|Vis2Qj$nb?yv-~{Wr(N2n9eOBQlP&jcvW3?HloC2+e9PVafqlk; zxVE`fcI%t9e-7fjlzJ*kCWH(07~RH)}2;DBdmVqI9J=9196RcAa z%;rrJA;26X1QJ-Ju#aI8(@BPp5HR=!csBTSU|NVUFf5i~(Vt@>xD8ewYv5RKMFvZd z@reL8*oaG8tODmsfn~LulF0vePCx%YS9`Xbu?koPOa)l3)owL0_UpH>IjypM7lZqH yLhvT2Kxu+TrsF`FjsvIvFht)4RS+8*Ckiow^4|{v@KZ!y*uMXz47RzL3j74Qz` + +Another, more generic way, of obtaining a plugin `.wgn` is to create it from source. Here's an example, using the AWS plugin: + +1. clone/download the Cloudify AWS Plugin: + +`git clone https://github.com/cloudify-cosmo/cloudify-aws-plugin.git` + +2. (optional) if you want to install a specific version of the plugin, checkout the corresponding tag. + +`git checkout ` + +3. create a `.wgn` file from the repository: + +`wagon create ` diff --git a/azure/aria/aria-extension-cloudify/adapters/__init__.py b/azure/aria/aria-extension-cloudify/adapters/__init__.py new file mode 100644 index 0000000..eb15bc2 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/adapters/__init__.py @@ -0,0 +1,15 @@ +# +# Copyright (c) 2017 GigaSpaces Technologies Ltd. All rights reserved. +# +# 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/azure/aria/aria-extension-cloudify/adapters/context_adapter.py b/azure/aria/aria-extension-cloudify/adapters/context_adapter.py new file mode 100644 index 0000000..9e540ae --- /dev/null +++ b/azure/aria/aria-extension-cloudify/adapters/context_adapter.py @@ -0,0 +1,461 @@ +# +# Copyright (c) 2017 GigaSpaces Technologies Ltd. All rights reserved. +# +# 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 tempfile + +from aria.orchestrator.context import operation + + +DEPLOYMENT = 'deployment' +NODE_INSTANCE = 'node-instance' +RELATIONSHIP_INSTANCE = 'relationship-instance' + + +class CloudifyContextAdapter(object): + + def __init__(self, ctx): + self._ctx = ctx + self._blueprint = BlueprintAdapter(ctx) + self._deployment = DeploymentAdapter(ctx) + self._operation = OperationAdapter(ctx) + self._bootstrap_context = BootstrapAdapter(ctx) + self._plugin = PluginAdapter(ctx) + self._agent = CloudifyAgentAdapter() + self._node = None + self._node_instance = None + self._source = None + self._target = None + if isinstance(ctx, operation.NodeOperationContext): + self._node = NodeAdapter(ctx, ctx.node_template, ctx.node) + self._instance = NodeInstanceAdapter(ctx, ctx.node, True) + elif isinstance(ctx, operation.RelationshipOperationContext): + self._source = RelationshipTargetAdapter( + ctx, + ctx.source_node_template, + ctx.source_node, + True + ) + self._target = RelationshipTargetAdapter( + ctx, + ctx.target_node_template, + ctx.target_node, + True + ) + + def __getattr__(self, item): + try: + return getattr(self._ctx, item) + except AttributeError: + return super(CloudifyContextAdapter, self).__getattribute__(item) + + @property + def blueprint(self): + return self._blueprint + + @property + def deployment(self): + return self._deployment + + @property + def operation(self): + return self._operation + + @property + def bootstrap_context(self): + return self._bootstrap_context + + @property + def plugin(self): + return self._plugin + + @property + def agent(self): + return self._agent + + @property + def type(self): + if self._source: + return RELATIONSHIP_INSTANCE + elif self._instance: + return NODE_INSTANCE + else: + return DEPLOYMENT + + @property + def instance(self): + self._verify_in_node_operation() + return self._instance + + @property + def node(self): + self._verify_in_node_operation() + return self._node + + @property + def source(self): + self._verify_in_relationship_operation() + return self._source + + @property + def target(self): + self._verify_in_relationship_operation() + return self._target + + @property + def execution_id(self): + return self._ctx.task.execution.id + + @property + def workflow_id(self): + return self._ctx.task.execution.workflow_name + + @property + def rest_token(self): + return None + + @property + def task_id(self): + return self._ctx.task.id + + @property + def task_name(self): + return self._ctx.task.function + + @property + def task_target(self): + return None + + @property + def task_queue(self): + return None + + @property + def logger(self): + + + def getChild( self, name ): + loggertype = type(self) + + childlogger = self._logger.getChild(name) + finallogger = loggertype(childlogger, self._task_id) + return finallogger + + + loggertype = type(self._ctx.logger) + + childloggertype = type(self._ctx.logger.getChild("test")) + if loggertype != childloggertype: + loggertype.getChild = getChild + + return self._ctx.logger + + def send_event(self, event): + self.logger.info(event) + + @property + def provider_context(self): + return {} + + def get_resource(self, resource_path): + return self._ctx.get_resource(resource_path) + + def get_resource_and_render(self, resource_path, template_variables=None): + return self._ctx.get_resource_and_render(resource_path, variables=template_variables) + + def download_resource(self, resource_path, target_path=None): + target_path = self._get_target_path(target_path, resource_path) + self._ctx.download_resource( + destination=target_path, + path=resource_path + ) + return target_path + + def download_resource_and_render(self, + resource_path, + target_path=None, + template_variables=None): + target_path = self._get_target_path(target_path, resource_path) + self._ctx.download_resource_and_render( + destination=target_path, + path=resource_path, + variables=template_variables + ) + return target_path + + @staticmethod + def _get_target_path(target_path, resource_path): + if target_path: + return target_path + fd, target_path = tempfile.mkstemp(suffix=os.path.basename(resource_path)) + os.close(fd) + return target_path + + def _verify_in_node_operation(self): + if self.type != NODE_INSTANCE: + self._ctx.task.abort( + 'ctx.node/ctx.instance can only be used in a {0} context but ' + 'used in a {1} context.'.format(NODE_INSTANCE, self.type) + ) + + def _verify_in_relationship_operation(self): + if self.type != RELATIONSHIP_INSTANCE: + self._ctx.task.abort( + 'ctx.source/ctx.target can only be used in a {0} context but ' + 'used in a {1} context.'.format(RELATIONSHIP_INSTANCE, + self.type) + ) + + +class BlueprintAdapter(object): + + def __init__(self, ctx): + self._ctx = ctx + + @property + def id(self): + return self._ctx.service_template.id + + +class DeploymentAdapter(object): + + def __init__(self, ctx): + self._ctx = ctx + + @property + def id(self): + return self._ctx.service.id + + +class NodeAdapter(object): + + def __init__(self, ctx, node_template, node): + self._ctx = ctx + self._node_template = node_template + self._node = node + + @property + def id(self): + return self._node_template.id + + @property + def name(self): + return self._node_template.name + + @property + def properties(self): + # Cloudify Azure plugin will request the resource_config and merge it with new configurations. + # This creates an problem when the resource_config is None. Fix this by replacing an empty + # resource_config with an empth dict. + if 'resource_config' in self._node.properties and self._node.properties.get('resource_config') == None: + self._node.properties['resource_config']={} + return self._node.properties + + @property + def type(self): + return self._node_template.type.name + + @property + def type_hierarchy(self): + # We needed to modify the type hierarchy to be a list of strings that include the word + # 'cloudify' in each one of them instead of 'aria', since in the Cloudify AWS plugin, that + # we currently wish to support, if we want to attach an ElasticIP to a node, this node's + # type_hierarchy property must be a list of strings only, and it must contain either the + # string 'cloudify.aws.nodes.Instance', or the string 'cloudify.aws.nodes.Interface'. + # In any other case, we won't be able to attach an ElasticIP to a node using the Cloudify + # AWS plugin. + type_hierarchy_names = [type_.name for type_ in self._node_template.type.hierarchy + if type_.name is not None] + return [type_name.replace('aria', 'cloudify') for type_name in type_hierarchy_names] + + +class NodeInstanceAdapter(object): + + def __init__(self, ctx, node, modifiable): + self._ctx = ctx + self._node = node + self._modifiable = modifiable + + @property + def id(self): + return self._node.id + + @property + def runtime_properties(self): + return self._node.attributes + + @runtime_properties.setter + def runtime_properties(self, value): + self._node.attributes = value + + def update(self, on_conflict=None): + self._ctx.model.node.update(self._node) + + def refresh(self, force=False): + self._ctx.model.node.refresh(self._node) + + @property + def host_ip(self): + return self._node.host_address + + @property + def relationships(self): + return [RelationshipAdapter(self._ctx, relationship=relationship) for + relationship in self._node.outbound_relationships] + + #def __getattr__(self, item): + # print "requsting " + # print self._node.attributes + # print dir(self._ctx) + # return getattr(self._ctx.instance, item) + + +class RelationshipAdapter(object): + + def __init__(self, ctx, relationship): + self._ctx = ctx + self._relationship = relationship + node = relationship.target_node + node_template = node.node_template + self.target = RelationshipTargetAdapter(ctx, node_template, node, False) + + @property + def type(self): + return self._relationship.type.name + + #@property + #def type_hierarchy(self): + # return self._relationship.type.hierarchy + + + + @property + def type_hierarchy(self): + # We needed to modify the type hierarchy to be a list of strings that include the word + # 'cloudify' in each one of them instead of 'aria', since in the Cloudify AWS plugin, that + # we currently wish to support, if we want to attach an ElasticIP to a node, this node's + # type_hierarchy property must be a list of strings only, and it must contain either the + # string 'cloudify.aws.nodes.Instance', or the string 'cloudify.aws.nodes.Interface'. + # In any other case, we won't be able to attach an ElasticIP to a node using the Cloudify + # AWS plugin. + type_hierarchy_names = [type_.name for type_ in self._relationship.type.hierarchy + if type_.name is not None] + return [type_name.replace('aria', 'cloudify') for type_name in type_hierarchy_names] + + + + + + + + + + + +class RelationshipTargetAdapter(object): + + def __init__(self, ctx, node_template, node, modifiable): + self._ctx = ctx + self.node = NodeAdapter(ctx, node_template=node_template, node=node) + self.instance = NodeInstanceAdapter(ctx, node=node, modifiable=modifiable) + + +class OperationAdapter(object): + + def __init__(self, ctx): + self._ctx = ctx + + @property + def name(self): + # We needed to modify the operation's 'name' property in order to support the Cloudify AWS + # plugin. It can't use ARIA's operation naming convention, as any operation we want to run + # using the Cloudify AWS plugin must have its name in the format: + # '.'. + aria_name = self._ctx.task.name + return aria_name.split('@')[0].replace(':', '.') + + @property + def retry_number(self): + return self._ctx.task.attempts_count - 1 + + @property + def max_retries(self): + task = self._ctx.task + if task.max_attempts == task.INFINITE_RETRIES: + return task.INFINITE_RETRIES + else: + return task.max_attempts - 1 if task.max_attempts > 0 else 0 + + def retry(self, message=None, retry_after=None): + self._ctx.task.retry(message, retry_after) + + +class BootstrapAdapter(object): + + def __init__(self, ctx): + self._ctx = ctx + self.cloudify_agent = _Stub() + self.resources_prefix = '' + + def broker_config(self, *args, **kwargs): + return {} + + +class CloudifyAgentAdapter(object): + + def init_script(self, *args, **kwargs): + return None + + +class PluginAdapter(object): + + def __init__(self, ctx): + self._ctx = ctx + self._plugin = None + + @property + def name(self): + return self._ctx.task.plugin.name + + @property + def package_name(self): + return self._plugin_attr('package_name') + + @property + def package_version(self): + return self._plugin_attr('package_version') + + @property + def prefix(self): + # TODO + return self._plugin_attr('prefix') + + @property + def workdir(self): + return self._ctx.plugin_workdir + + def _plugin_attr(self, attr): + if not self._plugin: + self._plugin = self._ctx.task.plugin + if not self._plugin: + return None + return getattr(self._plugin, attr, None) + + + +class _Stub(object): + def __getattr__(self, _): + return None diff --git a/azure/aria/aria-extension-cloudify/adapters/extension.py b/azure/aria/aria-extension-cloudify/adapters/extension.py new file mode 100644 index 0000000..bab472e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/adapters/extension.py @@ -0,0 +1,92 @@ +# +# Copyright (c) 2017 GigaSpaces Technologies Ltd. All rights reserved. +# +# 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 functools import wraps +from contextlib import contextmanager + +from aria import extension as aria_extension + +from .context_adapter import CloudifyContextAdapter + + +@aria_extension.process_executor +class CloudifyExecutorExtension(object): + + def decorate(self): + def decorator(function): + @wraps(function) + def wrapper(ctx, **operation_inputs): + # We assume that any Cloudify-based plugin would use the plugins-common, thus two + # different paths are created + is_cloudify_dependent = ctx.task.plugin and any( + 'cloudify_plugins_common' in w for w in ctx.task.plugin.wheels) + + if is_cloudify_dependent: + from cloudify import context + from cloudify.exceptions import (NonRecoverableError, RecoverableError) + + with ctx.model.instrument(*ctx.INSTRUMENTATION_FIELDS): + # We need to create a new class dynamically, since CloudifyContextAdapter + # doesn't exist at runtime + ctx_adapter = type('_CloudifyContextAdapter', + (CloudifyContextAdapter, context.CloudifyContext), + {}, )(ctx) + + exception = None + with _push_cfy_ctx(ctx_adapter, operation_inputs): + try: + function(ctx=ctx_adapter, **operation_inputs) + except NonRecoverableError as e: + ctx.task.abort(str(e)) + except RecoverableError as e: + ctx.task.retry(str(e), retry_interval=e.retry_after) + except BaseException as e: + # Keep exception and raise it outside of "with", because + # contextmanager does not allow raising exceptions + exception = e + if exception is not None: + raise exception + else: + function(ctx=ctx, **operation_inputs) + return wrapper + return decorator + + +@contextmanager +def _push_cfy_ctx(ctx, params): + from cloudify import state + + try: + # Support for Cloudify > 4.0 + with state.current_ctx.push(ctx, params) as current_ctx: + yield current_ctx + + except AttributeError: + # Support for Cloudify < 4.0 + try: + original_ctx = state.current_ctx.get_ctx() + except RuntimeError: + original_ctx = None + try: + original_params = state.current_ctx.get_parameters() + except RuntimeError: + original_params = None + + state.current_ctx.set(ctx, params) + try: + yield state.current_ctx.get_ctx() + finally: + state.current_ctx.set(original_ctx, original_params) diff --git a/azure/aria/aria-extension-cloudify/appveyor.yml b/azure/aria/aria-extension-cloudify/appveyor.yml new file mode 100644 index 0000000..f9812d9 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/appveyor.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2017 GigaSpaces Technologies Ltd. All rights reserved. +# +# 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. + +environment: + + TOX_ENV: pywin + + matrix: + - PYTHON: "C:\\Python27" + PYTHON_VERSION: 2.7.8 + PYTHON_ARCH: 32 + +build: false + +install: + - SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH% + - ps: (new-object System.Net.WebClient).Downloadfile('https://bootstrap.pypa.io/get-pip.py', 'C:\Users\appveyor\get-pip.py') + - ps: Start-Process -FilePath "C:\Python27\python.exe" -ArgumentList "C:\Users\appveyor\get-pip.py" -Wait -Passthru + +before_test: + - pip install virtualenv --upgrade + - virtualenv env + - 'env\Scripts\activate.bat' + - pip install tox + +test_script: + - pip --version + - tox --version + - tox -e %TOX_ENV% \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/aria_extension_tests/__init__.py b/azure/aria/aria-extension-cloudify/aria_extension_tests/__init__.py new file mode 100644 index 0000000..eb15bc2 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/aria_extension_tests/__init__.py @@ -0,0 +1,15 @@ +# +# Copyright (c) 2017 GigaSpaces Technologies Ltd. All rights reserved. +# +# 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/azure/aria/aria-extension-cloudify/aria_extension_tests/adapters/__init__.py b/azure/aria/aria-extension-cloudify/aria_extension_tests/adapters/__init__.py new file mode 100644 index 0000000..eb15bc2 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/aria_extension_tests/adapters/__init__.py @@ -0,0 +1,15 @@ +# +# Copyright (c) 2017 GigaSpaces Technologies Ltd. All rights reserved. +# +# 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/azure/aria/aria-extension-cloudify/aria_extension_tests/adapters/test_context_adapter.py b/azure/aria/aria-extension-cloudify/aria_extension_tests/adapters/test_context_adapter.py new file mode 100644 index 0000000..267f211 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/aria_extension_tests/adapters/test_context_adapter.py @@ -0,0 +1,541 @@ +# +# Copyright (c) 2017 GigaSpaces Technologies Ltd. All rights reserved. +# +# 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 copy +import datetime +import contextlib + +import pytest + +from aria import (workflow, operation) +from aria.modeling import models +from aria.orchestrator import events +from aria.orchestrator.workflows import api +from aria.orchestrator.workflows.exceptions import ExecutorException +from aria.orchestrator.workflows.executor import process +from aria.orchestrator.workflows.core import (engine, graph_compiler) +from aria.orchestrator.exceptions import (TaskAbortException, TaskRetryException) +from aria.utils import type as type_ + +import tests +from tests import (mock, storage, conftest) +from tests.orchestrator.workflows.helpers import events_collector + +from adapters import context_adapter + + +@pytest.fixture(autouse=True) +def cleanup_logger(request): + conftest.logging_handler_cleanup(request) + + +class TestCloudifyContextAdapter(object): + + def test_node_instance_operation(self, executor, workflow_context): + node_template = self._get_node_template(workflow_context) + node_type = 'aria.plugin.nodes.App' + node_instance_property = models.Property.wrap('hello', 'world') + node_template.type = models.Type(variant='variant', name=node_type) + node = self._get_node(workflow_context) + node_instance_attribute = models.Attribute.wrap('hello2', 'world2') + node.attributes[node_instance_attribute.name] = node_instance_attribute + node.properties[node_instance_property.name] = node_instance_property + workflow_context.model.node.update(node) + workflow_context.model.node_template.update(node_template) + + out = self._run(executor, workflow_context, _test_node_instance_operation) + + node_template = self._get_node_template(workflow_context) + node = self._get_node(workflow_context) + assert out['type'] == context_adapter.NODE_INSTANCE + assert out['node']['id'] == node_template.id + assert out['node']['name'] == node_template.name + assert out['node']['properties'] == \ + {node_instance_property.name: node_instance_property.value} + assert out['node']['type'] == node_type + assert out['node']['type_hierarchy'] == ['cloudify.plugin.nodes.App'] + assert out['instance']['id'] == node.id + assert out['instance']['runtime_properties'] == \ + {node_instance_attribute.name: node_instance_attribute.value} + assert not out['source'] + assert not out['target'] + + def test_node_instance_relationships(self, executor, workflow_context): + relationship_node_template = self._get_dependency_node_template(workflow_context) + relationship_node_instance = self._get_dependency_node(workflow_context) + relationship = relationship_node_instance.inbound_relationships[0] + relationship_type = models.Type(variant='variant', name='test.relationships.Relationship') + relationship.type = relationship_type + workflow_context.model.relationship.update(relationship) + + out = self._run(executor, workflow_context, _test_node_instance_relationships) + + assert len(out['instance']['relationships']) == 1 + relationship = out['instance']['relationships'][0] + assert relationship['type'] == relationship_type.name + assert relationship['type_hierarchy'] == [relationship_type.name] + assert relationship['target']['node']['id'] == relationship_node_template.id + assert relationship['target']['instance']['id'] == relationship_node_instance.id + + def test_source_operation(self, executor, workflow_context): + self._test_relationship_operation(executor, workflow_context, operation_end='source') + + def test_target_operation(self, executor, workflow_context): + self._test_relationship_operation(executor, workflow_context, operation_end='target') + + def _test_relationship_operation(self, executor, workflow_context, operation_end): + out = self._run( + executor, workflow_context, _test_relationship_operation, operation_end=operation_end) + + source_node = self._get_node_template(workflow_context) + source_node_instance = self._get_node(workflow_context) + target_node = self._get_dependency_node_template(workflow_context) + target_node_instance = self._get_dependency_node(workflow_context) + assert out['type'] == context_adapter.RELATIONSHIP_INSTANCE + assert out['source']['node']['id'] == source_node.id + assert out['source']['instance']['id'] == source_node_instance.id + assert out['target']['node']['id'] == target_node.id + assert out['target']['instance']['id'] == target_node_instance.id + assert not out['node'] + assert not out['instance'] + + def test_host_ip(self, executor, workflow_context): + node = self._get_node_template(workflow_context) + node.type_hierarchy = ['aria.nodes.Compute'] + node_instance = self._get_node(workflow_context) + node_instance.host_fk = node_instance.id + node_instance_ip = '120.120.120.120' + node_instance.attributes['ip'] = models.Attribute.wrap('ip', node_instance_ip) + workflow_context.model.node_template.update(node) + workflow_context.model.node.update(node_instance) + + out = self._run(executor, workflow_context, _test_host_ip) + + assert out['instance']['host_ip'] == node_instance_ip + + def test_get_and_download_resource_and_render(self, tmpdir, executor, workflow_context): + resource_path = 'resource' + variable = 'VALUE' + content = '{{ctx.service.name}}-{{variable}}' + rendered = '{0}-{1}'.format(workflow_context.service.name, variable) + source = tmpdir.join(resource_path) + source.write(content) + workflow_context.resource.service.upload( + entry_id=str(workflow_context.service.id), + source=str(source), + path=resource_path) + + out = self._run(executor, workflow_context, _test_get_and_download_resource_and_render, + inputs={'resource': resource_path, + 'variable': variable}) + + assert out['get_resource'] == content + assert out['get_resource_and_render'] == rendered + with open(out['download_resource'], 'rb') as f: + assert f.read() == content + with open(out['download_resource_and_render'], 'rb') as f: + assert f.read() == rendered + + os.remove(out['download_resource']) + os.remove(out['download_resource_and_render']) + + def test_retry(self, executor, workflow_context): + message = 'retry-message' + retry_interval = 0.01 + + exception = self._run_and_get_task_exceptions( + executor, workflow_context, _test_retry, + inputs={'message': message, 'retry_interval': retry_interval}, + max_attempts=2 + )[-1] + + assert isinstance(exception, TaskRetryException) + assert exception.message == message + assert exception.retry_interval == retry_interval + + out = self._get_node(workflow_context).attributes['out'].value + assert out['operation']['retry_number'] == 1 + assert out['operation']['max_retries'] == 1 + + def test_logger_and_send_event(self, executor, workflow_context): + # TODO: add assertions of output once process executor output can be captured + message = 'logger-message' + event = 'event-message' + self._run(executor, workflow_context, _test_logger_and_send_event, + inputs={'message': message, 'event': event}) + + def test_plugin(self, executor, workflow_context, tmpdir): + plugin = self._put_plugin(workflow_context) + out = self._run(executor, workflow_context, _test_plugin, plugin=plugin) + + expected_workdir = tmpdir.join( + 'workdir', 'plugins', str(workflow_context.service.id), plugin.name) + assert out['plugin']['name'] == plugin.name + assert out['plugin']['package_name'] == plugin.package_name + assert out['plugin']['package_version'] == plugin.package_version + assert out['plugin']['workdir'] == str(expected_workdir) + + def test_importable_ctx_and_inputs(self, executor, workflow_context): + test_inputs = {'input1': 1, 'input2': 2} + plugin = self._put_plugin(workflow_context, mock_cfy_plugin=True) + + out = self._run(executor, workflow_context, _test_importable_ctx_and_inputs, + inputs=test_inputs, + skip_common_assert=True, + plugin=plugin) + assert out['inputs'] == test_inputs + + def test_non_recoverable_error(self, executor, workflow_context): + message = 'NON_RECOVERABLE_MESSAGE' + plugin = self._put_plugin(workflow_context, mock_cfy_plugin=True) + + exception = self._run_and_get_task_exceptions( + executor, workflow_context, _test_non_recoverable_error, + inputs={'message': message}, + skip_common_assert=True, + plugin=plugin + )[0] + assert isinstance(exception, TaskAbortException) + assert exception.message == message + + def test_recoverable_error(self, executor, workflow_context): + message = 'RECOVERABLE_MESSAGE' + plugin = self._put_plugin(workflow_context, mock_cfy_plugin=True) + + retry_interval = 0.01 + exception = self._run_and_get_task_exceptions( + executor, workflow_context, _test_recoverable_error, + inputs={'message': message, 'retry_interval': retry_interval}, + skip_common_assert=True, + plugin=plugin + )[0] + assert isinstance(exception, TaskRetryException) + assert message in exception.message + assert exception.retry_interval == retry_interval + + def _test_common(self, out, workflow_context): + assert out['execution_id'] == workflow_context.execution.id + assert out['workflow_id'] == workflow_context.execution.workflow_name + assert out['rest_token'] is None + assert out['task_id'][0] == out['task_id'][1] + assert out['task_name'][0] == out['task_name'][1] + assert out['task_target'] is None + assert out['task_queue'] is None + assert out['provider_context'] == {} + assert out['blueprint']['id'] == workflow_context.service_template.id + assert out['deployment']['id'] == workflow_context.service.id + assert out['operation']['name'][0] == out['operation']['name'][1] + assert out['operation']['retry_number'][0] == out['operation']['retry_number'][1] + assert out['operation']['max_retries'][0] == out['operation']['max_retries'][1] - 1 + assert out['bootstrap_context']['resources_prefix'] == '' + assert out['bootstrap_context']['broker_config'] == {} + assert out['bootstrap_context']['cloudify_agent']['any'] is None + assert out['agent']['init_script'] is None + + def _run(self, + executor, + workflow_context, + func, + inputs=None, + max_attempts=None, + skip_common_assert=False, + operation_end=None, + plugin=None): + interface_name = 'test' + operation_name = 'op' + op_dict = {'function': '{0}.{1}'.format(__name__, func.__name__), + 'plugin': plugin, + 'arguments': inputs or {}} + node = self._get_node(workflow_context) + + if operation_end: + actor = relationship = node.outbound_relationships[0] + relationship.interfaces[interface_name] = mock.models.create_interface( + relationship.source_node.service, + interface_name, + operation_name, + operation_kwargs=op_dict + ) + workflow_context.model.relationship.update(relationship) + + else: + actor = node + node.interfaces[interface_name] = mock.models.create_interface( + node.service, + interface_name, + operation_name, + operation_kwargs=op_dict + ) + workflow_context.model.node.update(node) + + if inputs: + operation_inputs = \ + actor.interfaces[interface_name].operations[operation_name].inputs + for input_name, input in inputs.iteritems(): + operation_inputs[input_name] = models.Input(name=input_name, + type_name=type_.full_type_name(input)) + + @workflow + def mock_workflow(graph, **kwargs): + task = api.task.OperationTask( + actor, + interface_name, + operation_name, + arguments=inputs or {}, + max_attempts=max_attempts + ) + graph.add_tasks(task) + + tasks_graph = mock_workflow(ctx=workflow_context) + graph_compiler.GraphCompiler(workflow_context, executor.__class__).compile(tasks_graph) + eng = engine.Engine(executors={executor.__class__: executor}) + eng.execute(workflow_context) + out = self._get_node(workflow_context).attributes['out'].value + if not skip_common_assert: + self._test_common(out, workflow_context) + return out + + def _get_dependency_node_template(self, workflow_context): + return workflow_context.model.node_template.get_by_name( + mock.models.DEPENDENCY_NODE_TEMPLATE_NAME) + + def _get_dependency_node(self, workflow_context): + return workflow_context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + + def _get_node_template(self, workflow_context): + return workflow_context.model.node_template.get_by_name( + mock.models.DEPENDENT_NODE_TEMPLATE_NAME) + + def _get_node(self, workflow_context): + return workflow_context.model.node.get_by_name(mock.models.DEPENDENT_NODE_NAME) + + def _run_and_get_task_exceptions(self, *args, **kwargs): + signal = events.on_failure_task_signal + with events_collector(signal) as collected: + with pytest.raises(ExecutorException): + self._run(*args, **kwargs) + return [event['kwargs']['exception'] for event in collected[signal]] + + @pytest.fixture + def executor(self): + result = process.ProcessExecutor(python_path=[tests.ROOT_DIR]) + yield result + result.close() + + @pytest.fixture + def workflow_context(self, tmpdir): + result = mock.context.simple( + str(tmpdir), + context_kwargs=dict(workdir=str(tmpdir.join('workdir'))) + ) + yield result + storage.release_sqlite_storage(result.model) + + def _put_plugin(self, workflow_context, mock_cfy_plugin=False): + name = 'PLUGIN' + archive_name = 'ARCHIVE' + package_name = 'PACKAGE' + package_version = '0.1.1' + + plugin = models.Plugin( + name=name, + archive_name=archive_name, + package_name=package_name, + package_version=package_version, + uploaded_at=datetime.datetime.now(), + wheels=['cloudify_plugins_common'] if mock_cfy_plugin else [] + ) + + workflow_context.model.plugin.put(plugin) + + return plugin + + +@operation +def _test_node_instance_operation(ctx): + with _adapter(ctx) as (adapter, out): + node = adapter.node + instance = adapter.instance + out.update({ + 'node': { + 'id': node.id, + 'name': node.name, + 'properties': copy.deepcopy(node.properties), + 'type': node.type, + 'type_hierarchy': node.type_hierarchy + }, + 'instance': { + 'id': instance.id, + 'runtime_properties': copy.deepcopy(instance.runtime_properties) + } + }) + try: + assert adapter.source + out['source'] = True + except TaskAbortException: + out['source'] = False + try: + assert adapter.target + out['target'] = True + except TaskAbortException: + out['target'] = False + + +@operation +def _test_node_instance_relationships(ctx): + with _adapter(ctx) as (adapter, out): + relationships = [{'type': r.type, + 'type_hierarchy': [t.name for t in r.type_hierarchy], + 'target': {'node': {'id': r.target.node.id}, + 'instance': {'id': r.target.instance.id}}} + for r in adapter.instance.relationships] + out['instance'] = {'relationships': relationships} + + +@operation +def _test_relationship_operation(ctx): + with _adapter(ctx) as (adapter, out): + out.update({ + 'source': {'node': {'id': adapter.source.node.id}, + 'instance': {'id': adapter.source.instance.id}}, + 'target': {'node': {'id': adapter.target.node.id}, + 'instance': {'id': adapter.target.instance.id}} + }) + try: + assert adapter.node + out['node'] = True + except TaskAbortException: + out['node'] = False + try: + assert adapter.instance + out['instance'] = True + except TaskAbortException: + out['instance'] = False + + +@operation +def _test_host_ip(ctx): + with _adapter(ctx) as (adapter, out): + out['instance'] = {'host_ip': adapter.instance.host_ip} + + +@operation +def _test_get_and_download_resource_and_render(ctx, resource, variable): + with _adapter(ctx) as (adapter, out): + out.update({ + 'get_resource': adapter.get_resource(resource), + 'get_resource_and_render': adapter.get_resource_and_render( + resource, template_variables={'variable': variable} + ), + 'download_resource': adapter.download_resource(resource), + 'download_resource_and_render': adapter.download_resource_and_render( + resource, template_variables={'variable': variable} + ) + }) + + +@operation +def _test_retry(ctx, message, retry_interval): + with _adapter(ctx) as (adapter, out): + op = adapter.operation + out['operation'] = {'retry_number': op.retry_number, 'max_retries': op.max_retries} + op.retry(message, retry_after=retry_interval) + + +@operation +def _test_logger_and_send_event(ctx, message, event): + with _adapter(ctx) as (adapter, _): + adapter.logger.info(message) + adapter.send_event(event) + + +@operation +def _test_plugin(ctx): + with _adapter(ctx) as (adapter, out): + plugin = adapter.plugin + out['plugin'] = { + 'name': plugin.name, + 'package_name': plugin.package_name, + 'package_version': plugin.package_version, + 'workdir': plugin.workdir + } + + +@operation +def _test_importable_ctx_and_inputs(**_): + from cloudify import ctx + from cloudify.state import ctx_parameters + ctx.instance.runtime_properties['out'] = {'inputs': dict(ctx_parameters)} + + +@operation +def _test_non_recoverable_error(message, **_): + from cloudify.exceptions import NonRecoverableError + raise NonRecoverableError(message) + + +@operation +def _test_recoverable_error(message, retry_interval, **_): + from cloudify.exceptions import RecoverableError + raise RecoverableError(message, retry_interval) + + +def _test_common(out, ctx, adapter): + op = adapter.operation + bootstrap_context = adapter.bootstrap_context + out.update({ + 'type': adapter.type, + 'execution_id': adapter.execution_id, + 'workflow_id': adapter.workflow_id, + 'rest_token': adapter.rest_token, + 'task_id': (adapter.task_id, ctx.task.id), + 'task_name': (adapter.task_name, ctx.task.function), + 'task_target': adapter.task_target, + 'task_queue': adapter.task_queue, + 'provider_context': adapter.provider_context, + 'blueprint': {'id': adapter.blueprint.id}, + 'deployment': {'id': adapter.deployment.id}, + 'operation': { + 'name': [op.name, ctx.name.split('@')[0].replace(':', '.')], + 'retry_number': [op.retry_number, ctx.task.attempts_count - 1], + 'max_retries': [op.max_retries, ctx.task.max_attempts] + }, + 'bootstrap_context': { + 'broker_config': bootstrap_context.broker_config('arg1', 'arg2', arg3='arg3'), + # All attribute access of cloudify_agent returns none + 'cloudify_agent': {'any': bootstrap_context.cloudify_agent.any}, + 'resources_prefix': bootstrap_context.resources_prefix + }, + 'agent': { + 'init_script': adapter.agent.init_script('arg1', 'arg2', arg3='arg3') + } + }) + + +@contextlib.contextmanager +def _adapter(ctx): + out = {} + adapter = context_adapter.CloudifyContextAdapter(ctx) + _test_common(out, ctx, adapter) + try: + yield adapter, out + finally: + try: + instance = adapter.instance + except TaskAbortException: + instance = adapter.source.instance + instance.runtime_properties['out'] = out diff --git a/azure/aria/aria-extension-cloudify/aria_extension_tests/requirements.txt b/azure/aria/aria-extension-cloudify/aria_extension_tests/requirements.txt new file mode 100644 index 0000000..bfb7074 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/aria_extension_tests/requirements.txt @@ -0,0 +1,9 @@ +https://github.com/cloudify-cosmo/cloudify-dsl-parser/archive/master.zip +https://github.com/cloudify-cosmo/cloudify-rest-client/archive/master.zip +https://github.com/cloudify-cosmo/cloudify-plugins-common/archive/master.zip + +flake8==3.4.1 +pytest==3.2.0 +pytest-cov==2.5.1 +pytest-mock==1.6.2 +pytest-xdist==1.18.2 diff --git a/azure/aria/aria-extension-cloudify/examples/aws-hello-world/aws-helloworld.yaml b/azure/aria/aria-extension-cloudify/examples/aws-hello-world/aws-helloworld.yaml new file mode 100644 index 0000000..52fd458 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/examples/aws-hello-world/aws-helloworld.yaml @@ -0,0 +1,101 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - https://raw.githubusercontent.com/cloudify-cosmo/aria-extension-cloudify/master/plugins/aws/plugin.yaml + - aria-1.0 + +node_types: + http_web_server: + derived_from: tosca.nodes.WebApplication + properties: + port: + type: integer + +topology_template: + inputs: + webserver_port: + description: The HTTP web server port + type: integer + default: 8080 + image_id: + description: AWS EC2 image id to use for the server + type: string + instance_type: + description: AWS EC2 instance type to use for the server + type: string + default: m3.medium + ssh_username: + type: string + default: ubuntu + ssh_port: + type: integer + default: 22 + private_key_path: + description: Path to the private key used to authenticate into the instance + type: string + + node_templates: + elastic_ip: + type: aria.aws.nodes.ElasticIP + + security_group: + type: aria.aws.nodes.SecurityGroup + properties: + description: Security group for Hello World VM + rules: + - ip_protocol: tcp + cidr_ip: 0.0.0.0/0 + from_port: { get_property: [ http_web_server, port ] } + to_port: { get_property: [ http_web_server, port ] } + - ip_protocol: tcp + cidr_ip: 0.0.0.0/0 + from_port: { get_input: ssh_port } + to_port: { get_input: ssh_port } + + vm: + type: aria.aws.nodes.Instance + properties: + image_id: { get_input: image_id } + instance_type: { get_input: instance_type } + name: aria-aws-hello-world-instance + parameters: + key_name: { get_attribute: [ keypair, aws_resource_id ] } + requirements: + - elastic_ip: elastic_ip + - security_group: security_group + - keypair: keypair + + keypair: + type: aria.aws.nodes.KeyPair + properties: + private_key_path: { get_input: private_key_path } + + http_web_server: + type: http_web_server + properties: + port: { get_input: webserver_port } + requirements: + - host: vm + interfaces: + Standard: + configure: + implementation: + primary: scripts/configure.sh + dependencies: + - "ssh.user > { get_input: ssh_username }" + - "ssh.key_filename > { get_input: private_key_path }" + - "ssh.address > { get_attribute: [ vm, public_ip_address ] }" + start: + implementation: + primary: scripts/start.sh + dependencies: + - "ssh.user > { get_input: ssh_username }" + - "ssh.key_filename > { get_input: private_key_path }" + - "ssh.address > { get_attribute: [ vm, public_ip_address ] }" + stop: + implementation: + primary: scripts/stop.sh + dependencies: + - "ssh.user > { get_input: ssh_username }" + - "ssh.key_filename > { get_input: private_key_path }" + - "ssh.address > { get_attribute: [ vm, public_ip_address ] }" \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/examples/aws-hello-world/images/aria-logo.png b/azure/aria/aria-extension-cloudify/examples/aws-hello-world/images/aria-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..35058447f016ea4ea8b80ea0e769e4fbb1cc3e2b GIT binary patch literal 23601 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%0A<&?1gbMC-!j_m-K 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 literal 0 HcmV?d00001 diff --git a/azure/aria/aria-extension-cloudify/examples/aws-hello-world/index.html b/azure/aria/aria-extension-cloudify/examples/aws-hello-world/index.html new file mode 100644 index 0000000..597632b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/examples/aws-hello-world/index.html @@ -0,0 +1,14 @@ + +
+ ARIA Hello World +
+ +

Hello, World!

+

+ service_template_name = {{ ctx.service_template.name }}
+ service_name = {{ ctx.service.name }}
+ node_name = {{ ctx.node.name }} +

+ + + \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/examples/aws-hello-world/scripts/configure.sh b/azure/aria/aria-extension-cloudify/examples/aws-hello-world/scripts/configure.sh new file mode 100644 index 0000000..aa3ea5f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/examples/aws-hello-world/scripts/configure.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +set -e + +TEMP_DIR=/tmp +PYTHON_FILE_SERVER_ROOT="$TEMP_DIR/python-simple-http-webserver" +INDEX_PATH=index.html +IMAGE_PATH=images/aria-logo.png + +if [ -d "$PYTHON_FILE_SERVER_ROOT" ]; then + ctx logger info [ "Removing old web server root folder: $PYTHON_FILE_SERVER_ROOT." ] + rm -rf "$PYTHON_FILE_SERVER_ROOT" +fi + +ctx logger info [ "Creating web server root folder: $PYTHON_FILE_SERVER_ROOT." ] + +mkdir -p "$PYTHON_FILE_SERVER_ROOT" +cd "$PYTHON_FILE_SERVER_ROOT" + +ctx logger info [ "Downloading service template resources..." ] +ctx download-resource-and-render [ "$PYTHON_FILE_SERVER_ROOT/index.html" "$INDEX_PATH" ] +ctx download-resource [ "$PYTHON_FILE_SERVER_ROOT/aria-logo.png" "$IMAGE_PATH" ] diff --git a/azure/aria/aria-extension-cloudify/examples/aws-hello-world/scripts/start.sh b/azure/aria/aria-extension-cloudify/examples/aws-hello-world/scripts/start.sh new file mode 100644 index 0000000..7471cfc --- /dev/null +++ b/azure/aria/aria-extension-cloudify/examples/aws-hello-world/scripts/start.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +set -e + +TEMP_DIR=/tmp +PYTHON_FILE_SERVER_ROOT="$TEMP_DIR/python-simple-http-webserver" +PID_FILE=server.pid +PORT=$(ctx node properties port) +URL="http://localhost:$PORT" + +ctx logger info [ "Starting web server at: $PYTHON_FILE_SERVER_ROOT." ] + +cd "$PYTHON_FILE_SERVER_ROOT" +nohup python -m SimpleHTTPServer "$PORT" > /dev/null 2>&1 & +echo $! > "$PID_FILE" + +server_is_up() { + if which wget >/dev/null; then + if wget "$URL" >/dev/null; then + return 0 + fi + elif which curl >/dev/null; then + if curl "$URL" >/dev/null; then + return 0 + fi + else + ctx logger error [ "Both curl and wget were not found in path." ] + exit 1 + fi + return 1 +} + +ctx logger info [ "Waiting for web server to launch on port $PORT..." ] +STARTED=false +for i in $(seq 1 15) +do + if server_is_up; then + ctx logger info [ "Web server is up." ] + STARTED=true + break + else + ctx logger info [ "Web server not up. waiting 1 second." ] + sleep 1 + fi +done + +if [ "$STARTED" = false ]; then + ctx logger error [ "Web server did not start within 15 seconds." ] + exit 1 +fi diff --git a/azure/aria/aria-extension-cloudify/examples/aws-hello-world/scripts/stop.sh b/azure/aria/aria-extension-cloudify/examples/aws-hello-world/scripts/stop.sh new file mode 100644 index 0000000..9f3bfc5 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/examples/aws-hello-world/scripts/stop.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +set -e + +TEMP_DIR=/tmp +PYTHON_FILE_SERVER_ROOT="${TEMP_DIR}/python-simple-http-webserver" +PID_FILE=server.pid +PID=$(cat "$PYTHON_FILE_SERVER_ROOT/$PID_FILE") + +ctx logger info [ "Shutting down web server, pid = ${PID}." ] +kill -9 "$PID" || exit $? + +ctx logger info [ "Removing web server root folder: $PYTHON_FILE_SERVER_ROOT." ] +rm -rf "$PYTHON_FILE_SERVER_ROOT" diff --git a/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/images/aria-logo.png b/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/images/aria-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..35058447f016ea4ea8b80ea0e769e4fbb1cc3e2b GIT binary patch literal 23601 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%0A<&?1gbMC-!j_m-K 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 literal 0 HcmV?d00001 diff --git a/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/index.html b/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/index.html new file mode 100644 index 0000000..597632b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/index.html @@ -0,0 +1,14 @@ + +
+ ARIA Hello World +
+ +

Hello, World!

+

+ service_template_name = {{ ctx.service_template.name }}
+ service_name = {{ ctx.service.name }}
+ node_name = {{ ctx.node.name }} +

+ + + \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/openstack-helloworld.yaml b/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/openstack-helloworld.yaml new file mode 100644 index 0000000..1fb031c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/openstack-helloworld.yaml @@ -0,0 +1,144 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +imports: + - https://raw.githubusercontent.com/cloudify-cosmo/aria-extension-cloudify/master/plugins/openstack/plugin.yaml + - aria-1.0 + +node_types: + web_app: + derived_from: tosca.nodes.WebApplication + properties: + port: + type: integer + default: + +topology_template: + + inputs: + ssh_username: + type: string + default: ubuntu + external_network_name: + type: string + webserver_port: + type: integer + private_key_path: + type: string + image: + type: string + flavor: + type: string + openstack_config: + type: map + entry_schema: string + + node_templates: + network: + type: aria.openstack.nodes.Network + properties: + resource_id: aria_helloworld_network + create_if_missing: true + openstack_config: { get_input: openstack_config } + + router: + type: aria.openstack.nodes.Router + properties: + external_network: { get_input: external_network_name } + create_if_missing: true + resource_id: aria_helloworld_rtr + openstack_config: { get_input: openstack_config } + + subnet: + type: aria.openstack.nodes.Subnet + properties: + resource_id: aria_helloworld_subnet + create_if_missing: true + openstack_config: { get_input: openstack_config } + requirements: + - router: router + - network: network + + port: + type: aria.openstack.nodes.Port + properties: + create_if_missing: true + resource_id: aria_helloworld_port + openstack_config: { get_input: openstack_config } + requirements: + - security_group: security_group + - subnet: subnet + - network: network + + virtual_ip: + type: aria.openstack.nodes.FloatingIP + properties: + resource_id: aria_helloworld_floatingip + create_if_missing: true + openstack_config: { get_input: openstack_config } + floatingip: + floating_network_name: { get_input: external_network_name } + + security_group: + type: aria.openstack.nodes.SecurityGroup + properties: + create_if_missing: true + resource_id: aria_helloworld_sg + openstack_config: { get_input: openstack_config } + rules: + - remote_ip_prefix: 0.0.0.0/0 + port: { get_input: webserver_port } + - port: 22 + remote_ip_prefix: 0.0.0.0/0 + + keypair: + type: aria.openstack.nodes.KeyPair + properties: + create_if_missing: true + resource_id: aria_helloworld_kp + private_key_path: { get_input: private_key_path } + openstack_config: { get_input: openstack_config } + + vm: + type: aria.openstack.nodes.Server + properties: + image: { get_input: image } + flavor: { get_input: flavor } + create_if_missing: true + resource_id: aria_helloworld_vm + management_network_name: aria_helloworld_network + openstack_config: { get_input: openstack_config } + requirements: + - floating_ip: virtual_ip + - security_group: security_group + - key_pair: keypair + - port: port + + web_app: + type: web_app + properties: + port: { get_input: webserver_port } + requirements: + - host: vm + interfaces: + Standard: + configure: + implementation: + primary: scripts/configure.sh + dependencies: + - "ssh.user > { get_input: ssh_username }" + - "ssh.key_filename > { get_input: private_key_path }" + - "ssh.address > { get_attribute: [ virtual_ip, floating_ip_address ] }" + start: + implementation: + primary: scripts/start.sh + dependencies: + - "ssh.user > { get_input: ssh_username }" + - "ssh.key_filename > { get_input: private_key_path }" + - "ssh.address > { get_attribute: [ virtual_ip, floating_ip_address ] }" + stop: + implementation: + primary: scripts/stop.sh + dependencies: + - "ssh.user > { get_input: ssh_username }" + - "ssh.key_filename > { get_input: private_key_path }" + - "ssh.address > { get_attribute: [ virtual_ip, floating_ip_address ] }" diff --git a/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/scripts/configure.sh b/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/scripts/configure.sh new file mode 100644 index 0000000..400ae71 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/scripts/configure.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +TEMP_DIR=/tmp +PYTHON_FILE_SERVER_ROOT="$TEMP_DIR/python-simple-http-webserver" +INDEX_PATH=index.html +IMAGE_PATH=images/aria-logo.png + +if [ -d "$PYTHON_FILE_SERVER_ROOT" ]; then + ctx logger info [ "Removing old web server root folder: $PYTHON_FILE_SERVER_ROOT." ] + rm -rf "$PYTHON_FILE_SERVER_ROOT" +fi + +ctx logger info [ "Creating web server root folder: $PYTHON_FILE_SERVER_ROOT." ] + +mkdir -p "$PYTHON_FILE_SERVER_ROOT" +cd "$PYTHON_FILE_SERVER_ROOT" + +ctx logger info [ "Downloading service template resources..." ] +ctx download-resource-and-render [ "$PYTHON_FILE_SERVER_ROOT/index.html" "$INDEX_PATH" ] +ctx download-resource [ "$PYTHON_FILE_SERVER_ROOT/aria-logo.png" "$IMAGE_PATH" ] diff --git a/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/scripts/start.sh b/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/scripts/start.sh new file mode 100644 index 0000000..7471cfc --- /dev/null +++ b/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/scripts/start.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +set -e + +TEMP_DIR=/tmp +PYTHON_FILE_SERVER_ROOT="$TEMP_DIR/python-simple-http-webserver" +PID_FILE=server.pid +PORT=$(ctx node properties port) +URL="http://localhost:$PORT" + +ctx logger info [ "Starting web server at: $PYTHON_FILE_SERVER_ROOT." ] + +cd "$PYTHON_FILE_SERVER_ROOT" +nohup python -m SimpleHTTPServer "$PORT" > /dev/null 2>&1 & +echo $! > "$PID_FILE" + +server_is_up() { + if which wget >/dev/null; then + if wget "$URL" >/dev/null; then + return 0 + fi + elif which curl >/dev/null; then + if curl "$URL" >/dev/null; then + return 0 + fi + else + ctx logger error [ "Both curl and wget were not found in path." ] + exit 1 + fi + return 1 +} + +ctx logger info [ "Waiting for web server to launch on port $PORT..." ] +STARTED=false +for i in $(seq 1 15) +do + if server_is_up; then + ctx logger info [ "Web server is up." ] + STARTED=true + break + else + ctx logger info [ "Web server not up. waiting 1 second." ] + sleep 1 + fi +done + +if [ "$STARTED" = false ]; then + ctx logger error [ "Web server did not start within 15 seconds." ] + exit 1 +fi diff --git a/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/scripts/stop.sh b/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/scripts/stop.sh new file mode 100644 index 0000000..9f3bfc5 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/examples/openstack-hello-world/scripts/stop.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +set -e + +TEMP_DIR=/tmp +PYTHON_FILE_SERVER_ROOT="${TEMP_DIR}/python-simple-http-webserver" +PID_FILE=server.pid +PID=$(cat "$PYTHON_FILE_SERVER_ROOT/$PID_FILE") + +ctx logger info [ "Shutting down web server, pid = ${PID}." ] +kill -9 "$PID" || exit $? + +ctx logger info [ "Removing web server root folder: $PYTHON_FILE_SERVER_ROOT." ] +rm -rf "$PYTHON_FILE_SERVER_ROOT" diff --git a/azure/aria/aria-extension-cloudify/plugins/aws/plugin.yaml b/azure/aria/aria-extension-cloudify/plugins/aws/plugin.yaml new file mode 100644 index 0000000..5912d23 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/plugins/aws/plugin.yaml @@ -0,0 +1,1754 @@ +# +# Copyright (c) 2017 GigaSpaces Technologies Ltd. All rights reserved. +# +# 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. +# + +tosca_definitions_version: tosca_simple_yaml_1_0 + +topology_template: + policies: + cloudify-aws-plugin: + description: >- + aws plugin executes operations. + type: aria.Plugin + properties: + version: 1.4.10 + + +data_types: + aria.aws.datatypes.Config: + properties: + # Partially based on: http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html + aws_access_key_id: + description: > + The ID of your AWS ACCESS KEY. + type: string + required: false + aws_secret_access_key: + description: > + The ID of your AWS SECRET KEY. + type: string + required: false + region: + description: > + This is for backward compatibility with version 1.2. + type: string + required: false + ec2_region_name: + description: > + The EC2 Region RegionName, such as us-east-1. + (Not us-east-1b, which is an availability zone, or US East, which is a Region.) + type: string + required: false + ec2_region_endpoint: + description: > + The endpoint for the given region. + type: string + required: false + elb_region_name: + description: > + The ELB Region RegionName, such as us-east-1. + (Not us-east-1b, which is an availability zone, or US East, which is a Region.) + Required for aws_config for node type aria.aws.nodes.ElasticLoadBalancer. + type: string + required: false + elb_region_endpoint: + description: > + The endpoint for the given ELB region. + type: string + required: false + + aria.aws.datatypes.Route: + properties: + # Based on: http://docs.aws.amazon.com/cli/latest/reference/ec2/create-route.html + route_table_id: + description: > + In most cases, leave this blank, because the route table is implicit from the node or + relationship that is creating the route. + type: string + required: false + destination_cidr_block: + description: > + This is the cidr_block that you want to route traffic for to the device. + type: string + gateway_id: + description: > + The id of the gateway (either internet gateway, customer gateway, or vpn gateway). + type: string + required: false + instance_id: + description: > + The id of the instance (if you are routing to a NAT instance). + type: string + required: false + interface_id: + description: > + The id of an attached network interface. + type: string + required: false + vpc_peering_connection_id: + description: > + The id of a VPC peering connection. + type: string + required: false + + aria.aws.datatypes.NetworkAclEntry: + # Based on: http://docs.aws.amazon.com/cli/latest/reference/ec2/create-network-acl-entry.html + properties: + rule_number: + description: > + Some number to identify this rule. Cannot duplicate an existing rule number. + type: integer + protocol: + description: > + The Assigned Internet Protocol Number for the protocol (e.g. 1 is ICMP, 6 is TCP, and 17 is UDP). + type: integer + rule_action: + description: Either ALLOW or DENY. + type: string + constraints: + - valid_values: [ ALLOW, DENY ] + cidr_block: + description: > + The cidr_block. + type: string + egress: + description: > + Whether the rule applies to egress traffic from the subnet. + type: boolean + default: false + required: false + icmp_type: + description: > + If in protocol you chose 1 for ICMP, the ICMP type, -1 for all ICMP types. + type: integer + required: false + icmp_code: + description: > + If in protocol you chose 1 for ICMP, the ICMP code, -1 for all ICMP codes. + type: integer + required: false + port_range_from: + description: > + The first port in the range. + type: integer + constraints: + - in_range: [ 1, 65535 ] + port_range_to: + description: > + The last port in the range. + type: integer + constraints: + - in_range: [ 1, 65535 ] + + aria.aws.datatypes.SecurityGroupRule: + # Based on: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule.html + properties: + egress: + description: > + Whether the rule applies to egress traffic. + type: boolean + default: false + required: false + ip_protocol: + description: > + The Assigned Internet Protocol Number for the protocol. + type: string + required: false + from_port: + description: > + The first port in the range. + type: integer + required: false + constraints: + - in_range: [ 1, 65535 ] + to_port: + description: > + The last port in the range. + type: integer + required: false + constraints: + - in_range: [ 1, 65535 ] + cidr_ip: + description: > + The cidr_block. + type: string + required: false + src_group_id: + description: > + The security group ID. + type: string + required: false + + aria.aws.datatypes.BlockDeviceMapping: + derived_from: tosca.datatypes.Root + properties: + # Based on: http://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html#options + virtual_name: + type: string + required: false + device_name: + type: string + required: false + ebs: + type: aria.aws.datatypes.Ebs + required: false + no_device: + type: string + required: false + + aria.aws.datatypes.Ebs: + derived_from: tosca.datatypes.Root + properties: + # Based on: http://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html#options + snapshot_id: + type: string + required: false + volume_size: + type: integer + required: false + delete_on_termination: + type: boolean + required: false + volume_type: + type: string + required: false + constraints: + - valid_values: [ standard, io1, gp2, sc1, st1] + required: false + iops: + type: integer + required: false + encrypted: + type: boolean + required: false + + aria.aws.datatypes.NetworkInterfacePrivateIPAddress: + # Based on: http://docs.aws.amazon.com/cli/latest/reference/ec2/create-network-interface.html + # Specifically, look under --private-ip-addresses, and notice the differences from + # --private-ip-address. + derived_from: tosca.datatypes.Root + properties: + private_ip_address: + type: string + required: false + primary: + type: boolean + required: false + + aria.aws.datatypes.NetworkInterface: + # Based on: http://docs.aws.amazon.com/cli/latest/reference/ec2/create-network-interface.html + derived_from: tosca.datatypes.Root + properties: + description: + type: string + required: false + dry_run: + type: boolean + required: false + groups: + type: list + entry_schema: + type: string + required: false + ipv6_address_count: + type: integer + required: false + ipv6_addresses: + type: map + entry_schema: + type: string + required: false + private_ip_address: + type: string + required: false + private_ip_addresses: + type: map + entry_schema: + type: aria.aws.datatypes.NetworkInterfacePrivateIPAddress + required: false + secondary_private_ip_address_count: + type: integer + required: false + subnet_id: + type: string + required: false + cli_input_json: + type: string + required: false + generate_cli_skeleton: + type: string + required: false + + aria.aws.datatypes.RunInstancesParameters: + derived_from: tosca.datatypes.Root + properties: + # These properties were derived from the parameters of boto.e2c.connection.run_instances: + # https://github.com/boto/boto/blob/master/boto/ec2/connection.py#L738 + # In the corresponding aws documentation, + # http://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html, + # The properties 'placement', 'placement_group' and 'tenancy' of the boto api are part of a + # structure called 'placement', in addition to 'affinity' and 'host_id' which do not exist + # in the boto api. + image_id: + type: string + required: false + min_count: + type: integer + required: false + max_count: + type: integer + required: false + key_name: + type: string + required: false + security_groups: + type: list + entry_schema: + type: string + required: false + user_data: + type: string + required: false + addressing_type: + type: string + required: false + instance_type: + type: string + required: false + placement: + type: string + required: false + kernel_id: + type: string + required: false + ramdisk_id: + type: string + required: false + monitoring_enabled: + type: boolean + required: false + subnet_id: + type: string + required: false + block_device_map: + type: list + entry_schema: + type: aria.aws.datatypes.BlockDeviceMapping + required: false + disable_api_termination: + type: boolean + required: false + instance_initiated_shutdown_behavior: + type: string + constraints: + - valid_values: [ stop, terminate ] + required: false + private_id_address: + type: string + required: false + placement_group: + type: string + required: false + client_token: + type: string + required: false + security_group_ids: + type: list + entry_schema: + type: string + required: false + additional_info: + type: string + required: false + instance_profile_name: + type: string + required: false + instance_profile_arn: + type: string + required: false + tenancy: + type: string + required: false + constraints: + - valid_values: [ default, dedicated] + ebs_optimized: + type: boolean + required: false + network_interfaces: + type: list + entry_schema: + type: aria.aws.datatypes.NetworkInterface + required: false + dry_run: + type: boolean + required: false + + aria.aws.datatypes.LoadBalancerListener: + # According to the description of the 'listeners' property of aria.aws.node.LoadBalancer + derived_from: tosca.datatypes.Root + properties: + LoadBalancerPortNumber: + type: integer + constraints: + - in_range: [ 1, 65535 ] + InstancePortNumber: + type: integer + constraints: + - in_range: [ 1, 65535 ] + protocol: + type: string + constraints: + - valid_values: [ tcp, ssl, http, https ] + SSLCertificateID: + type: string + required: false + + aria.aws.datatypes.LoadBalancerComplexListener: + # According to the description of the 'complex_listeners' property of aria.aws.node.LoadBalancer + derived_from: aria.aws.datatypes.LoadBalancerListener + properties: + InstanceProtocol: + type: integer + constraints: + - in_range: [ 1, 65535 ] + + aria.aws.datatypes.LoadBalancerHealthCheck: + # Based on: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb-health-check.html + derived_from: tosca.datatypes.Root + properties: + healthy_threshold: + type: string + required: false + interval: + type: string + required: false + target: + type: string + required: false + timeout: + type: string + required: false + unhealthy_threshold: + type: string + required: false + + aria.aws.datatypes.NetworkInterfaceCreateParameters: + # These properties were derived from the parameters of boto.e2c.connection.create_network_interface + # https://github.com/boto/boto/blob/master/boto/ec2/connection.py#L4286, that are based on: + # http://docs.aws.amazon.com/cli/latest/reference/ec2/create-network-interface.html + derived_from: tosca.datatypes.Root + properties: + subnet_id: + type: string + required: false + private_ip_address: + type: string + required: false + description: + type: string + required: false + groups: + type: list + entry_schema: + type: string + required: false + dry_run: + type: boolean + required: false + + aria.aws.datatypes.VolumeCreateParameters: + # Based on http://docs.aws.amazon.com/cli/latest/reference/ec2/create-volume.html#synopsis + derived_from: tosca.datatypes.Root + properties: + size: + type: integer + required: false + zone: + type: string + required: false + snapshot: + type: string + required: false + volume_type: + type: string + required: false + iops: + type: integer + required: false + encrypted: + type: boolean + required: false + kms_key_id: + type: string + required: false + dry_run: + type: boolean + required: false + + aria.aws.datatypes.VolumeDeleteParameters: + # Based on: http://docs.aws.amazon.com/cli/latest/reference/ec2/delete-volume.html + derived_from: tosca.datatypes.Root + properties: + volume_id: + type: string + required: false + dry_run: + type: boolean + required: false + +interface_types: + aria.aws.interfaces.Validation: + derived_from: tosca.interfaces.Root + creation: + description: > + creation operation for the aws validation interface + aria.aws.interfaces.Snapshot: + derived_from: tosca.interfaces.Root + create: + description: > + creation operation for the aws snapshot interface + + +node_types: + aria.aws.nodes.Instance: + derived_from: tosca.nodes.Compute + properties: + use_external_resource: + description: > + Indicate whether the resource exists or it should be created, + true if you are bringing an existing resource, false if you want to create it. + type: boolean + default: false + resource_id: + description: > + The AWS resource ID of the external resource, if use_external_resource is true. + Otherwise it is an empty string. + type: string + default: '' + tags: + description: > + A dictionary of key/value pairs of tags you want to add. + type: map + default: {} + entry_schema: + type: string # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html + name: + description: > + Optional field if you want to add a specific name to the instance. + type: string + default: '' + required: false + image_id: + description: > + The ID of the AMI image in your Amazon account. + type: string + instance_type: + description: > + The instance's size. + type: string + use_password: + type: boolean + default: false + parameters: + description: > + The key value pair parameters allowed by Amazon API to the + ec2.connection.EC2Connection.run_instances command. It should be mentioned that + although this field is listed as optional, A non-trivial use case requires + that both the key_name parameter and the security_groups parameter be specified. + type: aria.aws.datatypes.RunInstancesParameters + default: {} + required: false + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + required: false + attributes: + public_ip_address: + type: string + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.instance.create + start: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.instance.start + inputs: + start_retry_interval: + description: Polling interval until the server is active in seconds + type: integer + default: 30 + private_key_path: + description: > + Path to private key which matches the server's + public key. Will be used to decrypt password in case + the "use_password" property is set to "true" + type: string + default: '' + stop: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.instance.stop + delete: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.instance.delete + Validation: + type: aria.aws.interfaces.Validation + creation: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.instance.creation_validation + requirements: + - elastic_ip: + capability: tosca.capabilities.Node + node: aria.aws.nodes.ElasticIP + relationship: aria.aws.relationships.InstanceConnectedToElasticIP + occurrences: [ 0, UNBOUNDED ] + - keypair: + capability: tosca.capabilities.Node + node: aria.aws.nodes.KeyPair + relationship: aria.aws.relationships.InstanceConnectedToKeypair + occurrences: [ 0, UNBOUNDED ] + - security_group: + capability: tosca.capabilities.Node + node: aria.aws.nodes.SecurityGroup + relationship: aria.aws.relationships.instance_connected_to_security_group + occurrences: [ 0, UNBOUNDED ] + - load_balancer: + capability: tosca.capabilities.Node + node: aria.aws.nodes.ElasticLoadBalancer + relationship: aria.aws.relationships.InstanceConnectedToLoadBalancer + occurrences: [ 0, UNBOUNDED ] + - subnet_to_be_contained_in: + capability: tosca.capabilities.Node + node: aria.aws.nodes.Subnet + relationship: aria.aws.relationships.InstanceContainedInSubnet + occurrences: [ 0, UNBOUNDED ] + - subnet_to_connect_to: + capability: tosca.capabilities.Node + node: aria.aws.nodes.Subnet + relationship: aria.aws.relationships.InstanceConnectedToSubnet + occurrences: [ 0, UNBOUNDED ] + - eni: + capability: tosca.capabilities.Root + node: aria.aws.nodes.Interface + relationship: aria.aws.relationships.InstanceConnectedToENI + occurrences: [ 0, UNBOUNDED ] + + aria.aws.nodes.WindowsInstance: + derived_from: aria.aws.nodes.Instance + properties: + use_password: + type: boolean + default: true + os_family: + type: string + default: windows + + aria.aws.nodes.ElasticIP: + derived_from: tosca.nodes.Root + properties: + use_external_resource: + description: > + Indicate whether the resource exists or it should be created, + true if you are bringing an existing resource, false if you want to create it. + type: boolean + default: false + resource_id: + description: > + The AWS resource ID of the external resource, if use_external_resource is true. + Otherwise it is an empty string. + type: string + default: '' + tags: + description: > + A dictionary of key/value pairs of tags you want to add. + type: map + default: {} + entry_schema: + type: string # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html + domain: + description: > + Set this to 'vpc' if you want to use VPC. + type: string + required: false + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + required: false + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.elasticip.create + delete: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.elasticip.delete + Validation: + type: aria.aws.interfaces.Validation + creation: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.elasticip.creation_validation + + aria.aws.nodes.SecurityGroup: + derived_from: tosca.nodes.Root + properties: + use_external_resource: + description: > + Indicate whether the resource exists or it should be created, + true if you are bringing an existing resource, false if you want to create it. + type: boolean + default: false + resource_id: + description: > + The AWS resource ID of the external resource, if use_external_resource is true. + Otherwise it is an empty string. + type: string + default: '' + tags: + description: > + A dictionary of key/value pairs of tags you want to add. + type: map + default: {} + entry_schema: + type: string # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html + description: + description: > + The description field that is required for every security group that you create + in Amazon. + type: string + rules: + description: > + You need to pass in either src_group_id (security group ID) OR cidr_ip, + and then the following three: ip_protocol, from_port and to_port. + type: list + entry_schema: + type: aria.aws.datatypes.SecurityGroupRule + default: [] + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + required: false + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.securitygroup.create + start: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.securitygroup.start + delete: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.securitygroup.delete + Validation: + type: aria.aws.interfaces.Validation + creation: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.securitygroup.creation_validation + requirements: + - vpc: + capability: tosca.capabilities.Node + node: aria.aws.nodes.VPC + relationship: aria.aws.relationships.SecurityGroupContainedInVPC + occurrences: [ 0, UNBOUNDED ] + - security_group_rule: + capability: tosca.capabilities.Node + node: aria.aws.nodes.SecurityGroupRule + relationship: aria.aws.relationships.SecurityGroupUsesRule + occurrences: [ 0, UNBOUNDED ] + + aria.aws.nodes.Volume: + derived_from: tosca.nodes.Root + properties: + use_external_resource: + description: > + Indicate whether the resource exists or it should be created, + true if you are bringing an existing resource, false if you want to create it. + type: boolean + default: false + resource_id: + description: > + The AWS resource ID of the external resource, if use_external_resource is true. + Otherwise it is an empty string. + type: string + default: '' + tags: + description: > + A dictionary of key/value pairs of tags you want to add. + type: map + default: {} + entry_schema: + type: string # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html + size: + description: > + The size of the volume in GB. + type: string + zone: + description: > + A string representing the AWS availability zone. + type: string + device: + description: > + The device on the instance + type: string + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + required: false + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.ebs.create + inputs: + args: + type: map + entry_schema: + type: aria.aws.datatypes.VolumeCreateParameters + default: {} + start: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.ebs.start + delete: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.ebs.delete + inputs: + args: + type: map + entry_schema: + type: aria.aws.datatypes.VolumeDeleteParameters + default: {} + Validation: + type: aria.aws.interfaces.Validation + creation: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.ebs.creation_validation + Snapshot: + type: aria.aws.interfaces.Snapshot + create: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.ebs.create_snapshot + inputs: + args: + type: map + entry_schema: + type: string + default: {} + requirements: + - instance: + capability: tosca.capabilities.Node + node: aria.aws.nodes.Instance + relationship: aria.aws.relationships.VolumeConnectedToInstance + occurrences: [ 0, UNBOUNDED ] + + aria.aws.nodes.KeyPair: + derived_from: tosca.nodes.Root + properties: + use_external_resource: + description: > + Indicate whether the resource exists or if the resource should be created. + type: boolean + default: false + resource_id: + description: > + The AWS resource ID of the external resource, if use_external_resource is true. + If use_external_resource is false, this will be the keys name and ID in AWS. + If left blank, the plugin will set a name for you. + Otherwise it is an empty string. + type: string + default: '' + tags: + description: > + A dictionary of key/value pairs of tags you want to add. + type: map + default: {} + entry_schema: + type: string # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html + private_key_path: + description: > + The path where the key should be saved on the machine. If this is a bootstrap + process, this refers to the local computer. If this will run on the manager, + this will be saved on the manager. + type: string + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + required: false + attributes: + aws_resource_id: + type: string + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.keypair.create + delete: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.keypair.delete + Validation: + type: aria.aws.interfaces.Validation + creation: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.keypair.creation_validation + + aria.aws.nodes.ElasticLoadBalancer: + derived_from: tosca.nodes.LoadBalancer + properties: + use_external_resource: + description: > + Indicate whether the resource exists or it should be created, + true if you are bringing an existing resource, false if you want to create it. + type: boolean + default: false + resource_id: + description: > + The AWS resource ID of the external resource, if use_external_resource is true. + Otherwise it is an empty string. + type: string + default: '' + tags: + description: > + A dictionary of key/value pairs of tags you want to add. + type: map + default: {} + entry_schema: + type: string # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html + elb_name: + description: > + The mnemonic name associated with the new load balancer + type: string + zones: + description: > + zones (List of strings) - The names of the availability zone(s) to add. + example: ['us-east-1b','us-east-1b'] + type: string + security_groups: + description: > + security_groups (list of strings) - The security groups assigned to your LoadBalancer + within your VPC. + example: ['sg-123456','sg-7891011'] + FYI: security groups only supported with vpc + type: list + entry_schema: + type: string + default: [] + required: false + listeners: + description: > + listeners (List of tuples) - Each tuple contains three or four values, (LoadBalancerPortNumber, + InstancePortNumber, Protocol, [SSLCertificateId]) where LoadBalancerPortNumber and + InstancePortNumber are integer values between 1 and 65535, Protocol is a string containing + either 'TCP', 'SSL', 'HTTP', or 'HTTPS'; SSLCertificateID is the ARN of a AWS IAM certificate, + and must be specified when doing HTTPS. + example: [[80, 8080, 'http'], [443, 8443, 'tcp']] + type: list + entry_schema: + type: aria.aws.datatypes.LoadBalancerListener + health_checks: + description: > + list of healthchecks (dicts) to use as criteria for instance health + example: [{'target': 'HTTP:8080/health'}, {'target': 'HTTP:80/alive'}] + type: list + entry_schema: + type: aria.aws.datatypes.LoadBalancerHealthCheck + default: [] + required: false + scheme: + description: > + The type of a LoadBalancer. By default, Elastic Load Balancing creates an internet-facing + LoadBalancer with a publicly resolvable DNS name, which resolves to public IP addresses. + Specify the value internal for this option to create an internal LoadBalancer with a DNS + name that resolves to private IP addresses. + This option is only available for LoadBalancers attached to an Amazon VPC. + type: string + default: '' + required: false + subnets: + description: > + list of strings - A list of subnet IDs in your VPC to attach to your LoadBalancer. + example: + type: list + entry_schema: + type: string + default: [] + required: false + complex_listeners: + description: > + List of tuples - Each tuple contains four or five values, (LoadBalancerPortNumber, + InstancePortNumber, Protocol, InstanceProtocol, SSLCertificateId). + Where: + LoadBalancerPortNumber and InstancePortNumber are integer values between 1 and 65535 + Protocol and InstanceProtocol is a string containing either 'TCP', 'SSL', 'HTTP', or 'HTTPS' + SSLCertificateId is the ARN of an SSL certificate loaded into AWS IAM + type: list + entry_schema: + type: aria.aws.datatypes.LoadBalancerComplexListener + default: [] + required: false + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + required: false + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.elasticloadbalancer.create + start: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.elasticloadbalancer.start + delete: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.elasticloadbalancer.delete + Validation: + type: aria.aws.interfaces.Validation + creation: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.elasticloadbalancer.creation_validation + + aria.aws.nodes.VPC: + derived_from: tosca.nodes.network.Network + properties: + use_external_resource: + description: > + Indicate whether the resource exists or it should be created, + true if you are bringing an existing resource, false if you want to create it. + type: boolean + default: false + resource_id: + description: > + The AWS resource ID of the external resource, if use_external_resource is true. + Otherwise it is an empty string. + type: string + default: '' + tags: + description: > + A dictionary of key/value pairs of tags you want to add. + type: map + default: {} + entry_schema: + type: string # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html + cidr_block: + description: > + The CIDR Block that you will split this VPCs subnets across. + type: string + instance_tenancy: + description: > + Default or dedicated. + type: string + default: default + required: false + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + required: false + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.vpc.create_vpc + start: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.vpc.start + delete: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.vpc.delete + Validation: + type: aria.aws.interfaces.Validation + creation: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.vpc.creation_validation + requirements: + - vpc: + capability: tosca.capabilities.Node + node: aria.aws.nodes.VPC + relationship: aria.aws.relationships.RouteTableOfSourceVPCConnectedToTargetPeerVPC + occurrences: [ 0, UNBOUNDED ] + + aria.aws.nodes.Subnet: + derived_from: tosca.nodes.Root + properties: + use_external_resource: + description: > + Indicate whether the resource exists or it should be created, + true if you are bringing an existing resource, false if you want to create it. + type: boolean + default: false + resource_id: + description: > + The AWS resource ID of the external resource, if use_external_resource is true. + Otherwise it is an empty string. + type: string + default: '' + tags: + description: > + A dictionary of key/value pairs of tags you want to add. + type: map + default: {} + entry_schema: + type: string # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html + cidr_block: + description: > + The CIDR Block that instances will be on. + type: string + availability_zone: + description: > + The availability zone that you want your subnet in. + type: string + default: '' + required: false + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + required: false + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.subnet.create_subnet + start: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.subnet.start_subnet + delete: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.subnet.delete_subnet + Validation: + type: aria.aws.interfaces.Validation + creation: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.subnet.creation_validation + requirements: + - vpc: + capability: tosca.capabilities.Node + node: aria.aws.nodes.VPC + relationship: aria.aws.relationships.SubnetContainedInVPC + occurrences: [ 0, UNBOUNDED ] + + aria.aws.nodes.Gateway: + derived_from: tosca.nodes.Root + properties: + use_external_resource: + description: > + Indicate whether the resource exists or it should be created, + true if you are bringing an existing resource, false if you want to create it. + type: boolean + default: false + resource_id: + description: > + The AWS resource ID of the external resource, if use_external_resource is true. + Otherwise it is an empty string. + type: string + default: '' + tags: + description: > + A dictionary of key/value pairs of tags you want to add. + type: map + default: {} + entry_schema: + type: string # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + required: false + interfaces: + Validation: + type: aria.aws.interfaces.Validation + creation: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.creation_validation + requirements: + - vpc: + capability: tosca.capabilities.Node + node: aria.aws.nodes.VPC + relationship: aria.aws.relationships.GatewayConnectedToVPC + occurrences: [ 0, UNBOUNDED ] + + aria.aws.nodes.InternetGateway: + derived_from: aria.aws.nodes.Gateway + properties: + cidr_block: + description: > + The cidr_block that you want this internet gateway to service. Default is for all internet + traffic. + type: string + default: '0.0.0.0/0' + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.create_internet_gateway + start: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.start_internet_gateway + delete: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.delete_internet_gateway + + aria.aws.nodes.VPNGateway: + derived_from: aria.aws.nodes.Gateway + properties: + type: + description: > + Type of VPN Connection. Only valid value currently is ipsec.1 + type: string + default: ipsec.1 + availability_zone: + description: > + The Availability Zone where you want the VPN gateway. + type: string + default: '' + required: false + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.create_vpn_gateway + start: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.start_vpn_gateway + delete: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.delete_vpn_gateway + + aria.aws.nodes.CustomerGateway: + derived_from: aria.aws.nodes.Gateway + properties: + type: + description: > + Type of VPN Connection. Only valid value currently is ipsec.1 + type: string + default: ipsec.1 + ip_address: + description: > + Internet-routable IP address for customers gateway. Must be a static address + type: string + bgp_asn: + description: > + Customer gateways Border Gateway Protocol (BGP) Autonomous System Number (ASN) + type: integer + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.create_customer_gateway + start: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.start_customer_gateway + delete: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.delete_customer_gateway + requirements: + - vpn_gateway: + capability: tosca.capabilities.Node + node: aria.aws.nodes.VPNGateway + relationship: aria.aws.relationships.CustomerGatewayConnectedToVPNGateway + occurrences: [ 0, UNBOUNDED ] + + aria.aws.nodes.ACL: + derived_from: tosca.nodes.Root + properties: + use_external_resource: + description: > + Indicate whether the resource exists or it should be created, + true if you are bringing an existing resource, false if you want to create it. + type: boolean + default: false + resource_id: + description: > + The AWS resource ID of the external resource, if use_external_resource is true. + Otherwise it is an empty string. + type: string + default: '' + tags: + description: > + A dictionary of key/value pairs of tags you want to add. + type: map + default: {} + entry_schema: + type: string # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html + acl_network_entries: + description: > + A list of rules of data type aria.datatypes.aws.NetworkAclEntry (see above). + type: list + entry_schema: + type: aria.aws.datatypes.NetworkAclEntry + default: [] + required: false + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + required: false + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.networkacl.create_network_acl + start: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.networkacl.start_network_acl + delete: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.networkacl.delete_network_acl + Validation: + type: aria.aws.interfaces.Validation + creation: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.networkacl.creation_validation + requirements: + - vpc: + capability: tosca.capabilities.Node + node: aria.aws.nodes.VPC + relationship: aria.aws.relationships.NetworkACLContainedInVPC + occurrences: [ 0, UNBOUNDED ] + - subnet: + capability: tosca.capabilities.Node + node: aria.aws.nodes.Subnet + relationship: aria.aws.relationships.NetworkACLAssociatedWithSubnet + occurrences: [ 0, UNBOUNDED ] + + aria.aws.nodes.DHCPOptions: + derived_from: tosca.nodes.Root + properties: + use_external_resource: + description: > + Indicate whether the resource exists or it should be created, + true if you are bringing an existing resource, false if you want to create it. + type: boolean + default: false + resource_id: + description: > + The AWS resource ID of the external resource, if use_external_resource is true. + Otherwise it is an empty string. + type: string + default: '' + tags: + description: > + A dictionary of key/value pairs of tags you want to add. + type: map + default: {} + entry_schema: + type: string # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html + domain_name: + description: > + A domain name. + type: string + required: false + domain_name_servers: + description: > + A list of up to four DNS servers. + type: list + entry_schema: + type: string + default: [] + required: false + ntp_servers: + description: > + A list of up to four NTP servers. + type: list + entry_schema: + type: string + default: [] + required: false + netbios_name_servers: + description: > + A list of up to four netbios servers. + type: list + entry_schema: + type: string + default: [] + required: false + netbios_node_type: + description: > + netbios type. recommended two. + type: string + default: '' + required: false + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + required: false + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.dhcp.create_dhcp_options + start: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.dhcp.start_dhcp_options + delete: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.dhcp.delete_dhcp_options + Validation: + type: aria.aws.interfaces.Validation + creation: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.dhcp.creation_validation + requirements: + - vpc: + capability: tosca.capabilities.Node + node: aria.aws.nodes.VPC + relationship: aria.aws.relationships.DHCPOptionsAssociatedWithVPC + occurrences: [ 0, UNBOUNDED ] + + aria.aws.nodes.RouteTable: + derived_from: tosca.nodes.Root + properties: + use_external_resource: + description: > + Indicate whether the resource exists or it should be created, + true if you are bringing an existing resource, false if you want to create it. + type: boolean + default: false + required: true + resource_id: + description: > + The AWS resource ID of the external resource, if use_external_resource is true. + Otherwise it is an empty string. + type: string + default: '' + tags: + description: > + A dictionary of key/value pairs of tags you want to add. + type: map + default: {} + entry_schema: + type: string # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + required: false + interfaces: + Standard: + create: + implementation: cloudify_aws.vpc.routetable.create_route_table + inputs: + routes: + description: > + A list of aria.aws.datatypes.Route. + type: list + entry_schema: + type: aria.aws.datatypes.Route + default: [] + start: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.routetable.start_route_table + delete: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.routetable.delete_route_table + Validation: + type: aria.aws.interfaces.Validation + creation: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.routetable.creation_validation + requirements: + - vpc: + capability: tosca.capabilities.Node + node: aria.aws.nodes.VPC + relationship: aria.aws.relationships.SubnetContainedInVPC + occurrences: [ 0, UNBOUNDED ] + - subnet: + capability: tosca.capabilities.Node + node: aria.aws.nodes.Subnet + relationship: aria.aws.relationships.RoutetableAssociatedWithSubnet + occurrences: [ 0, UNBOUNDED ] + - gateway: + capability: tosca.capabilities.Node + node: aria.aws.nodes.Gateway + relationship: aria.aws.relationships.RouteTableToGateway + occurrences: [ 0, UNBOUNDED ] + + aria.aws.nodes.Interface: + derived_from: tosca.nodes.network.Port + properties: + use_external_resource: + description: > + Indicate whether the resource exists or it should be created, + true if you are bringing an existing resource, false if you want to create it. + type: boolean + default: false + resource_id: + description: > + The AWS resource ID of the external resource, if use_external_resource is true. + Otherwise it is an empty string. + type: string + default: '' + tags: + description: > + A dictionary of key/value pairs of tags you want to add. + type: map + default: {} + entry_schema: + type: string # http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html + parameters: + description: > + Any parameters accepted by the create_network_interface operation. + type: aria.aws.datatypes.NetworkInterfaceCreateParameters + required: false + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + required: false + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.eni.create + inputs: + args: + type: aria.aws.datatypes.NetworkInterfaceCreateParameters + default: {} + start: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.eni.start + delete: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.eni.delete + inputs: + args: + type: map + entry_schema: + type: string + default: {} + requirements: + - instance: + capability: tosca.capabilities.Node + node: aria.aws.nodes.Instance + relationship: aria.aws.relationships.ENIConnectedToInstance + occurrences: [ 0, UNBOUNDED ] + + aria.aws.nodes.SecurityGroupRule: + derived_from: tosca.nodes.Root + properties: + use_external_resource: + type: boolean + default: False + resource_id: + description: > + The resource ID. + type: string + default: '' + required: false + rule: + description: > + A list of rules of data type aria.aws.datatypes.SecurityGroupRule (see above). + type: list + entry_schema: + type: aria.aws.datatypes.SecurityGroupRule + default: [] + required: false + aws_config: + description: > + A dictionary of values to pass to authenticate with the AWS API. + type: aria.aws.datatypes.Config + requirements: + - security_group_to_depend_on: + capability: tosca.capabilities.Node + node: aria.aws.nodes.SecurityGroup + relationship: aria.aws.relationships.RuleDependsOnSecurityGroup + occurrences: [ 0, UNBOUNDED ] + - security_group_to_be_contained_in: + capability: tosca.capabilities.Node + node: aria.aws.nodes.SecurityGroup + relationship: aria.aws.relationships.RuleContainedInSecurityGroup + occurrences: [ 0, UNBOUNDED ] + + aria.aws.nodes.SecurityGroupRule.Multi: + derived_from: aria.aws.nodes.SecurityGroupRule + interfaces: + Standard: + create: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.securitygroup.create_rule + inputs: + args: + type: map + entry_schema: + type: aria.aws.datatypes.SecurityGroupRule + default: {} + delete: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.securitygroup.delete_rule + inputs: + args: + type: map + entry_schema: + type: aria.aws.datatypes.SecurityGroupRule + default: {} + + +relationship_types: + aria.aws.relationships.ConnectedToElasticIP: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_source: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.elasticip.associate + remove_source: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.elasticip.disassociate + + aria.aws.relationships.InstanceConnectedToElasticIP: + derived_from: aria.aws.relationships.ConnectedToElasticIP + + aria.aws.relationships.InstanceConnectedToKeypair: + derived_from: tosca.relationships.ConnectsTo + + aria.aws.relationships.ConnectedToSecurityGroup: + derived_from: tosca.relationships.ConnectsTo + + # The name of this relationship is not in CamelCase since in order to attach security group to an + # instance using the Cloudify AWS plugin, the relationship between the instance and the security + # group must be include the string 'instance_connected_to_security_group' in its name. + aria.aws.relationships.instance_connected_to_security_group: + derived_from: aria.aws.relationships.ConnectedToSecurityGroup + + aria.aws.relationships.InstanceConnectedToLoadBalancer: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_source: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.elasticloadbalancer.associate + remove_source: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.elasticloadbalancer.disassociate + + aria.aws.relationships.VolumeConnectedToInstance: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_source: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.ebs.associate + inputs: + args: + type: map + entry_schema: + type: string + default: {} + force: + type: boolean + default: False + remove_source: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.ebs.disassociate + inputs: + args: + type: map + entry_schema: + type: string + default: {} + force: + type: boolean + default: False + + aria.aws.relationships.SubnetContainedInVPC: + derived_from: tosca.relationships.HostedOn + + aria.aws.relationships.RoutetableContainedInVPC: + derived_from: tosca.relationships.HostedOn + + aria.aws.relationships.RoutetableAssociatedWithSubnet: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.routetable.associate_route_table + remove_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.routetable.disassociate_route_table + + aria.aws.relationships.RouteTableToGateway: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.routetable.create_route_to_gateway + inputs: + destination_cidr_block: + description: > + Provide a specific value for the destination cidr block. + If the target is an internet gateway, then this is not necessary. + It will resolve to the cidr_block node property. + Otherwise, you need to provide this value. + type: string + default: '' + remove_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.routetable.delete_route_from_gateway + + aria.aws.relationships.GatewayConnectedToVPC: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.attach_gateway + remove_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.detach_gateway + + aria.aws.relationships.NetworkACLContainedInVPC: + derived_from: tosca.relationships.HostedOn + + aria.aws.relationships.NetworkACLAssociatedWithSubnet: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.networkacl.associate_network_acl + remove_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.networkacl.disassociate_network_acl + + aria.aws.relationships.RouteTableOfSourceVPCConnectedToTargetPeerVPC: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + pre_configure_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.vpc.create_vpc_peering_connection + inputs: + target_account_id: + description: > + The 12 digit account ID that the target VPC belongs to. + type: string + default: '' + routes: + description: > + A list of aria.aws.datatypes.Route for assignment to the source Route Table. + type: list + entry_schema: + type: aria.aws.datatypes.Route + default: [] + post_configure_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.vpc.accept_vpc_peering_connection + remove_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.vpc.delete_vpc_peering_connection + + aria.aws.relationships.DHCPOptionsAssociatedWithVPC: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.dhcp.associate_dhcp_options + remove_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.dhcp.restore_dhcp_options + + aria.aws.relationships.CustomerGatewayConnectedToVPNGateway: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.create_vpn_connection + inputs: + routes: + description: > + A list of static routes to add to this vpn_connection. + The routes will be of type aria.aws.datatypes.Route. + However, you can only provide the destination_cidr_block and a vpn_connection_id. + type: list + entry_schema: + type: aria.aws.datatypes.Route + default: [] + remove_target: + implementation: cloudify-aws-plugin > cloudify_aws.vpc.gateway.delete_vpn_connection + + aria.aws.relationships.InstanceContainedInSubnet: + derived_from: tosca.relationships.HostedOn + + aria.aws.relationships.InstanceConnectedToSubnet: + derived_from: tosca.relationships.ConnectsTo + + aria.aws.relationships.SecurityGroupContainedInVPC: + derived_from: tosca.relationships.HostedOn + + aria.aws.relationships.ConnectedToSubnet: # ARIA NOTE: I don't see a use for this relationship + derived_from: tosca.relationships.ConnectsTo + + aria.aws.relationships.ENIConnectedToInstance: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_source: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.eni.associate + inputs: + args: + type: map + entry_schema: + type: string + default: {} + remove_source: + implementation: cloudify-aws-plugin > cloudify_aws.ec2.eni.disassociate + inputs: + args: + type: map + entry_schema: + type: string + default: {} + + aria.aws.relationships.InstanceConnectedToENI: + derived_from: tosca.relationships.ConnectsTo + + aria.aws.relationships.SecurityGroupUsesRule: + derived_from: tosca.relationships.DependsOn + + aria.aws.relationships.RuleDependsOnSecurityGroup: + derived_from: tosca.relationships.DependsOn + + aria.aws.relationships.RuleContainedInSecurityGroup: + derived_from: tosca.relationships.HostedOn diff --git a/azure/aria/aria-extension-cloudify/plugins/openstack/plugin.yaml b/azure/aria/aria-extension-cloudify/plugins/openstack/plugin.yaml new file mode 100644 index 0000000..8f3e6e6 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/plugins/openstack/plugin.yaml @@ -0,0 +1,1174 @@ +# +# Copyright (c) 2017 GigaSpaces Technologies Ltd. All rights reserved. +# +# 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. +# +tosca_definitions_version: tosca_simple_yaml_1_0 + + +topology_template: + policies: + cloudify-openstack-plugin: + description: >- + openstack plugin executes operations. + type: aria.Plugin + properties: + version: 2.0.1 + + +data_types: + + aria.openstack.datatypes.Config: + description: >- + openstack configuration + properties: + username: + type: string + password: + type: string + tenant_name: + type: string + auth_url: + type: string + region: + type: string + required: false + nova_url: + type: string + required: false + neutron_url: + type: string + required: false + + aria.openstack.datatypes.Rules: + description: >- + openstack security group rules + properties: + remote_ip_prefix: + type: string + default: 0.0.0.0/0 + port: + type: integer + default: + + # source: https://developer.openstack.org/api-ref/compute/ + + aria.openstack.datatypes.Server: + description: >- + openstack Server args. + properties: + security_groups: + type: list + entry_schema: string + required: false + availability_zone: + type: string + required: false + userdata: + type: string + required: false + + aria.openstack.datatypes.Keypair: + description: >- + openstack keypair args. + properties: + public_key: + type: string + required: false + type: + type: string + required: false + user_id: + type: string + required: false + + # source: https://developer.openstack.org/api-ref/block-storage/v2/index.html + + aria.openstack.datatypes.Volume: + description: >- + openstack volume args. + properties: + size: + type: integer + required: false + description: + type: string + required: false + availability_zone: + type: string + required: false + consistencygroup_id: + type: string + required: false + volume_type: + type: string + required: false + snapshot_id: + type: string + required: false + source_replica: + type: string + required: false + tenant_id: + type: string + required: false + + # source: https://developer.openstack.org/api-ref/image/ + + aria.openstack.datatypes.Image: + description: >- + openstack image args. + properties: + id: + type: string + required: false + min_disk: + type: integer + required: false + min_ram: + type: integer + required: false + name: + type: string + required: false + protected: + type: boolean + required: false + tags: + type: list + entry_schema: string + required: false + visibility: + type: string + required: false + + # source: https://developer.openstack.org/api-ref/identity/v3/ + + aria.openstack.datatypes.Project: + description: >- + openstack image args. + properties: + is_domain: + type: boolean + required: false + description: + type: string + required: false + domain_id: + type: string + required: false + name: + type: string + required: false + enabled: + type: boolean + required: false + parent_id: + type: string + required: false + + # source: https://developer.openstack.org/api-ref/networking/v2/index.html + + aria.openstack.datatypes.Subnet: + description: >- + openstack subnet args. + properties: + network_id: + type: string + required: false + ip_version: + type: integer + required: false + default: 4 + cidr: + type: string + required: false + gateway_ip: + type: string + required: false + dns_nameservers: + type: list + entry_schema: string + required: false + enable_dhcp: + type: boolean + required: false + tenant_id: + type: string + required: false + + aria.openstack.datatypes.Port: + description: >- + openstack port args + properties: + network_id: + type: string + required: false + admin_state_up: + type: boolean + required: false + status: + type: string + required: false + mac_address: + type: string + required: false + device_id: + type: string + required: false + device_owner: + type: string + required: false + tenant_id: + type: string + required: false + + aria.openstack.datatypes.Network: + description: >- + openstack network args + properties: + admin_state_up: + type: boolean + required: false + status: + type: string + required: false + subnets: + type: list + entry_schema: string + required: false + shared: + type: boolean + required: false + tenant_id: + type: string + required: false + + aria.openstack.datatypes.SecurityGroup: + description: >- + openstack network args + properties: + admin_state_up: + type: boolean + required: false + port_security_enabled: + type: boolean + required: false + project_id: + type: string + required: false + qos_policy_id: + type: string + required: false + segments: + type: list + entry_schema: string + required: false + shared: + type: boolean + required: false + vlan_transparent: + type: boolean + required: false + tenant_id: + type: string + required: false + + aria.openstack.datatypes.Router: + description: >- + openstack network args + properties: + bgpvpn_id: + type: string + required: false + router_id: + type: string + required: false + + aria.openstack.datatypes.FloatingIP: + description: >- + openstack network args + properties: + tenant_id: + type: string + required: false + project_id: + type: string + required: false + floating_network_id: + type: string + required: false + floating_network_name: + type: string + required: false + fixed_ip_address: + type: string + required: false + floating_ip_address: + type: string + required: false + port_id: + type: string + required: false + subnet_id: + type: string + required: false + + +interface_types: + + aria.openstack.interfaces.validation: + derived_from: tosca.interfaces.Root + creation: + description: >- + creation operation for the openstack validation interface + deletion: + description: >- + deletion operation for the openstack validation interface + + +node_types: + + aria.openstack.nodes.Server: + derived_from: tosca.nodes.Compute + properties: + server: + default: {} + type: aria.openstack.datatypes.Server + required: false + ip: + default: + type: string + os_family: + description: >- + Property specifying what type of operating system family + this compute node will run. + default: linux + type: string + use_external_resource: + type: boolean + default: false + description: >- + a boolean for setting whether to create the resource or use an existing one. + See the using existing resources section. + create_if_missing: + default: false + type: boolean + description: >- + If use_external_resource is ``true`` and the resource is missing, + create it instead of failing. + resource_id: + default: '' + type: string + description: >- + name to give to the new resource or the name or ID of an existing resource when the ``use_external_resource`` property is set to ``true`` (see the using existing resources section). Defaults to '' (empty string). + image: + default: '' + type: string + description: >- + The image for the server. + May receive either the ID or the name of the image. + note: This property is currently optional for backwards compatibility, + but will be modified to become a required property in future versions + (Default: ''). + flavor: + default: '' + type: string + description: >- + The flavor for the server. + May receive either the ID or the name of the flavor. + note: This property is currently optional for backwards compatibility, + but will be modified to become a required property in future versions + (Default: ''). + use_password: + default: false + type: boolean + description: >- + A boolean describing whether this server image supports user-password authentication. + Images that do should post the administrator user's password to the Openstack metadata service (e.g. via cloudbase); + The password would then be retrieved by the plugin, + decrypted using the server's keypair and then saved in the server's runtime properties. + management_network_name: + type: string + description: >- + The current implementation of the openstack plugin requires this field. The value of + this field should be set to the openstack name of a network this server is attached to. + openstack_config: + type: aria.openstack.datatypes.Config + required: false + description: >- + see Openstack Configuraion + interfaces: + Standard: + create: + implementation: cloudify-openstack-plugin > nova_plugin.server.create + inputs: + args: + required: false + default: {} + type: aria.openstack.datatypes.Server + start: + implementation: cloudify-openstack-plugin > nova_plugin.server.start + inputs: + start_retry_interval: + default: 30 + type: integer + private_key_path: + type: string + default: '' + required: true + stop: cloudify-openstack-plugin > nova_plugin.server.stop + delete: cloudify-openstack-plugin > nova_plugin.server.delete + Validation: + type: aria.openstack.interfaces.validation + creation: + implementation: cloudify-openstack-plugin > nova_plugin.server.creation_validation + inputs: + args: + required: false + default: {} + type: aria.openstack.datatypes.Server + + requirements: + - floating_ip: + capability: tosca.capabilities.Node + node: aria.openstack.nodes.FloatingIP + relationship: aria.openstack.server_connected_to_floating_ip + occurrences: [ 0, UNBOUNDED ] + - security_group: + capability: tosca.capabilities.Node + node: aria.openstack.nodes.SecurityGroup + relationship: aria.openstack.server_connected_to_security_group + occurrences: [ 0, UNBOUNDED ] + - port: + capability: tosca.capabilities.Node + node: aria.openstack.nodes.Port + relationship: aria.openstack.server_connected_to_port + occurrences: [ 0, UNBOUNDED ] + - key_pair: + capability: tosca.capabilities.Node + node: aria.openstack.nodes.KeyPair + relationship: aria.openstack.server_connected_to_keypair + occurrences: [ 0, UNBOUNDED ] + capabilities: + openstack_container: + type: Node + + aria.openstack.nodes.WindowsServer: + derived_from: aria.openstack.nodes.Server + properties: + use_password: + default: true + type: boolean + description: >- + Default changed for derived type + because Windows instances need a password for agent installation + os_family: + default: windows + type: string + description: >- + (updates the os_family default as a convenience) + + aria.openstack.nodes.KeyPair: + derived_from: tosca.nodes.Root + properties: + keypair: + default: {} + type: aria.openstack.datatypes.Keypair + required: false + description: >- + the path (on the machine the plugin is running on) to + where the private key should be stored. If + use_external_resource is set to "true", the existing + private key is expected to be at this path. + private_key_path: + description: > + the path (on the machine the plugin is running on) to + where the private key should be stored. If + use_external_resource is set to "true", the existing + private key is expected to be at this path. + type: string + use_external_resource: + type: boolean + default: false + description: >- + a boolean describing whether this resource should be + created or rather that it already exists on Openstack + and should be used as-is. + create_if_missing: + default: false + type: boolean + description: >- + If use_external_resource is ``true`` and the resource is missing, + create it instead of failing. + resource_id: + default: '' + type: string + description: >- + the name that will be given to the resource on Openstack (excluding optional prefix). + If not provided, a default name will be given instead. + If use_external_resource is set to "true", this exact + value (without any prefixes applied) will be looked for + as either the name or id of an existing keypair to be used. + openstack_config: + type: aria.openstack.datatypes.Config + required: false + interfaces: + Standard: + create: + implementation: cloudify-openstack-plugin > nova_plugin.keypair.create + inputs: + args: + required: false + default: {} + type: aria.openstack.datatypes.Keypair + + delete: cloudify-openstack-plugin > nova_plugin.keypair.delete + + Validation: + type: aria.openstack.interfaces.validation + creation: cloudify-openstack-plugin > nova_plugin.keypair.creation_validation + + capabilities: + keypair: + type: tosca.capabilities.Node + + aria.openstack.nodes.Subnet: + derived_from: tosca.nodes.Root + properties: + subnet: + type: aria.openstack.datatypes.Subnet + required: false + default: + cidr: 172.16.0.0/16 + use_external_resource: + type: boolean + default: false + description: >- + a boolean for setting whether to create the resource or use an existing one. + See the using existing resources section. + create_if_missing: + default: false + type: boolean + description: >- + If use_external_resource is ``true`` and the resource is missing, + create it instead of failing. + resource_id: + default: '' + type: string + description: >- + name to give to the new resource or the name or ID of an existing resource when the ``use_external_resource`` property is set to ``true`` (see the using existing resources section). Defaults to '' (empty string). + openstack_config: + type: aria.openstack.datatypes.Config + required: false + interfaces: + Standard: + create: + implementation: cloudify-openstack-plugin > neutron_plugin.subnet.create + inputs: + args: + required: false + type: aria.openstack.datatypes.Subnet + default: + cidr: 172.16.0.0/16 + delete: cloudify-openstack-plugin > neutron_plugin.subnet.delete + Validation: + type: aria.openstack.interfaces.validation + creation: + implementation: cloudify-openstack-plugin > neutron_plugin.subnet.creation_validation + inputs: + args: + type: aria.openstack.datatypes.Subnet + required: false + default: + cidr: 172.16.0.0/16 + + requirements: + - router: + capability: tosca.capabilities.Node + node: aria.openstack.nodes.Router + relationship: aria.openstack.subnet_connected_to_router + occurrences: [ 0, UNBOUNDED ] + - network: + capability: tosca.capabilities.Node + node: aria.openstack.nodes.Network + capabilities: + subnet: + type: tosca.capabilities.Node + + aria.openstack.nodes.SecurityGroup: + derived_from: tosca.nodes.Root + properties: + security_group: + type: aria.openstack.datatypes.SecurityGroup + required: false + default: {} + description: + type: string + default: '' + description: >- + SecurityGroup description. + create_if_missing: + default: false + type: boolean + description: >- + If use_external_resource is ``true`` and the resource is missing, + create it instead of failing. + use_external_resource: + type: boolean + default: false + description: >- + a boolean for setting whether to create the resource or use an existing one. + See the using existing resources section. + resource_id: + default: '' + type: string + description: >- + name to give to the new resource or the name or ID of an existing resource when the ``use_external_resource`` property is set to ``true`` (see the using existing resources section). Defaults to '' (empty string). + openstack_config: + type: aria.openstack.datatypes.Config + required: false + rules: + default: [] + type: list + entry_schema: aria.openstack.datatypes.Rules + disable_default_egress_rules: + default: false + type: boolean + description: >- + a flag for removing the default rules which https://wiki.openstack.org/wiki/Neutron/SecurityGroups#Behavior. If not set to `true`, these rules will remain, and exist alongside any additional rules passed using the `rules` property. + interfaces: + Standard: + create: + implementation: cloudify-openstack-plugin > neutron_plugin.security_group.create + inputs: + args: + type: aria.openstack.datatypes.SecurityGroup + required: false + default: {} + delete: cloudify-openstack-plugin > neutron_plugin.security_group.delete + + Validation: + type: aria.openstack.interfaces.validation + creation: cloudify-openstack-plugin > neutron_plugin.security_group.creation_validation + + capabilities: + security: + type: tosca.capabilities.Node + + aria.openstack.nodes.Router: + derived_from: tosca.nodes.Root + properties: + router: + type: aria.openstack.datatypes.Router + required: false + default: {} + external_network: + default: '' + type: string + description: >- + An external network name or ID. + If given, the router will use this external network as a gateway. + use_external_resource: + type: boolean + default: false + description: >- + a boolean for setting whether to create the resource or use an existing one. + See the using existing resources section. + create_if_missing: + default: false + type: boolean + description: >- + If use_external_resource is ``true`` and the resource is missing, + create it instead of failing. + resource_id: + default: '' + description: >- + name to give to the new resource or the name or ID of an existing resource when the ``use_external_resource`` property is set to ``true`` (see the using existing resources section). Defaults to '' (empty string). + type: string + openstack_config: + type: aria.openstack.datatypes.Config + required: false + + interfaces: + Standard: + create: + implementation: cloudify-openstack-plugin > neutron_plugin.router.create + inputs: + args: + default: {} + type: aria.openstack.datatypes.Router + required: false + delete: cloudify-openstack-plugin > neutron_plugin.router.delete + Validation: + type: aria.openstack.interfaces.validation + creation: cloudify-openstack-plugin > neutron_plugin.router.creation_validation + + capabilities: + gateway: + type: tosca.capabilities.Node + + aria.openstack.nodes.Port: + derived_from: tosca.nodes.Root + properties: + port: + type: aria.openstack.datatypes.Port + required: false + default: {} + fixed_ip: + default: '' + type: string + description: >- + may be used to request a specific fixed IP for the port. + If the IP is unavailable + (either already taken or does not belong to a subnet the port is on) + an error will be raised. + use_external_resource: + type: boolean + default: false + description: >- + a boolean for setting whether to create the resource or use an existing one. + See the using existing resources section. + create_if_missing: + default: false + type: boolean + description: >- + If use_external_resource is ``true`` and the resource is missing, + create it instead of failing. + resource_id: + default: '' + type: string + description: >- + name to give to the new resource or the name or ID of an existing resource when the ``use_external_resource`` property is set to ``true`` (see the using existing resources section). Defaults to '' (empty string). + openstack_config: + type: aria.openstack.datatypes.Config + required: false + + interfaces: + Standard: + create: + implementation: cloudify-openstack-plugin > neutron_plugin.port.create + inputs: + args: + default: {} + type: aria.openstack.datatypes.Port + required: false + + delete: cloudify-openstack-plugin > neutron_plugin.port.delete + + Validation: + type: aria.openstack.interfaces.validation + creation: cloudify-openstack-plugin > neutron_plugin.port.creation_validation + + requirements: + - security_group: + capability: tosca.capabilities.Node + node: aria.openstack.nodes.SecurityGroup + relationship: aria.openstack.port_connected_to_security_group + occurrences: [ 0, UNBOUNDED ] + - floating_ip: + capability: tosca.capabilities.Node + node: aria.openstack.nodes.FloatingIP + relationship: aria.openstack.port_connected_to_floating_ip + occurrences: [ 0, UNBOUNDED ] + - subnet: + capability: tosca.capabilities.Node + node: aria.openstack.nodes.Subnet + relationship: aria.openstack.port_connected_to_subnet + - network: + capability: tosca.capabilities.Node + node: aria.openstack.nodes.Network + occurrences: [ 0, UNBOUNDED ] + capabilities: + entry_point: + type: tosca.capabilities.Node + + aria.openstack.nodes.Network: + derived_from: tosca.nodes.Root + properties: + network: + type: aria.openstack.datatypes.Network + required: false + default: {} + use_external_resource: + type: boolean + default: false + description: >- + a boolean for setting whether to create the resource or use an existing one. + See the using existing resources section. + create_if_missing: + default: false + type: boolean + description: >- + If use_external_resource is ``true`` and the resource is missing, + create it instead of failing. + resource_id: + default: '' + type: string + description: >- + name to give to the new resource or the name or ID of an existing resource when the ``use_external_resource`` property is set to ``true`` (see the using existing resources section). Defaults to '' (empty string). + openstack_config: + type: aria.openstack.datatypes.Config + required: false + interfaces: + Standard: + create: + implementation: cloudify-openstack-plugin > neutron_plugin.network.create + inputs: + args: + default: {} + type: aria.openstack.datatypes.Network + required: false + + delete: cloudify-openstack-plugin > neutron_plugin.network.delete + + Validation: + type: aria.openstack.interfaces.validation + creation: cloudify-openstack-plugin > neutron_plugin.network.creation_validation + + capabilities: + address_space: + type: tosca.capabilities.Node + + aria.openstack.nodes.FloatingIP: + derived_from: tosca.nodes.Root + attributes: + floating_ip_address: + type: string + properties: + floatingip: + type: aria.openstack.datatypes.FloatingIP + required: false + default: {} + use_external_resource: + type: boolean + default: false + description: >- + a boolean for setting whether to create the resource or use an existing one. + See the using existing resources section. + create_if_missing: + default: false + type: boolean + description: >- + If use_external_resource is ``true`` and the resource is missing, + create it instead of failing. + resource_id: + description: IP address of the floating IP + default: '' + type: string + description: >- + name to give to the new resource or the name or ID of an existing resource when the ``use_external_resource`` property is set to ``true`` (see the using existing resources section). Defaults to '' (empty string). + openstack_config: + type: aria.openstack.datatypes.Config + required: false + + interfaces: + Standard: + create: + implementation: cloudify-openstack-plugin > neutron_plugin.floatingip.create + inputs: + args: + default: {} + type: aria.openstack.datatypes.FloatingIP + required: false + + delete: cloudify-openstack-plugin > neutron_plugin.floatingip.delete + + Validation: + type: aria.openstack.interfaces.validation + creation: cloudify-openstack-plugin > neutron_plugin.floatingip.creation_validation + + capabilities: + address: + type: tosca.capabilities.Node + + aria.openstack.nodes.Volume: + derived_from: tosca.nodes.Root + properties: + volume: + default: {} + type: aria.openstack.datatypes.Volume + description: >- + key-value volume configuration as described in http://developer.openstack.org/api-ref-blockstorage-v1.html#volumes-v1. (**DEPRECATED - Use the `args` input in create operation instead**) + use_external_resource: + type: boolean + default: false + description: >- + a boolean for setting whether to create the resource or use an existing one. + See the using existing resources section. + create_if_missing: + default: false + type: boolean + description: >- + If use_external_resource is ``true`` and the resource is missing, + create it instead of failing. + resource_id: + default: + type: string + description: >- + name to give to the new resource or the name or ID of an existing resource when the ``use_external_resource`` property is set to ``true`` (see the using existing resources section). Defaults to '' (empty string). + device_name: + default: auto + type: string + description: >- + The device name this volume will be attached to. + Default value is *auto*, + which means openstack will auto-assign a device. + Note that if you do explicitly set a value, + this value may not be the actual device name assigned. + Sometimes the device requested will not be available and openstack will assign it to a different device, + this is why we recommend using *auto*. + openstack_config: + type: aria.openstack.datatypes.Config + required: false + boot: + type: boolean + default: false + description: >- + If a Server instance is connected to this Volume by a relationship, + this volume will be used as the boot volume for that Server. + interfaces: + Standard: + create: + implementation: cloudify-openstack-plugin > cinder_plugin.volume.create + inputs: + args: + default: {} + type: aria.openstack.datatypes.Volume + required: false + + status_attempts: + description: >- + Number of times to check for the creation's status before failing + type: integer + default: 20 + status_timeout: + description: >- + Interval (in seconds) between subsequent inquiries of the creation's + status + type: integer + default: 15 + delete: cloudify-openstack-plugin > cinder_plugin.volume.delete + + Validation: + type: aria.openstack.interfaces.validation + creation: cloudify-openstack-plugin > cinder_plugin.volume.creation_validation + + requirements: + - server: + capability: tosca.capabilities.Node + node: aria.openstack.nodes.Server + relationship: aria.openstack.volume_attached_to_server + + aria.openstack.nodes.Image: + derived_from: tosca.nodes.Root + properties: + image: + description: >- + Required parameters are (container_format, disk_format). Accepted + types are available on + http://docs.openstack.org/developer/glance/formats.html + To create an image from the local file its path should be added + in data parameter. + default: {} + type: map + entry_schema: string + image_url: + default: '' + type: string + description: >- + The openstack resource URL for the image. + use_external_resource: + default: false + type: boolean + description: >- + a boolean for setting whether to create the resource or use an existing one. + See the using existing resources section. + create_if_missing: + default: false + type: boolean + description: >- + If use_external_resource is ``true`` and the resource is missing, + create it instead of failing. + resource_id: + default: '' + type: string + description: >- + name to give to the new resource or the name or ID of an existing resource when the ``use_external_resource`` property is set to ``true`` (see the using existing resources section). Defaults to '' (empty string). + openstack_config: + type: aria.openstack.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-openstack-plugin > glance_plugin.image.create + + start: + implementation: cloudify-openstack-plugin > glance_plugin.image.start + inputs: + start_retry_interval: + default: 30 + type: integer + + delete: cloudify-openstack-plugin > glance_plugin.image.delete + + Validation: + type: aria.openstack.interfaces.validation + creation: cloudify-openstack-plugin > glance_plugin.image.creation_validation + + aria.openstack.nodes.Project: + derived_from: tosca.nodes.Root + properties: + project: + default: {} + type: aria.openstack.datatypes.Project + description: >- + key-value project configuration. + users: + default: [] + type: list + entry_schema: string + description: >- + List of users assigned to this project in the following format: + { name: string, roles: [string] } + quota: + default: {} + type: map + entry_schema: string + description: | + A dictionary mapping service names to quota definitions for a proejct + + e.g:: + + quota: + neutron: + nova: + use_external_resource: + default: false + type: boolean + description: >- + a boolean for setting whether to create the resource or use an existing one. + See the using existing resources section. + create_if_missing: + default: false + type: boolean + description: >- + If use_external_resource is ``true`` and the resource is missing, + create it instead of failing. + resource_id: + default: '' + type: string + description: >- + name to give to the new resource or the name or ID of an existing resource when the ``use_external_resource`` property is set to ``true`` (see the using existing resources section). Defaults to '' (empty string). + openstack_config: + type: aria.openstack.datatypes.Config + required: false + interfaces: + Standard: + create: openstack.keystone_plugin.project.create + start: openstack.keystone_plugin.project.start + delete: openstack.keystone_plugin.project.delete + Validation: + type: aria.openstack.interfaces.validation + creation: openstack.keystone_plugin.project.creation_validation + + +relationship_types: + + aria.openstack.port_connected_to_security_group: + derived_from: ConnectsTo + interfaces: + Configure: + add_source: cloudify-openstack-plugin > neutron_plugin.port.connect_security_group + + aria.openstack.subnet_connected_to_router: + derived_from: ConnectsTo + interfaces: + Configure: + add_target: cloudify-openstack-plugin > neutron_plugin.router.connect_subnet + remove_target: cloudify-openstack-plugin > neutron_plugin.router.disconnect_subnet + + aria.openstack.server_connected_to_floating_ip: + derived_from: ConnectsTo + interfaces: + Configure: + add_source: + implementation: cloudify-openstack-plugin > nova_plugin.server.connect_floatingip + inputs: + fixed_ip: + description: > + The fixed IP to be associated with the floating IP. + If omitted, Openstack will choose which port to associate. + type: string + default: '' + remove_source: cloudify-openstack-plugin > nova_plugin.server.disconnect_floatingip + + aria.openstack.port_connected_to_floating_ip: + derived_from: ConnectsTo + interfaces: + Configure: + add_source: cloudify-openstack-plugin > neutron_plugin.floatingip.connect_port + remove_source: cloudify-openstack-plugin > neutron_plugin.floatingip.disconnect_port + + aria.openstack.server_connected_to_security_group: + derived_from: ConnectsTo + interfaces: + Configure: + add_source: cloudify-openstack-plugin > nova_plugin.server.connect_security_group + remove_source: cloudify-openstack-plugin > nova_plugin.server.disconnect_security_group + + aria.openstack.server_connected_to_port: + derived_from: ConnectsTo + interfaces: + Configure: + remove_source: cloudify-openstack-plugin > neutron_plugin.port.detach + + aria.openstack.server_connected_to_keypair: + derived_from: ConnectsTo + + aria.openstack.port_connected_to_subnet: + derived_from: ConnectsTo + + aria.openstack.volume_attached_to_server: + derived_from: ConnectsTo + interfaces: + Configure: + add_target: + implementation: cloudify-openstack-plugin > nova_plugin.server.attach_volume + inputs: + + status_attempts: + description: > + Number of times to check for the attachment's status before failing + type: integer + default: 10 + status_timeout: + description: > + Interval (in seconds) between subsequent inquiries of the attachment's + status + type: integer + default: 2 + remove_target: + implementation: cloudify-openstack-plugin > nova_plugin.server.detach_volume + inputs: + + status_attempts: + description: > + Number of times to check for the detachment's status before failing + type: integer + default: 10 + status_timeout: + description: > + Interval (in seconds) between subsequent inquiries of the detachment's + status + type: integer + default: 2 diff --git a/azure/aria/aria-extension-cloudify/requirements.txt b/azure/aria/aria-extension-cloudify/requirements.txt new file mode 100644 index 0000000..ca46872 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/requirements.txt @@ -0,0 +1 @@ +-e git+https://github.com/apache/incubator-ariatosca@master#egg=aria diff --git a/azure/aria/aria-extension-cloudify/setup.py b/azure/aria/aria-extension-cloudify/setup.py new file mode 100644 index 0000000..9a8d891 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/setup.py @@ -0,0 +1,44 @@ +# +# Copyright (c) 2016 GigaSpaces Technologies Ltd. All rights reserved. +# +# 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 sys + +from setuptools import setup, find_packages + +_PACKAGE_NAME = 'aria-extension-cloudify' +_PYTHON_SUPPORTED_VERSIONS = [(2, 6), (2, 7)] + +if (sys.version_info[0], sys.version_info[1]) not in _PYTHON_SUPPORTED_VERSIONS: + raise NotImplementedError('{0} Package support Python version 2.6 & 2.7 Only' + .format(_PACKAGE_NAME)) + +setup( + name=_PACKAGE_NAME, + version='4.1', + description="Enable ARIA to utilize some of Cloudify's abilities, such as interfacing with AWS " + "and Openstack.", + author='Gigaspaces', + author_email='cosmo-admin@gigaspaces.com', + license='LICENSE', + + packages=find_packages(include=['adapters*']), + install_requires=['apache-ariatosca'], + entry_points={ + 'aria_extension': [ + 'adapter = adapters.extension' + ] + } +) diff --git a/azure/aria/aria-extension-cloudify/src/aria/.gitignore b/azure/aria/aria-extension-cloudify/src/aria/.gitignore new file mode 100644 index 0000000..482383a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/.gitignore @@ -0,0 +1,64 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +bin/ +build/ +develop-eggs/ +dist/ +eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage* +.cache +nosetests.xml +coverage.xml + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Rope +.ropeproject + +# Django stuff: +*.log +*.pot + +# Sphinx documentation +docs/_build/ + +*.iml + +*COMMIT_MSG + +*.noseids + +# QuickBuild +.qbcache/ + +.idea/ diff --git a/azure/aria/aria-extension-cloudify/src/aria/.rat-excludes b/azure/aria/aria-extension-cloudify/src/aria/.rat-excludes new file mode 100644 index 0000000..aa0e3b8 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/.rat-excludes @@ -0,0 +1,24 @@ +CONTRIBUTING +DISCLAIMER +VERSION +NOTICE +MANIFEST.in +requirements.txt +requirements.in +docs +dist +build +apache_ariatosca.egg-info +.git +.gitignore +.gitattributes +.coverage +.coveragerc +.rat-excludes +.*.yaml +.*.html +.*.pyc +.*.md +.*.rst +.*.iml +.idea diff --git a/azure/aria/aria-extension-cloudify/src/aria/.travis.yml b/azure/aria/aria-extension-cloudify/src/aria/.travis.yml new file mode 100644 index 0000000..958be80 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/.travis.yml @@ -0,0 +1,64 @@ +# 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. + +# We need to set "sudo: true" in order to use a virtual machine instead of a container, because +# SSH tests fail in the container. See: +# https://docs.travis-ci.com/user/reference/overview/#Virtualization-environments + +dist: trusty +sudo: true + +language: python + +addons: + apt: + sources: + - sourceline: 'ppa:fkrull/deadsnakes' + packages: + # Ubuntu 14.04 (trusty) does not come with Python 2.6, so we will install it from Felix + # Krull's PPA + - python2.6 + - python2.6-dev + +python: + # We handle Python 2.6 testing from within tox (see tox.ini); note that this means that we run + # tox itself always from Python 2.7 + - '2.7' + +env: + # The PYTEST_PROCESSES environment var is used in tox.ini to override the --numprocesses argument + # for PyTest's xdist plugin. The reason this is necessary is that conventional Travis environments + # may report a large amount of available CPUs, but they they are greatly restricted. Through trial + # and error we found that more than 1 process may result in failures. + - PYTEST_PROCESSES=1 TOX_ENV=pylint_code + - PYTEST_PROCESSES=1 TOX_ENV=pylint_tests + - PYTEST_PROCESSES=1 TOX_ENV=py27 + - PYTEST_PROCESSES=1 TOX_ENV=py26 + - PYTEST_PROCESSES=1 TOX_ENV=py27e2e + - PYTEST_PROCESSES=1 TOX_ENV=py26e2e + - PYTEST_PROCESSES=1 TOX_ENV=py27ssh + - PYTEST_PROCESSES=1 TOX_ENV=py26ssh + - PYTEST_PROCESSES=1 TOX_ENV=docs + +before_install: + # Create SSH keys for SSH tests + - ssh-keygen -f $HOME/.ssh/id_rsa -t rsa -N '' + - cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys + + # Python dependencies + - pip install --upgrade pip + - pip install --upgrade setuptools + - pip install tox + - tox --version + +script: + - tox -e $TOX_ENV diff --git a/azure/aria/aria-extension-cloudify/src/aria/=35.0.0 b/azure/aria/aria-extension-cloudify/src/aria/=35.0.0 new file mode 100644 index 0000000..e69de29 diff --git a/azure/aria/aria-extension-cloudify/src/aria/=35.0.0, b/azure/aria/aria-extension-cloudify/src/aria/=35.0.0, new file mode 100644 index 0000000..e69de29 diff --git a/azure/aria/aria-extension-cloudify/src/aria/CHANGELOG.rst b/azure/aria/aria-extension-cloudify/src/aria/CHANGELOG.rst new file mode 100644 index 0000000..a0ca089 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/CHANGELOG.rst @@ -0,0 +1,16 @@ +0.1.1 +----- + +[ARIA-312] Validation of workflow and operation kwargs raise false alarms +[ARIA-301] Environment-marked dependencies are installed regardless of environment when installing from wheel +[ARIA-299] Resuming canceled execution with non-finished tasks fails +[ARIA-298] Test suite sometimes fails or freezes despite all tests passing +[ARIA-296] Process termination test fails on windows +[ARIA-287] New tox suite to make sure that Sphinx documentation generation isn't broken +[ARIA-202] Execution plugin assumes '/tmp' for temp directory on the local/remote machine + + +0.1.0 +----- + + * Initial release. \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/CONTRIBUTING b/azure/aria/aria-extension-cloudify/src/aria/CONTRIBUTING new file mode 100644 index 0000000..4124003 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/CONTRIBUTING @@ -0,0 +1,3 @@ +Contribution guide is available on our Confluence: + +https://cwiki.apache.org/confluence/display/ARIATOSCA/Contributing+to+ARIA \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/DISCLAIMER b/azure/aria/aria-extension-cloudify/src/aria/DISCLAIMER new file mode 100644 index 0000000..358d8e1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/DISCLAIMER @@ -0,0 +1,10 @@ +Apache AriaTosca is an effort undergoing incubation at the Apache Software +Foundation (ASF), sponsored by the Apache Incubator. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness +or stability of the code, it does indicate that the project has yet to be +fully endorsed by the ASF. \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/LICENSE b/azure/aria/aria-extension-cloudify/src/aria/LICENSE new file mode 100644 index 0000000..37ec93a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/LICENSE @@ -0,0 +1,191 @@ +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: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +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 +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/azure/aria/aria-extension-cloudify/src/aria/MANIFEST.in b/azure/aria/aria-extension-cloudify/src/aria/MANIFEST.in new file mode 100644 index 0000000..6b67894 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/MANIFEST.in @@ -0,0 +1,12 @@ +include CONTRIBUTING +include DISCLAIMER +include LICENSE +include NOTICE +include VERSION +include CHANGELOG.rst +include README.rst +include requirements.in +include requirements.txt +recursive-include docs/html * +recursive-include examples * +prune docs/html/.doctrees diff --git a/azure/aria/aria-extension-cloudify/src/aria/Makefile b/azure/aria/aria-extension-cloudify/src/aria/Makefile new file mode 100644 index 0000000..9fef3ab --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/Makefile @@ -0,0 +1,63 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +EXTENSIONS = ./extensions +DIST = ./dist +DOCS = ./docs +HTML = ./docs/html +EASY_INSTALL_PTH = $(VIRTUAL_ENV)/lib/python2.7/site-packages/easy-install.pth +PYTHON_VERSION = $$(python -V 2>&1 | cut -f2 -d' ' | cut -f1,2 -d'.' --output-delimiter='') + +.DEFAULT_GOAL = default +.PHONY: clean install install-virtual docs test dist deploy + +default: + @echo "Please choose one of the following targets: clean, install, install-virtual, docs, test, dist, requirements.txt" + +clean: + rm -rf "$(DIST)" "$(HTML)" build .tox .coverage* + -find . -maxdepth 1 -type f -name '.coverage' -delete + -find . -type f -name '*.pyc' -delete + -find . -type d -name '__pycache__' -prune -exec rm -rf {} \; 2>/dev/null + +install: + pip install .[ssh] + +install-virtual: + pip install --editable .[ssh] + + # "pip install --editable" will not add our extensions to the path, so we will patch the virtualenv + EXTENSIONS_PATH="$$(head -n 1 "$(EASY_INSTALL_PTH)")/extensions" && \ + if ! grep -Fxq "$$EXTENSIONS_PATH" "$(EASY_INSTALL_PTH)"; then \ + echo "$$EXTENSIONS_PATH" >> "$(EASY_INSTALL_PTH)"; \ + fi + +docs: + pip install --requirement "$(DOCS)/requirements.txt" + rm -rf "$(HTML)" + sphinx-build -W -T -b html "$(DOCS)" "$(HTML)" + +test: + pip install --upgrade "tox>=2.7.0" + tox -e pylint_code \ + -e pylint_tests \ + -e py$(PYTHON_VERSION) \ + -e py$(PYTHON_VERSION)e2e \ + -e py$(PYTHON_VERSION)ssh \ + -e docs + +./requirements.txt: ./requirements.in + pip install --upgrade "pip-tools>=1.9.0" + pip-compile --output-file ./requirements.txt ./requirements.in diff --git a/azure/aria/aria-extension-cloudify/src/aria/NOTICE b/azure/aria/aria-extension-cloudify/src/aria/NOTICE new file mode 100644 index 0000000..bf03ab5 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/NOTICE @@ -0,0 +1,5 @@ +Apache AriaTosca +Copyright 2016-2017 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/README.rst b/azure/aria/aria-extension-cloudify/src/aria/README.rst new file mode 100644 index 0000000..6f8885c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/README.rst @@ -0,0 +1,167 @@ +ARIA +==== + +|Build Status| |Appveyor Build Status| |License| |PyPI release| |Python Versions| |Wheel| +|Contributors| |Open Pull Requests| |Closed Pull Requests| + + +What is ARIA? +------------- + +`ARIA `__ is a an open-source, +`TOSCA `__-based, lightweight library and CLI for +orchestration and for consumption by projects building TOSCA-based solutions for resources and +services orchestration. + +ARIA can be utilized by any organization that wants to implement TOSCA-based orchestration in its +solutions, whether a multi-cloud enterprise application, or an NFV or SDN solution for multiple +virtual infrastructure managers. + +With ARIA, you can utilize TOSCA's cloud portability out-of-the-box, to develop, test and run your +applications, from template to deployment. + +ARIA is an incubation project under the `Apache Software Foundation `__. + + +Installation +------------ + +ARIA is `available on PyPI `__. + +ARIA requires Python 2.6/2.7. Python 3 is currently not supported. + +To install ARIA directly from PyPI (using a ``wheel``), use:: + + pip install --upgrade pip setuptools + pip install apache-ariatosca + +To install ARIA from source, download the source tarball from +`PyPI `__, extract and ``cd`` into the extract dir, +and run:: + + pip install --upgrade pip setuptools + pip install . + +| The source package comes along with relevant examples, documentation, ``requirements.txt`` (for +| installing specifically the frozen dependencies' versions with which ARIA was tested) and more. +| +| ARIA has additional optional dependencies. These are required for running operations over SSH. +| Below are instructions on how to install these dependencies, including required system +| dependencies per OS. +| +| Note: These dependencies may have varying licenses which may not be compatible with Apache license +| 2.0. + +**Ubuntu/Debian** (tested on Ubuntu 14.04, Ubuntu 16.04):: + + apt-get install -y python-dev gcc libffi-dev libssl-dev + pip install apache-ariatosca[ssh] + +**CentOS/Fedora** (tested on CentOS 6.6, CentOS 7):: + + yum install -y python-devel gcc libffi-devel openssl-devel + pip install apache-ariatosca[ssh] + +**Archlinux**:: + + pacman -Syu --noconfirm python2 gcc libffi openssl + pip2 install apache-ariatosca[ssh] + +**Windows** (tested on Windows 10):: + + # no additional system requirements are needed + pip install apache-ariatosca[ssh] + +**MacOS**:: + + # TODO + + + +To install ``pip``, either use your operating system's package management system, or run:: + + wget http://bootstrap.pypa.io/get-pip.py + python get-pip.py + + + +Getting Started +--------------- + +This section will describe how to run a simple "Hello World" example. + +First, provide ARIA with the ARIA "hello world" service-template and name it (e.g. +``my-service-template``):: + + aria service-templates store examples/hello-world/hello-world.yaml my-service-template + +Now create a service based on this service-template and name it (e.g. ``my-service``):: + + aria services create my-service -t my-service-template + +Finally, start an ``install`` workflow execution on ``my-service`` like so:: + + aria executions start install -s my-service + +You should now have a simple web-server running on your local machine. You can try visiting +``http://localhost:9090`` to view your deployed application. + +To uninstall and clean your environment, follow these steps:: + + aria executions start uninstall -s my-service + aria services delete my-service + aria service-templates delete my-service-template + + +Contribution +------------ + +You are welcome and encouraged to participate and contribute to the ARIA project. + +Please see our guide to +`Contributing to ARIA +`__. + +Feel free to also provide feedback on the mailing lists (see `Resources <#user-content-resources>`__ +section). + + +Resources +--------- + +- `ARIA homepage `__ +- `ARIA wiki `__ +- `Issue tracker `__ + +- Dev mailing list: dev@ariatosca.incubator.apache.org +- User mailing list: user@ariatosca.incubator.apache.org + +Subscribe by sending a mail to ``-subscribe@ariatosca.incubator.apache.org`` (e.g. +``dev-subscribe@ariatosca.incubator.apache.org``). See information on how to subscribe to mailing +lists `here `__. + +For past correspondence, see the +`dev mailing list archive `__. + + +License +------- + +ARIA is licensed under the +`Apache License 2.0 `__. + +.. |Build Status| image:: https://img.shields.io/travis/apache/incubator-ariatosca/master.svg + :target: https://travis-ci.org/apache/incubator-ariatosca +.. |Appveyor Build Status| image:: https://img.shields.io/appveyor/ci/ApacheSoftwareFoundation/incubator-ariatosca/master.svg + :target: https://ci.appveyor.com/project/ApacheSoftwareFoundation/incubator-ariatosca/history +.. |License| image:: https://img.shields.io/github/license/apache/incubator-ariatosca.svg + :target: http://www.apache.org/licenses/LICENSE-2.0 +.. |PyPI release| image:: https://img.shields.io/pypi/v/apache-ariatosca.svg + :target: https://pypi.python.org/pypi/apache-ariatosca +.. |Python Versions| image:: https://img.shields.io/pypi/pyversions/apache-ariatosca.svg +.. |Wheel| image:: https://img.shields.io/pypi/wheel/apache-ariatosca.svg +.. |Contributors| image:: https://img.shields.io/github/contributors/apache/incubator-ariatosca.svg +.. |Open Pull Requests| image:: https://img.shields.io/github/issues-pr/apache/incubator-ariatosca.svg + :target: https://github.com/apache/incubator-ariatosca/pulls +.. |Closed Pull Requests| image:: https://img.shields.io/github/issues-pr-closed-raw/apache/incubator-ariatosca.svg + :target: https://github.com/apache/incubator-ariatosca/pulls?q=is%3Apr+is%3Aclosed diff --git a/azure/aria/aria-extension-cloudify/src/aria/VERSION b/azure/aria/aria-extension-cloudify/src/aria/VERSION new file mode 100644 index 0000000..341cf11 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/VERSION @@ -0,0 +1 @@ +0.2.0 \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/appveyor.yml b/azure/aria/aria-extension-cloudify/src/aria/appveyor.yml new file mode 100644 index 0000000..a03b180 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/appveyor.yml @@ -0,0 +1,41 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +environment: + + TOX_ENV: pywin + + matrix: + - PYTHON: "C:\\Python27" + PYTHON_VERSION: 2.7.8 + PYTHON_ARCH: 32 + +build: false + +install: + - SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH% + - ps: (new-object System.Net.WebClient).Downloadfile('https://bootstrap.pypa.io/get-pip.py', 'C:\Users\appveyor\get-pip.py') + - ps: Start-Process -FilePath "C:\Python27\python.exe" -ArgumentList "C:\Users\appveyor\get-pip.py" -Wait -Passthru + +before_test: + - pip install virtualenv --upgrade + - virtualenv env + - 'env\Scripts\activate.bat' + - pip install tox + +test_script: + - pip --version + - tox --version + - tox -e %TOX_ENV% diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/.pylintrc b/azure/aria/aria-extension-cloudify/src/aria/aria/.pylintrc new file mode 100644 index 0000000..4d77556 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/.pylintrc @@ -0,0 +1,423 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +[MASTER] + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=.git + +# Add files or directories matching the regex patterns to the blacklist. The +# regex matches against base names, not paths. +ignore-patterns= + +# Pickle collected data for later comparisons. +persistent=yes + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Use multiple processes to speed up Pylint. +jobs=4 + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +extension-pkg-whitelist= + +# Allow optimization of some AST trees. This will activate a peephole AST +# optimizer, which will apply various small optimizations. For instance, it can +# be used to obtain the result of joining multiple strings with the addition +# operator. Joining a lot of strings can lead to a maximum recursion error in +# Pylint and this flag can prevent that. It has one side effect, the resulting +# AST will be different than the one from reality. This option is deprecated +# and it will be removed in Pylint 2.0. +optimize-ast=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +#enable= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +disable=import-star-module-level,old-octal-literal,oct-method,print-statement,unpacking-in-except,parameter-unpacking,backtick,old-raise-syntax,old-ne-operator,long-suffix,dict-view-method,dict-iter-method,metaclass-assignment,next-method-called,raising-string,indexing-exception,raw_input-builtin,long-builtin,file-builtin,execfile-builtin,coerce-builtin,cmp-builtin,buffer-builtin,basestring-builtin,apply-builtin,filter-builtin-not-iterating,using-cmp-argument,useless-suppression,range-builtin-not-iterating,suppressed-message,no-absolute-import,old-division,cmp-method,reload-builtin,zip-builtin-not-iterating,intern-builtin,unichr-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,input-builtin,round-builtin,hex-method,nonzero-method,map-builtin-not-iterating,redefined-builtin,logging-format-interpolation,import-error,redefined-variable-type,broad-except,protected-access,global-statement,no-member,unused-argument + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=colorized + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". This option is deprecated +# and it will be removed in Pylint 2.0. +files-output=no + +# Tells whether to display a full report or only the messages +reports=yes + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=(_+[a-zA-Z0-9]*?$)|dummy|args|kwargs + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_,_cb + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,future.builtins + + +[SPELLING] + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging + + +[BASIC] + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,v,f,ex,e,_,id,ip + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +property-classes=abc.abstractproperty + +# Regular expression matching correct function names +function-rgx=[a-z_][a-z0-9_]{2,50}$ + +# Naming hint for function names +function-name-hint=[a-z_][a-z0-9_]{2,50}$ + +# Regular expression matching correct variable names +variable-rgx=[a-z_][a-z0-9_]{2,50}$ + +# Naming hint for variable names +variable-name-hint=[a-z_][a-z0-9_]{2,50}$ + +# Regular expression matching correct constant names +const-rgx=(([A-Za-z_][A-Za-z0-9_]*)|(__.*__))$ + +# Naming hint for constant names +const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression matching correct attribute names +attr-rgx=[a-z_][a-z0-9_]{2,50}$ + +# Naming hint for attribute names +attr-name-hint=[a-z_][a-z0-9_]{2,50}$ + +# Regular expression matching correct argument names +argument-rgx=[a-z_][a-z0-9_]{2,50}$ + +# Naming hint for argument names +argument-name-hint=[a-z_][a-z0-9_]{2,50}$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,50}|(__.*__))$ + +# Naming hint for class attribute names +class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,50}|(__.*__))$ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Naming hint for inline iteration names +inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ + +# Regular expression matching correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Naming hint for class names +class-name-hint=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression matching correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Naming hint for module names +module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression matching correct method names +method-rgx=[a-z_][a-z0-9_]{2,50}$ + +# Naming hint for method names +method-name-hint=[a-z_][a-z0-9_]{2,50}$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + + +[ELIF] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=7 + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=100 + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + +# List of optional constructs for which whitespace checking is disabled. `dict- +# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. +# `trailing-comma` allows a space between comma and closing bracket: (a, ). +# `empty-line` allows space-only lines. +no-space-check=trailing-comma,dict-separator + +# Maximum number of lines in a module +max-module-lines=1500 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict,_fields,_replace,_source,_make + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=20 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of locals for function / method body +max-locals=20 + +# Maximum number of return / yield for function / method body +max-returns=10 + +# Maximum number of branch for function / method body +max-branches=15 + +# Maximum number of statements in function / method body +max-statements=50 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=20 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=0 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=50 + +# Maximum number of boolean expressions in a if statement +max-bool-expr=5 + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=Exception + + +[pre-commit-hook] +params=--reports=no +limit=9.5 diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/__init__.py new file mode 100644 index 0000000..76a62ce --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/__init__.py @@ -0,0 +1,89 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +The ARIA root package provides entry points for extension and storage initialization. +""" + +import sys + +import pkg_resources +aria_package_name = 'apache-ariatosca' +__version__ = pkg_resources.get_distribution(aria_package_name).version + +from .orchestrator.decorators import workflow, operation # pylint: disable=wrong-import-position +from . import ( # pylint: disable=wrong-import-position + extension, + utils, + parser, + storage, + modeling, + orchestrator, + cli +) + +if sys.version_info < (2, 7): + # pkgutil in python2.6 has a bug where it fails to import from protected modules, which causes + # the entire process to fail. In order to overcome this issue we use our custom iter_modules + from .utils.imports import iter_modules +else: + from pkgutil import iter_modules + +__all__ = ( + '__version__', + 'workflow', + 'operation', + 'install_aria_extensions', + 'application_model_storage', + 'application_resource_storage' +) + + +def install_aria_extensions(): + """ + Iterates all Python packages with names beginning with ``aria_extension_`` and all + ``aria_extension`` entry points and loads them. + + It then invokes all registered extension functions. + """ + for loader, module_name, _ in iter_modules(): + if module_name.startswith('aria_extension_'): + loader.find_module(module_name).load_module(module_name) + for entry_point in pkg_resources.iter_entry_points(group='aria_extension'): + entry_point.load() + extension.init() + + +def application_model_storage(api, api_kwargs=None, initiator=None, initiator_kwargs=None): + """ + Initiate model storage. + """ + return storage.ModelStorage(api_cls=api, + api_kwargs=api_kwargs, + items=modeling.models.models_to_register, + initiator=initiator, + initiator_kwargs=initiator_kwargs or {}) + + +def application_resource_storage(api, api_kwargs=None, initiator=None, initiator_kwargs=None): + """ + Initiate resource storage. + """ + + return storage.ResourceStorage(api_cls=api, + api_kwargs=api_kwargs, + items=['service_template', 'service', 'plugin'], + initiator=initiator, + initiator_kwargs=initiator_kwargs) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/__init__.py new file mode 100644 index 0000000..c0ef46f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/__init__.py @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI package. +""" diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/ascii_art.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/ascii_art.py new file mode 100644 index 0000000..8a8b79f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/ascii_art.py @@ -0,0 +1,24 @@ +# -*- coding: utf8 -*- +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + + +ARIA_ASCII_ART = r""" + █████╗ ██████╗ ██╗ █████╗ + ██╔══██╗██╔══██╗██║██╔══██╗ + ███████║██████╔╝██║███████║ + ██╔══██║██╔══██╗██║██╔══██║ + ██║ ██║██║ ██║██║██║ ██║ + ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═╝""" diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/color.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/color.py new file mode 100644 index 0000000..d6a4cd6 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/color.py @@ -0,0 +1,108 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Terminal colorization utilities. +""" + +from StringIO import StringIO +import atexit +import re + +import colorama + +from ..utils.formatting import safe_str + + +def _restore_terminal(): + colorama.deinit() + + +colorama.init() +atexit.register(_restore_terminal) + + +class StringStylizer(object): + def __init__(self, str_, color_spec=None): + self._str = str_ + self._color_spec = color_spec + + def __repr__(self): + if self._color_spec: + return '{schema}{str}{reset}'.format( + schema=self._color_spec, str=safe_str(self._str), reset=Colors.Style.RESET_ALL) + return self._str + + def __add__(self, other): + return safe_str(self) + other + + def __radd__(self, other): + return other + safe_str(self) + + def color(self, color_spec): + self._color_spec = color_spec + + def replace(self, old, new, **kwargs): + self._str = self._str.replace(safe_str(old), safe_str(new), **kwargs) + + def format(self, *args, **kwargs): + self._str = self._str.format(*args, **kwargs) + + def highlight(self, pattern, schema): + if pattern is None: + return + for match in set(re.findall(re.compile(pattern), self._str)): + self.replace(match, schema + match + Colors.Style.RESET_ALL + self._color_spec) + + +def _get_colors(color_type): + for name in dir(color_type): + if not name.startswith('_'): + yield (name.lower(), getattr(color_type, name)) + + +class Colors(object): + Fore = colorama.Fore + Back = colorama.Back + Style = colorama.Style + + _colors = { + 'fore': dict(_get_colors(Fore)), + 'back': dict(_get_colors(Back)), + 'style': dict(_get_colors(Style)) + } + + +class ColorSpec(object): + def __init__(self, fore=None, back=None, style=None): + """ + It is possible to provide fore, back and style arguments. Each could be either the color as + lowercase letters, or the full color name for Colorama. + """ + self._kwargs = dict(fore=fore, back=back, style=style) + self._str = StringIO() + for type_, colors in Colors._colors.items(): + value = self._kwargs.get(type_, None) + # the former case is if the value is a string, the latter is in case of an object. + self._str.write(colors.get(value) or value) + + def __str__(self): + return self._str.getvalue() + + def __add__(self, other): + return str(self) + str(other) + + def __radd__(self, other): + return str(other) + str(self) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/__init__.py new file mode 100644 index 0000000..ba34a43 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/__init__.py @@ -0,0 +1,30 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI commands package. +""" + +from . import ( + executions, + logs, + node_templates, + nodes, + plugins, + reset, + service_templates, + services, + workflows +) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/executions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/executions.py new file mode 100644 index 0000000..cecbbc5 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/executions.py @@ -0,0 +1,246 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI ``executions`` sub-commands. +""" + +import os + +from .. import helptexts +from .. import table +from .. import utils +from .. import logger as cli_logger +from .. import execution_logging +from ..core import aria +from ...modeling.models import Execution +from ...orchestrator.workflow_runner import WorkflowRunner +from ...orchestrator.workflows.executor.dry import DryExecutor +from ...utils import formatting +from ...utils import threading + +EXECUTION_COLUMNS = ('id', 'workflow_name', 'status', 'service_name', + 'created_at', 'error') + + +@aria.group(name='executions') +@aria.options.verbose() +def executions(): + """ + Manage executions + """ + pass + + +@executions.command(name='show', + short_help='Show information for an execution') +@aria.argument('execution-id') +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def show(execution_id, model_storage, logger): + """ + Show information for an execution + + EXECUTION_ID is the unique ID of the execution. + """ + logger.info('Showing execution {0}'.format(execution_id)) + execution = model_storage.execution.get(execution_id) + + table.print_data(EXECUTION_COLUMNS, execution, 'Execution:', col_max_width=50) + + # print execution parameters + logger.info('Execution Inputs:') + if execution.inputs: + #TODO check this section, havent tested it + execution_inputs = [ei.to_dict() for ei in execution.inputs] + for input_name, input_value in formatting.decode_dict( + execution_inputs).iteritems(): + logger.info('\t{0}: \t{1}'.format(input_name, input_value)) + else: + logger.info('\tNo inputs') + + +@executions.command(name='list', + short_help='List executions') +@aria.options.service_name(required=False) +@aria.options.sort_by() +@aria.options.descending +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def list(service_name, + sort_by, + descending, + model_storage, + logger): + """ + List executions + + If SERVICE_NAME is provided, list executions on that service. Otherwise, list executions on all + services. + """ + if service_name: + logger.info('Listing executions for service {0}...'.format( + service_name)) + service = model_storage.service.get_by_name(service_name) + filters = dict(service=service) + else: + logger.info('Listing all executions...') + filters = {} + + executions_list = model_storage.execution.list( + filters=filters, + sort=utils.storage_sort_param(sort_by, descending)).items + + table.print_data(EXECUTION_COLUMNS, executions_list, 'Executions:') + + +@executions.command(name='start', + short_help='Start a workflow on a service') +@aria.argument('workflow-name') +@aria.options.service_name(required=True) +@aria.options.inputs(help=helptexts.EXECUTION_INPUTS) +@aria.options.dry_execution +@aria.options.task_max_attempts() +@aria.options.task_retry_interval() +@aria.options.mark_pattern() +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_resource_storage +@aria.pass_plugin_manager +@aria.pass_logger +def start(workflow_name, + service_name, + inputs, + dry, + task_max_attempts, + task_retry_interval, + mark_pattern, + model_storage, + resource_storage, + plugin_manager, + logger): + """ + Start a workflow on a service + + SERVICE_NAME is the unique name of the service. + + WORKFLOW_NAME is the unique name of the workflow within the service (e.g. "uninstall"). + """ + service = model_storage.service.get_by_name(service_name) + executor = DryExecutor() if dry else None # use WorkflowRunner's default executor + + workflow_runner = \ + WorkflowRunner( + model_storage, resource_storage, plugin_manager, + service_id=service.id, workflow_name=workflow_name, inputs=inputs, executor=executor, + task_max_attempts=task_max_attempts, task_retry_interval=task_retry_interval + ) + logger.info('Starting {0}execution. Press Ctrl+C cancel'.format('dry ' if dry else '')) + + _run_execution(workflow_runner, logger, model_storage, dry, mark_pattern) + + +@executions.command(name='resume', + short_help='Resume a stopped execution') +@aria.argument('execution-id') +@aria.options.dry_execution +@aria.options.retry_failed_tasks +@aria.options.mark_pattern() +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_resource_storage +@aria.pass_plugin_manager +@aria.pass_logger +def resume(execution_id, + retry_failed_tasks, + dry, + mark_pattern, + model_storage, + resource_storage, + plugin_manager, + logger): + """ + Resume a stopped execution + + EXECUTION_ID is the unique ID of the execution. + """ + executor = DryExecutor() if dry else None # use WorkflowRunner's default executor + + execution = model_storage.execution.get(execution_id) + if execution.status != execution.CANCELLED: + logger.info("Can't resume execution {execution.id} - " + "execution is in status {execution.status}. " + "Can only resume executions in status {valid_status}" + .format(execution=execution, valid_status=execution.CANCELLED)) + return + + workflow_runner = \ + WorkflowRunner( + model_storage, resource_storage, plugin_manager, + execution_id=execution_id, retry_failed_tasks=retry_failed_tasks, executor=executor, + ) + + logger.info('Resuming {0}execution. Press Ctrl+C cancel'.format('dry ' if dry else '')) + _run_execution(workflow_runner, logger, model_storage, dry, mark_pattern) + + +def _run_execution(workflow_runner, logger, model_storage, dry, mark_pattern): + execution_thread_name = '{0}_{1}'.format(workflow_runner.service.name, + workflow_runner.execution.workflow_name) + execution_thread = threading.ExceptionThread(target=workflow_runner.execute, + name=execution_thread_name) + + execution_thread.start() + + last_task_id = workflow_runner.execution.logs[-1].id if workflow_runner.execution.logs else 0 + log_iterator = cli_logger.ModelLogIterator(model_storage, + workflow_runner.execution_id, + offset=last_task_id) + try: + while execution_thread.is_alive(): + execution_logging.log_list(log_iterator, mark_pattern=mark_pattern) + execution_thread.join(1) + + except KeyboardInterrupt: + _cancel_execution(workflow_runner, execution_thread, logger, log_iterator) + + # It might be the case where some logs were written and the execution was terminated, thus we + # need to drain the remaining logs. + execution_logging.log_list(log_iterator, mark_pattern=mark_pattern) + + # raise any errors from the execution thread (note these are not workflow execution errors) + execution_thread.raise_error_if_exists() + + execution = workflow_runner.execution + logger.info('Execution has ended with "{0}" status'.format(execution.status)) + if execution.status == Execution.FAILED and execution.error: + logger.info('Execution error:{0}{1}'.format(os.linesep, execution.error)) + + if dry: + # remove traces of the dry execution (including tasks, logs, inputs..) + model_storage.execution.delete(execution) + + +def _cancel_execution(workflow_runner, execution_thread, logger, log_iterator): + logger.info('Cancelling execution. Press Ctrl+C again to force-cancel.') + workflow_runner.cancel() + while execution_thread.is_alive(): + try: + execution_logging.log_list(log_iterator) + execution_thread.join(1) + except KeyboardInterrupt: + pass diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/logs.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/logs.py new file mode 100644 index 0000000..b751b97 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/logs.py @@ -0,0 +1,72 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI ``logs`` sub-commands. +""" + +from .. import execution_logging +from ..logger import ModelLogIterator +from ..core import aria + + +@aria.group(name='logs') +@aria.options.verbose() +def logs(): + """ + Manage logs of workflow executions + """ + pass + + +@logs.command(name='list', + short_help='List logs for an execution') +@aria.argument('execution-id') +@aria.options.verbose() +@aria.options.mark_pattern() +@aria.pass_model_storage +@aria.pass_logger +def list(execution_id, mark_pattern, model_storage, logger): + """ + List logs for an execution + + EXECUTION_ID is the unique ID of the execution. + """ + logger.info('Listing logs for execution id {0}'.format(execution_id)) + log_iterator = ModelLogIterator(model_storage, execution_id) + + any_logs = execution_logging.log_list(log_iterator, mark_pattern=mark_pattern) + + if not any_logs: + logger.info('\tNo logs') + + +@logs.command(name='delete', + short_help='Delete logs of an execution') +@aria.argument('execution-id') +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def delete(execution_id, model_storage, logger): + """ + Delete logs of an execution + + EXECUTION_ID is the unique ID of the execution. + """ + logger.info('Deleting logs for execution id {0}'.format(execution_id)) + logs_list = model_storage.log.list(filters=dict(execution_fk=execution_id)) + for log in logs_list: + model_storage.log.delete(log) + logger.info('Deleted logs for execution id {0}'.format(execution_id)) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/node_templates.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/node_templates.py new file mode 100644 index 0000000..ec160d2 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/node_templates.py @@ -0,0 +1,100 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI ``node-templates`` sub-commands. +""" + +from .. import table +from .. import utils +from ..core import aria + + +NODE_TEMPLATE_COLUMNS = ['id', 'name', 'description', 'service_template_name', 'type_name'] + + +@aria.group(name='node-templates') +@aria.options.verbose() +def node_templates(): + """ + Manages stored service templates' node templates + """ + pass + + +@node_templates.command(name='show', + short_help='Show information for a stored node template') +@aria.argument('node-template-id') +# @aria.options.service_template_name(required=True) +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def show(node_template_id, model_storage, logger): + """ + Show information for a stored node template + + NODE_TEMPLATE_ID is the unique node template ID. + """ + logger.info('Showing node template {0}'.format(node_template_id)) + node_template = model_storage.node_template.get(node_template_id) + + table.print_data(NODE_TEMPLATE_COLUMNS, node_template, 'Node template:', col_max_width=50) + + # print node template properties + logger.info('Node template properties:') + if node_template.properties: + logger.info(utils.get_parameter_templates_as_string(node_template.properties)) + else: + logger.info('\tNo properties') + + # print node IDs + nodes = node_template.nodes + logger.info('Nodes:') + if nodes: + for node in nodes: + logger.info('\t{0}'.format(node.name)) + else: + logger.info('\tNo nodes') + + +@node_templates.command(name='list', + short_help='List stored node templates') +@aria.options.service_template_name() +@aria.options.sort_by('service_template_name') +@aria.options.descending +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def list(service_template_name, sort_by, descending, model_storage, logger): + """ + List stored node templates + + If SERVICE_TEMPLATE_NAME is provided, list node templates for that stored service template. + Otherwise, list node templates for all service templates. + """ + if service_template_name: + logger.info('Listing node templates for service template {0}...'.format( + service_template_name)) + service_template = model_storage.service_template.get_by_name(service_template_name) + filters = dict(service_template=service_template) + else: + logger.info('Listing all node templates...') + filters = {} + + node_templates_list = model_storage.node_template.list( + filters=filters, + sort=utils.storage_sort_param(sort_by, descending)) + + table.print_data(NODE_TEMPLATE_COLUMNS, node_templates_list, 'Node templates:') diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/nodes.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/nodes.py new file mode 100644 index 0000000..30f1dd4 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/nodes.py @@ -0,0 +1,94 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI ``nodes`` sub-commands. +""" + +from .. import table +from .. import utils +from ..core import aria + + +NODE_COLUMNS = ['id', 'name', 'service_name', 'node_template_name', 'state'] + + +@aria.group(name='nodes') +@aria.options.verbose() +def nodes(): + """ + Manage services' nodes + """ + pass + + +@nodes.command(name='show', + short_help='Show information for a node') +@aria.argument('node_id') +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def show(node_id, model_storage, logger): + """ + Show information for a node + + NODE_ID is the unique node ID. + """ + logger.info('Showing node {0}'.format(node_id)) + node = model_storage.node.get(node_id) + + table.print_data(NODE_COLUMNS, node, 'Node:', col_max_width=50) + + # print node attributes + logger.info('Node attributes:') + if node.attributes: + for param_name, param in node.attributes.iteritems(): + logger.info('\t{0}: {1}'.format(param_name, param.value)) + else: + logger.info('\tNo attributes') + + +@nodes.command(name='list', + short_help='List node') +@aria.options.service_name(required=False) +@aria.options.sort_by('service_name') +@aria.options.descending +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def list(service_name, + sort_by, + descending, + model_storage, + logger): + """ + List nodes + + If SERVICE_NAME is provided, list nodes for that service. Otherwise, list nodes for all + services. + """ + if service_name: + logger.info('Listing nodes for service {0}...'.format(service_name)) + service = model_storage.service.get_by_name(service_name) + filters = dict(service=service) + else: + logger.info('Listing all nodes...') + filters = {} + + nodes_list = model_storage.node.list( + filters=filters, + sort=utils.storage_sort_param(sort_by, descending)) + + table.print_data(NODE_COLUMNS, nodes_list, 'Nodes:') diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/plugins.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/plugins.py new file mode 100644 index 0000000..b5d68a2 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/plugins.py @@ -0,0 +1,111 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI ``plugins`` sub-commands. +""" + +from .. import table +from .. import utils +from ..core import aria + + +PLUGIN_COLUMNS = ['id', 'package_name', 'package_version', 'supported_platform', + 'distribution', 'distribution_release', 'uploaded_at'] + + +@aria.group(name='plugins') +@aria.options.verbose() +def plugins(): + """ + Manage plugins + """ + pass + + +@plugins.command(name='validate', + short_help='Validate a plugin archive') +@aria.argument('plugin-path') +@aria.options.verbose() +@aria.pass_plugin_manager +@aria.pass_logger +def validate(plugin_path, plugin_manager, logger): + """ + Validate a plugin archive + + A valid plugin is a wagon (`http://github.com/cloudify-cosmo/wagon`) in the ZIP format (suffix + may also be `.wgn`). + + PLUGIN_PATH is the path to the wagon archive. + """ + logger.info('Validating plugin {0}...'.format(plugin_path)) + plugin_manager.validate_plugin(plugin_path) + logger.info('Plugin validated successfully') + + +@plugins.command(name='install', + short_help='Install a plugin') +@aria.argument('plugin-path') +@aria.options.verbose() +@aria.pass_context +@aria.pass_plugin_manager +@aria.pass_logger +def install(ctx, plugin_path, plugin_manager, logger): + """ + Install a plugin + + A valid plugin is a wagon (`http://github.com/cloudify-cosmo/wagon`) in the ZIP format (suffix + may also be `.wgn`). + + PLUGIN_PATH is the path to the wagon archive. + """ + ctx.invoke(validate, plugin_path=plugin_path) + logger.info('Installing plugin {0}...'.format(plugin_path)) + plugin = plugin_manager.install(plugin_path) + logger.info("Plugin installed. The plugin's id is {0}".format(plugin.id)) + + +@plugins.command(name='show', + short_help='Show information for an installed plugin') +@aria.argument('plugin-id') +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def show(plugin_id, model_storage, logger): + """ + Show information for an installed plugin + + PLUGIN_ID is the unique installed plugin ID in this ARIA instance. + """ + logger.info('Showing plugin {0}...'.format(plugin_id)) + plugin = model_storage.plugin.get(plugin_id) + table.print_data(PLUGIN_COLUMNS, plugin, 'Plugin:') + + +@plugins.command(name='list', + short_help='List all installed plugins') +@aria.options.sort_by('uploaded_at') +@aria.options.descending +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def list(sort_by, descending, model_storage, logger): + """ + List all installed plugins + """ + logger.info('Listing all plugins...') + plugins_list = model_storage.plugin.list( + sort=utils.storage_sort_param(sort_by, descending)).items + table.print_data(PLUGIN_COLUMNS, plugins_list, 'Plugins:') diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/reset.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/reset.py new file mode 100644 index 0000000..c82c707 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/reset.py @@ -0,0 +1,45 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI ``reset`` command. +""" + +from .. import helptexts +from ..core import aria +from ..env import env +from ..exceptions import AriaCliError + + +@aria.command(name='reset', + short_help="Reset ARIA working directory") +@aria.options.force(help=helptexts.FORCE_RESET) +@aria.options.reset_config +@aria.pass_logger +@aria.options.verbose() +def reset(force, reset_config, logger): + """ + Reset ARIA working directory + + Deletes installed plugins, service templates, services, executions, and logs. The user + configuration will remain intact unless the `--reset_config` flag has been set as well, in + which case the entire ARIA working directory shall be removed. + """ + if not force: + raise AriaCliError("To reset the ARIA's working directory, you must also provide the force" + " flag ('-f'/'--force').") + + env.reset(reset_config=reset_config) + logger.info("ARIA's working directory has been reset") diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/service_templates.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/service_templates.py new file mode 100644 index 0000000..5a7039c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/service_templates.py @@ -0,0 +1,244 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI ``service-templates`` sub-commands. +""" + +import os + +from .. import csar +from .. import service_template_utils +from .. import table +from .. import utils +from ..core import aria +from ...core import Core +from ...storage import exceptions as storage_exceptions +from ...parser import consumption +from ...utils import (formatting, collections, console) +from ... orchestrator import topology + +DESCRIPTION_FIELD_LENGTH_LIMIT = 20 +SERVICE_TEMPLATE_COLUMNS = \ + ('id', 'name', 'description', 'main_file_name', 'created_at', 'updated_at') + + +@aria.group(name='service-templates') +@aria.options.verbose() +def service_templates(): + """ + Manage service templates + """ + pass + + +@service_templates.command(name='show', + short_help='Show information for a stored service template') +@aria.argument('service-template-name') +@aria.options.verbose() +@aria.pass_model_storage +@aria.options.service_template_mode_full +@aria.options.mode_types +@aria.options.format_json +@aria.options.format_yaml +@aria.pass_logger +def show(service_template_name, model_storage, mode_full, mode_types, format_json, format_yaml, + logger): + """ + Show information for a stored service template + + SERVICE_TEMPLATE_NAME is the unique name of the stored service template. + """ + service_template = model_storage.service_template.get_by_name(service_template_name) + + if format_json or format_yaml: + mode_full = True + + if mode_full: + consumption.ConsumptionContext() + if format_json: + console.puts(formatting.json_dumps(collections.prune(service_template.as_raw))) + elif format_yaml: + console.puts(formatting.yaml_dumps(collections.prune(service_template.as_raw))) + else: + console.puts(topology.Topology().dump(service_template)) + elif mode_types: + console.puts(topology.Topology().dump_types(service_template=service_template)) + else: + logger.info('Showing service template {0}...'.format(service_template_name)) + service_template_dict = service_template.to_dict() + service_template_dict['#services'] = len(service_template.services) + columns = SERVICE_TEMPLATE_COLUMNS + ('#services',) + column_formatters = \ + dict(description=table.trim_formatter_generator(DESCRIPTION_FIELD_LENGTH_LIMIT)) + table.print_data(columns, service_template_dict, 'Service-template:', + column_formatters=column_formatters, col_max_width=50) + + if service_template_dict['description'] is not None: + logger.info('Description:') + logger.info('{0}{1}'.format(service_template_dict['description'].encode('UTF-8') or '', + os.linesep)) + + if service_template.services: + logger.info('Existing services:') + for service_name in service_template.services: + logger.info('\t{0}'.format(service_name)) + + +@service_templates.command(name='list', + short_help='List all stored service templates') +@aria.options.sort_by() +@aria.options.descending +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def list(sort_by, descending, model_storage, logger): + """ + List all stored service templates + """ + + logger.info('Listing all service templates...') + service_templates_list = model_storage.service_template.list( + sort=utils.storage_sort_param(sort_by, descending)) + + column_formatters = \ + dict(description=table.trim_formatter_generator(DESCRIPTION_FIELD_LENGTH_LIMIT)) + table.print_data(SERVICE_TEMPLATE_COLUMNS, service_templates_list, 'Service templates:', + column_formatters=column_formatters) + + +@service_templates.command(name='store', + short_help='Parse and store a service template archive') +@aria.argument('service-template-path') +@aria.argument('service-template-name') +@aria.options.service_template_filename +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_resource_storage +@aria.pass_plugin_manager +@aria.pass_logger +def store(service_template_path, service_template_name, service_template_filename, + model_storage, resource_storage, plugin_manager, logger): + """ + Parse and store a service template archive + + SERVICE_TEMPLATE_PATH is the path to the service template archive. + + SERVICE_TEMPLATE_NAME is the unique name to give to the service template in storage. + """ + logger.info('Storing service template {0}...'.format(service_template_name)) + + service_template_path = service_template_utils.get(service_template_path, + service_template_filename) + core = Core(model_storage, resource_storage, plugin_manager) + try: + core.create_service_template(service_template_path, + os.path.dirname(service_template_path), + service_template_name) + except storage_exceptions.StorageError as e: + utils.check_overriding_storage_exceptions(e, 'service template', service_template_name) + raise + logger.info('Service template {0} stored'.format(service_template_name)) + + +@service_templates.command(name='delete', + short_help='Delete a stored service template') +@aria.argument('service-template-name') +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_resource_storage +@aria.pass_plugin_manager +@aria.pass_logger +def delete(service_template_name, model_storage, resource_storage, plugin_manager, logger): + """ + Delete a stored service template + + SERVICE_TEMPLATE_NAME is the unique name of the stored service template. + """ + logger.info('Deleting service template {0}...'.format(service_template_name)) + service_template = model_storage.service_template.get_by_name(service_template_name) + core = Core(model_storage, resource_storage, plugin_manager) + core.delete_service_template(service_template.id) + logger.info('Service template {0} deleted'.format(service_template_name)) + + +@service_templates.command(name='inputs', + short_help='Show stored service template inputs') +@aria.argument('service-template-name') +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def inputs(service_template_name, model_storage, logger): + """ + Show stored service template inputs + + SERVICE_TEMPLATE_NAME is the unique name of the stored service template. + """ + logger.info('Showing inputs for service template {0}...'.format(service_template_name)) + print_service_template_inputs(model_storage, service_template_name, logger) + + +@service_templates.command(name='validate', + short_help='Validate a service template archive') +@aria.argument('service-template') +@aria.options.service_template_filename +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_resource_storage +@aria.pass_plugin_manager +@aria.pass_logger +def validate(service_template, service_template_filename, + model_storage, resource_storage, plugin_manager, logger): + """ + Validate a service template archive + + SERVICE_TEMPLATE_PATH is the path to the service template archive. + """ + logger.info('Validating service template: {0}'.format(service_template)) + service_template_path = service_template_utils.get(service_template, service_template_filename) + core = Core(model_storage, resource_storage, plugin_manager) + core.validate_service_template(service_template_path) + logger.info('Service template validated successfully') + + +@service_templates.command(name='create-archive', + short_help='Create a CSAR archive from a service template source') +@aria.argument('service-template-path') +@aria.argument('destination') +@aria.options.verbose() +@aria.pass_logger +def create_archive(service_template_path, destination, logger): + """ + Create a CSAR archive from a service template source + + SERVICE_TEMPLATE_PATH is the path to the service template source. + + DESTINATION is the path to the created CSAR archive. + """ + logger.info('Creating a CSAR archive') + if not destination.endswith(csar.CSAR_FILE_EXTENSION): + destination += csar.CSAR_FILE_EXTENSION + csar.write(service_template_path, destination, logger) + logger.info('CSAR archive created at {0}'.format(destination)) + + +def print_service_template_inputs(model_storage, service_template_name, logger): + service_template = model_storage.service_template.get_by_name(service_template_name) + + logger.info('Service template inputs:') + if service_template.inputs: + logger.info(utils.get_parameter_templates_as_string(service_template.inputs)) + else: + logger.info('\tNo inputs') diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/services.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/services.py new file mode 100644 index 0000000..6752899 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/services.py @@ -0,0 +1,238 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI ``services`` sub-commands. +""" + +import os +from StringIO import StringIO + +from . import service_templates +from .. import helptexts +from .. import table +from .. import utils +from ..core import aria +from ...core import Core +from ...modeling import exceptions as modeling_exceptions +from ...storage import exceptions as storage_exceptions +from ...parser import consumption +from ...utils import (formatting, collections, console) +from ...orchestrator import topology + + +DESCRIPTION_FIELD_LENGTH_LIMIT = 20 +SERVICE_COLUMNS = ('id', 'name', 'description', 'service_template_name', 'created_at', 'updated_at') + + +@aria.group(name='services') +@aria.options.verbose() +def services(): + """ + Manage services + """ + pass + + +@services.command(name='show', + short_help='Show information for a service') +@aria.argument('service-name') +@aria.options.verbose() +@aria.options.service_mode_full +@aria.options.mode_graph +@aria.options.format_json +@aria.options.format_yaml +@aria.pass_model_storage +@aria.pass_logger +def show(service_name, model_storage, mode_full, mode_graph, format_json, format_yaml, logger): + """ + Show information for a service + + SERVICE_NAME is the unique name of the service. + """ + service = model_storage.service.get_by_name(service_name) + + if format_json or format_yaml: + mode_full = True + + if mode_full: + consumption.ConsumptionContext() + if format_json: + console.puts(formatting.json_dumps(collections.prune(service.as_raw))) + elif format_yaml: + console.puts(formatting.yaml_dumps(collections.prune(service.as_raw))) + else: + console.puts(topology.Topology().dump(service)) + elif mode_graph: + console.puts(topology.Topology().dump_graph(service)) + else: + logger.info('Showing service {0}...'.format(service_name)) + service_dict = service.to_dict() + columns = SERVICE_COLUMNS + column_formatters = \ + dict(description=table.trim_formatter_generator(DESCRIPTION_FIELD_LENGTH_LIMIT)) + table.print_data(columns, service_dict, 'Service:', + column_formatters=column_formatters, col_max_width=50) + + if service_dict['description'] is not None: + logger.info('Description:') + logger.info('{0}{1}'.format(service_dict['description'].encode('UTF-8') or '', + os.linesep)) + + +@services.command(name='list', short_help='List services') +@aria.options.service_template_name() +@aria.options.sort_by() +@aria.options.descending +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def list(service_template_name, + sort_by, + descending, + model_storage, + logger): + """ + List services + + If `--service-template-name` is provided, list services based on that service template. + Otherwise, list all services. + """ + if service_template_name: + logger.info('Listing services for service template {0}...'.format( + service_template_name)) + service_template = model_storage.service_template.get_by_name(service_template_name) + filters = dict(service_template=service_template) + else: + logger.info('Listing all services...') + filters = {} + + services_list = model_storage.service.list( + sort=utils.storage_sort_param(sort_by=sort_by, descending=descending), + filters=filters) + table.print_data(SERVICE_COLUMNS, services_list, 'Services:') + + +@services.command(name='create', + short_help='Create a service') +@aria.argument('service-name', required=False) +@aria.options.service_template_name(required=True) +@aria.options.inputs(help=helptexts.SERVICE_INPUTS) +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_resource_storage +@aria.pass_plugin_manager +@aria.pass_logger +def create(service_template_name, + service_name, + inputs, # pylint: disable=redefined-outer-name + model_storage, + resource_storage, + plugin_manager, + logger): + """ + Create a service + + SERVICE_NAME is the unique name to give to the service. + """ + logger.info('Creating new service from service template {0}...'.format( + service_template_name)) + core = Core(model_storage, resource_storage, plugin_manager) + service_template = model_storage.service_template.get_by_name(service_template_name) + + try: + service = core.create_service(service_template.id, inputs, service_name) + except storage_exceptions.StorageError as e: + utils.check_overriding_storage_exceptions(e, 'service', service_name) + raise + except modeling_exceptions.ParameterException: + service_templates.print_service_template_inputs(model_storage, service_template_name, + logger) + raise + logger.info("Service created. The service's name is {0}".format(service.name)) + + +@services.command(name='delete', + short_help='Delete a service') +@aria.argument('service-name') +@aria.options.force(help=helptexts.IGNORE_AVAILABLE_NODES) +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_resource_storage +@aria.pass_plugin_manager +@aria.pass_logger +def delete(service_name, force, model_storage, resource_storage, plugin_manager, logger): + """ + Delete a service + + SERVICE_NAME is the unique name of the service. + """ + logger.info('Deleting service {0}...'.format(service_name)) + service = model_storage.service.get_by_name(service_name) + core = Core(model_storage, resource_storage, plugin_manager) + core.delete_service(service.id, force=force) + logger.info('Service {0} deleted'.format(service_name)) + + +@services.command(name='outputs', + short_help='Show service outputs') +@aria.argument('service-name') +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def outputs(service_name, model_storage, logger): + """ + Show service outputs + + SERVICE_NAME is the unique name of the service. + """ + logger.info('Showing outputs for service {0}...'.format(service_name)) + service = model_storage.service.get_by_name(service_name) + + if service.outputs: + outputs_string = StringIO() + for output_name, output in service.outputs.iteritems(): + outputs_string.write(' - "{0}":{1}'.format(output_name, os.linesep)) + outputs_string.write(' Description: {0}{1}'.format(output.description, os.linesep)) + outputs_string.write(' Value: {0}{1}'.format(output.value, os.linesep)) + logger.info(outputs_string.getvalue()) + else: + logger.info('\tNo outputs') + + +@services.command(name='inputs', + short_help='Show service inputs') +@aria.argument('service-name') +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def inputs(service_name, model_storage, logger): + """ + Show service inputs + + SERVICE_NAME is the unique name of the service. + """ + logger.info('Showing inputs for service {0}...'.format(service_name)) + service = model_storage.service.get_by_name(service_name) + + if service.inputs: + inputs_string = StringIO() + for input_name, input_ in service.inputs.iteritems(): + inputs_string.write(' - "{0}":{1}'.format(input_name, os.linesep)) + inputs_string.write(' Description: {0}{1}'.format(input_.description, os.linesep)) + inputs_string.write(' Value: {0}{1}'.format(input_.value, os.linesep)) + logger.info(inputs_string.getvalue()) + else: + logger.info('\tNo inputs') diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/workflows.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/workflows.py new file mode 100644 index 0000000..ca191aa --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/commands/workflows.py @@ -0,0 +1,111 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI ``worfklows`` sub-commands. +""" + +from .. import table +from ..core import aria +from ..exceptions import AriaCliError + +WORKFLOW_COLUMNS = ['name', 'service_template_name', 'service_name'] + + +@aria.group(name='workflows') +def workflows(): + """ + Manage service workflows + """ + pass + + +@workflows.command(name='show', + short_help='Show information for a service workflow') +@aria.argument('workflow-name') +@aria.options.service_name(required=True) +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def show(workflow_name, service_name, model_storage, logger): + """ + Show information for a service workflow + + SERVICE_NAME is the unique name of the service. + + WORKFLOW_NAME is the unique name of the workflow within the service (e.g. "uninstall"). + """ + logger.info('Retrieving workflow {0} for service {1}'.format( + workflow_name, service_name)) + service = model_storage.service.get_by_name(service_name) + workflow = next((wf for wf in service.workflows.itervalues() if + wf.name == workflow_name), None) + if not workflow: + raise AriaCliError( + 'Workflow {0} not found for service {1}'.format(workflow_name, service_name)) + + defaults = { + 'service_template_name': service.service_template_name, + 'service_name': service.name + } + table.print_data(WORKFLOW_COLUMNS, workflow, 'Workflows:', defaults=defaults) + + # print workflow inputs + required_inputs = dict() + optional_inputs = dict() + for input_name, input in workflow.inputs.iteritems(): + inputs_group = optional_inputs if input.value is not None else required_inputs + inputs_group[input_name] = input + + logger.info('Workflow Inputs:') + logger.info('\tMandatory Inputs:') + for input_name, input in required_inputs.iteritems(): + if input.description is not None: + logger.info('\t\t{0}\t({1})'.format(input_name, + input.description)) + else: + logger.info('\t\t{0}'.format(input_name)) + + logger.info('\tOptional Inputs:') + for input_name, input in optional_inputs.iteritems(): + if input.description is not None: + logger.info('\t\t{0}: \t{1}\t({2})'.format( + input_name, input.value, input.description)) + else: + logger.info('\t\t{0}: \t{1}'.format(input_name, + input.value)) + + +@workflows.command(name='list', + short_help='List service workflows') +@aria.options.service_name(required=True) +@aria.options.verbose() +@aria.pass_model_storage +@aria.pass_logger +def list(service_name, model_storage, logger): + """ + List service workflows + + SERVICE_NAME is the unique name of the service. + """ + logger.info('Listing workflows for service {0}...'.format(service_name)) + service = model_storage.service.get_by_name(service_name) + workflows_list = sorted(service.workflows.itervalues(), key=lambda w: w.name) + + defaults = { + 'service_template_name': service.service_template_name, + 'service_name': service.name + } + table.print_data(WORKFLOW_COLUMNS, workflows_list, 'Workflows:', defaults=defaults) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/config/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/config/__init__.py new file mode 100644 index 0000000..738e8ed --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/config/__init__.py @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI configuration package. +""" diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/config/config.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/config/config.py new file mode 100644 index 0000000..bbece80 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/config/config.py @@ -0,0 +1,93 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI configuration mechanism. +""" + +import os +import pkg_resources +from ruamel import yaml + +from jinja2.environment import Template + + +CONFIG_FILE_NAME = 'config.yaml' + + +class CliConfig(object): + + def __init__(self, config_path): + with open(config_path) as f: + self._config = yaml.safe_load(f.read()) + + @classmethod + def create_config(cls, workdir): + config_path = os.path.join(workdir, CONFIG_FILE_NAME) + if not os.path.isfile(config_path): + config_template = pkg_resources.resource_string( + __package__, + 'config_template.yaml') + + default_values = { + 'log_path': os.path.join(workdir, 'cli.log'), + 'enable_colors': True + } + + template = Template(config_template) + rendered = template.render(**default_values) + with open(config_path, 'w') as f: + f.write(rendered) + f.write(os.linesep) + + return cls(config_path) + + @property + def logging(self): + return self.Logging(self._config.get('logging')) + + class Logging(object): + + def __init__(self, logging): + self._logging = logging or {} + + @property + def filename(self): + return self._logging.get('filename') + + @property + def loggers(self): + return self._logging.get('loggers', {}) + + @property + def execution(self): + return self.Execution(self._logging.get('execution')) + + class Execution(object): + + def __init__(self, execution_logging): + self._execution_logging = execution_logging + + @property + def colors_enabled(self): + return self.colors.get('enabled', False) + + @property + def colors(self): + return self._execution_logging.get('colors', {}) + + @property + def formats(self): + return self._execution_logging.get('formats', {}) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/config/config_template.yaml b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/config/config_template.yaml new file mode 100644 index 0000000..94fcac3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/config/config_template.yaml @@ -0,0 +1,42 @@ + +logging: + + # path to a file where cli logs will be saved. + filename: {{ log_path }} + + # configuring level per logger + loggers: + + # main logger of the cli. provides basic descriptions for executed operations. + aria.cli.main: info + + execution: + formats: + # According to verbosity level 0 - no verbose. 3 - high verbose + 0: '{message}' + 1: '{timestamp:%H:%M:%S} | {level[0]} | {message}' + 2: '{timestamp:%H:%M:%S} | {level[0]} | {implementation} | {message}' + 3: '{timestamp:%H:%M:%S} | {level[0]} | {implementation} | {inputs} | {message}' + + colors: + enabled: true + + level: + default: {'fore': 'lightmagenta_ex'} + error: {'fore': 'red', 'style': 'bright'} + timestamp: + default: {'fore': 'lightmagenta_ex'} + error: {'fore': 'red', 'style': 'bright'} + message: + default: {'fore': 'lightblue_ex'} + error: {'fore': 'red', 'style': 'bright'} + implementation: + default: {'fore': 'lightblack_ex'} + error: {'fore': 'red', 'style': 'bright'} + inputs: + default: {'fore': 'blue'} + error: {'fore': 'red', 'style': 'bright'} + traceback: + default: {'fore': 'red'} + + marker: 'lightyellow_ex' diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/core/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/core/__init__.py new file mode 100644 index 0000000..88a9801 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/core/__init__.py @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI core package. +""" diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/core/aria.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/core/aria.py new file mode 100644 index 0000000..b84507c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/core/aria.py @@ -0,0 +1,507 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Enhancements and ARIA-specific conveniences for `Click `__. +""" + +import os +import sys +import difflib +import traceback +import inspect +from functools import wraps + +import click + +from ..env import ( + env, + logger +) +from .. import defaults +from .. import helptexts +from ..ascii_art import ARIA_ASCII_ART +from ..inputs import inputs_to_dict +from ... import __version__ +from ...utils.exceptions import get_exception_as_string + + +CLICK_CONTEXT_SETTINGS = dict( + help_option_names=['-h', '--help'], + token_normalize_func=lambda param: param.lower()) + + +class MutuallyExclusiveOption(click.Option): + def __init__(self, *args, **kwargs): + self.mutually_exclusive = set(kwargs.pop('mutually_exclusive', tuple())) + self.mutuality_description = kwargs.pop('mutuality_description', + ', '.join(self.mutually_exclusive)) + self.mutuality_error = kwargs.pop('mutuality_error', + helptexts.DEFAULT_MUTUALITY_ERROR_MESSAGE) + if self.mutually_exclusive: + help = kwargs.get('help', '') + kwargs['help'] = '{0}. {1}'.format(help, self._message) + super(MutuallyExclusiveOption, self).__init__(*args, **kwargs) + + def handle_parse_result(self, ctx, opts, args): + if (self.name in opts) and self.mutually_exclusive.intersection(opts): + raise click.UsageError('Illegal usage: {0}'.format(self._message)) + return super(MutuallyExclusiveOption, self).handle_parse_result(ctx, opts, args) + + @property + def _message(self): + return '{0} be used together with {1} ({2}).'.format( + '{0} cannot'.format(', '.join(self.opts)) if hasattr(self, 'opts') else 'Cannot', + self.mutuality_description, + self.mutuality_error) + + +def mutually_exclusive_option(*param_decls, **attrs): + """ + Decorator for mutually exclusive options. + + This decorator works similarly to `click.option`, but supports an extra ``mutually_exclusive`` + argument, which is a list of argument names with which the option is mutually exclusive. + + You can optionally also supply ``mutuality_description`` and ``mutuality_error`` to override the + default messages. + + NOTE: All mutually exclusive options must use this. It's not enough to use it in just one of the + options. + """ + + # NOTE: This code is copied and slightly modified from click.decorators.option and + # click.decorators._param_memo. Unfortunately, using click's ``cls`` parameter support does not + # work as is with extra decorator arguments. + + def decorator(func): + if 'help' in attrs: + attrs['help'] = inspect.cleandoc(attrs['help']) + param = MutuallyExclusiveOption(param_decls, **attrs) + if not hasattr(func, '__click_params__'): + func.__click_params__ = [] + func.__click_params__.append(param) + return func + return decorator + + +def show_version(ctx, param, value): + if not value: + return + + logger.info('{0} v{1}'.format(ARIA_ASCII_ART, __version__)) + ctx.exit() + + +def inputs_callback(ctx, param, value): + """ + Allow to pass any inputs we provide to a command as processed inputs instead of having to call + ``inputs_to_dict`` inside the command. + + ``@aria.options.inputs`` already calls this callback so that every time you use the option it + returns the inputs as a dictionary. + """ + if not value: + return {} + + return inputs_to_dict(value) + + +def set_verbosity_level(ctx, param, value): + if not value: + return + + env.logging.verbosity_level = value + + +def set_cli_except_hook(): + def recommend(possible_solutions): + logger.info('Possible solutions:') + for solution in possible_solutions: + logger.info(' - {0}'.format(solution)) + + def new_excepthook(tpe, value, trace): + if env.logging.is_high_verbose_level(): + # log error including traceback + logger.error(get_exception_as_string(tpe, value, trace)) + else: + # write the full error to the log file + with open(env.logging.log_file, 'a') as log_file: + traceback.print_exception( + etype=tpe, + value=value, + tb=trace, + file=log_file) + # print only the error message + print value + + if hasattr(value, 'possible_solutions'): + recommend(getattr(value, 'possible_solutions')) + + sys.excepthook = new_excepthook + + +def pass_logger(func): + """ + Simply passes the logger to a command. + """ + # Wraps here makes sure the original docstring propagates to click + @wraps(func) + def wrapper(*args, **kwargs): + return func(logger=logger, *args, **kwargs) + + return wrapper + + +def pass_plugin_manager(func): + """ + Simply passes the plugin manager to a command. + """ + # Wraps here makes sure the original docstring propagates to click + @wraps(func) + def wrapper(*args, **kwargs): + return func(plugin_manager=env.plugin_manager, *args, **kwargs) + + return wrapper + + +def pass_model_storage(func): + """ + Simply passes the model storage to a command. + """ + # Wraps here makes sure the original docstring propagates to click + @wraps(func) + def wrapper(*args, **kwargs): + return func(model_storage=env.model_storage, *args, **kwargs) + + return wrapper + + +def pass_resource_storage(func): + """ + Simply passes the resource storage to a command. + """ + # Wraps here makes sure the original docstring propagates to click + @wraps(func) + def wrapper(*args, **kwargs): + return func(resource_storage=env.resource_storage, *args, **kwargs) + + return wrapper + + +def pass_context(func): + """ + Make click context ARIA specific. + + This exists purely for aesthetic reasons, otherwise some decorators are called + ``@click.something`` instead of ``@aria.something``. + """ + return click.pass_context(func) + + +class AliasedGroup(click.Group): + def __init__(self, *args, **kwargs): + self.max_suggestions = kwargs.pop("max_suggestions", 3) + self.cutoff = kwargs.pop("cutoff", 0.5) + super(AliasedGroup, self).__init__(*args, **kwargs) + + def get_command(self, ctx, cmd_name): + cmd = click.Group.get_command(self, ctx, cmd_name) + if cmd is not None: + return cmd + matches = \ + [x for x in self.list_commands(ctx) if x.startswith(cmd_name)] + if not matches: + return None + elif len(matches) == 1: + return click.Group.get_command(self, ctx, matches[0]) + ctx.fail('Too many matches: {0}'.format(', '.join(sorted(matches)))) + + def resolve_command(self, ctx, args): + """ + Override clicks ``resolve_command`` method and appends *Did you mean ...* suggestions to the + raised exception message. + """ + try: + return super(AliasedGroup, self).resolve_command(ctx, args) + except click.exceptions.UsageError as error: + error_msg = str(error) + original_cmd_name = click.utils.make_str(args[0]) + matches = difflib.get_close_matches( + original_cmd_name, + self.list_commands(ctx), + self.max_suggestions, + self.cutoff) + if matches: + error_msg += '{0}{0}Did you mean one of these?{0} {1}'.format( + os.linesep, + '{0} '.format(os.linesep).join(matches, )) + raise click.exceptions.UsageError(error_msg, error.ctx) + + +def group(name): + """ + Allow to create a group with a default click context and a class for Click's ``didyoueamn`` + without having to repeat it for every group. + """ + return click.group( + name=name, + context_settings=CLICK_CONTEXT_SETTINGS, + cls=AliasedGroup) + + +def command(*args, **kwargs): + """ + Make Click commands ARIA specific. + + This exists purely for aesthetic reasons, otherwise some decorators are called + ``@click.something`` instead of ``@aria.something``. + """ + return click.command(*args, **kwargs) + + +def argument(*args, **kwargs): + """ + Make Click arguments specific to ARIA. + + This exists purely for aesthetic reasons, otherwise some decorators are called + ``@click.something`` instead of ``@aria.something`` + """ + return click.argument(*args, **kwargs) + + +class Options(object): + def __init__(self): + """ + The options API is nicer when you use each option by calling ``@aria.options.some_option`` + instead of ``@aria.some_option``. + + Note that some options are attributes and some are static methods. The reason for that is + that we want to be explicit regarding how a developer sees an option. If it can receive + arguments, it's a method - if not, it's an attribute. + """ + self.version = click.option( + '--version', + is_flag=True, + callback=show_version, + expose_value=False, + is_eager=True, + help=helptexts.VERSION) + + self.json_output = click.option( + '--json-output', + is_flag=True, + help=helptexts.JSON_OUTPUT) + + self.dry_execution = click.option( + '--dry', + is_flag=True, + help=helptexts.DRY_EXECUTION) + + self.retry_failed_tasks = click.option( + '--retry-failed-tasks', + is_flag=True, + help=helptexts.RETRY_FAILED_TASK + ) + + self.reset_config = click.option( + '--reset-config', + is_flag=True, + help=helptexts.RESET_CONFIG) + + self.descending = click.option( + '--descending', + required=False, + is_flag=True, + default=defaults.SORT_DESCENDING, + help=helptexts.DESCENDING) + + self.service_template_filename = click.option( + '-n', + '--service-template-filename', + default=defaults.SERVICE_TEMPLATE_FILENAME, + help=helptexts.SERVICE_TEMPLATE_FILENAME) + + self.service_template_mode_full = mutually_exclusive_option( + '-f', + '--full', + 'mode_full', + mutually_exclusive=('mode_types',), + is_flag=True, + help=helptexts.SHOW_FULL, + mutuality_description='-t, --types', + mutuality_error=helptexts.MODE_MUTUALITY_ERROR_MESSAGE) + + self.service_mode_full = mutually_exclusive_option( + '-f', + '--full', + 'mode_full', + mutually_exclusive=('mode_graph',), + is_flag=True, + help=helptexts.SHOW_FULL, + mutuality_description='-g, --graph', + mutuality_error=helptexts.MODE_MUTUALITY_ERROR_MESSAGE) + + self.mode_types = mutually_exclusive_option( + '-t', + '--types', + 'mode_types', + mutually_exclusive=('mode_full',), + is_flag=True, + help=helptexts.SHOW_TYPES, + mutuality_description='-f, --full', + mutuality_error=helptexts.MODE_MUTUALITY_ERROR_MESSAGE) + + self.mode_graph = mutually_exclusive_option( + '-g', + '--graph', + 'mode_graph', + mutually_exclusive=('mode_full',), + is_flag=True, + help=helptexts.SHOW_GRAPH, + mutuality_description='-f, --full', + mutuality_error=helptexts.MODE_MUTUALITY_ERROR_MESSAGE) + + self.format_json = mutually_exclusive_option( + '-j', + '--json', + 'format_json', + mutually_exclusive=('format_yaml',), + is_flag=True, + help=helptexts.SHOW_JSON, + mutuality_description='-y, --yaml', + mutuality_error=helptexts.FORMAT_MUTUALITY_ERROR_MESSAGE) + + self.format_yaml = mutually_exclusive_option( + '-y', + '--yaml', + 'format_yaml', + mutually_exclusive=('format_json',), + is_flag=True, + help=helptexts.SHOW_YAML, + mutuality_description='-j, --json', + mutuality_error=helptexts.FORMAT_MUTUALITY_ERROR_MESSAGE) + + @staticmethod + def verbose(expose_value=False): + return click.option( + '-v', + '--verbose', + count=True, + callback=set_verbosity_level, + expose_value=expose_value, + is_eager=True, + help=helptexts.VERBOSE) + + @staticmethod + def inputs(help): + return click.option( + '-i', + '--inputs', + multiple=True, + callback=inputs_callback, + help=help) + + @staticmethod + def force(help): + return click.option( + '-f', + '--force', + is_flag=True, + help=help) + + @staticmethod + def task_max_attempts(default=defaults.TASK_MAX_ATTEMPTS): + return click.option( + '--task-max-attempts', + type=int, + default=default, + help=helptexts.TASK_MAX_ATTEMPTS.format(default)) + + @staticmethod + def sort_by(default='created_at'): + return click.option( + '--sort-by', + required=False, + default=default, + help=helptexts.SORT_BY) + + @staticmethod + def task_retry_interval(default=defaults.TASK_RETRY_INTERVAL): + return click.option( + '--task-retry-interval', + type=int, + default=default, + help=helptexts.TASK_RETRY_INTERVAL.format(default)) + + @staticmethod + def service_id(required=False): + return click.option( + '-s', + '--service-id', + required=required, + help=helptexts.SERVICE_ID) + + @staticmethod + def execution_id(required=False): + return click.option( + '-e', + '--execution-id', + required=required, + help=helptexts.EXECUTION_ID) + + @staticmethod + def service_template_id(required=False): + return click.option( + '-t', + '--service-template-id', + required=required, + help=helptexts.SERVICE_TEMPLATE_ID) + + @staticmethod + def service_template_path(required=False): + return click.option( + '-p', + '--service-template-path', + required=required, + type=click.Path(exists=True)) + + @staticmethod + def service_name(required=False): + return click.option( + '-s', + '--service-name', + required=required, + help=helptexts.SERVICE_ID) + + @staticmethod + def service_template_name(required=False): + return click.option( + '-t', + '--service-template-name', + required=required, + help=helptexts.SERVICE_ID) + + @staticmethod + def mark_pattern(): + return click.option( + '-m', + '--mark-pattern', + help=helptexts.MARK_PATTERN, + type=str, + required=False + ) + +options = Options() diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/csar.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/csar.py new file mode 100644 index 0000000..40b1699 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/csar.py @@ -0,0 +1,187 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Support for the CSAR (Cloud Service ARchive) packaging specification. + +See the `TOSCA Simple Profile v1.0 cos01 specification `__ +""" + +import os +import logging +import pprint +import tempfile +import zipfile + +import requests +from ruamel import yaml + +CSAR_FILE_EXTENSION = '.csar' +META_FILE = 'TOSCA-Metadata/TOSCA.meta' +META_FILE_VERSION_KEY = 'TOSCA-Meta-File-Version' +META_FILE_VERSION_VALUE = '1.0' +META_CSAR_VERSION_KEY = 'CSAR-Version' +META_CSAR_VERSION_VALUE = '1.1' +META_CREATED_BY_KEY = 'Created-By' +META_CREATED_BY_VALUE = 'ARIA' +META_ENTRY_DEFINITIONS_KEY = 'Entry-Definitions' +BASE_METADATA = { + META_FILE_VERSION_KEY: META_FILE_VERSION_VALUE, + META_CSAR_VERSION_KEY: META_CSAR_VERSION_VALUE, + META_CREATED_BY_KEY: META_CREATED_BY_VALUE, +} + + +def write(service_template_path, destination, logger): + + service_template_path = os.path.abspath(os.path.expanduser(service_template_path)) + source = os.path.dirname(service_template_path) + entry = os.path.basename(service_template_path) + + meta_file = os.path.join(source, META_FILE) + if not os.path.isdir(source): + raise ValueError('{0} is not a directory. Please specify the service template ' + 'directory.'.format(source)) + if not os.path.isfile(service_template_path): + raise ValueError('{0} does not exists. Please specify a valid entry point.' + .format(service_template_path)) + if os.path.exists(destination): + raise ValueError('{0} already exists. Please provide a path to where the CSAR should be ' + 'created.'.format(destination)) + if os.path.exists(meta_file): + raise ValueError('{0} already exists. This commands generates a meta file for you. Please ' + 'remove the existing metafile.'.format(meta_file)) + metadata = BASE_METADATA.copy() + metadata[META_ENTRY_DEFINITIONS_KEY] = entry + logger.debug('Compressing root directory to ZIP') + with zipfile.ZipFile(destination, 'w', zipfile.ZIP_DEFLATED) as f: + for root, _, files in os.walk(source): + for file in files: + file_full_path = os.path.join(root, file) + file_relative_path = os.path.relpath(file_full_path, source) + logger.debug('Writing to archive: {0}'.format(file_relative_path)) + f.write(file_full_path, file_relative_path) + logger.debug('Writing new metadata file to {0}'.format(META_FILE)) + f.writestr(META_FILE, yaml.dump(metadata, default_flow_style=False)) + + +class _CSARReader(object): + + def __init__(self, source, destination, logger): + self.logger = logger + if os.path.isdir(destination) and os.listdir(destination): + raise ValueError('{0} already exists and is not empty. ' + 'Please specify the location where the CSAR ' + 'should be extracted.'.format(destination)) + downloaded_csar = '://' in source + if downloaded_csar: + file_descriptor, download_target = tempfile.mkstemp() + os.close(file_descriptor) + self._download(source, download_target) + source = download_target + self.source = os.path.expanduser(source) + self.destination = os.path.expanduser(destination) + self.metadata = {} + try: + if not os.path.exists(self.source): + raise ValueError('{0} does not exists. Please specify a valid CSAR path.' + .format(self.source)) + if not zipfile.is_zipfile(self.source): + raise ValueError('{0} is not a valid CSAR.'.format(self.source)) + self._extract() + self._read_metadata() + self._validate() + finally: + if downloaded_csar: + os.remove(self.source) + + @property + def created_by(self): + return self.metadata.get(META_CREATED_BY_KEY) + + @property + def csar_version(self): + return self.metadata.get(META_CSAR_VERSION_KEY) + + @property + def meta_file_version(self): + return self.metadata.get(META_FILE_VERSION_KEY) + + @property + def entry_definitions(self): + return self.metadata.get(META_ENTRY_DEFINITIONS_KEY) + + @property + def entry_definitions_yaml(self): + with open(os.path.join(self.destination, self.entry_definitions)) as f: + return yaml.load(f) + + def _extract(self): + self.logger.debug('Extracting CSAR contents') + if not os.path.exists(self.destination): + os.mkdir(self.destination) + with zipfile.ZipFile(self.source) as f: + f.extractall(self.destination) + self.logger.debug('CSAR contents successfully extracted') + + def _read_metadata(self): + csar_metafile = os.path.join(self.destination, META_FILE) + if not os.path.exists(csar_metafile): + raise ValueError('Metadata file {0} is missing from the CSAR'.format(csar_metafile)) + self.logger.debug('CSAR metadata file: {0}'.format(csar_metafile)) + self.logger.debug('Attempting to parse CSAR metadata YAML') + with open(csar_metafile) as f: + self.metadata.update(yaml.load(f)) + self.logger.debug('CSAR metadata:{0}{1}'.format(os.linesep, pprint.pformat(self.metadata))) + + def _validate(self): + def validate_key(key, expected=None): + if not self.metadata.get(key): + raise ValueError('{0} is missing from the metadata file.'.format(key)) + actual = str(self.metadata[key]) + if expected and actual != expected: + raise ValueError('{0} is expected to be {1} in the metadata file while it is in ' + 'fact {2}.'.format(key, expected, actual)) + validate_key(META_FILE_VERSION_KEY, expected=META_FILE_VERSION_VALUE) + validate_key(META_CSAR_VERSION_KEY, expected=META_CSAR_VERSION_VALUE) + validate_key(META_CREATED_BY_KEY) + validate_key(META_ENTRY_DEFINITIONS_KEY) + self.logger.debug('CSAR entry definitions: {0}'.format(self.entry_definitions)) + entry_definitions_path = os.path.join(self.destination, self.entry_definitions) + if not os.path.isfile(entry_definitions_path): + raise ValueError('The entry definitions {0} referenced by the metadata file does not ' + 'exist.'.format(entry_definitions_path)) + + def _download(self, url, target): + response = requests.get(url, stream=True) + if response.status_code != 200: + raise ValueError('Server at {0} returned a {1} status code' + .format(url, response.status_code)) + self.logger.info('Downloading {0} to {1}'.format(url, target)) + with open(target, 'wb') as f: + for chunk in response.iter_content(chunk_size=8192): + if chunk: + f.write(chunk) + + +def read(source, destination=None, logger=None): + destination = destination or tempfile.mkdtemp() + logger = logger or logging.getLogger('dummy') + return _CSARReader(source=source, destination=destination, logger=logger) + + +def is_csar_archive(source): + return source.endswith(CSAR_FILE_EXTENSION) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/defaults.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/defaults.py new file mode 100644 index 0000000..e84abc0 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/defaults.py @@ -0,0 +1,30 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Various CLI default values. +""" + +#: Default service template filename +SERVICE_TEMPLATE_FILENAME = 'service_template.yaml' + +#: Default task max attempts +TASK_MAX_ATTEMPTS = 30 + +#: Default task retry interval +TASK_RETRY_INTERVAL = 30 + +#: Default sort descending +SORT_DESCENDING = False diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/env.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/env.py new file mode 100644 index 0000000..84bdebe --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/env.py @@ -0,0 +1,127 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Environment (private) +""" + +import os +import shutil + +from .config import config +from .logger import Logging +from .. import (application_model_storage, application_resource_storage) +from ..orchestrator.plugin import PluginManager +from ..storage.sql_mapi import SQLAlchemyModelAPI +from ..storage.filesystem_rapi import FileSystemResourceAPI + + +ARIA_DEFAULT_WORKDIR_NAME = '.aria' + + +class _Environment(object): + + def __init__(self, workdir): + + self._workdir = workdir + self._init_workdir() + + self._config = config.CliConfig.create_config(workdir) + self._logging = Logging(self._config) + + self._model_storage_dir = os.path.join(workdir, 'models') + self._resource_storage_dir = os.path.join(workdir, 'resources') + self._plugins_dir = os.path.join(workdir, 'plugins') + + # initialized lazily + self._model_storage = None + self._resource_storage = None + self._plugin_manager = None + + @property + def workdir(self): + return self._workdir + + @property + def config(self): + return self._config + + @property + def logging(self): + return self._logging + + @property + def model_storage(self): + if not self._model_storage: + self._model_storage = self._init_sqlite_model_storage() + return self._model_storage + + @property + def resource_storage(self): + if not self._resource_storage: + self._resource_storage = self._init_fs_resource_storage() + return self._resource_storage + + @property + def plugin_manager(self): + if not self._plugin_manager: + self._plugin_manager = self._init_plugin_manager() + return self._plugin_manager + + def reset(self, reset_config): + if reset_config: + shutil.rmtree(self._workdir) + else: + _, dirs, files = next(os.walk(self._workdir)) + files.remove(config.CONFIG_FILE_NAME) + + for dir_ in dirs: + shutil.rmtree(os.path.join(self._workdir, dir_)) + for file_ in files: + os.remove(os.path.join(self._workdir, file_)) + + def _init_workdir(self): + if not os.path.exists(self._workdir): + os.makedirs(self._workdir) + + def _init_sqlite_model_storage(self): + if not os.path.exists(self._model_storage_dir): + os.makedirs(self._model_storage_dir) + + initiator_kwargs = dict(base_dir=self._model_storage_dir) + return application_model_storage( + SQLAlchemyModelAPI, + initiator_kwargs=initiator_kwargs) + + def _init_fs_resource_storage(self): + if not os.path.exists(self._resource_storage_dir): + os.makedirs(self._resource_storage_dir) + + fs_kwargs = dict(directory=self._resource_storage_dir) + return application_resource_storage( + FileSystemResourceAPI, + api_kwargs=fs_kwargs) + + def _init_plugin_manager(self): + if not os.path.exists(self._plugins_dir): + os.makedirs(self._plugins_dir) + + return PluginManager(self.model_storage, self._plugins_dir) + + +env = _Environment(os.path.join( + os.environ.get('ARIA_WORKDIR', os.path.expanduser('~')), ARIA_DEFAULT_WORKDIR_NAME)) + +logger = env.logging.logger diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/exceptions.py new file mode 100644 index 0000000..7da9836 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/exceptions.py @@ -0,0 +1,24 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +CLI exceptions. +""" + +from ..exceptions import AriaError + + +class AriaCliError(AriaError): + pass diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/execution_logging.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/execution_logging.py new file mode 100644 index 0000000..915038b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/execution_logging.py @@ -0,0 +1,243 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Formatting for ``executions`` sub-commands. +""" + +import os +import re +from StringIO import StringIO +from functools import partial + +from . import ( + logger, + color +) +from .env import env + + +FIELD_TYPE = 'field_type' +LEVEL = 'level' +TIMESTAMP = 'timestamp' +MESSAGE = 'message' +IMPLEMENTATION = 'implementation' +INPUTS = 'inputs' +TRACEBACK = 'traceback' +MARKER = 'marker' + +FINAL_STATES = 'final_states' +SUCCESS_STATE = 'succeeded' +CANCEL_STATE = 'canceled' +FAIL_STATE = 'failed' + +_EXECUTION_PATTERN = "\'.*\' workflow execution {0}".format +# In order to be able to format a string into this regex pattern, we need to provide support +# in adding this string into double curly brackets. This is an issue with python format, so we add +# this via format itself. +_FIELD_TYPE_PATTERN = partial('.*({starting}{0}{closing}).*'.format, starting='{', closing='.*?}') + +_PATTERNS = { + FINAL_STATES: { + SUCCESS_STATE: re.compile(_EXECUTION_PATTERN(SUCCESS_STATE)), + CANCEL_STATE: re.compile(_EXECUTION_PATTERN(CANCEL_STATE)), + FAIL_STATE: re.compile(_EXECUTION_PATTERN(FAIL_STATE)), + }, + FIELD_TYPE: { + IMPLEMENTATION: re.compile(_FIELD_TYPE_PATTERN(IMPLEMENTATION)), + LEVEL: re.compile(_FIELD_TYPE_PATTERN(LEVEL)), + MESSAGE: re.compile(_FIELD_TYPE_PATTERN(MESSAGE)), + INPUTS: re.compile(_FIELD_TYPE_PATTERN(INPUTS)), + TIMESTAMP: re.compile(_FIELD_TYPE_PATTERN(TIMESTAMP)) + } +} + +_FINAL_STATES = { + SUCCESS_STATE: color.Colors.Fore.GREEN, + CANCEL_STATE: color.Colors.Fore.YELLOW, + FAIL_STATE: color.Colors.Fore.RED +} + +_DEFAULT_COLORS = { + LEVEL: { + 'default': {'fore': 'lightmagenta_ex'}, + 'error': {'fore': 'red', 'style': 'bright'}, + }, + TIMESTAMP: { + 'default': {'fore': 'lightmagenta_ex'}, + 'error': {'fore': 'red', 'style': 'bright'}, + }, + MESSAGE: { + 'default': {'fore': 'lightblue_ex'}, + 'error': {'fore': 'red', 'style': 'bright'}, + }, + IMPLEMENTATION:{ + 'default': {'fore': 'lightblack_ex'}, + 'error': {'fore': 'red', 'style': 'bright'}, + }, + INPUTS: { + 'default': {'fore': 'blue'}, + 'error': {'fore': 'red', 'style': 'bright'}, + }, + TRACEBACK: {'default': {'fore': 'red'}}, + + MARKER: 'lightyellow_ex' +} + +_DEFAULT_FORMATS = { + logger.NO_VERBOSE: '{message}', + logger.LOW_VERBOSE: '{timestamp:%H:%M:%S} | {level[0]} | {message}', + logger.MEDIUM_VERBOSE: '{timestamp:%H:%M:%S} | {level[0]} | {implementation} | {message}', + logger.HIGH_VERBOSE: + '{timestamp:%H:%M:%S} | {level[0]} | {implementation} | {inputs} | {message}' +} + + +def stylize_log(item, mark_pattern): + + # implementation + if item.task: + # operation task + implementation = item.task.function + inputs = dict(arg.unwrapped for arg in item.task.arguments.itervalues()) + else: + # execution task + implementation = item.execution.workflow_name + inputs = dict(inp.unwrapped for inp in item.execution.inputs.itervalues()) + + stylized_str = color.StringStylizer(_get_format()) + _populate_level(stylized_str, item) + _populate_timestamp(stylized_str, item) + _populate_message(stylized_str, item, mark_pattern) + _populate_inputs(stylized_str, inputs, item, mark_pattern) + _populate_implementation(stylized_str, implementation, item, mark_pattern) + + msg = StringIO() + msg.write(str(stylized_str)) + # Add the exception and the error msg. + if item.traceback and env.logging.verbosity_level >= logger.MEDIUM_VERBOSE: + msg.write(os.linesep) + msg.writelines(_color_traceback('\t' + '|' + line, item, mark_pattern) + for line in item.traceback.splitlines(True)) + + return msg.getvalue() + + +def log(item, mark_pattern=None, *args, **kwargs): + leveled_log = getattr(env.logging.logger, item.level.lower()) + return leveled_log(stylize_log(item, mark_pattern), *args, **kwargs) + + +def log_list(iterator, mark_pattern=None): + any_logs = False + for item in iterator: + log(item, mark_pattern) + any_logs = True + return any_logs + + +def _get_format(): + return (env.config.logging.execution.formats.get(env.logging.verbosity_level) or + _DEFAULT_FORMATS.get(env.logging.verbosity_level)) + + +def _get_styles(field_type): + return env.config.logging.execution.colors[field_type] + + +def _is_color_enabled(): + # If styling is enabled and the current log_item isn't final string + return env.config.logging.execution.colors_enabled + + +def _get_marker_schema(): + return color.ColorSpec(back=_get_styles(MARKER)) + + +def _populate_implementation(str_, implementation, log_item, mark_pattern=None): + _stylize(str_, implementation, log_item, IMPLEMENTATION, mark_pattern) + + +def _populate_inputs(str_, inputs, log_item, mark_pattern=None): + _stylize(str_, inputs, log_item, INPUTS, mark_pattern) + + +def _populate_timestamp(str_, log_item): + _stylize(str_, log_item.created_at, log_item, TIMESTAMP) + + +def _populate_message(str_, log_item, mark_pattern=None): + _stylize(str_, log_item.msg, log_item, MESSAGE, mark_pattern) + + +def _populate_level(str_, log_item): + _stylize(str_, log_item.level[0], log_item, LEVEL) + + +def _stylize(stylized_str, msg, log_item, msg_type, mark_pattern=None): + match = re.match(_PATTERNS[FIELD_TYPE][msg_type], stylized_str._str) + if not match: + return + matched_substr = match.group(1) + + substring = color.StringStylizer(matched_substr) + + # handle format + substring.format(**{msg_type: msg}) + + if _is_color_enabled(): + # handle color + substring.color(_resolve_schema(msg_type, log_item)) + if not _is_end_execution_log(log_item): + # handle highlighting + substring.highlight(mark_pattern, _get_marker_schema()) + + stylized_str.replace(matched_substr, substring) + + +def _color_traceback(traceback, log_item, mark_pattern): + if _is_color_enabled(): + stylized_string = color.StringStylizer(traceback, _resolve_schema(TRACEBACK, log_item)) + stylized_string.highlight(mark_pattern, _get_marker_schema()) + return stylized_string + return traceback + + +def _is_end_execution_log(log_item): + return not log_item.task and bool(_end_execution_schema(log_item)) + + +def _end_execution_schema(log_item): + for state, pattern in _PATTERNS[FINAL_STATES].items(): + if re.match(pattern, log_item.msg): + return _FINAL_STATES[state] + + +def _resolve_schema(msg_type, log_item): + if _is_end_execution_log(log_item): + return _end_execution_schema(log_item) + else: + return color.ColorSpec( + **( + # retrieve the schema from the user config according to the level + _get_styles(msg_type).get(log_item.level.lower()) or + # retrieve the default schema from the user config + _get_styles(msg_type).get('default') or + # retrieve the schema from the aria default config according to the level + _DEFAULT_COLORS[msg_type].get(log_item.level.lower()) or + # retrieve the default schema from the aria default config + _DEFAULT_COLORS[msg_type].get('default') + ) + ) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/helptexts.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/helptexts.py new file mode 100644 index 0000000..5ab353a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/helptexts.py @@ -0,0 +1,62 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Gathers all CLI command help texts in one place. +""" + +DEFAULT_MUTUALITY_ERROR_MESSAGE = 'mutually exclusive' +VERBOSE = \ + "Show verbose output; you can supply this up to three times (i.e. -vvv)" + +VERSION = "Display the version and exit" +FORCE_RESET = "Confirmation for resetting ARIA's working directory" +RESET_CONFIG = "Reset ARIA's user configuration" + +SERVICE_TEMPLATE_ID = "The unique identifier for the service template" +SERVICE_ID = "The unique identifier for the service" +EXECUTION_ID = "The unique identifier for the execution" + +SERVICE_TEMPLATE_PATH = "The path to the application's service template file" +SERVICE_TEMPLATE_FILENAME = ( + "The name of the archive's main service template file " + "(only relevant if uploading a non-CSAR archive)") +INPUTS_PARAMS_USAGE = ( + '(can be provided as wildcard based paths ' + '("inp?.yaml", "/my_inputs/", etc.) to YAML files, a JSON string or as ' + '"key1=value1;key2=value2"); this argument can be used multiple times') +SERVICE_INPUTS = "Inputs for the service {0}".format(INPUTS_PARAMS_USAGE) +EXECUTION_INPUTS = "Inputs for the execution {0}".format(INPUTS_PARAMS_USAGE) + +TASK_RETRY_INTERVAL = \ + "How long of a minimal interval should occur between task retry attempts [default: {0}]" +TASK_MAX_ATTEMPTS = \ + "How many times should a task be attempted in case of failures [default: {0}]" +DRY_EXECUTION = "Execute a workflow dry run (prints operations information without causing side " \ + "effects)" +RETRY_FAILED_TASK = "Retry tasks that failed in the previous execution attempt" +IGNORE_AVAILABLE_NODES = "Delete the service even if it has available nodes" +SORT_BY = "Key for sorting the list" +DESCENDING = "Sort list in descending order [default: False]" +JSON_OUTPUT = "Output logs in JSON format" +MARK_PATTERN = "Mark a regular expression pattern in the logs" + +SHOW_FULL = "Show full information" +SHOW_JSON = "Show in JSON format (implies --full)" +SHOW_YAML = "Show in YAML format (implies --full)" +SHOW_TYPES = "Show only the type hierarchies" +SHOW_GRAPH = "Show only the node graph" +MODE_MUTUALITY_ERROR_MESSAGE = 'only one mode is possible' +FORMAT_MUTUALITY_ERROR_MESSAGE = 'only one format is possible' diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/inputs.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/inputs.py new file mode 100644 index 0000000..bea3e1a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/inputs.py @@ -0,0 +1,124 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Helpers for validating and coercing service template inputs. +""" + +import os +import glob +from ruamel import yaml + +from .env import logger +from .exceptions import AriaCliError + + +def inputs_to_dict(resources): + """ + Returns a dictionary of inputs + + :param resources: can be: + + * list of files + * single file + * directory containing multiple input files + * ``key1=value1;key2=value2`` pairs string. + * string formatted as JSON/YAML + * wildcard based string (e.g. ``*-inputs.yaml``) + """ + if not resources: + return dict() + + parsed_dict = {} + + for resource in resources: + logger.debug('Processing inputs source: {0}'.format(resource)) + # Workflow parameters always pass an empty dictionary. We ignore it + if isinstance(resource, basestring): + try: + parsed_dict.update(_parse_single_input(resource)) + except AriaCliError: + raise AriaCliError( + "Invalid input: {0}. It must represent a dictionary. " + "Valid values can be one of:{1} " + "- A path to a YAML file{1} " + "- A path to a directory containing YAML files{1} " + "- A single quoted wildcard based path " + "(e.g. '*-inputs.yaml'){1} " + "- A string formatted as JSON/YAML{1} " + "- A string formatted as key1=value1;key2=value2".format( + resource, os.linesep)) + return parsed_dict + + +def _parse_single_input(resource): + try: + # parse resource as string representation of a dictionary + return _plain_string_to_dict(resource) + except AriaCliError: + input_files = glob.glob(resource) + parsed_dict = dict() + if os.path.isdir(resource): + for input_file in os.listdir(resource): + parsed_dict.update( + _parse_yaml_path(os.path.join(resource, input_file))) + elif input_files: + for input_file in input_files: + parsed_dict.update(_parse_yaml_path(input_file)) + else: + parsed_dict.update(_parse_yaml_path(resource)) + return parsed_dict + + +def _parse_yaml_path(resource): + + try: + # if resource is a path - parse as a yaml file + if os.path.isfile(resource): + with open(resource) as f: + content = yaml.load(f.read()) + else: + # parse resource content as yaml + content = yaml.load(resource) + except yaml.error.YAMLError as e: + raise AriaCliError("'{0}' is not a valid YAML. {1}".format( + resource, str(e))) + + # Emtpy files return None + content = content or dict() + if not isinstance(content, dict): + raise AriaCliError() + + return content + + +def _plain_string_to_dict(input_string): + input_string = input_string.strip() + input_dict = {} + mapped_inputs = input_string.split(';') + for mapped_input in mapped_inputs: + mapped_input = mapped_input.strip() + if not mapped_input: + continue + split_mapping = mapped_input.split('=') + try: + key = split_mapping[0].strip() + value = split_mapping[1].strip() + except IndexError: + raise AriaCliError( + "Invalid input format: {0}, the expected format is: " + "key1=value1;key2=value2".format(input_string)) + input_dict[key] = value + return input_dict diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/logger.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/logger.py new file mode 100644 index 0000000..14baae0 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/logger.py @@ -0,0 +1,134 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Centralized logging configuration and formatting. +""" + +import os +import copy +import logging +from logutils import dictconfig + +HIGH_VERBOSE = 3 +MEDIUM_VERBOSE = 2 +LOW_VERBOSE = 1 +NO_VERBOSE = 0 + +LOGGER_CONFIG_TEMPLATE = { + "version": 1, + "formatters": { + "file": { + "format": "%(asctime)s [%(levelname)s] %(message)s" + }, + "console": { + "format": "%(message)s" + } + }, + "handlers": { + "file": { + "class": "logging.handlers.RotatingFileHandler", + "formatter": "file", + "maxBytes": "5000000", + "backupCount": "20" + }, + "console": { + "class": "logging.StreamHandler", + "stream": "ext://sys.stdout", + "formatter": "console" + } + }, + "disable_existing_loggers": False +} + + +class Logging(object): + + def __init__(self, config): + self._log_file = None + self._verbosity_level = NO_VERBOSE + self._all_loggers_names = [] + self._configure_loggers(config) + self._lgr = logging.getLogger('aria.cli.main') + + @property + def logger(self): + return self._lgr + + @property + def log_file(self): + return self._log_file + + @property + def verbosity_level(self): + return self._verbosity_level + + @verbosity_level.setter + def verbosity_level(self, level): + self._verbosity_level = level + if self.is_high_verbose_level(): + for logger_name in self._all_loggers_names: + logging.getLogger(logger_name).setLevel(logging.DEBUG) + + def is_high_verbose_level(self): + return self.verbosity_level == HIGH_VERBOSE + + def _configure_loggers(self, config): + loggers_config = config.logging.loggers + logfile = config.logging.filename + + logger_dict = copy.deepcopy(LOGGER_CONFIG_TEMPLATE) + if logfile: + # set filename on file handler + logger_dict['handlers']['file']['filename'] = logfile + logfile_dir = os.path.dirname(logfile) + if not os.path.exists(logfile_dir): + os.makedirs(logfile_dir) + self._log_file = logfile + else: + del logger_dict['handlers']['file'] + + # add handlers to all loggers + loggers = {} + for logger_name in loggers_config: + loggers[logger_name] = dict(handlers=list(logger_dict['handlers'].keys())) + self._all_loggers_names.append(logger_name) + logger_dict['loggers'] = loggers + + # set level for all loggers + for logger_name, logging_level in loggers_config.iteritems(): + log = logging.getLogger(logger_name) + level = logging._levelNames[logging_level.upper()] + log.setLevel(level) + + dictconfig.dictConfig(logger_dict) + + +class ModelLogIterator(object): + + def __init__(self, model_storage, execution_id, filters=None, sort=None, offset=0): + self._last_visited_id = offset + self._model_storage = model_storage + self._execution_id = execution_id + self._additional_filters = filters or {} + self._sort = sort or {} + + def __iter__(self): + filters = dict(execution_fk=self._execution_id, id=dict(gt=self._last_visited_id)) + filters.update(self._additional_filters) + + for log in self._model_storage.log.iter(filters=filters, sort=self._sort): + self._last_visited_id = log.id + yield log diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/main.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/main.py new file mode 100644 index 0000000..640360b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/main.py @@ -0,0 +1,65 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Executable entry point into the CLI. +""" + +from aria import install_aria_extensions +from aria.cli import commands +from aria.cli.core import aria + + +@aria.group(name='aria') +@aria.options.verbose() +@aria.options.version +def _aria(): + """ + ARIA's Command Line Interface. + + To activate bash-completion run:: + + eval "$(_ARIA_COMPLETE=source aria)" + + ARIA's working directory resides by default in "~/.aria". To change it, set the environment + variable ARIA_WORKDIR to something else (e.g. "/tmp/"). + """ + aria.set_cli_except_hook() + + +def _register_commands(): + """ + Register the CLI's commands. + """ + + _aria.add_command(commands.service_templates.service_templates) + _aria.add_command(commands.node_templates.node_templates) + _aria.add_command(commands.services.services) + _aria.add_command(commands.nodes.nodes) + _aria.add_command(commands.workflows.workflows) + _aria.add_command(commands.executions.executions) + _aria.add_command(commands.plugins.plugins) + _aria.add_command(commands.logs.logs) + _aria.add_command(commands.reset.reset) + + +def main(): + install_aria_extensions() + _register_commands() + _aria() + + +if __name__ == '__main__': + main() diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/service_template_utils.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/service_template_utils.py new file mode 100644 index 0000000..2af72a0 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/service_template_utils.py @@ -0,0 +1,129 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Loading mechanism for service templates. +""" + +import os +from urlparse import urlparse + +from . import csar +from . import utils +from .exceptions import AriaCliError +from ..utils import archive as archive_utils + + +def get(source, service_template_filename): + """ + Get a source and return a path to the main service template file + + The behavior based on then source argument content is: + + * local ``.yaml`` file: return the file + * local archive (``.csar``, ``.zip``, ``.tar``, ``.tar.gz``, and ``.tar.bz2``): extract it + locally and return path service template file + * URL: download and get service template from downloaded archive + * GitHub repo: download and get service template from downloaded archive + + :param source: path/URL/GitHub repo to archive/service-template file + :type source: basestring + :param service_template_filename: path to service template if source is a non-CSAR archive + with CSAR archives, this is read from the metadata file) + :type service_template_filename: basestring + :return: path to main service template file + :rtype: basestring + """ + if urlparse(source).scheme: + downloaded_file = utils.download_file(source) + return _get_service_template_file_from_archive( + downloaded_file, service_template_filename) + elif os.path.isfile(source): + if _is_archive(source): + return _get_service_template_file_from_archive(source, service_template_filename) + else: + # Maybe check if yaml. + return os.path.abspath(source) + elif len(source.split('/')) == 2: + url = _map_to_github_url(source) + downloaded_file = utils.download_file(url) + return _get_service_template_file_from_archive( + downloaded_file, service_template_filename) + else: + raise AriaCliError( + 'You must provide either a path to a local file, a remote URL ' + 'or a GitHub `organization/repository[:tag/branch]`') + + +def _get_service_template_file_from_archive(archive, service_template_filename): + """ + Extract archive to temporary location and get path to service template file. + + :param archive: path to archive file + :type archive: basestring + :param service_template_filename: path to service template file relative to archive + :type service_template_filename: basestring + :return: absolute path to service template file + :rtype: basestring + + """ + if csar.is_csar_archive(archive): + service_template_file = _extract_csar_archive(archive) + else: + extract_directory = archive_utils.extract_archive(archive) + print extract_directory + service_template_dir = os.path.join( + extract_directory, + os.listdir(extract_directory)[0], + ) + print service_template_dir + service_template_file = os.path.join(service_template_dir, service_template_filename) + print service_template_file + print service_template_filename + + if not os.path.isfile(service_template_file): + raise AriaCliError( + 'Could not find `{0}`. Please provide the name of the main ' + 'service template file by using the `-n/--service-template-filename` flag' + .format(service_template_filename)) + return service_template_file + + +def _map_to_github_url(source): + """ + Returns a path to a downloaded GitHub archive. + + :param source: GitHub repo: ``org/repo[:tag/branch]`` + :type source: basestring + :return: URL to the archive file for the given repo in GitHub + :rtype: basestring + + """ + source_parts = source.split(':', 1) + repo = source_parts[0] + tag = source_parts[1] if len(source_parts) == 2 else 'master' + url = 'https://github.com/{0}/archive/{1}.tar.gz'.format(repo, tag) + return url + + +def _is_archive(source): + return archive_utils.is_archive(source) or csar.is_csar_archive(source) + + +def _extract_csar_archive(archive): + reader = csar.read(source=archive) + main_service_template_file_name = os.path.basename(reader.entry_definitions) + return os.path.join(reader.destination, + main_service_template_file_name) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/table.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/table.py new file mode 100644 index 0000000..74487ae --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/table.py @@ -0,0 +1,125 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Tabular formatting utilities. +""" + +import os +from datetime import datetime + +from prettytable import PrettyTable + +from .env import logger + + +def print_data(columns, items, header_text, + column_formatters=None, col_max_width=None, defaults=None): + """ + Prints data in a tabular form. + + :param columns: columns of the table, e.g. ``['id','name']`` + :type columns: iterable of basestring + :param items: each element must have keys or attributes corresponding to the ``columns`` items, + e.g. ``[{'id':'123', 'name':'Pete'}]`` + :type data: [{:obj:`basestring`: :obj:`basestring`}] + :param column_formatters: maps column name to formatter, a function that may manipulate the + string values printed for this column, e.g. ``{'created_at': timestamp_formatter}`` + :type column_formatters: {:obj:`basestring`: :obj:`function`} + :param col_max_width: maximum width of table + :type col_max_width: int + :param defaults: default values for keys that don't exist in the data itself, e.g. + ``{'serviceId':'123'}`` + :type defaults: {:obj:`basestring`: :obj:`basestring`} + """ + if items is None: + items = [] + elif not isinstance(items, list): + items = [items] + + pretty_table = _generate(columns, data=items, column_formatters=column_formatters, + defaults=defaults) + if col_max_width: + pretty_table.max_width = col_max_width + _log(header_text, pretty_table) + + +def _log(title, table): + logger.info('{0}{1}{0}{2}{0}'.format(os.linesep, title, table)) + + +def _generate(cols, data, column_formatters=None, defaults=None): + """ + Return a new PrettyTable instance representing the list. + + :param cols: columns of the table, e.g. ``['id','name']`` + :type cols: iterable of :obj:`basestring` + :param data: each element must have keys or attributes corresponding to the ``cols`` items, + e.g. ``[{'id':'123', 'name':'Pete'}]`` + :type data: [{:obj:`basestring`: :obj:`basestring`}] + :param column_formatters: maps column name to formatter, a function that may manipulate the + string values printed for this column, e.g. ``{'created_at': timestamp_formatter}`` + :type column_formatters: {:obj:`basestring`: :obj:`function`} + :param defaults: default values for keys that don't exist in the data itself, e.g. + ``{'serviceId':'123'}`` + :type defaults: {:obj:`basestring`: :obj:`basestring`} + """ + def get_values_per_column(column, row_data): + if hasattr(row_data, column) or (isinstance(row_data, dict) and column in row_data): + val = row_data[column] if isinstance(row_data, dict) else getattr(row_data, column) + + if val and isinstance(val, list): + val = [str(element) for element in val] + val = ','.join(val) + elif val is None or isinstance(val, list): + # don't print `[]` or `None` (but do print `0`, `False`, etc.) + val = '' + + if column in column_formatters: + # calling the user's column formatter to manipulate the value + val = column_formatters[column](val) + + return val + else: + return defaults.get(column) + + column_formatters = column_formatters or dict() + defaults = defaults or dict() + pretty_table = PrettyTable(list(cols)) + + for datum in data: + values_row = [] + for col in cols: + values_row.append(get_values_per_column(col, datum)) + pretty_table.add_row(values_row) + + return pretty_table + + +def timestamp_formatter(value): + try: + datetime.strptime(value[:10], '%Y-%m-%d') + return value.replace('T', ' ').replace('Z', ' ') + except ValueError: + # not a timestamp + return value + + +def trim_formatter_generator(max_length): + def trim_formatter(value): + if len(value) >= max_length: + value = '{0}..'.format(value[:max_length - 2]) + return value + return trim_formatter diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/cli/utils.py b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/utils.py new file mode 100644 index 0000000..697ff37 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/cli/utils.py @@ -0,0 +1,117 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Miscellaneous CLI utilities. +""" + +import os +import sys +from StringIO import StringIO + +from backports.shutil_get_terminal_size import get_terminal_size + +from .env import logger +from .exceptions import AriaCliError +from ..utils import http + + +def storage_sort_param(sort_by, descending): + return {sort_by: 'desc' if descending else 'asc'} + + +def get_parameter_templates_as_string(parameter_templates): + params_string = StringIO() + + for param_name, param_template in parameter_templates.iteritems(): + params_string.write('\t{0}:{1}'.format(param_name, os.linesep)) + param_dict = param_template.to_dict() + del param_dict['id'] # not interested in printing the id + for k, v in param_dict.iteritems(): + params_string.write('\t\t{0}: {1}{2}'.format(k, v, os.linesep)) + + params_string.write(os.linesep) + return params_string.getvalue() + + +def check_overriding_storage_exceptions(e, model_class, name): + """ + Checks whether the storage exception is a known type where we'd like to override the exception + message; If so, it raises a new error. Otherwise it simply returns. + """ + assert isinstance(e, BaseException) + if 'UNIQUE constraint failed' in e.message: + new_message = \ + 'Could not store {model_class} `{name}`{linesep}' \ + 'There already a exists a {model_class} with the same name' \ + .format(model_class=model_class, name=name, linesep=os.linesep) + trace = sys.exc_info()[2] + raise type(e), type(e)(new_message), trace # pylint: disable=raising-non-exception + + +def download_file(url): + progress_bar = generate_progress_handler(url, 'Downloading') + try: + destination = http.download_file(url, logger=logger, progress_handler=progress_bar) + except Exception as e: + raise AriaCliError( + 'Failed to download {0}. ({1})'.format(url, str(e))) + return destination + + +def generate_progress_handler(file_path, action='', max_bar_length=80): + """ + Returns a function that prints a progress bar in the terminal. + + :param file_path: the name of the file being transferred + :param action: uploading/downloading + :param max_bar_length: maximum allowed length of the bar + :return: configured ``print_progress`` function + """ + # We want to limit the maximum line length to 80, but allow for a smaller terminal size. We also + # include the action string, and some extra chars + terminal_width = get_terminal_size().columns + + # This takes care of the case where there is no terminal (e.g. unittest) + terminal_width = terminal_width or max_bar_length + bar_length = min(max_bar_length, terminal_width) - len(action) - 12 + + # Shorten the file name if it's too long + file_name = os.path.basename(file_path) + if len(file_name) > (bar_length / 4) + 3: + file_name = file_name[:bar_length / 4] + '...' + + bar_length -= len(file_name) + + def print_progress(read_bytes, total_bytes): + """ + Print upload/download progress on a single line. + + Call this function in a loop to create a progress bar in the terminal. + + :param read_bytes: number of bytes already processed + :param total_bytes: total number of bytes in the file + """ + + filled_length = min(bar_length, int(round(bar_length * read_bytes / float(total_bytes)))) + percents = min(100.00, round(100.00 * (read_bytes / float(total_bytes)), 2)) + bar = '#' * filled_length + '-' * (bar_length - filled_length) # pylint: disable=blacklisted-name + + # The \r caret makes sure the cursor moves back to the beginning of the line + sys.stdout.write('\r{0} {1} |{2}| {3}%'.format(action, file_name, bar, percents)) + if read_bytes >= total_bytes: + sys.stdout.write(os.linesep) + + return print_progress diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/core.py b/azure/aria/aria-extension-cloudify/src/aria/aria/core.py new file mode 100644 index 0000000..e364f48 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/core.py @@ -0,0 +1,133 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +ARIA core module. +""" + +from . import exceptions +from .parser import consumption +from .parser.loading.location import UriLocation +from .orchestrator import topology + + +class Core(object): + + def __init__(self, + model_storage, + resource_storage, + plugin_manager): + self._model_storage = model_storage + self._resource_storage = resource_storage + self._plugin_manager = plugin_manager + + @property + def model_storage(self): + return self._model_storage + + @property + def resource_storage(self): + return self._resource_storage + + @property + def plugin_manager(self): + return self._plugin_manager + + def validate_service_template(self, service_template_path): + self._parse_service_template(service_template_path) + + def create_service_template(self, service_template_path, service_template_dir, + service_template_name): + context = self._parse_service_template(service_template_path) + service_template = context.modeling.template + service_template.name = service_template_name + self.model_storage.service_template.put(service_template) + self.resource_storage.service_template.upload( + entry_id=str(service_template.id), source=service_template_dir) + return service_template.id + + def delete_service_template(self, service_template_id): + service_template = self.model_storage.service_template.get(service_template_id) + if service_template.services: + raise exceptions.DependentServicesError( + 'Can\'t delete service template `{0}` - service template has existing services' + .format(service_template.name)) + + self.model_storage.service_template.delete(service_template) + self.resource_storage.service_template.delete(entry_id=str(service_template.id)) + + def create_service(self, service_template_id, inputs, service_name=None): + service_template = self.model_storage.service_template.get(service_template_id) + + storage_session = self.model_storage._all_api_kwargs['session'] + # setting no autoflush for the duration of instantiation - this helps avoid dependency + # constraints as they're being set up + with storage_session.no_autoflush: + topology_ = topology.Topology() + service = topology_.instantiate( + service_template, inputs=inputs, plugins=self.model_storage.plugin.list()) + topology_.coerce(service, report_issues=True) + + topology_.validate(service) + topology_.satisfy_requirements(service) + topology_.coerce(service, report_issues=True) + + topology_.validate_capabilities(service) + topology_.assign_hosts(service) + topology_.configure_operations(service) + topology_.coerce(service, report_issues=True) + if topology_.dump_issues(): + raise exceptions.InstantiationError('Failed to instantiate service template `{0}`' + .format(service_template.name)) + + storage_session.flush() # flushing so service.id would auto-populate + service.name = service_name or '{0}_{1}'.format(service_template.name, service.id) + self.model_storage.service.put(service) + return service + + def delete_service(self, service_id, force=False): + service = self.model_storage.service.get(service_id) + + active_executions = [e for e in service.executions if e.is_active()] + if active_executions: + raise exceptions.DependentActiveExecutionsError( + 'Can\'t delete service `{0}` - there is an active execution for this service. ' + 'Active execution ID: {1}'.format(service.name, active_executions[0].id)) + + if not force: + available_nodes = [str(n.id) for n in service.nodes.itervalues() if n.is_available()] + if available_nodes: + raise exceptions.DependentAvailableNodesError( + 'Can\'t delete service `{0}` - there are available nodes for this service. ' + 'Available node IDs: {1}'.format(service.name, ', '.join(available_nodes))) + + self.model_storage.service.delete(service) + + @staticmethod + def _parse_service_template(service_template_path): + context = consumption.ConsumptionContext() + context.presentation.location = UriLocation(service_template_path) + # Most of the parser uses the topology package in order to manipulate the models. + # However, here we use the Consumer mechanism, but this should change in the future. + consumption.ConsumerChain( + context, + ( + consumption.Read, + consumption.Validate, + consumption.ServiceTemplate + )).consume() + if context.validation.dump_issues(): + raise exceptions.ParsingError('Failed to parse service template') + return context diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/exceptions.py new file mode 100644 index 0000000..5d3e21d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/exceptions.py @@ -0,0 +1,73 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Base exception classes and other common exceptions used throughout ARIA. +""" + +import sys + + +class AriaError(Exception): + """ + Base class for ARIA errors. + """ + pass + + +class AriaException(Exception): + """ + Base class for ARIA exceptions. + """ + + def __init__(self, message=None, cause=None, cause_traceback=None): + super(AriaException, self).__init__(message) + self.cause = cause + self.issue = None + if cause_traceback is None: + _, e, traceback = sys.exc_info() + if cause == e: + # Make sure it's our traceback + cause_traceback = traceback + self.cause_traceback = cause_traceback + + +class DependentServicesError(AriaError): + """ + Raised when attempting to delete a service template which has existing services. + """ + pass + + +class DependentActiveExecutionsError(AriaError): + """ + Raised when attempting to delete a service which has active executions. + """ + pass + + +class DependentAvailableNodesError(AriaError): + """ + Raised when attempting to delete a service which has available nodes. + """ + pass + + +class ParsingError(AriaError): + pass + + +class InstantiationError(AriaError): + pass diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/extension.py b/azure/aria/aria-extension-cloudify/src/aria/aria/extension.py new file mode 100644 index 0000000..e90750d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/extension.py @@ -0,0 +1,154 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Mechanism for registering and loading ARIA extensions. +""" + +# pylint: disable=no-self-use + +from .utils import collections + + +class _Registrar(object): + + def __init__(self, registry): + if not isinstance(registry, (dict, list)): + raise RuntimeError('Unsupported registry type') + self._registry = registry + + def register(self, function): + result = function() + if isinstance(self._registry, dict): + for key in result: + if key in self._registry: + raise RuntimeError('Re-definition of {0} in {1}'.format(key, function.__name__)) + self._registry.update(result) + elif isinstance(self._registry, list): + if not isinstance(result, (list, tuple, set)): + result = [result] + self._registry += list(result) + else: + raise RuntimeError('Illegal state') + + def __call__(self): + return self._registry + + +def _registrar(function): + function._registrar_function = True + return function + + +class _ExtensionRegistration(object): + """ + Base class for extension class decorators. + """ + + def __init__(self): + self._registrars = {} + self._registered_classes = [] + for attr, value in vars(self.__class__).items(): + try: + is_registrar_function = value._registrar_function + except AttributeError: + is_registrar_function = False + if is_registrar_function: + registrar = _Registrar(registry=getattr(self, attr)()) + setattr(self, attr, registrar) + self._registrars[attr] = registrar + + def __call__(self, cls): + self._registered_classes.append(cls) + return cls + + def init(self): + """ + Initialize all registrars by calling all registered functions. + """ + registered_instances = [cls() for cls in self._registered_classes] + for name, registrar in self._registrars.items(): + for instance in registered_instances: + registrating_function = getattr(instance, name, None) + if registrating_function: + registrar.register(registrating_function) + + +class _ParserExtensionRegistration(_ExtensionRegistration): + """ + Parser extensions class decorator. + """ + + @_registrar + def presenter_class(self): + """ + Presentation class registration. + + Implementing functions can return a single class or a list/tuple of classes. + """ + return [] + + @_registrar + def specification_package(self): + """ + Specification package registration. + + Implementing functions can return a package name or a list/tuple of names. + """ + return [] + + @_registrar + def specification_url(self): + """ + Specification URL registration. + + Implementing functions should return a dictionary from names to URLs. + """ + return {} + + @_registrar + def uri_loader_prefix(self): + """ + URI loader prefix registration. + + Implementing functions can return a single prefix or a list/tuple of prefixes. + """ + return collections.StrictList(value_class=basestring) + +parser = _ParserExtensionRegistration() + + +class _ProcessExecutorExtensionRegistration(_ExtensionRegistration): + """ + Process executor extension class decorator. + """ + + @_registrar + def decorate(self): + """ + The operation function executed by the process executor will be decorated with the function + returned from ``decorate()``. + """ + return [] + +process_executor = _ProcessExecutorExtensionRegistration() + + +def init(): + """ + Initialize all registrars by calling all registered functions. + """ + parser.init() + process_executor.init() diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/logger.py b/azure/aria/aria-extension-cloudify/src/aria/aria/logger.py new file mode 100644 index 0000000..f4f6ec9 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/logger.py @@ -0,0 +1,186 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Mix-ins and functions for logging, supporting multiple backends (such as SQL) and consistent +formatting. +""" + +import logging +from logging import handlers as logging_handlers +# NullHandler doesn't exist in < 27. this workaround is from +# http://docs.python.org/release/2.6/library/logging.html#configuring-logging-for-a-library +try: + from logging import NullHandler # pylint: disable=unused-import +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass +from datetime import datetime + + +TASK_LOGGER_NAME = 'aria.executions.task' + + +_base_logger = logging.getLogger('aria') + + +class LoggerMixin(object): + """ + Provides logging functionality to a class. + + :ivar logger_name: logger name; default to the class name + :ivar logger_level: logger level; defaults to ``logging.DEBUG`` + :ivar base_logger: child loggers are created from this; defaults to the root logger + """ + logger_name = None + logger_level = logging.DEBUG + + def __init__(self, *args, **kwargs): + self.logger_name = self.logger_name or self.__class__.__name__ + self.logger = logging.getLogger('{0}.{1}'.format(_base_logger.name, self.logger_name)) + # Set the logger handler of any object derived from LoggerMixing to NullHandler. + # This is since the absence of a handler shows up while using the CLI in the form of: + # `No handlers could be found for logger "..."`. + self.logger.addHandler(NullHandler()) + self.logger.setLevel(self.logger_level) + super(LoggerMixin, self).__init__(*args, **kwargs) + + @classmethod + def with_logger( + cls, + logger_name=None, + logger_level=logging.DEBUG, + base_logger=logging.getLogger(), + **kwargs): + """ + Set the logger used by the consuming class. + """ + cls.logger_name = logger_name + cls.logger_level = logger_level + cls.base_logger = base_logger + return cls(**kwargs) + + def __getstate__(self): + obj_dict = vars(self).copy() + del obj_dict['logger'] + return obj_dict + + def __setstate__(self, obj_dict): + vars(self).update( + logger=logging.getLogger('{0}.{1}'.format(_base_logger.name, obj_dict['logger_name'])), + **obj_dict) + + +def create_logger(logger=_base_logger, handlers=(), **configs): + """ + :param logger: logger name; defaults to ARIA logger + :type logger: logging.Logger + :param handlers: logger handlers + :type handlers: [] + :param configs: logger configurations + :type configs: [] + :return: logger + """ + logger.handlers = [] + for handler in handlers: + logger.addHandler(handler) + + logger.setLevel(configs.get('level', logging.DEBUG)) + logger.debug('Logger {0} configured'.format(logger.name)) + return logger + + +def create_console_log_handler(level=logging.DEBUG, formatter=None): + """ + :param level: + :param formatter: + """ + console = logging.StreamHandler() + console.setLevel(level) + console.formatter = formatter or _DefaultConsoleFormat() + return console + + +def create_sqla_log_handler(model, log_cls, execution_id, level=logging.DEBUG): + + # This is needed since the engine and session are entirely new we need to reflect the db + # schema of the logging model into the engine and session. + return _SQLAlchemyHandler(model=model, log_cls=log_cls, execution_id=execution_id, level=level) + + +class _DefaultConsoleFormat(logging.Formatter): + """ + Info level log format: ``%(message)s``. + + Every other log level is formatted: ``%(levelname)s: %(message)s``. + """ + def format(self, record): + try: + if hasattr(record, 'prefix'): + self._fmt = '<%(asctime)s: [%(levelname)s] @%(prefix)s> %(message)s' + else: + self._fmt = '<%(asctime)s: [%(levelname)s]> %(message)s' + + except AttributeError: + return record.message + return logging.Formatter.format(self, record) + + +def create_file_log_handler( + file_path, + level=logging.DEBUG, + max_bytes=5 * 1000 * 1024, + backup_count=10, + formatter=None): + """ + Create a :class:`logging.handlers.RotatingFileHandler`. + """ + rotating_file = logging_handlers.RotatingFileHandler( + filename=file_path, + maxBytes=max_bytes, + backupCount=backup_count, + delay=True, + ) + rotating_file.setLevel(level) + rotating_file.formatter = formatter or _default_file_formatter + return rotating_file + + +class _SQLAlchemyHandler(logging.Handler): + def __init__(self, model, log_cls, execution_id, **kwargs): + logging.Handler.__init__(self, **kwargs) + self._model = model + self._cls = log_cls + self._execution_id = execution_id + + def emit(self, record): + created_at = datetime.strptime(logging.Formatter('%(asctime)s').formatTime(record), + '%Y-%m-%d %H:%M:%S,%f') + log = self._cls( + execution_fk=self._execution_id, + task_fk=record.task_id, + level=record.levelname, + msg=str(record.msg), + created_at=created_at, + + # Not mandatory. + traceback=getattr(record, 'traceback', None) + ) + self._model.log.put(log) + + +_default_file_formatter = logging.Formatter( + '%(asctime)s [%(name)s:%(levelname)s] %(message)s <%(pathname)s:%(lineno)d>') diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/__init__.py new file mode 100644 index 0000000..57bc188 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/__init__.py @@ -0,0 +1,54 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 package provides an API for modeling ARIA's state and serializing it to storage. +""" + +from collections import namedtuple + +from . import ( + mixins, + types, + models, + utils, + service_template as _service_template_bases, + service_instance as _service_instance_bases, + service_changes as _service_changes_bases, + service_common as _service_common_bases, + orchestration as _orchestration_bases +) + + +_ModelBasesCls = namedtuple('ModelBase', 'service_template,' + 'service_instance,' + 'service_changes,' + 'service_common,' + 'orchestration') + +model_bases = _ModelBasesCls(service_template=_service_template_bases, + service_instance=_service_instance_bases, + service_changes=_service_changes_bases, + service_common=_service_common_bases, + orchestration=_orchestration_bases) + + +__all__ = ( + 'mixins', + 'types', + 'models', + 'model_bases', + 'utils' +) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/constraints.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/constraints.py new file mode 100644 index 0000000..8ed33d5 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/constraints.py @@ -0,0 +1,31 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Constraints for the requirements-and-capabilities matching mechanism. +""" + +class NodeTemplateConstraint(object): + """ + Used to constrain requirements for node templates. + + Must be serializable. + """ + + def matches(self, source_node_template, target_node_template): + """ + Returns ``True`` if the target matches the constraint for the source. + """ + raise NotImplementedError diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/exceptions.py new file mode 100644 index 0000000..cddc049 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/exceptions.py @@ -0,0 +1,63 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Modeling exceptions. +""" + +from ..exceptions import AriaException + + +class ModelingException(AriaException): + """ + ARIA modeling exception. + """ + + +class ParameterException(ModelingException): + """ + ARIA parameter exception. + """ + pass + + +class ValueFormatException(ModelingException): + """ + ARIA modeling exception: the value is in the wrong format. + """ + + +class CannotEvaluateFunctionException(ModelingException): + """ + ARIA modeling exception: cannot evaluate the function at this time. + """ + + +class MissingRequiredInputsException(ParameterException): + """ + ARIA modeling exception: Required parameters have been omitted. + """ + + +class ParametersOfWrongTypeException(ParameterException): + """ + ARIA modeling exception: Parameters of the wrong types have been provided. + """ + + +class UndeclaredInputsException(ParameterException): + """ + ARIA modeling exception: Undeclared parameters have been provided. + """ diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/functions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/functions.py new file mode 100644 index 0000000..554bbfb --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/functions.py @@ -0,0 +1,140 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Mechanism for evaluating intrinsic functions. +""" +from ..parser.exceptions import InvalidValueError +from ..parser.consumption import ConsumptionContext +from ..utils.collections import OrderedDict +from ..utils.type import full_type_name +from . import exceptions + + +class Function(object): + """ + Base class for intrinsic functions. Serves as a placeholder for a value that should eventually + be derived by "evaluating" (calling) the function. + + Note that this base class is provided as a convenience and you do not have to inherit it: any + object with an ``__evaluate__`` method would be treated similarly. + """ + + @property + def as_raw(self): + raise NotImplementedError + + def __evaluate__(self, container_holder): + """ + Evaluates the function if possible. + + :rtype: :class:`Evaluation` (or any object with ``value`` and ``final`` properties) + :raises CannotEvaluateFunctionException: if cannot be evaluated at this time (do *not* just + return ``None``) + """ + + raise NotImplementedError + + def __deepcopy__(self, memo): + # Circumvent cloning in order to maintain our state + return self + + +class Evaluation(object): + """ + An evaluated :class:`Function` return value. + + :ivar value: evaluated value + :ivar final: whether the value is final + :vartype final: boolean + """ + + def __init__(self, value, final=False): + self.value = value + self.final = final + + +def evaluate(value, container_holder, report_issues=False): # pylint: disable=too-many-branches + """ + Recursively attempts to call ``__evaluate__``. If an evaluation occurred will return an + :class:`Evaluation`, otherwise it will be ``None``. If any evaluation is non-final, then the + entire evaluation will also be non-final. + + The ``container_holder`` argument should have three properties: ``container`` should return + the model that contains the value, ``service`` should return the containing + :class:`~aria.modeling.models.Service` model or None, and ``service_template`` should return the + containing :class:`~aria.modeling.models.ServiceTemplate` model or ``None``. + """ + + evaluated = False + final = True + + if hasattr(value, '__evaluate__'): + try: + evaluation = value.__evaluate__(container_holder) + + # Verify evaluation structure + if (evaluation is None) \ + or (not hasattr(evaluation, 'value')) \ + or (not hasattr(evaluation, 'final')): + raise InvalidValueError('bad __evaluate__ implementation: {0}' + .format(full_type_name(value))) + + evaluated = True + value = evaluation.value + final = evaluation.final + + # The evaluated value might itself be evaluable + evaluation = evaluate(value, container_holder, report_issues) + if evaluation is not None: + value = evaluation.value + if not evaluation.final: + final = False + except exceptions.CannotEvaluateFunctionException: + pass + except InvalidValueError as e: + if report_issues: + context = ConsumptionContext.get_thread_local() + context.validation.report(e.issue) + + elif isinstance(value, list): + evaluated_list = [] + for v in value: + evaluation = evaluate(v, container_holder, report_issues) + if evaluation is not None: + evaluated_list.append(evaluation.value) + evaluated = True + if not evaluation.final: + final = False + else: + evaluated_list.append(v) + if evaluated: + value = evaluated_list + + elif isinstance(value, dict): + evaluated_dict = OrderedDict() + for k, v in value.iteritems(): + evaluation = evaluate(v, container_holder, report_issues) + if evaluation is not None: + evaluated_dict[k] = evaluation.value + evaluated = True + if not evaluation.final: + final = False + else: + evaluated_dict[k] = v + if evaluated: + value = evaluated_dict + + return Evaluation(value, final) if evaluated else None diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/mixins.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/mixins.py new file mode 100644 index 0000000..d58c25a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/mixins.py @@ -0,0 +1,333 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +ARIA modeling mix-ins module +""" + +from sqlalchemy.ext import associationproxy +from sqlalchemy import ( + Column, + Integer, + Text, + PickleType +) + +from ..utils import collections, caching +from ..utils.type import canonical_type_name, full_type_name +from . import utils, functions + + +class ModelMixin(object): + + @utils.classproperty + def __modelname__(cls): # pylint: disable=no-self-argument + return getattr(cls, '__mapiname__', cls.__tablename__) + + @classmethod + def id_column_name(cls): + raise NotImplementedError + + @classmethod + def name_column_name(cls): + raise NotImplementedError + + def to_dict(self, fields=None, suppress_error=False): + """ + Create a dict representation of the model. + + :param suppress_error: if set to ``True``, sets ``None`` to attributes that it's unable to + retrieve (e.g., if a relationship wasn't established yet, and so it's impossible to access + a property through it) + """ + + res = dict() + fields = fields or self.fields() + for field in fields: + try: + field_value = getattr(self, field) + except AttributeError: + if suppress_error: + field_value = None + else: + raise + if isinstance(field_value, list): + field_value = list(field_value) + elif isinstance(field_value, dict): + field_value = dict(field_value) + elif isinstance(field_value, ModelMixin): + field_value = field_value.to_dict() + res[field] = field_value + + return res + + @classmethod + def fields(cls): + """ + List of field names for this table. + + Mostly for backwards compatibility in the code (that uses ``fields``). + """ + + fields = set(cls._iter_association_proxies()) + fields.update(cls.__table__.columns.keys()) + return fields - set(getattr(cls, '__private_fields__', ())) + + @classmethod + def _iter_association_proxies(cls): + for col, value in vars(cls).items(): + if isinstance(value, associationproxy.AssociationProxy): + yield col + + def __repr__(self): + return '<{cls} id=`{id}`>'.format( + cls=self.__class__.__name__, + id=getattr(self, self.name_column_name())) + + +class ModelIDMixin(object): + id = Column(Integer, primary_key=True, autoincrement=True, doc=""" + Unique ID. + + :type: :obj:`int` + """) + + name = Column(Text, index=True, doc=""" + Model name. + + :type: :obj:`basestring` + """) + + @classmethod + def id_column_name(cls): + return 'id' + + @classmethod + def name_column_name(cls): + return 'name' + + +class InstanceModelMixin(ModelMixin): + """ + Mix-in for service instance models. + + All models support validation, diagnostic dumping, and representation as raw data (which can be + translated into JSON or YAML) via :meth:`as_raw`. + """ + + @property + def as_raw(self): + raise NotImplementedError + + def coerce_values(self, report_issues): + pass + + +class TemplateModelMixin(InstanceModelMixin): # pylint: disable=abstract-method + """ + Mix-in for service template models. + + All model models can be instantiated into service instance models. + """ + + +class ParameterMixin(TemplateModelMixin, caching.HasCachedMethods): #pylint: disable=abstract-method + """ + Mix-in for typed values. The value can contain nested intrinsic functions. + + This model can be used as the ``container_holder`` argument for + :func:`~aria.modeling.functions.evaluate`. + """ + + type_name = Column(Text, doc=""" + Type name. + + :type: :obj:`basestring` + """) + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + _value = Column(PickleType) + + @property + def value(self): + value = self._value + if value is not None: + evaluation = functions.evaluate(value, self) + if evaluation is not None: + value = evaluation.value + return value + + @value.setter + def value(self, value): + self._value = value + + @property + @caching.cachedmethod + def owner(self): + """ + The sole owner of this parameter, which is another model that relates to it. + + *All* parameters should have an owner model. + + :raises ~exceptions.ValueError: if failed to find an owner, which signifies an abnormal, + orphaned parameter + """ + + # Find first non-null relationship + for the_relationship in self.__mapper__.relationships: + v = getattr(self, the_relationship.key) + if v: + return v + + raise ValueError('orphaned {class_name}: does not have an owner: {name}'.format( + class_name=type(self).__name__, name=self.name)) + + @property + @caching.cachedmethod + def container(self): # pylint: disable=too-many-return-statements,too-many-branches + """ + The logical container for this parameter, which would be another model: service, node, + group, or policy (or their templates). + + The logical container is equivalent to the ``SELF`` keyword used by intrinsic functions in + TOSCA. + + *All* parameters should have a container model. + + :raises ~exceptions.ValueError: if failed to find a container model, which signifies an + abnormal, orphaned parameter + """ + + from . import models + + container = self.owner + + # Extract interface from operation + if isinstance(container, models.Operation): + container = container.interface + elif isinstance(container, models.OperationTemplate): + container = container.interface_template + + # Extract from other models + if isinstance(container, models.Interface): + container = container.node or container.group or container.relationship + elif isinstance(container, models.InterfaceTemplate): + container = container.node_template or container.group_template \ + or container.relationship_template + elif isinstance(container, models.Capability) or isinstance(container, models.Artifact): + container = container.node + elif isinstance(container, models.CapabilityTemplate) \ + or isinstance(container, models.ArtifactTemplate): + container = container.node_template + elif isinstance(container, models.Task): + container = container.actor + + # Extract node from relationship + if isinstance(container, models.Relationship): + container = container.source_node + elif isinstance(container, models.RelationshipTemplate): + container = container.requirement_template.node_template + + if container is not None: + return container + + raise ValueError('orphaned parameter: does not have a container: {0}'.format(self.name)) + + @property + @caching.cachedmethod + def service(self): + """ + The :class:`~aria.modeling.models.Service` model containing this parameter, or ``None`` if + not contained in a service. + + :raises ~exceptions.ValueError: if failed to find a container model, which signifies an + abnormal, orphaned parameter + """ + + from . import models + container = self.container + if isinstance(container, models.Service): + return container + elif hasattr(container, 'service'): + return container.service + return None + + @property + @caching.cachedmethod + def service_template(self): + """ + The :class:`~aria.modeling.models.ServiceTemplate` model containing this parameter, or + ``None`` if not contained in a service template. + + :raises ~exceptions.ValueError: if failed to find a container model, which signifies an + abnormal, orphaned parameter + """ + + from . import models + container = self.container + if isinstance(container, models.ServiceTemplate): + return container + elif hasattr(container, 'service_template'): + return container.service_template + return None + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('type_name', self.type_name), + ('value', self.value), + ('description', self.description))) + + @property + def unwrapped(self): + return self.name, self.value + + @classmethod + def wrap(cls, name, value, description=None): + """ + Wraps an arbitrary value as a parameter. The type will be guessed via introspection. + + For primitive types, we will prefer their TOSCA aliases. See the `TOSCA Simple Profile v1.0 + cos01 specification `__ + + :param name: parameter name + :type name: basestring + :param value: parameter value + :param description: human-readable description (optional) + :type description: basestring + """ + + type_name = canonical_type_name(value) + if type_name is None: + type_name = full_type_name(value) + return cls(name=name, # pylint: disable=unexpected-keyword-arg + type_name=type_name, + value=value, + description=description) + + def as_other_parameter_model(self, other_model_cls): + name, value = self.unwrapped + return other_model_cls.wrap(name, value) + + def as_argument(self): + from . import models + return self.as_other_parameter_model(models.Argument) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/models.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/models.py new file mode 100644 index 0000000..cf84fdb --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/models.py @@ -0,0 +1,427 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 models. + +Service template models +----------------------- + +.. autosummary:: + :nosignatures: + + aria.modeling.models.ServiceTemplate + aria.modeling.models.NodeTemplate + aria.modeling.models.GroupTemplate + aria.modeling.models.PolicyTemplate + aria.modeling.models.SubstitutionTemplate + aria.modeling.models.SubstitutionTemplateMapping + aria.modeling.models.RequirementTemplate + aria.modeling.models.RelationshipTemplate + aria.modeling.models.CapabilityTemplate + aria.modeling.models.InterfaceTemplate + aria.modeling.models.OperationTemplate + aria.modeling.models.ArtifactTemplate + aria.modeling.models.PluginSpecification + +Service instance models +----------------------- + +.. autosummary:: + :nosignatures: + + aria.modeling.models.Service + aria.modeling.models.Node + aria.modeling.models.Group + aria.modeling.models.Policy + aria.modeling.models.Substitution + aria.modeling.models.SubstitutionMapping + aria.modeling.models.Relationship + aria.modeling.models.Capability + aria.modeling.models.Interface + aria.modeling.models.Operation + aria.modeling.models.Artifact + +Common models +------------- + +.. autosummary:: + :nosignatures: + + aria.modeling.models.Output + aria.modeling.models.Input + aria.modeling.models.Configuration + aria.modeling.models.Property + aria.modeling.models.Attribute + aria.modeling.models.Type + aria.modeling.models.Metadata + +Orchestration models +-------------------- + +.. autosummary:: + :nosignatures: + + aria.modeling.models.Execution + aria.modeling.models.Task + aria.modeling.models.Log + aria.modeling.models.Plugin + aria.modeling.models.Argument +""" + +# pylint: disable=abstract-method + +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import ( + Column, + Text +) + +from . import ( + service_template, + service_instance, + service_changes, + service_common, + orchestration, + mixins, + utils +) + + +aria_declarative_base = declarative_base(cls=mixins.ModelIDMixin) + + +# See also models_to_register at the bottom of this file +__all__ = ( + 'models_to_register', + + # Service template models + 'ServiceTemplate', + 'NodeTemplate', + 'GroupTemplate', + 'PolicyTemplate', + 'SubstitutionTemplate', + 'SubstitutionTemplateMapping', + 'RequirementTemplate', + 'RelationshipTemplate', + 'CapabilityTemplate', + 'InterfaceTemplate', + 'OperationTemplate', + 'ArtifactTemplate', + 'PluginSpecification', + + # Service instance models + 'Service', + 'Node', + 'Group', + 'Policy', + 'Substitution', + 'SubstitutionMapping', + 'Relationship', + 'Capability', + 'Interface', + 'Operation', + 'Artifact', + + # Service changes models + 'ServiceUpdate', + 'ServiceUpdateStep', + 'ServiceModification', + + # Common service models + 'Input', + 'Configuration', + 'Output', + 'Property', + 'Attribute', + 'Type', + 'Metadata', + + # Orchestration models + 'Execution', + 'Plugin', + 'Task', + 'Log', + 'Argument' +) + + +# region service template models + +@utils.fix_doc +class ServiceTemplate(aria_declarative_base, service_template.ServiceTemplateBase): + name = Column(Text, index=True, unique=True) + + +@utils.fix_doc +class NodeTemplate(aria_declarative_base, service_template.NodeTemplateBase): + pass + + +@utils.fix_doc +class GroupTemplate(aria_declarative_base, service_template.GroupTemplateBase): + pass + + +@utils.fix_doc +class PolicyTemplate(aria_declarative_base, service_template.PolicyTemplateBase): + pass + + +@utils.fix_doc +class SubstitutionTemplate(aria_declarative_base, service_template.SubstitutionTemplateBase): + pass + + +@utils.fix_doc +class SubstitutionTemplateMapping(aria_declarative_base, + service_template.SubstitutionTemplateMappingBase): + pass + + +@utils.fix_doc +class RequirementTemplate(aria_declarative_base, service_template.RequirementTemplateBase): + pass + + +@utils.fix_doc +class RelationshipTemplate(aria_declarative_base, service_template.RelationshipTemplateBase): + pass + + +@utils.fix_doc +class CapabilityTemplate(aria_declarative_base, service_template.CapabilityTemplateBase): + pass + + +@utils.fix_doc +class InterfaceTemplate(aria_declarative_base, service_template.InterfaceTemplateBase): + pass + + +@utils.fix_doc +class OperationTemplate(aria_declarative_base, service_template.OperationTemplateBase): + pass + + +@utils.fix_doc +class ArtifactTemplate(aria_declarative_base, service_template.ArtifactTemplateBase): + pass + + +@utils.fix_doc +class PluginSpecification(aria_declarative_base, service_template.PluginSpecificationBase): + pass + +# endregion + + +# region service instance models + +@utils.fix_doc +class Service(aria_declarative_base, service_instance.ServiceBase): + name = Column(Text, index=True, unique=True) + + +@utils.fix_doc +class Node(aria_declarative_base, service_instance.NodeBase): + pass + + +@utils.fix_doc +class Group(aria_declarative_base, service_instance.GroupBase): + pass + + +@utils.fix_doc +class Policy(aria_declarative_base, service_instance.PolicyBase): + pass + + +@utils.fix_doc +class Substitution(aria_declarative_base, service_instance.SubstitutionBase): + pass + + +@utils.fix_doc +class SubstitutionMapping(aria_declarative_base, service_instance.SubstitutionMappingBase): + pass + + +@utils.fix_doc +class Relationship(aria_declarative_base, service_instance.RelationshipBase): + pass + + +@utils.fix_doc +class Capability(aria_declarative_base, service_instance.CapabilityBase): + pass + + +@utils.fix_doc +class Interface(aria_declarative_base, service_instance.InterfaceBase): + pass + + +@utils.fix_doc +class Operation(aria_declarative_base, service_instance.OperationBase): + pass + + +@utils.fix_doc +class Artifact(aria_declarative_base, service_instance.ArtifactBase): + pass + +# endregion + + +# region service changes models + +@utils.fix_doc +class ServiceUpdate(aria_declarative_base, service_changes.ServiceUpdateBase): + pass + + +@utils.fix_doc +class ServiceUpdateStep(aria_declarative_base, service_changes.ServiceUpdateStepBase): + pass + + +@utils.fix_doc +class ServiceModification(aria_declarative_base, service_changes.ServiceModificationBase): + pass + +# endregion + + +# region common service models + +@utils.fix_doc +class Input(aria_declarative_base, service_common.InputBase): + pass + + +@utils.fix_doc +class Configuration(aria_declarative_base, service_common.ConfigurationBase): + pass + + +@utils.fix_doc +class Output(aria_declarative_base, service_common.OutputBase): + pass + + +@utils.fix_doc +class Property(aria_declarative_base, service_common.PropertyBase): + pass + + +@utils.fix_doc +class Attribute(aria_declarative_base, service_common.AttributeBase): + pass + + +@utils.fix_doc +class Type(aria_declarative_base, service_common.TypeBase): + pass + + +@utils.fix_doc +class Metadata(aria_declarative_base, service_common.MetadataBase): + pass + +# endregion + + +# region orchestration models + +@utils.fix_doc +class Execution(aria_declarative_base, orchestration.ExecutionBase): + pass + + +@utils.fix_doc +class Plugin(aria_declarative_base, orchestration.PluginBase): + pass + + +@utils.fix_doc +class Task(aria_declarative_base, orchestration.TaskBase): + pass + + +@utils.fix_doc +class Log(aria_declarative_base, orchestration.LogBase): + pass + + +@utils.fix_doc +class Argument(aria_declarative_base, orchestration.ArgumentBase): + pass + +# endregion + + +# See also __all__ at the top of this file +models_to_register = ( + # Service template models + ServiceTemplate, + NodeTemplate, + GroupTemplate, + PolicyTemplate, + SubstitutionTemplate, + SubstitutionTemplateMapping, + RequirementTemplate, + RelationshipTemplate, + CapabilityTemplate, + InterfaceTemplate, + OperationTemplate, + ArtifactTemplate, + PluginSpecification, + + # Service instance models + Service, + Node, + Group, + Policy, + SubstitutionMapping, + Substitution, + Relationship, + Capability, + Interface, + Operation, + Artifact, + + # Service changes models + ServiceUpdate, + ServiceUpdateStep, + ServiceModification, + + # Common service models + Input, + Configuration, + Output, + Property, + Attribute, + Type, + Metadata, + + # Orchestration models + Execution, + Plugin, + Task, + Log, + Argument +) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/orchestration.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/orchestration.py new file mode 100644 index 0000000..4d4f0fe --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/orchestration.py @@ -0,0 +1,715 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +ARIA modeling orchestration module +""" + +# pylint: disable=no-self-argument, no-member, abstract-method +from datetime import datetime + +from sqlalchemy import ( + Column, + Integer, + Text, + DateTime, + Boolean, + Enum, + String, + Float, + orm, + PickleType) +from sqlalchemy.ext.declarative import declared_attr + +from ..orchestrator.exceptions import (TaskAbortException, TaskRetryException) +from . import mixins +from . import ( + relationship, + types as modeling_types +) + + +class ExecutionBase(mixins.ModelMixin): + """ + Workflow execution. + """ + + __tablename__ = 'execution' + + __private_fields__ = ('service_fk', + 'service_template') + + SUCCEEDED = 'succeeded' + FAILED = 'failed' + CANCELLED = 'cancelled' + PENDING = 'pending' + STARTED = 'started' + CANCELLING = 'cancelling' + + STATES = (SUCCEEDED, FAILED, CANCELLED, PENDING, STARTED, CANCELLING) + END_STATES = (SUCCEEDED, FAILED, CANCELLED) + + VALID_TRANSITIONS = { + PENDING: (STARTED, CANCELLED), + STARTED: END_STATES + (CANCELLING,), + CANCELLING: END_STATES, + # Retrying + CANCELLED: PENDING, + FAILED: PENDING + } + + # region one_to_many relationships + + @declared_attr + def inputs(cls): + """ + Execution parameters. + + :type: {:obj:`basestring`: :class:`Input`} + """ + return relationship.one_to_many(cls, 'input', dict_key='name') + + @declared_attr + def tasks(cls): + """ + Tasks. + + :type: [:class:`Task`] + """ + return relationship.one_to_many(cls, 'task') + + @declared_attr + def logs(cls): + """ + Log messages for the execution (including log messages for its tasks). + + :type: [:class:`Log`] + """ + return relationship.one_to_many(cls, 'log') + + # endregion + + # region many_to_one relationships + + @declared_attr + def service(cls): + """ + Associated service. + + :type: :class:`Service` + """ + return relationship.many_to_one(cls, 'service') + + # endregion + + # region association proxies + + @declared_attr + def service_name(cls): + return relationship.association_proxy('service', cls.name_column_name()) + + @declared_attr + def service_template(cls): + return relationship.association_proxy('service', 'service_template') + + @declared_attr + def service_template_name(cls): + return relationship.association_proxy('service', 'service_template_name') + + # endregion + + # region foreign keys + + @declared_attr + def service_fk(cls): + return relationship.foreign_key('service') + + # endregion + + created_at = Column(DateTime, index=True, doc=""" + Creation timestamp. + + :type: :class:`~datetime.datetime` + """) + + started_at = Column(DateTime, nullable=True, index=True, doc=""" + Started timestamp. + + :type: :class:`~datetime.datetime` + """) + + ended_at = Column(DateTime, nullable=True, index=True, doc=""" + Ended timestamp. + + :type: :class:`~datetime.datetime` + """) + + error = Column(Text, nullable=True, doc=""" + Error message. + + :type: :obj:`basestring` + """) + + status = Column(Enum(*STATES, name='execution_status'), default=PENDING, doc=""" + Status. + + :type: :obj:`basestring` + """) + + workflow_name = Column(Text, doc=""" + Workflow name. + + :type: :obj:`basestring` + """) + + @orm.validates('status') + def validate_status(self, key, value): + """Validation function that verifies execution status transitions are OK""" + try: + current_status = getattr(self, key) + except AttributeError: + return + valid_transitions = self.VALID_TRANSITIONS.get(current_status, []) + if all([current_status is not None, + current_status != value, + value not in valid_transitions]): + raise ValueError('Cannot change execution status from {current} to {new}'.format( + current=current_status, + new=value)) + return value + + def has_ended(self): + return self.status in self.END_STATES + + def is_active(self): + return not self.has_ended() and self.status != self.PENDING + + def __str__(self): + return '<{0} id=`{1}` (status={2})>'.format( + self.__class__.__name__, + getattr(self, self.name_column_name()), + self.status + ) + + +class TaskBase(mixins.ModelMixin): + """ + Represents the smallest unit of stateful execution in ARIA. The task state includes inputs, + outputs, as well as an atomic status, ensuring that the task can only be running once at any + given time. + + The Python :attr:`function` is usually provided by an associated :class:`Plugin`. The + :attr:`arguments` of the function should be set according to the specific signature of the + function. + + Tasks may be "one shot" or may be configured to run repeatedly in the case of failure. + + Tasks are often based on :class:`Operation`, and thus act on either a :class:`Node` or a + :class:`Relationship`, however this is not required. + """ + + __tablename__ = 'task' + + __private_fields__ = ('node_fk', + 'relationship_fk', + 'plugin_fk', + 'execution_fk') + + START_WORKFLOW = 'start_workflow' + END_WORKFLOW = 'end_workflow' + START_SUBWROFKLOW = 'start_subworkflow' + END_SUBWORKFLOW = 'end_subworkflow' + STUB = 'stub' + CONDITIONAL = 'conditional' + + STUB_TYPES = ( + START_WORKFLOW, + START_SUBWROFKLOW, + END_WORKFLOW, + END_SUBWORKFLOW, + STUB, + CONDITIONAL, + ) + + PENDING = 'pending' + RETRYING = 'retrying' + SENT = 'sent' + STARTED = 'started' + SUCCESS = 'success' + FAILED = 'failed' + STATES = ( + PENDING, + RETRYING, + SENT, + STARTED, + SUCCESS, + FAILED, + ) + INFINITE_RETRIES = -1 + + # region one_to_many relationships + + @declared_attr + def logs(cls): + """ + Log messages. + + :type: [:class:`Log`] + """ + return relationship.one_to_many(cls, 'log') + + @declared_attr + def arguments(cls): + """ + Arguments sent to the Python :attr:`function``. + + :type: {:obj:`basestring`: :class:`Argument`} + """ + return relationship.one_to_many(cls, 'argument', dict_key='name') + + # endregion + + # region many_one relationships + + @declared_attr + def execution(cls): + """ + Containing execution. + + :type: :class:`Execution` + """ + return relationship.many_to_one(cls, 'execution') + + @declared_attr + def node(cls): + """ + Node actor (can be ``None``). + + :type: :class:`Node` + """ + return relationship.many_to_one(cls, 'node') + + @declared_attr + def relationship(cls): + """ + Relationship actor (can be ``None``). + + :type: :class:`Relationship` + """ + return relationship.many_to_one(cls, 'relationship') + + @declared_attr + def plugin(cls): + """ + Associated plugin. + + :type: :class:`Plugin` + """ + return relationship.many_to_one(cls, 'plugin') + + # endregion + + # region association proxies + + @declared_attr + def node_name(cls): + return relationship.association_proxy('node', cls.name_column_name()) + + @declared_attr + def relationship_name(cls): + return relationship.association_proxy('relationship', cls.name_column_name()) + + @declared_attr + def execution_name(cls): + return relationship.association_proxy('execution', cls.name_column_name()) + + # endregion + + # region foreign keys + + @declared_attr + def execution_fk(cls): + return relationship.foreign_key('execution', nullable=True) + + @declared_attr + def node_fk(cls): + return relationship.foreign_key('node', nullable=True) + + @declared_attr + def relationship_fk(cls): + return relationship.foreign_key('relationship', nullable=True) + + @declared_attr + def plugin_fk(cls): + return relationship.foreign_key('plugin', nullable=True) + + # endregion + + status = Column(Enum(*STATES, name='status'), default=PENDING, doc=""" + Current atomic status ('pending', 'retrying', 'sent', 'started', 'success', 'failed'). + + :type: :obj:`basestring` + """) + + due_at = Column(DateTime, nullable=False, index=True, default=datetime.utcnow(), doc=""" + Timestamp to start the task. + + :type: :class:`~datetime.datetime` + """) + + started_at = Column(DateTime, default=None, doc=""" + Started timestamp. + + :type: :class:`~datetime.datetime` + """) + + ended_at = Column(DateTime, default=None, doc=""" + Ended timestamp. + + :type: :class:`~datetime.datetime` + """) + + attempts_count = Column(Integer, default=1, doc=""" + How many attempts occurred. + + :type: :class:`~datetime.datetime` + """) + + function = Column(String, doc=""" + Full path to Python function. + + :type: :obj:`basestring` + """) + + max_attempts = Column(Integer, default=1, doc=""" + Maximum number of attempts allowed in case of task failure. + + :type: :obj:`int` + """) + + retry_interval = Column(Float, default=0, doc=""" + Interval between task retry attemps (in seconds). + + :type: :obj:`float` + """) + + ignore_failure = Column(Boolean, default=False, doc=""" + Set to ``True`` to ignore failures. + + :type: :obj:`bool` + """) + + interface_name = Column(String, doc=""" + Name of interface on node or relationship. + + :type: :obj:`basestring` + """) + + operation_name = Column(String, doc=""" + Name of operation in interface on node or relationship. + + :type: :obj:`basestring` + """) + + _api_id = Column(String) + _executor = Column(PickleType) + _context_cls = Column(PickleType) + _stub_type = Column(Enum(*STUB_TYPES)) + + @property + def actor(self): + """ + Actor of the task (node or relationship). + """ + return self.node or self.relationship + + @orm.validates('max_attempts') + def validate_max_attempts(self, _, value): # pylint: disable=no-self-use + """ + Validates that max attempts is either -1 or a positive number. + """ + if value < 1 and value != TaskBase.INFINITE_RETRIES: + raise ValueError('Max attempts can be either -1 (infinite) or any positive number. ' + 'Got {value}'.format(value=value)) + return value + + @staticmethod + def abort(message=None): + raise TaskAbortException(message) + + @staticmethod + def retry(message=None, retry_interval=None): + raise TaskRetryException(message, retry_interval=retry_interval) + + @declared_attr + def dependencies(cls): + return relationship.many_to_many(cls, self=True) + + def has_ended(self): + return self.status in (self.SUCCESS, self.FAILED) + + def is_waiting(self): + if self._stub_type: + return not self.has_ended() + else: + return self.status in (self.PENDING, self.RETRYING) + + @classmethod + def from_api_task(cls, api_task, executor, **kwargs): + instantiation_kwargs = {} + + if hasattr(api_task.actor, 'outbound_relationships'): + instantiation_kwargs['node'] = api_task.actor + elif hasattr(api_task.actor, 'source_node'): + instantiation_kwargs['relationship'] = api_task.actor + else: + raise RuntimeError('No operation context could be created for {actor.model_cls}' + .format(actor=api_task.actor)) + + instantiation_kwargs.update( + { + 'name': api_task.name, + 'status': cls.PENDING, + 'max_attempts': api_task.max_attempts, + 'retry_interval': api_task.retry_interval, + 'ignore_failure': api_task.ignore_failure, + 'execution': api_task._workflow_context.execution, + 'interface_name': api_task.interface_name, + 'operation_name': api_task.operation_name, + + # Only non-stub tasks have these fields + 'plugin': api_task.plugin, + 'function': api_task.function, + 'arguments': api_task.arguments, + '_context_cls': api_task._context_cls, + '_executor': executor, + } + ) + + instantiation_kwargs.update(**kwargs) + + return cls(**instantiation_kwargs) + + +class LogBase(mixins.ModelMixin): + """ + Single log message. + """ + + __tablename__ = 'log' + + __private_fields__ = ('execution_fk', + 'task_fk') + + # region many_to_one relationships + + @declared_attr + def execution(cls): + """ + Containing execution. + + :type: :class:`Execution` + """ + return relationship.many_to_one(cls, 'execution') + + @declared_attr + def task(cls): + """ + Containing task (can be ``None``). + + :type: :class:`Task` + """ + return relationship.many_to_one(cls, 'task') + + # endregion + + # region foreign keys + + @declared_attr + def execution_fk(cls): + return relationship.foreign_key('execution') + + @declared_attr + def task_fk(cls): + return relationship.foreign_key('task', nullable=True) + + # endregion + + level = Column(String, doc=""" + Log level. + + :type: :obj:`basestring` + """) + + msg = Column(String, doc=""" + Log message. + + :type: :obj:`basestring` + """) + + created_at = Column(DateTime, index=True, doc=""" + Creation timestamp. + + :type: :class:`~datetime.datetime` + """) + + traceback = Column(Text, doc=""" + Error traceback in case of failure. + + :type: :class:`~datetime.datetime` + """) + + def __str__(self): + return self.msg + + def __repr__(self): + name = (self.task.actor if self.task else self.execution).name + return '{name}: {self.msg}'.format(name=name, self=self) + + +class PluginBase(mixins.ModelMixin): + """ + Installed plugin. + + Plugins are usually packaged as `wagons `__, which + are archives of one or more `wheels `__. + Most of these fields are indeed extracted from the installed wagon's metadata. + """ + + __tablename__ = 'plugin' + + # region one_to_many relationships + + @declared_attr + def tasks(cls): + """ + Associated Tasks. + + :type: [:class:`Task`] + """ + return relationship.one_to_many(cls, 'task') + + # endregion + + archive_name = Column(Text, nullable=False, index=True, doc=""" + Filename (not the full path) of the wagon's archive, often with a ``.wgn`` extension. + + :type: :obj:`basestring` + """) + + distribution = Column(Text, doc=""" + Name of the operating system on which the wagon was installed (e.g. ``ubuntu``). + + :type: :obj:`basestring` + """) + + distribution_release = Column(Text, doc=""" + Release of the operating system on which the wagon was installed (e.g. ``trusty``). + + :type: :obj:`basestring` + """) + + distribution_version = Column(Text, doc=""" + Version of the operating system on which the wagon was installed (e.g. ``14.04``). + + :type: :obj:`basestring` + """) + + package_name = Column(Text, nullable=False, index=True, doc=""" + Primary Python package name used when the wagon was installed, which is one of the wheels in the + wagon (e.g. ``cloudify-script-plugin``). + + :type: :obj:`basestring` + """) + + package_source = Column(Text, doc=""" + Full install string for the primary Python package name used when the wagon was installed (e.g. + ``cloudify-script-plugin==1.2``). + + :type: :obj:`basestring` + """) + + package_version = Column(Text, doc=""" + Version for the primary Python package name used when the wagon was installed (e.g. ``1.2``). + + :type: :obj:`basestring` + """) + + supported_platform = Column(Text, doc=""" + If the wheels are *all* pure Python then this would be "any", otherwise it would be the + installed platform name (e.g. ``linux_x86_64``). + + :type: :obj:`basestring` + """) + + supported_py_versions = Column(modeling_types.StrictList(basestring), doc=""" + Python versions supported by all the wheels (e.g. ``["py26", "py27"]``) + + :type: [:obj:`basestring`] + """) + + wheels = Column(modeling_types.StrictList(basestring), nullable=False, doc=""" + Filenames of the wheels archived in the wagon, often with a ``.whl`` extension. + + :type: [:obj:`basestring`] + """) + + uploaded_at = Column(DateTime, nullable=False, index=True, doc=""" + Timestamp for when the wagon was installed. + + :type: :class:`~datetime.datetime` + """) + + +class ArgumentBase(mixins.ParameterMixin): + """ + Python function argument parameter. + """ + + __tablename__ = 'argument' + + # region many_to_one relationships + + @declared_attr + def task(cls): + """ + Containing task (can be ``None``); + + :type: :class:`Task` + """ + return relationship.many_to_one(cls, 'task') + + @declared_attr + def operation(cls): + """ + Containing operation (can be ``None``); + + :type: :class:`Operation` + """ + return relationship.many_to_one(cls, 'operation') + + # endregion + + # region foreign keys + + @declared_attr + def task_fk(cls): + return relationship.foreign_key('task', nullable=True) + + @declared_attr + def operation_fk(cls): + return relationship.foreign_key('operation', nullable=True) + + # endregion diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/relationship.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/relationship.py new file mode 100644 index 0000000..0d906de --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/relationship.py @@ -0,0 +1,395 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +ARIA modeling relationship module +""" + +# pylint: disable=invalid-name, redefined-outer-name + +from sqlalchemy.orm import relationship, backref +from sqlalchemy.orm.collections import attribute_mapped_collection +from sqlalchemy.ext.associationproxy import association_proxy as original_association_proxy +from sqlalchemy import ( + Column, + ForeignKey, + Integer, + Table +) + +from ..utils import formatting + +NO_BACK_POP = 'NO_BACK_POP' + + +def foreign_key(other_table, nullable=False): + """ + Declare a foreign key property, which will also create a foreign key column in the table with + the name of the property. By convention the property name should end in "_fk". + + You are required to explicitly create foreign keys in order to allow for one-to-one, + one-to-many, and many-to-one relationships (but not for many-to-many relationships). If you do + not do so, SQLAlchemy will fail to create the relationship property and raise an exception with + a clear error message. + + You should normally not have to access this property directly, but instead use the associated + relationship properties. + + *This utility method should only be used during class creation.* + + :param other_table: other table name + :type other_table: basestring + :param nullable: ``True`` to allow null values (meaning that there is no relationship) + :type nullable: bool + """ + + return Column(Integer, + ForeignKey('{table}.id'.format(table=other_table), ondelete='CASCADE'), + nullable=nullable) + + +def one_to_one_self(model_class, fk): + """ + Declare a one-to-one relationship property. The property value would be an instance of the same + model. + + You will need an associated foreign key to our own table. + + *This utility method should only be used during class creation.* + + :param model_class: class in which this relationship will be declared + :type model_class: type + :param fk: foreign key name + :type fk: basestring + """ + + remote_side = '{model_class}.{remote_column}'.format( + model_class=model_class.__name__, + remote_column=model_class.id_column_name() + ) + + primaryjoin = '{remote_side} == {model_class}.{column}'.format( + remote_side=remote_side, + model_class=model_class.__name__, + column=fk + ) + return _relationship( + model_class, + model_class.__tablename__, + relationship_kwargs={ + 'primaryjoin': primaryjoin, + 'remote_side': remote_side, + 'post_update': True + } + ) + + +def one_to_one(model_class, + other_table, + fk=None, + other_fk=None, + back_populates=None): + """ + Declare a one-to-one relationship property. The property value would be an instance of the other + table's model. + + You have two options for the foreign key. Either this table can have an associated key to the + other table (use the ``fk`` argument) or the other table can have an associated foreign key to + this our table (use the ``other_fk`` argument). + + *This utility method should only be used during class creation.* + + :param model_class: class in which this relationship will be declared + :type model_class: type + :param other_table: other table name + :type other_table: basestring + :param fk: foreign key name at our table (no need specify if there's no ambiguity) + :type fk: basestring + :param other_fk: foreign key name at the other table (no need specify if there's no ambiguity) + :type other_fk: basestring + :param back_populates: override name of matching many-to-many property at other table; set to + ``False`` to disable + :type back_populates: basestring or bool + """ + backref_kwargs = None + if back_populates is not NO_BACK_POP: + if back_populates is None: + back_populates = model_class.__tablename__ + backref_kwargs = {'name': back_populates, 'uselist': False} + back_populates = None + + return _relationship(model_class, + other_table, + fk=fk, + back_populates=back_populates, + backref_kwargs=backref_kwargs, + other_fk=other_fk) + + +def one_to_many(model_class, + other_table=None, + other_fk=None, + dict_key=None, + back_populates=None, + rel_kwargs=None, + self=False): + """ + Declare a one-to-many relationship property. The property value would be a list or dict of + instances of the child table's model. + + The child table will need an associated foreign key to our table. + + The declaration will automatically create a matching many-to-one property at the child model, + named after our table name. Use the ``child_property`` argument to override this name. + + *This utility method should only be used during class creation.* + + :param model_class: class in which this relationship will be declared + :type model_class: type + :param other_table: other table name + :type other_table: basestring + :param other_fk: foreign key name at the other table (no need specify if there's no ambiguity) + :type other_fk: basestring + :param dict_key: if set the value will be a dict with this key as the dict key; otherwise will + be a list + :type dict_key: basestring + :param back_populates: override name of matching many-to-one property at other table; set to + ``False`` to disable + :type back_populates: basestring or bool + :param rel_kwargs: additional relationship kwargs to be used by SQLAlchemy + :type rel_kwargs: dict + :param self: used for relationships between a table and itself. if set, other_table will + become the same as the source table. + :type self: bool + """ + relationship_kwargs = rel_kwargs or {} + if self: + assert other_fk + other_table_name = model_class.__tablename__ + back_populates = False + relationship_kwargs['remote_side'] = '{model}.{column}'.format(model=model_class.__name__, + column=other_fk) + + else: + assert other_table + other_table_name = other_table + if back_populates is None: + back_populates = model_class.__tablename__ + relationship_kwargs.setdefault('cascade', 'all') + + return _relationship( + model_class, + other_table_name, + back_populates=back_populates, + other_fk=other_fk, + dict_key=dict_key, + relationship_kwargs=relationship_kwargs) + + +def many_to_one(model_class, + parent_table, + fk=None, + parent_fk=None, + back_populates=None): + """ + Declare a many-to-one relationship property. The property value would be an instance of the + parent table's model. + + You will need an associated foreign key to the parent table. + + The declaration will automatically create a matching one-to-many property at the child model, + named after the plural form of our table name. Use the ``parent_property`` argument to override + this name. Note: the automatic property will always be a SQLAlchemy query object; if you need a + Python collection then use :func:`one_to_many` at that model. + + *This utility method should only be used during class creation.* + + :param model_class: class in which this relationship will be declared + :type model_class: type + :param parent_table: parent table name + :type parent_table: basestring + :param fk: foreign key name at our table (no need specify if there's no ambiguity) + :type fk: basestring + :param back_populates: override name of matching one-to-many property at parent table; set to + ``False`` to disable + :type back_populates: basestring or bool + """ + if back_populates is None: + back_populates = formatting.pluralize(model_class.__tablename__) + + return _relationship(model_class, + parent_table, + back_populates=back_populates, + fk=fk, + other_fk=parent_fk) + + +def many_to_many(model_class, + other_table=None, + prefix=None, + dict_key=None, + other_property=None, + self=False): + """ + Declare a many-to-many relationship property. The property value would be a list or dict of + instances of the other table's model. + + You do not need associated foreign keys for this relationship. Instead, an extra table will be + created for you. + + The declaration will automatically create a matching many-to-many property at the other model, + named after the plural form of our table name. Use the ``other_property`` argument to override + this name. Note: the automatic property will always be a SQLAlchemy query object; if you need a + Python collection then use :func:`many_to_many` again at that model. + + *This utility method should only be used during class creation.* + + :param model_class: class in which this relationship will be declared + :type model_class: type + :param other_table: parent table name + :type other_table: basestring + :param prefix: optional prefix for extra table name as well as for ``other_property`` + :type prefix: basestring + :param dict_key: if set the value will be a dict with this key as the dict key; otherwise will + be a list + :type dict_key: basestring + :param other_property: override name of matching many-to-many property at other table; set to + ``False`` to disable + :type other_property: basestring or bool + :param self: used for relationships between a table and itself. if set, other_table will + become the same as the source table. + :type self: bool + """ + + this_table = model_class.__tablename__ + this_column_name = '{0}_id'.format(this_table) + this_foreign_key = '{0}.id'.format(this_table) + + if self: + other_table = this_table + + other_column_name = '{0}_{1}'.format(other_table, 'self_ref_id' if self else 'id') + other_foreign_key = '{0}.{1}'.format(other_table, 'id') + + secondary_table_name = '{0}_{1}'.format(this_table, other_table) + + if prefix is not None: + secondary_table_name = '{0}_{1}'.format(prefix, secondary_table_name) + if other_property is None: + other_property = '{0}_{1}'.format(prefix, formatting.pluralize(this_table)) + + secondary_table = _get_secondary_table( + model_class.metadata, + secondary_table_name, + this_column_name, + other_column_name, + this_foreign_key, + other_foreign_key + ) + + kwargs = {'relationship_kwargs': {'secondary': secondary_table}} + + if self: + kwargs['back_populates'] = NO_BACK_POP + kwargs['relationship_kwargs']['primaryjoin'] = \ + getattr(model_class, 'id') == getattr(secondary_table.c, this_column_name) + kwargs['relationship_kwargs']['secondaryjoin'] = \ + getattr(model_class, 'id') == getattr(secondary_table.c, other_column_name) + else: + kwargs['backref_kwargs'] = \ + {'name': other_property, 'uselist': True} if other_property else None + kwargs['dict_key'] = dict_key + + return _relationship(model_class, other_table, **kwargs) + + +def association_proxy(*args, **kwargs): + if 'type' in kwargs: + type_ = kwargs.get('type') + del kwargs['type'] + else: + type_ = ':obj:`basestring`' + proxy = original_association_proxy(*args, **kwargs) + proxy.__doc__ = """ + Internal. For use in SQLAlchemy queries. + + :type: {0} + """.format(type_) + return proxy + + +def _relationship(model_class, + other_table_name, + back_populates=None, + backref_kwargs=None, + relationship_kwargs=None, + fk=None, + other_fk=None, + dict_key=None): + relationship_kwargs = relationship_kwargs or {} + + if fk: + relationship_kwargs.setdefault( + 'foreign_keys', + lambda: getattr(_get_class_for_table(model_class, model_class.__tablename__), fk) + ) + + elif other_fk: + relationship_kwargs.setdefault( + 'foreign_keys', + lambda: getattr(_get_class_for_table(model_class, other_table_name), other_fk) + ) + + if dict_key: + relationship_kwargs.setdefault('collection_class', + attribute_mapped_collection(dict_key)) + + if backref_kwargs: + assert back_populates is None + return relationship( + lambda: _get_class_for_table(model_class, other_table_name), + backref=backref(**backref_kwargs), + **relationship_kwargs + ) + else: + if back_populates is not NO_BACK_POP: + relationship_kwargs['back_populates'] = back_populates + return relationship(lambda: _get_class_for_table(model_class, other_table_name), + **relationship_kwargs) + + +def _get_class_for_table(model_class, tablename): + if tablename in (model_class.__name__, model_class.__tablename__): + return model_class + + for table_cls in model_class._decl_class_registry.itervalues(): + if tablename == getattr(table_cls, '__tablename__', None): + return table_cls + + raise ValueError('unknown table: {0}'.format(tablename)) + + +def _get_secondary_table(metadata, + name, + first_column, + second_column, + first_foreign_key, + second_foreign_key): + return Table( + name, + metadata, + Column(first_column, Integer, ForeignKey(first_foreign_key)), + Column(second_column, Integer, ForeignKey(second_foreign_key)) + ) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_changes.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_changes.py new file mode 100644 index 0000000..061262a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_changes.py @@ -0,0 +1,253 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +ARIA modeling service changes module +""" + +# pylint: disable=no-self-argument, no-member, abstract-method + +from collections import namedtuple + +from sqlalchemy import ( + Column, + Text, + DateTime, + Enum, +) +from sqlalchemy.ext.declarative import declared_attr + +from .types import (List, Dict) +from .mixins import ModelMixin +from . import relationship + + +class ServiceUpdateBase(ModelMixin): + """ + Deployment update model representation. + """ + __tablename__ = 'service_update' + + __private_fields__ = ('service_fk', + 'execution_fk') + + created_at = Column(DateTime, nullable=False, index=True) + service_plan = Column(Dict, nullable=False) + service_update_nodes = Column(Dict) + service_update_service = Column(Dict) + service_update_node_templates = Column(List) + modified_entity_ids = Column(Dict) + state = Column(Text) + + # region association proxies + + @declared_attr + def execution_name(cls): + return relationship.association_proxy('execution', cls.name_column_name()) + + @declared_attr + def service_name(cls): + return relationship.association_proxy('service', cls.name_column_name()) + + # endregion + + # region one_to_one relationships + + # endregion + + # region one_to_many relationships + + @declared_attr + def steps(cls): + return relationship.one_to_many(cls, 'service_update_step') + + # endregion + + # region many_to_one relationships + + @declared_attr + def execution(cls): + return relationship.one_to_one(cls, 'execution', back_populates=relationship.NO_BACK_POP) + + @declared_attr + def service(cls): + return relationship.many_to_one(cls, 'service', back_populates='updates') + + # endregion + + # region foreign keys + + @declared_attr + def execution_fk(cls): + return relationship.foreign_key('execution', nullable=True) + + @declared_attr + def service_fk(cls): + return relationship.foreign_key('service') + + # endregion + + def to_dict(self, suppress_error=False, **kwargs): + dep_update_dict = super(ServiceUpdateBase, self).to_dict(suppress_error) #pylint: disable=no-member + # Taking care of the fact the DeploymentSteps are _BaseModels + dep_update_dict['steps'] = [step.to_dict() for step in self.steps] + return dep_update_dict + + +class ServiceUpdateStepBase(ModelMixin): + """ + Deployment update step model representation. + """ + + __tablename__ = 'service_update_step' + + __private_fields__ = ('service_update_fk',) + + _action_types = namedtuple('ACTION_TYPES', 'ADD, REMOVE, MODIFY') + ACTION_TYPES = _action_types(ADD='add', REMOVE='remove', MODIFY='modify') + + _entity_types = namedtuple( + 'ENTITY_TYPES', + 'NODE, RELATIONSHIP, PROPERTY, OPERATION, WORKFLOW, OUTPUT, DESCRIPTION, GROUP, PLUGIN') + ENTITY_TYPES = _entity_types( + NODE='node', + RELATIONSHIP='relationship', + PROPERTY='property', + OPERATION='operation', + WORKFLOW='workflow', + OUTPUT='output', + DESCRIPTION='description', + GROUP='group', + PLUGIN='plugin' + ) + + action = Column(Enum(*ACTION_TYPES, name='action_type'), nullable=False) + entity_id = Column(Text, nullable=False) + entity_type = Column(Enum(*ENTITY_TYPES, name='entity_type'), nullable=False) + + # region association proxies + + @declared_attr + def service_update_name(cls): + return relationship.association_proxy('service_update', cls.name_column_name()) + + # endregion + + # region one_to_one relationships + + # endregion + + # region one_to_many relationships + + # endregion + + # region many_to_one relationships + + @declared_attr + def service_update(cls): + return relationship.many_to_one(cls, 'service_update', back_populates='steps') + + # endregion + + # region foreign keys + + @declared_attr + def service_update_fk(cls): + return relationship.foreign_key('service_update') + + # endregion + + def __hash__(self): + return hash((getattr(self, self.id_column_name()), self.entity_id)) + + def __lt__(self, other): + """ + the order is 'remove' < 'modify' < 'add' + :param other: + :return: + """ + if not isinstance(other, self.__class__): + return not self >= other + + if self.action != other.action: + if self.action == 'remove': + return_value = True + elif self.action == 'add': + return_value = False + else: + return_value = other.action == 'add' + return return_value + + if self.action == 'add': + return self.entity_type == 'node' and other.entity_type == 'relationship' + if self.action == 'remove': + return self.entity_type == 'relationship' and other.entity_type == 'node' + return False + + +class ServiceModificationBase(ModelMixin): + """ + Deployment modification model representation. + """ + + __tablename__ = 'service_modification' + + __private_fields__ = ('service_fk',) + + STARTED = 'started' + FINISHED = 'finished' + ROLLEDBACK = 'rolledback' + + STATES = [STARTED, FINISHED, ROLLEDBACK] + END_STATES = [FINISHED, ROLLEDBACK] + + context = Column(Dict) + created_at = Column(DateTime, nullable=False, index=True) + ended_at = Column(DateTime, index=True) + modified_node_templates = Column(Dict) + nodes = Column(Dict) + status = Column(Enum(*STATES, name='service_modification_status')) + + # region association proxies + + @declared_attr + def service_name(cls): + return relationship.association_proxy('service', cls.name_column_name()) + + # endregion + + # region one_to_one relationships + + # endregion + + # region one_to_many relationships + + # endregion + + # region many_to_one relationships + + @declared_attr + def service(cls): + return relationship.many_to_one(cls, 'service', back_populates='modifications') + + # endregion + + # region foreign keys + + @declared_attr + def service_fk(cls): + return relationship.foreign_key('service') + + # endregion diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_common.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_common.py new file mode 100644 index 0000000..d1f6b00 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_common.py @@ -0,0 +1,601 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +ARIA modeling service common module +""" + +# pylint: disable=no-self-argument, no-member, abstract-method + +from sqlalchemy import ( + Column, + Text, + Boolean +) +from sqlalchemy.ext.declarative import declared_attr + +from ..utils import ( + collections, + formatting +) +from .mixins import InstanceModelMixin, TemplateModelMixin, ParameterMixin +from . import relationship + + +class OutputBase(ParameterMixin): + """ + Output parameter or declaration for an output parameter. + """ + + __tablename__ = 'output' + + # region many_to_one relationships + + @declared_attr + def service_template(cls): + """ + Containing service template (can be ``None``). + + :type: :class:`ServiceTemplate` + """ + return relationship.many_to_one(cls, 'service_template') + + @declared_attr + def service(cls): + """ + Containing service (can be ``None``). + + :type: :class:`ServiceTemplate` + """ + return relationship.many_to_one(cls, 'service') + + # endregion + + # region foreign keys + + @declared_attr + def service_template_fk(cls): + return relationship.foreign_key('service_template', nullable=True) + + @declared_attr + def service_fk(cls): + return relationship.foreign_key('service', nullable=True) + + # endregion + + +class InputBase(ParameterMixin): + """ + Input parameter or declaration for an input parameter. + """ + + __tablename__ = 'input' + + required = Column(Boolean, doc=""" + Is the input mandatory. + + :type: :obj:`bool` + """) + + @classmethod + def wrap(cls, name, value, description=None, required=True): # pylint: disable=arguments-differ + input = super(InputBase, cls).wrap(name, value, description) + input.required = required + return input + + # region many_to_one relationships + + @declared_attr + def service_template(cls): + """ + Containing service template (can be ``None``). + + :type: :class:`ServiceTemplate` + """ + return relationship.many_to_one(cls, 'service_template') + + @declared_attr + def service(cls): + """ + Containing service (can be ``None``). + + :type: :class:`Service` + """ + return relationship.many_to_one(cls, 'service') + + @declared_attr + def interface(cls): + """ + Containing interface (can be ``None``). + + :type: :class:`Interface` + """ + return relationship.many_to_one(cls, 'interface') + + @declared_attr + def operation(cls): + """ + Containing operation (can be ``None``). + + :type: :class:`Operation` + """ + return relationship.many_to_one(cls, 'operation') + + @declared_attr + def interface_template(cls): + """ + Containing interface template (can be ``None``). + + :type: :class:`InterfaceTemplate` + """ + return relationship.many_to_one(cls, 'interface_template') + + @declared_attr + def operation_template(cls): + """ + Containing operation template (can be ``None``). + + :type: :class:`OperationTemplate` + """ + return relationship.many_to_one(cls, 'operation_template') + + @declared_attr + def execution(cls): + """ + Containing execution (can be ``None``). + + :type: :class:`Execution` + """ + return relationship.many_to_one(cls, 'execution') + + # endregion + + # region foreign keys + + @declared_attr + def service_template_fk(cls): + return relationship.foreign_key('service_template', nullable=True) + + @declared_attr + def service_fk(cls): + return relationship.foreign_key('service', nullable=True) + + @declared_attr + def interface_fk(cls): + return relationship.foreign_key('interface', nullable=True) + + @declared_attr + def operation_fk(cls): + return relationship.foreign_key('operation', nullable=True) + + @declared_attr + def interface_template_fk(cls): + return relationship.foreign_key('interface_template', nullable=True) + + @declared_attr + def operation_template_fk(cls): + return relationship.foreign_key('operation_template', nullable=True) + + @declared_attr + def execution_fk(cls): + return relationship.foreign_key('execution', nullable=True) + + @declared_attr + def task_fk(cls): + return relationship.foreign_key('task', nullable=True) + + # endregion + + +class ConfigurationBase(ParameterMixin): + """ + Configuration parameter. + """ + + __tablename__ = 'configuration' + + # region many_to_one relationships + + @declared_attr + def operation_template(cls): + """ + Containing operation template (can be ``None``). + + :type: :class:`OperationTemplate` + """ + return relationship.many_to_one(cls, 'operation_template') + + @declared_attr + def operation(cls): + """ + Containing operation (can be ``None``). + + :type: :class:`Operation` + """ + return relationship.many_to_one(cls, 'operation') + + # endregion + + # region foreign keys + + @declared_attr + def operation_template_fk(cls): + return relationship.foreign_key('operation_template', nullable=True) + + @declared_attr + def operation_fk(cls): + return relationship.foreign_key('operation', nullable=True) + + # endregion + + +class PropertyBase(ParameterMixin): + """ + Property parameter or declaration for a property parameter. + """ + + __tablename__ = 'property' + + # region many_to_one relationships + + @declared_attr + def node_template(cls): + """ + Containing node template (can be ``None``). + + :type: :class:`NodeTemplate` + """ + return relationship.many_to_one(cls, 'node_template') + + @declared_attr + def group_template(cls): + """ + Containing group template (can be ``None``). + + :type: :class:`GroupTemplate` + """ + return relationship.many_to_one(cls, 'group_template') + + @declared_attr + def policy_template(cls): + """ + Containing policy template (can be ``None``). + + :type: :class:`PolicyTemplate` + """ + return relationship.many_to_one(cls, 'policy_template') + + @declared_attr + def relationship_template(cls): + """ + Containing relationship template (can be ``None``). + + :type: :class:`RelationshipTemplate` + """ + return relationship.many_to_one(cls, 'relationship_template') + + @declared_attr + def capability_template(cls): + """ + Containing capability template (can be ``None``). + + :type: :class:`CapabilityTemplate` + """ + return relationship.many_to_one(cls, 'capability_template') + + @declared_attr + def artifact_template(cls): + """ + Containing artifact template (can be ``None``). + + :type: :class:`ArtifactTemplate` + """ + return relationship.many_to_one(cls, 'artifact_template') + + @declared_attr + def node(cls): + """ + Containing node (can be ``None``). + + :type: :class:`Node` + """ + return relationship.many_to_one(cls, 'node') + + @declared_attr + def group(cls): + """ + Containing group (can be ``None``). + + :type: :class:`Group` + """ + return relationship.many_to_one(cls, 'group') + + @declared_attr + def policy(cls): + """ + Containing policy (can be ``None``). + + :type: :class:`Policy` + """ + return relationship.many_to_one(cls, 'policy') + + @declared_attr + def relationship(cls): + """ + Containing relationship (can be ``None``). + + :type: :class:`Relationship` + """ + return relationship.many_to_one(cls, 'relationship') + + @declared_attr + def capability(cls): + """ + Containing capability (can be ``None``). + + :type: :class:`Capability` + """ + return relationship.many_to_one(cls, 'capability') + + @declared_attr + def artifact(cls): + """ + Containing artifact (can be ``None``). + + :type: :class:`Artifact` + """ + return relationship.many_to_one(cls, 'artifact') + + # endregion + + # region foreign keys + + @declared_attr + def node_template_fk(cls): + return relationship.foreign_key('node_template', nullable=True) + + @declared_attr + def group_template_fk(cls): + return relationship.foreign_key('group_template', nullable=True) + + @declared_attr + def policy_template_fk(cls): + return relationship.foreign_key('policy_template', nullable=True) + + @declared_attr + def relationship_template_fk(cls): + return relationship.foreign_key('relationship_template', nullable=True) + + @declared_attr + def capability_template_fk(cls): + return relationship.foreign_key('capability_template', nullable=True) + + @declared_attr + def artifact_template_fk(cls): + return relationship.foreign_key('artifact_template', nullable=True) + + @declared_attr + def node_fk(cls): + return relationship.foreign_key('node', nullable=True) + + @declared_attr + def group_fk(cls): + return relationship.foreign_key('group', nullable=True) + + @declared_attr + def policy_fk(cls): + return relationship.foreign_key('policy', nullable=True) + + @declared_attr + def relationship_fk(cls): + return relationship.foreign_key('relationship', nullable=True) + + @declared_attr + def capability_fk(cls): + return relationship.foreign_key('capability', nullable=True) + + @declared_attr + def artifact_fk(cls): + return relationship.foreign_key('artifact', nullable=True) + + # endregion + + +class AttributeBase(ParameterMixin): + """ + Attribute parameter or declaration for an attribute parameter. + """ + + __tablename__ = 'attribute' + + # region many_to_one relationships + + @declared_attr + def node_template(cls): + """ + Containing node template (can be ``None``). + + :type: :class:`NodeTemplate` + """ + return relationship.many_to_one(cls, 'node_template') + + @declared_attr + def node(cls): + """ + Containing node (can be ``None``). + + :type: :class:`Node` + """ + return relationship.many_to_one(cls, 'node') + + # endregion + + # region foreign keys + + @declared_attr + def node_template_fk(cls): + """For Attribute many-to-one to NodeTemplate""" + return relationship.foreign_key('node_template', nullable=True) + + @declared_attr + def node_fk(cls): + """For Attribute many-to-one to Node""" + return relationship.foreign_key('node', nullable=True) + + # endregion + + +class TypeBase(InstanceModelMixin): + """ + Type and its children. Can serve as the root for a type hierarchy. + """ + + __tablename__ = 'type' + + __private_fields__ = ('parent_type_fk',) + + variant = Column(Text, nullable=False) + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + _role = Column(Text, name='role') + + # region one_to_one relationships + + @declared_attr + def parent(cls): + """ + Parent type (will be ``None`` for the root of a type hierarchy). + + :type: :class:`Type` + """ + return relationship.one_to_one_self(cls, 'parent_type_fk') + + # endregion + + # region one_to_many relationships + + @declared_attr + def children(cls): + """ + Children. + + :type: [:class:`Type`] + """ + return relationship.one_to_many(cls, other_fk='parent_type_fk', self=True) + + # endregion + + # region foreign keys + + @declared_attr + def parent_type_fk(cls): + """For Type one-to-many to Type""" + return relationship.foreign_key('type', nullable=True) + + # endregion + + @property + def role(self): + def get_role(the_type): + if the_type is None: + return None + elif the_type._role is None: + return get_role(the_type.parent) + return the_type._role + + return get_role(self) + + @role.setter + def role(self, value): + self._role = value + + def is_descendant(self, base_name, name): + base = self.get_descendant(base_name) + if base is not None: + if base.get_descendant(name) is not None: + return True + return False + + def get_descendant(self, name): + if self.name == name: + return self + for child in self.children: + found = child.get_descendant(name) + if found is not None: + return found + return None + + def iter_descendants(self): + for child in self.children: + yield child + for descendant in child.iter_descendants(): + yield descendant + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('description', self.description), + ('role', self.role))) + + @property + def as_raw_all(self): + types = [] + self._append_raw_children(types) + return types + + def _append_raw_children(self, types): + for child in self.children: + raw_child = formatting.as_raw(child) + raw_child['parent'] = self.name + types.append(raw_child) + child._append_raw_children(types) + + @property + def hierarchy(self): + """ + Type hierarchy as a list beginning with this type and ending in the root. + + :type: [:class:`Type`] + """ + return [self] + (self.parent.hierarchy if self.parent else []) + + +class MetadataBase(TemplateModelMixin): + """ + Custom values associated with the service. + + This model is used by both service template and service instance elements. + + :ivar name: name + :vartype name: basestring + :ivar value: value + :vartype value: basestring + """ + + __tablename__ = 'metadata' + + value = Column(Text) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('value', self.value))) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_instance.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_instance.py new file mode 100644 index 0000000..01c4da9 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_instance.py @@ -0,0 +1,1695 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +ARIA modeling service instance module +""" + +# pylint: disable=too-many-lines, no-self-argument, no-member, abstract-method + +from sqlalchemy import ( + Column, + Text, + Integer, + Enum, + Boolean +) +from sqlalchemy import DateTime +from sqlalchemy.ext.declarative import declared_attr +from sqlalchemy.ext.orderinglist import ordering_list + +from . import ( + relationship, + types as modeling_types +) +from .mixins import InstanceModelMixin + +from ..utils import ( + collections, + formatting +) + + +class ServiceBase(InstanceModelMixin): + """ + Usually an instance of a :class:`ServiceTemplate` and its many associated templates (node + templates, group templates, policy templates, etc.). However, it can also be created + programmatically. + """ + + __tablename__ = 'service' + + __private_fields__ = ('substitution_fk', + 'service_template_fk') + + # region one_to_one relationships + + @declared_attr + def substitution(cls): + """ + Exposes the entire service as a single node. + + :type: :class:`Substitution` + """ + return relationship.one_to_one(cls, 'substitution', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region one_to_many relationships + + @declared_attr + def outputs(cls): + """ + Output parameters. + + :type: {:obj:`basestring`: :class:`Output`} + """ + return relationship.one_to_many(cls, 'output', dict_key='name') + + @declared_attr + def inputs(cls): + """ + Externally provided parameters. + + :type: {:obj:`basestring`: :class:`Input`} + """ + return relationship.one_to_many(cls, 'input', dict_key='name') + + @declared_attr + def updates(cls): + """ + Service updates. + + :type: [:class:`ServiceUpdate`] + """ + return relationship.one_to_many(cls, 'service_update') + + @declared_attr + def modifications(cls): + """ + Service modifications. + + :type: [:class:`ServiceModification`] + """ + return relationship.one_to_many(cls, 'service_modification') + + @declared_attr + def executions(cls): + """ + Executions. + + :type: [:class:`Execution`] + """ + return relationship.one_to_many(cls, 'execution') + + @declared_attr + def nodes(cls): + """ + Nodes. + + :type: {:obj:`basestring`, :class:`Node`} + """ + return relationship.one_to_many(cls, 'node', dict_key='name') + + @declared_attr + def groups(cls): + """ + Groups. + + :type: {:obj:`basestring`, :class:`Group`} + """ + return relationship.one_to_many(cls, 'group', dict_key='name') + + @declared_attr + def policies(cls): + """ + Policies. + + :type: {:obj:`basestring`, :class:`Policy`} + """ + return relationship.one_to_many(cls, 'policy', dict_key='name') + + @declared_attr + def workflows(cls): + """ + Workflows. + + :type: {:obj:`basestring`, :class:`Operation`} + """ + return relationship.one_to_many(cls, 'operation', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def service_template(cls): + """ + Source service template (can be ``None``). + + :type: :class:`ServiceTemplate` + """ + return relationship.many_to_one(cls, 'service_template') + + # endregion + + # region many_to_many relationships + + @declared_attr + def meta_data(cls): + """ + Associated metadata. + + :type: {:obj:`basestring`, :class:`Metadata`} + """ + # Warning! We cannot use the attr name "metadata" because it's used by SQLAlchemy! + return relationship.many_to_many(cls, 'metadata', dict_key='name') + + @declared_attr + def plugins(cls): + """ + Associated plugins. + + :type: {:obj:`basestring`, :class:`Plugin`} + """ + return relationship.many_to_many(cls, 'plugin', dict_key='name') + + # endregion + + # region association proxies + + @declared_attr + def service_template_name(cls): + return relationship.association_proxy('service_template', 'name', type=':obj:`basestring`') + + # endregion + + # region foreign keys + + @declared_attr + def substitution_fk(cls): + """Service one-to-one to Substitution""" + return relationship.foreign_key('substitution', nullable=True) + + @declared_attr + def service_template_fk(cls): + """For Service many-to-one to ServiceTemplate""" + return relationship.foreign_key('service_template', nullable=True) + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + created_at = Column(DateTime, nullable=False, index=True, doc=""" + Creation timestamp. + + :type: :class:`~datetime.datetime` + """) + + updated_at = Column(DateTime, doc=""" + Update timestamp. + + :type: :class:`~datetime.datetime` + """) + + def get_node_by_type(self, type_name): + """ + Finds the first node of a type (or descendent type). + """ + service_template = self.service_template + + if service_template is not None: + node_types = service_template.node_types + if node_types is not None: + for node in self.nodes.itervalues(): + if node_types.is_descendant(type_name, node.type.name): + return node + + return None + + def get_policy_by_type(self, type_name): + """ + Finds the first policy of a type (or descendent type). + """ + service_template = self.service_template + + if service_template is not None: + policy_types = service_template.policy_types + if policy_types is not None: + for policy in self.policies.itervalues(): + if policy_types.is_descendant(type_name, policy.type.name): + return policy + + return None + + @property + def as_raw(self): + return collections.OrderedDict(( + ('description', self.description), + ('metadata', formatting.as_raw_dict(self.meta_data)), + ('nodes', formatting.as_raw_list(self.nodes)), + ('groups', formatting.as_raw_list(self.groups)), + ('policies', formatting.as_raw_list(self.policies)), + ('substitution', formatting.as_raw(self.substitution)), + ('inputs', formatting.as_raw_dict(self.inputs)), + ('outputs', formatting.as_raw_dict(self.outputs)), + ('workflows', formatting.as_raw_list(self.workflows)))) + + +class NodeBase(InstanceModelMixin): + """ + Typed vertex in the service topology. + + Nodes may have zero or more :class:`Relationship` instances to other nodes, together forming + a many-to-many node graph. + + Usually an instance of a :class:`NodeTemplate`. + """ + + __tablename__ = 'node' + + __private_fields__ = ('type_fk', + 'host_fk', + 'service_fk', + 'node_template_fk') + + INITIAL = 'initial' + CREATING = 'creating' + CREATED = 'created' + CONFIGURING = 'configuring' + CONFIGURED = 'configured' + STARTING = 'starting' + STARTED = 'started' + STOPPING = 'stopping' + DELETING = 'deleting' + DELETED = 'deleted' + ERROR = 'error' + + # Note: 'deleted' isn't actually part of the TOSCA spec, since according the description of the + # 'deleting' state: "Node is transitioning from its current state to one where it is deleted and + # its state is no longer tracked by the instance model." However, we prefer to be able to + # retrieve information about deleted nodes, so we chose to add this 'deleted' state to enable us + # to do so. + + STATES = (INITIAL, CREATING, CREATED, CONFIGURING, CONFIGURED, STARTING, STARTED, STOPPING, + DELETING, DELETED, ERROR) + + _OP_TO_STATE = {'create': {'transitional': CREATING, 'finished': CREATED}, + 'configure': {'transitional': CONFIGURING, 'finished': CONFIGURED}, + 'start': {'transitional': STARTING, 'finished': STARTED}, + 'stop': {'transitional': STOPPING, 'finished': CONFIGURED}, + 'delete': {'transitional': DELETING, 'finished': DELETED}} + + # region one_to_one relationships + + @declared_attr + def host(cls): # pylint: disable=method-hidden + """ + Node in which we are hosted (can be ``None``). + + Normally the host node is found by following the relationship graph (relationships with + ``host`` roles) to final nodes (with ``host`` roles). + + :type: :class:`Node` + """ + return relationship.one_to_one_self(cls, 'host_fk') + + # endregion + + # region one_to_many relationships + + @declared_attr + def tasks(cls): + """ + Associated tasks. + + :type: [:class:`Task`] + """ + return relationship.one_to_many(cls, 'task') + + @declared_attr + def interfaces(cls): + """ + Associated interfaces. + + :type: {:obj:`basestring`: :class:`Interface`} + """ + return relationship.one_to_many(cls, 'interface', dict_key='name') + + @declared_attr + def properties(cls): + """ + Associated immutable parameters. + + :type: {:obj:`basestring`: :class:`Property`} + """ + return relationship.one_to_many(cls, 'property', dict_key='name') + + @declared_attr + def attributes(cls): + """ + Associated mutable parameters. + + :type: {:obj:`basestring`: :class:`Attribute`} + """ + return relationship.one_to_many(cls, 'attribute', dict_key='name') + + @declared_attr + def artifacts(cls): + """ + Associated artifacts. + + :type: {:obj:`basestring`: :class:`Artifact`} + """ + return relationship.one_to_many(cls, 'artifact', dict_key='name') + + @declared_attr + def capabilities(cls): + """ + Associated exposed capabilities. + + :type: {:obj:`basestring`: :class:`Capability`} + """ + return relationship.one_to_many(cls, 'capability', dict_key='name') + + @declared_attr + def outbound_relationships(cls): + """ + Relationships to other nodes. + + :type: [:class:`Relationship`] + """ + return relationship.one_to_many( + cls, 'relationship', other_fk='source_node_fk', back_populates='source_node', + rel_kwargs=dict( + order_by='Relationship.source_position', + collection_class=ordering_list('source_position', count_from=0) + ) + ) + + @declared_attr + def inbound_relationships(cls): + """ + Relationships from other nodes. + + :type: [:class:`Relationship`] + """ + return relationship.one_to_many( + cls, 'relationship', other_fk='target_node_fk', back_populates='target_node', + rel_kwargs=dict( + order_by='Relationship.target_position', + collection_class=ordering_list('target_position', count_from=0) + ) + ) + + # endregion + + # region many_to_one relationships + + @declared_attr + def service(cls): + """ + Containing service. + + :type: :class:`Service` + """ + return relationship.many_to_one(cls, 'service') + + @declared_attr + def node_template(cls): + """ + Source node template (can be ``None``). + + :type: :class:`NodeTemplate` + """ + return relationship.many_to_one(cls, 'node_template') + + @declared_attr + def type(cls): + """ + Node type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region association proxies + + @declared_attr + def service_name(cls): + return relationship.association_proxy('service', 'name', type=':obj:`basestring`') + + @declared_attr + def node_template_name(cls): + return relationship.association_proxy('node_template', 'name', type=':obj:`basestring`') + + # endregion + + # region foreign_keys + + @declared_attr + def type_fk(cls): + """For Node many-to-one to Type""" + return relationship.foreign_key('type') + + @declared_attr + def host_fk(cls): + """For Node one-to-one to Node""" + return relationship.foreign_key('node', nullable=True) + + @declared_attr + def service_fk(cls): + """For Service one-to-many to Node""" + return relationship.foreign_key('service') + + @declared_attr + def node_template_fk(cls): + """For Node many-to-one to NodeTemplate""" + return relationship.foreign_key('node_template') + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + state = Column(Enum(*STATES, name='node_state'), nullable=False, default=INITIAL, doc=""" + TOSCA state. + + :type: :obj:`basestring` + """) + + version = Column(Integer, default=1, doc=""" + Used by :mod:`aria.storage.instrumentation`. + + :type: :obj:`int` + """) + + __mapper_args__ = {'version_id_col': version} # Enable SQLAlchemy automatic version counting + + @classmethod + def determine_state(cls, op_name, is_transitional): + """ + :returns the state the node should be in as a result of running the operation on this node. + + E.g. if we are running tosca.interfaces.node.lifecycle.Standard.create, then + the resulting state should either 'creating' (if the task just started) or 'created' + (if the task ended). + + If the operation is not a standard TOSCA lifecycle operation, then we return None. + """ + + state_type = 'transitional' if is_transitional else 'finished' + try: + return cls._OP_TO_STATE[op_name][state_type] + except KeyError: + return None + + def is_available(self): + return self.state not in (self.INITIAL, self.DELETED, self.ERROR) + + def get_outbound_relationship_by_name(self, name): + for the_relationship in self.outbound_relationships: + if the_relationship.name == name: + return the_relationship + return None + + def get_inbound_relationship_by_name(self, name): + for the_relationship in self.inbound_relationships: + if the_relationship.name == name: + return the_relationship + return None + + @property + def host_address(self): + if self.host and self.host.attributes: + attribute = self.host.attributes.get('ip') + if attribute is not None: + return attribute.value + return None + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('type_name', self.type.name), + ('properties', formatting.as_raw_dict(self.properties)), + ('attributes', formatting.as_raw_dict(self.properties)), + ('interfaces', formatting.as_raw_list(self.interfaces)), + ('artifacts', formatting.as_raw_list(self.artifacts)), + ('capabilities', formatting.as_raw_list(self.capabilities)), + ('relationships', formatting.as_raw_list(self.outbound_relationships)))) + + +class GroupBase(InstanceModelMixin): + """ + Typed logical container for zero or more :class:`Node` instances. + + Usually an instance of a :class:`GroupTemplate`. + """ + + __tablename__ = 'group' + + __private_fields__ = ('type_fk', + 'service_fk', + 'group_template_fk') + + # region one_to_many relationships + + @declared_attr + def properties(cls): + """ + Associated immutable parameters. + + :type: {:obj:`basestring`: :class:`Property`} + """ + return relationship.one_to_many(cls, 'property', dict_key='name') + + @declared_attr + def interfaces(cls): + """ + Associated interfaces. + + :type: {:obj:`basestring`: :class:`Interface`} + """ + return relationship.one_to_many(cls, 'interface', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def service(cls): + """ + Containing service. + + :type: :class:`Service` + """ + return relationship.many_to_one(cls, 'service') + + @declared_attr + def group_template(cls): + """ + Source group template (can be ``None``). + + :type: :class:`GroupTemplate` + """ + return relationship.many_to_one(cls, 'group_template') + + @declared_attr + def type(cls): + """ + Group type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region many_to_many relationships + + @declared_attr + def nodes(cls): + """ + Member nodes. + + :type: [:class:`Node`] + """ + return relationship.many_to_many(cls, 'node') + + # endregion + + # region foreign_keys + + @declared_attr + def type_fk(cls): + """For Group many-to-one to Type""" + return relationship.foreign_key('type') + + @declared_attr + def service_fk(cls): + """For Service one-to-many to Group""" + return relationship.foreign_key('service') + + @declared_attr + def group_template_fk(cls): + """For Group many-to-one to GroupTemplate""" + return relationship.foreign_key('group_template', nullable=True) + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('properties', formatting.as_raw_dict(self.properties)), + ('interfaces', formatting.as_raw_list(self.interfaces)))) + + +class PolicyBase(InstanceModelMixin): + """ + Typed set of orchestration hints applied to zero or more :class:`Node` or :class:`Group` + instances. + + Usually an instance of a :class:`PolicyTemplate`. + """ + + __tablename__ = 'policy' + + __private_fields__ = ('type_fk', + 'service_fk', + 'policy_template_fk') + + # region one_to_many relationships + + @declared_attr + def properties(cls): + """ + Associated immutable parameters. + + :type: {:obj:`basestring`: :class:`Property`} + """ + return relationship.one_to_many(cls, 'property', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def service(cls): + """ + Containing service. + + :type: :class:`Service` + """ + return relationship.many_to_one(cls, 'service') + + @declared_attr + def policy_template(cls): + """ + Source policy template (can be ``None``). + + :type: :class:`PolicyTemplate` + """ + return relationship.many_to_one(cls, 'policy_template') + + @declared_attr + def type(cls): + """ + Group type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region many_to_many relationships + + @declared_attr + def nodes(cls): + """ + Policy is enacted on these nodes. + + :type: {:obj:`basestring`: :class:`Node`} + """ + return relationship.many_to_many(cls, 'node') + + @declared_attr + def groups(cls): + """ + Policy is enacted on nodes in these groups. + + :type: {:obj:`basestring`: :class:`Group`} + """ + return relationship.many_to_many(cls, 'group') + + # endregion + + # region foreign_keys + + @declared_attr + def type_fk(cls): + """For Policy many-to-one to Type""" + return relationship.foreign_key('type') + + @declared_attr + def service_fk(cls): + """For Service one-to-many to Policy""" + return relationship.foreign_key('service') + + @declared_attr + def policy_template_fk(cls): + """For Policy many-to-one to PolicyTemplate""" + return relationship.foreign_key('policy_template', nullable=True) + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('type_name', self.type.name), + ('properties', formatting.as_raw_dict(self.properties)))) + + +class SubstitutionBase(InstanceModelMixin): + """ + Exposes the entire service as a single node. + + Usually an instance of a :class:`SubstitutionTemplate`. + """ + + __tablename__ = 'substitution' + + __private_fields__ = ('node_type_fk', + 'substitution_template_fk') + + # region one_to_many relationships + + @declared_attr + def mappings(cls): + """ + Map requirement and capabilities to exposed node. + + :type: {:obj:`basestring`: :class:`SubstitutionMapping`} + """ + return relationship.one_to_many(cls, 'substitution_mapping', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def service(cls): + """ + Containing service. + + :type: :class:`Service` + """ + return relationship.one_to_one(cls, 'service', back_populates=relationship.NO_BACK_POP) + + @declared_attr + def substitution_template(cls): + """ + Source substitution template (can be ``None``). + + :type: :class:`SubstitutionTemplate` + """ + return relationship.many_to_one(cls, 'substitution_template') + + @declared_attr + def node_type(cls): + """ + Exposed node type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region foreign_keys + + @declared_attr + def node_type_fk(cls): + """For Substitution many-to-one to Type""" + return relationship.foreign_key('type') + + @declared_attr + def substitution_template_fk(cls): + """For Substitution many-to-one to SubstitutionTemplate""" + return relationship.foreign_key('substitution_template', nullable=True) + + # endregion + + @property + def as_raw(self): + return collections.OrderedDict(( + ('node_type_name', self.node_type.name), + ('mappings', formatting.as_raw_dict(self.mappings)))) + + +class SubstitutionMappingBase(InstanceModelMixin): + """ + Used by :class:`Substitution` to map a capability or a requirement to the exposed node. + + The :attr:`name` field should match the capability or requirement template name on the exposed + node's type. + + Only one of :attr:`capability` and :attr:`requirement_template` can be set. If the latter is + set, then :attr:`node` must also be set. + + Usually an instance of a :class:`SubstitutionMappingTemplate`. + """ + + __tablename__ = 'substitution_mapping' + + __private_fields__ = ('substitution_fk', + 'node_fk', + 'capability_fk', + 'requirement_template_fk') + + # region one_to_one relationships + + @declared_attr + def capability(cls): + """ + Capability to expose (can be ``None``). + + :type: :class:`Capability` + """ + return relationship.one_to_one(cls, 'capability', back_populates=relationship.NO_BACK_POP) + + @declared_attr + def requirement_template(cls): + """ + Requirement template to expose (can be ``None``). + + :type: :class:`RequirementTemplate` + """ + return relationship.one_to_one(cls, 'requirement_template', + back_populates=relationship.NO_BACK_POP) + + @declared_attr + def node(cls): + """ + Node for which to expose :attr:`requirement_template` (can be ``None``). + + :type: :class:`Node` + """ + return relationship.one_to_one(cls, 'node', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region many_to_one relationships + + @declared_attr + def substitution(cls): + """ + Containing substitution. + + :type: :class:`Substitution` + """ + return relationship.many_to_one(cls, 'substitution', back_populates='mappings') + + # endregion + + # region foreign keys + + @declared_attr + def substitution_fk(cls): + """For Substitution one-to-many to SubstitutionMapping""" + return relationship.foreign_key('substitution') + + @declared_attr + def capability_fk(cls): + """For Substitution one-to-one to Capability""" + return relationship.foreign_key('capability', nullable=True) + + @declared_attr + def node_fk(cls): + """For Substitution one-to-one to Node""" + return relationship.foreign_key('node', nullable=True) + + @declared_attr + def requirement_template_fk(cls): + """For Substitution one-to-one to RequirementTemplate""" + return relationship.foreign_key('requirement_template', nullable=True) + + # endregion + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name),)) + + +class RelationshipBase(InstanceModelMixin): + """ + Optionally-typed edge in the service topology, connecting a :class:`Node` to a + :class:`Capability` of another node. + + Might be an instance of :class:`RelationshipTemplate` and/or :class:`RequirementTemplate`. + """ + + __tablename__ = 'relationship' + + __private_fields__ = ('type_fk', + 'source_node_fk', + 'target_node_fk', + 'target_capability_fk', + 'requirement_template_fk', + 'relationship_template_fk', + 'target_position', + 'source_position') + + # region one_to_one relationships + + @declared_attr + def target_capability(cls): + """ + Target capability. + + :type: :class:`Capability` + """ + return relationship.one_to_one(cls, 'capability', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region one_to_many relationships + + @declared_attr + def tasks(cls): + """ + Associated tasks. + + :type: [:class:`Task`] + """ + return relationship.one_to_many(cls, 'task') + + @declared_attr + def interfaces(cls): + """ + Associated interfaces. + + :type: {:obj:`basestring`: :class:`Interface`} + """ + return relationship.one_to_many(cls, 'interface', dict_key='name') + + @declared_attr + def properties(cls): + """ + Associated immutable parameters. + + :type: {:obj:`basestring`: :class:`Property`} + """ + return relationship.one_to_many(cls, 'property', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def source_node(cls): + """ + Source node. + + :type: :class:`Node` + """ + return relationship.many_to_one( + cls, 'node', fk='source_node_fk', back_populates='outbound_relationships') + + @declared_attr + def target_node(cls): + """ + Target node. + + :type: :class:`Node` + """ + return relationship.many_to_one( + cls, 'node', fk='target_node_fk', back_populates='inbound_relationships') + + @declared_attr + def relationship_template(cls): + """ + Source relationship template (can be ``None``). + + :type: :class:`RelationshipTemplate` + """ + return relationship.many_to_one(cls, 'relationship_template') + + @declared_attr + def requirement_template(cls): + """ + Source requirement template (can be ``None``). + + :type: :class:`RequirementTemplate` + """ + return relationship.many_to_one(cls, 'requirement_template') + + @declared_attr + def type(cls): + """ + Relationship type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region association proxies + + @declared_attr + def source_node_name(cls): + return relationship.association_proxy('source_node', 'name') + + @declared_attr + def target_node_name(cls): + return relationship.association_proxy('target_node', 'name') + + # endregion + + # region foreign keys + + @declared_attr + def type_fk(cls): + """For Relationship many-to-one to Type""" + return relationship.foreign_key('type', nullable=True) + + @declared_attr + def source_node_fk(cls): + """For Node one-to-many to Relationship""" + return relationship.foreign_key('node') + + @declared_attr + def target_node_fk(cls): + """For Node one-to-many to Relationship""" + return relationship.foreign_key('node') + + @declared_attr + def target_capability_fk(cls): + """For Relationship one-to-one to Capability""" + return relationship.foreign_key('capability', nullable=True) + + @declared_attr + def requirement_template_fk(cls): + """For Relationship many-to-one to RequirementTemplate""" + return relationship.foreign_key('requirement_template', nullable=True) + + @declared_attr + def relationship_template_fk(cls): + """For Relationship many-to-one to RelationshipTemplate""" + return relationship.foreign_key('relationship_template', nullable=True) + + # endregion + + source_position = Column(Integer, doc=""" + Position at source. + + :type: :obj:`int` + """) + + target_position = Column(Integer, doc=""" + Position at target. + + :type: :obj:`int` + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('target_node_id', self.target_node.name), + ('type_name', self.type.name + if self.type is not None else None), + ('template_name', self.relationship_template.name + if self.relationship_template is not None else None), + ('properties', formatting.as_raw_dict(self.properties)), + ('interfaces', formatting.as_raw_list(self.interfaces)))) + + +class CapabilityBase(InstanceModelMixin): + """ + Typed attachment serving two purposes: to provide extra properties and attributes to a + :class:`Node`, and to expose targets for :class:`Relationship` instances from other nodes. + + Usually an instance of a :class:`CapabilityTemplate`. + """ + + __tablename__ = 'capability' + + __private_fields__ = ('capability_fk', + 'node_fk', + 'capability_template_fk') + + # region one_to_many relationships + + @declared_attr + def properties(cls): + """ + Associated immutable parameters. + + :type: {:obj:`basestring`: :class:`Property`} + """ + return relationship.one_to_many(cls, 'property', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def node(cls): + """ + Containing node. + + :type: :class:`Node` + """ + return relationship.many_to_one(cls, 'node') + + @declared_attr + def capability_template(cls): + """ + Source capability template (can be ``None``). + + :type: :class:`CapabilityTemplate` + """ + return relationship.many_to_one(cls, 'capability_template') + + @declared_attr + def type(cls): + """ + Capability type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region foreign_keys + + @declared_attr + def type_fk(cls): + """For Capability many-to-one to Type""" + return relationship.foreign_key('type') + + @declared_attr + def node_fk(cls): + """For Node one-to-many to Capability""" + return relationship.foreign_key('node') + + @declared_attr + def capability_template_fk(cls): + """For Capability many-to-one to CapabilityTemplate""" + return relationship.foreign_key('capability_template', nullable=True) + + # endregion + + min_occurrences = Column(Integer, default=None, doc=""" + Minimum number of requirement matches required. + + :type: :obj:`int` + """) + + max_occurrences = Column(Integer, default=None, doc=""" + Maximum number of requirement matches allowed. + + :type: :obj:`int` + """) + + occurrences = Column(Integer, default=0, doc=""" + Number of requirement matches. + + :type: :obj:`int` + """) + + @property + def has_enough_relationships(self): + if self.min_occurrences is not None: + return self.occurrences >= self.min_occurrences + return True + + def relate(self): + if self.max_occurrences is not None: + if self.occurrences == self.max_occurrences: + return False + self.occurrences += 1 + return True + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('type_name', self.type.name), + ('properties', formatting.as_raw_dict(self.properties)))) + + +class InterfaceBase(InstanceModelMixin): + """ + Typed bundle of :class:`Operation` instances. + + Can be associated with a :class:`Node`, a :class:`Group`, or a :class:`Relationship`. + + Usually an instance of a :class:`InterfaceTemplate`. + """ + + __tablename__ = 'interface' + + __private_fields__ = ('type_fk', + 'node_fk', + 'group_fk', + 'relationship_fk', + 'interface_template_fk') + + # region one_to_many relationships + + @declared_attr + def inputs(cls): + """ + Parameters for all operations of the interface. + + :type: {:obj:`basestring`: :class:`Input`} + """ + return relationship.one_to_many(cls, 'input', dict_key='name') + + @declared_attr + def operations(cls): + """ + Associated operations. + + :type: {:obj:`basestring`: :class:`Operation`} + """ + return relationship.one_to_many(cls, 'operation', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def node(cls): + """ + Containing node (can be ``None``). + + :type: :class:`Node` + """ + return relationship.many_to_one(cls, 'node') + + @declared_attr + def group(cls): + """ + Containing group (can be ``None``). + + :type: :class:`Group` + """ + return relationship.many_to_one(cls, 'group') + + @declared_attr + def relationship(cls): + """ + Containing relationship (can be ``None``). + + :type: :class:`Relationship` + """ + return relationship.many_to_one(cls, 'relationship') + + @declared_attr + def interface_template(cls): + """ + Source interface template (can be ``None``). + + :type: :class:`InterfaceTemplate` + """ + return relationship.many_to_one(cls, 'interface_template') + + @declared_attr + def type(cls): + """ + Interface type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region foreign_keys + + @declared_attr + def type_fk(cls): + """For Interface many-to-one to Type""" + return relationship.foreign_key('type') + + @declared_attr + def node_fk(cls): + """For Node one-to-many to Interface""" + return relationship.foreign_key('node', nullable=True) + + @declared_attr + def group_fk(cls): + """For Group one-to-many to Interface""" + return relationship.foreign_key('group', nullable=True) + + @declared_attr + def relationship_fk(cls): + """For Relationship one-to-many to Interface""" + return relationship.foreign_key('relationship', nullable=True) + + @declared_attr + def interface_template_fk(cls): + """For Interface many-to-one to InterfaceTemplate""" + return relationship.foreign_key('interface_template', nullable=True) + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('description', self.description), + ('type_name', self.type.name), + ('inputs', formatting.as_raw_dict(self.inputs)), + ('operations', formatting.as_raw_list(self.operations)))) + + +class OperationBase(InstanceModelMixin): + """ + Entry points to Python functions called as part of a workflow execution. + + The operation signature (its :attr:`name` and its :attr:`inputs`'s names and types) is declared + by the type of the :class:`Interface`, however each operation can provide its own + :attr:`implementation` as well as additional inputs. + + The Python :attr:`function` is usually provided by an associated :class:`Plugin`. Its purpose is + to execute the implementation, providing it with both the operation's and interface's inputs. + The :attr:`arguments` of the function should be set according to the specific signature of the + function. + + Additionally, :attr:`configuration` parameters can be provided as hints to configure the + function's behavior. For example, they can be used to configure remote execution credentials. + + Might be an instance of :class:`OperationTemplate`. + """ + + __tablename__ = 'operation' + + __private_fields__ = ('service_fk', + 'interface_fk', + 'plugin_fk', + 'operation_template_fk') + + # region one_to_one relationships + + @declared_attr + def plugin(cls): + """ + Associated plugin. + + :type: :class:`Plugin` + """ + return relationship.one_to_one(cls, 'plugin', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region one_to_many relationships + + @declared_attr + def inputs(cls): + """ + Parameters provided to the :attr:`implementation`. + + :type: {:obj:`basestring`: :class:`Input`} + """ + return relationship.one_to_many(cls, 'input', dict_key='name') + + @declared_attr + def arguments(cls): + """ + Arguments sent to the Python :attr:`function`. + + :type: {:obj:`basestring`: :class:`Argument`} + """ + return relationship.one_to_many(cls, 'argument', dict_key='name') + + @declared_attr + def configurations(cls): + """ + Configuration parameters for the Python :attr:`function`. + + :type: {:obj:`basestring`: :class:`Configuration`} + """ + return relationship.one_to_many(cls, 'configuration', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def service(cls): + """ + Containing service (can be ``None``). For workflow operations. + + :type: :class:`Service` + """ + return relationship.many_to_one(cls, 'service', back_populates='workflows') + + @declared_attr + def interface(cls): + """ + Containing interface (can be ``None``). + + :type: :class:`Interface` + """ + return relationship.many_to_one(cls, 'interface') + + @declared_attr + def operation_template(cls): + """ + Source operation template (can be ``None``). + + :type: :class:`OperationTemplate` + """ + return relationship.many_to_one(cls, 'operation_template') + + # endregion + + # region foreign_keys + + @declared_attr + def service_fk(cls): + """For Service one-to-many to Operation""" + return relationship.foreign_key('service', nullable=True) + + @declared_attr + def interface_fk(cls): + """For Interface one-to-many to Operation""" + return relationship.foreign_key('interface', nullable=True) + + @declared_attr + def plugin_fk(cls): + """For Operation one-to-one to Plugin""" + return relationship.foreign_key('plugin', nullable=True) + + @declared_attr + def operation_template_fk(cls): + """For Operation many-to-one to OperationTemplate""" + return relationship.foreign_key('operation_template', nullable=True) + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + relationship_edge = Column(Boolean, doc=""" + When ``True`` specifies that the operation is on the relationship's target edge; ``False`` is + the source edge (only used by operations on relationships) + + :type: :obj:`bool` + """) + + implementation = Column(Text, doc=""" + Implementation (usually the name of an artifact). + + :type: :obj:`basestring` + """) + + dependencies = Column(modeling_types.StrictList(item_cls=basestring), doc=""" + Dependencies (usually names of artifacts). + + :type: [:obj:`basestring`] + """) + + function = Column(Text, doc=""" + Full path to Python function. + + :type: :obj:`basestring` + """) + + executor = Column(Text, doc=""" + Name of executor. + + :type: :obj:`basestring` + """) + + max_attempts = Column(Integer, doc=""" + Maximum number of attempts allowed in case of task failure. + + :type: :obj:`int` + """) + + retry_interval = Column(Integer, doc=""" + Interval between task retry attempts (in seconds). + + :type: :obj:`float` + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('description', self.description), + ('implementation', self.implementation), + ('dependencies', self.dependencies), + ('inputs', formatting.as_raw_dict(self.inputs)))) + + +class ArtifactBase(InstanceModelMixin): + """ + Typed file, either provided in a CSAR or downloaded from a repository. + + Usually an instance of :class:`ArtifactTemplate`. + """ + + __tablename__ = 'artifact' + + __private_fields__ = ('type_fk', + 'node_fk', + 'artifact_template_fk') + + # region one_to_many relationships + + @declared_attr + def properties(cls): + """ + Associated immutable parameters. + + :type: {:obj:`basestring`: :class:`Property`} + """ + return relationship.one_to_many(cls, 'property', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def node(cls): + """ + Containing node. + + :type: :class:`Node` + """ + return relationship.many_to_one(cls, 'node') + + @declared_attr + def artifact_template(cls): + """ + Source artifact template (can be ``None``). + + :type: :class:`ArtifactTemplate` + """ + return relationship.many_to_one(cls, 'artifact_template') + + @declared_attr + def type(cls): + """ + Artifact type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region foreign_keys + + @declared_attr + def type_fk(cls): + """For Artifact many-to-one to Type""" + return relationship.foreign_key('type') + + @declared_attr + def node_fk(cls): + """For Node one-to-many to Artifact""" + return relationship.foreign_key('node') + + @declared_attr + def artifact_template_fk(cls): + """For Artifact many-to-one to ArtifactTemplate""" + return relationship.foreign_key('artifact_template', nullable=True) + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + source_path = Column(Text, doc=""" + Source path (in CSAR or repository). + + :type: :obj:`basestring` + """) + + target_path = Column(Text, doc=""" + Path at which to install at destination. + + :type: :obj:`basestring` + """) + + repository_url = Column(Text, doc=""" + Repository URL. + + :type: :obj:`basestring` + """) + + repository_credential = Column(modeling_types.StrictDict(basestring, basestring), doc=""" + Credentials for accessing the repository. + + :type: {:obj:`basestring`, :obj:`basestring`} + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('description', self.description), + ('type_name', self.type.name), + ('source_path', self.source_path), + ('target_path', self.target_path), + ('repository_url', self.repository_url), + ('repository_credential', formatting.as_agnostic(self.repository_credential)), + ('properties', formatting.as_raw_dict(self.properties)))) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_template.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_template.py new file mode 100644 index 0000000..cd0adb4 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/service_template.py @@ -0,0 +1,1758 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +ARIA modeling service template module +""" + +# pylint: disable=too-many-lines, no-self-argument, no-member, abstract-method + +from __future__ import absolute_import # so we can import standard 'types' + +from sqlalchemy import ( + Column, + Text, + Integer, + Boolean, + DateTime, + PickleType +) +from sqlalchemy.ext.declarative import declared_attr + +from ..utils import (collections, formatting) +from .mixins import TemplateModelMixin +from . import ( + relationship, + types as modeling_types +) + + +class ServiceTemplateBase(TemplateModelMixin): + """ + Template for creating :class:`Service` instances. + + Usually created by various DSL parsers, such as ARIA's TOSCA extension. However, it can also be + created programmatically. + """ + + __tablename__ = 'service_template' + + __private_fields__ = ('substitution_template_fk', + 'node_type_fk', + 'group_type_fk', + 'policy_type_fk', + 'relationship_type_fk', + 'capability_type_fk', + 'interface_type_fk', + 'artifact_type_fk') + + # region one_to_one relationships + + @declared_attr + def substitution_template(cls): + """ + Exposes an entire service as a single node. + + :type: :class:`SubstitutionTemplate` + """ + return relationship.one_to_one( + cls, 'substitution_template', back_populates=relationship.NO_BACK_POP) + + @declared_attr + def node_types(cls): + """ + Base for the node type hierarchy, + + :type: :class:`Type` + """ + return relationship.one_to_one( + cls, 'type', fk='node_type_fk', back_populates=relationship.NO_BACK_POP) + + @declared_attr + def group_types(cls): + """ + Base for the group type hierarchy, + + :type: :class:`Type` + """ + return relationship.one_to_one( + cls, 'type', fk='group_type_fk', back_populates=relationship.NO_BACK_POP) + + @declared_attr + def policy_types(cls): + """ + Base for the policy type hierarchy, + + :type: :class:`Type` + """ + return relationship.one_to_one( + cls, 'type', fk='policy_type_fk', back_populates=relationship.NO_BACK_POP) + + @declared_attr + def relationship_types(cls): + """ + Base for the relationship type hierarchy, + + :type: :class:`Type` + """ + return relationship.one_to_one( + cls, 'type', fk='relationship_type_fk', back_populates=relationship.NO_BACK_POP) + + @declared_attr + def capability_types(cls): + """ + Base for the capability type hierarchy, + + :type: :class:`Type` + """ + return relationship.one_to_one( + cls, 'type', fk='capability_type_fk', back_populates=relationship.NO_BACK_POP) + + @declared_attr + def interface_types(cls): + """ + Base for the interface type hierarchy, + + :type: :class:`Type` + """ + return relationship.one_to_one( + cls, 'type', fk='interface_type_fk', back_populates=relationship.NO_BACK_POP) + + @declared_attr + def artifact_types(cls): + """ + Base for the artifact type hierarchy, + + :type: :class:`Type` + """ + return relationship.one_to_one( + cls, 'type', fk='artifact_type_fk', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region one_to_many relationships + + @declared_attr + def services(cls): + """ + Instantiated services. + + :type: [:class:`Service`] + """ + return relationship.one_to_many(cls, 'service', dict_key='name') + + @declared_attr + def node_templates(cls): + """ + Templates for creating nodes. + + :type: {:obj:`basestring`, :class:`NodeTemplate`} + """ + return relationship.one_to_many(cls, 'node_template', dict_key='name') + + @declared_attr + def group_templates(cls): + """ + Templates for creating groups. + + :type: {:obj:`basestring`, :class:`GroupTemplate`} + """ + return relationship.one_to_many(cls, 'group_template', dict_key='name') + + @declared_attr + def policy_templates(cls): + """ + Templates for creating policies. + + :type: {:obj:`basestring`, :class:`PolicyTemplate`} + """ + return relationship.one_to_many(cls, 'policy_template', dict_key='name') + + @declared_attr + def workflow_templates(cls): + """ + Templates for creating workflows. + + :type: {:obj:`basestring`, :class:`OperationTemplate`} + """ + return relationship.one_to_many(cls, 'operation_template', dict_key='name') + + @declared_attr + def outputs(cls): + """ + Declarations for output parameters are filled in after service installation. + + :type: {:obj:`basestring`: :class:`Output`} + """ + return relationship.one_to_many(cls, 'output', dict_key='name') + + @declared_attr + def inputs(cls): + """ + Declarations for externally provided parameters. + + :type: {:obj:`basestring`: :class:`Input`} + """ + return relationship.one_to_many(cls, 'input', dict_key='name') + + @declared_attr + def plugin_specifications(cls): + """ + Required plugins for instantiated services. + + :type: {:obj:`basestring`: :class:`PluginSpecification`} + """ + return relationship.one_to_many(cls, 'plugin_specification', dict_key='name') + + # endregion + + # region many_to_many relationships + + @declared_attr + def meta_data(cls): + """ + Associated metadata. + + :type: {:obj:`basestring`: :class:`Metadata`} + """ + # Warning! We cannot use the attr name "metadata" because it's used by SQLAlchemy! + return relationship.many_to_many(cls, 'metadata', dict_key='name') + + # endregion + + # region foreign keys + + @declared_attr + def substitution_template_fk(cls): + """For ServiceTemplate one-to-one to SubstitutionTemplate""" + return relationship.foreign_key('substitution_template', nullable=True) + + @declared_attr + def node_type_fk(cls): + """For ServiceTemplate one-to-one to Type""" + return relationship.foreign_key('type', nullable=True) + + @declared_attr + def group_type_fk(cls): + """For ServiceTemplate one-to-one to Type""" + return relationship.foreign_key('type', nullable=True) + + @declared_attr + def policy_type_fk(cls): + """For ServiceTemplate one-to-one to Type""" + return relationship.foreign_key('type', nullable=True) + + @declared_attr + def relationship_type_fk(cls): + """For ServiceTemplate one-to-one to Type""" + return relationship.foreign_key('type', nullable=True) + + @declared_attr + def capability_type_fk(cls): + """For ServiceTemplate one-to-one to Type""" + return relationship.foreign_key('type', nullable=True) + + @declared_attr + def interface_type_fk(cls): + """For ServiceTemplate one-to-one to Type""" + return relationship.foreign_key('type', nullable=True) + + @declared_attr + def artifact_type_fk(cls): + """For ServiceTemplate one-to-one to Type""" + return relationship.foreign_key('type', nullable=True) + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + main_file_name = Column(Text, doc=""" + Filename of CSAR or YAML file from which this service template was parsed. + + :type: :obj:`basestring` + """) + + created_at = Column(DateTime, nullable=False, index=True, doc=""" + Creation timestamp. + + :type: :class:`~datetime.datetime` + """) + + updated_at = Column(DateTime, doc=""" + Update timestamp. + + :type: :class:`~datetime.datetime` + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('description', self.description), + ('metadata', formatting.as_raw_dict(self.meta_data)), + ('node_templates', formatting.as_raw_list(self.node_templates)), + ('group_templates', formatting.as_raw_list(self.group_templates)), + ('policy_templates', formatting.as_raw_list(self.policy_templates)), + ('substitution_template', formatting.as_raw(self.substitution_template)), + ('inputs', formatting.as_raw_dict(self.inputs)), + ('outputs', formatting.as_raw_dict(self.outputs)), + ('workflow_templates', formatting.as_raw_list(self.workflow_templates)))) + + @property + def types_as_raw(self): + return collections.OrderedDict(( + ('node_types', formatting.as_raw(self.node_types)), + ('group_types', formatting.as_raw(self.group_types)), + ('policy_types', formatting.as_raw(self.policy_types)), + ('relationship_types', formatting.as_raw(self.relationship_types)), + ('capability_types', formatting.as_raw(self.capability_types)), + ('interface_types', formatting.as_raw(self.interface_types)), + ('artifact_types', formatting.as_raw(self.artifact_types)))) + + +class NodeTemplateBase(TemplateModelMixin): + """ + Template for creating zero or more :class:`Node` instances, which are typed vertices in the + service topology. + """ + + __tablename__ = 'node_template' + + __private_fields__ = ('type_fk', + 'service_template_fk') + + # region one_to_many relationships + + @declared_attr + def nodes(cls): + """ + Instantiated nodes. + + :type: [:class:`Node`] + """ + return relationship.one_to_many(cls, 'node') + + @declared_attr + def interface_templates(cls): + """ + Associated interface templates. + + :type: {:obj:`basestring`: :class:`InterfaceTemplate`} + """ + return relationship.one_to_many(cls, 'interface_template', dict_key='name') + + @declared_attr + def artifact_templates(cls): + """ + Associated artifacts. + + :type: {:obj:`basestring`: :class:`ArtifactTemplate`} + """ + return relationship.one_to_many(cls, 'artifact_template', dict_key='name') + + @declared_attr + def capability_templates(cls): + """ + Associated exposed capability templates. + + :type: {:obj:`basestring`: :class:`CapabilityTemplate`} + """ + return relationship.one_to_many(cls, 'capability_template', dict_key='name') + + @declared_attr + def requirement_templates(cls): + """ + Associated potential relationships with other nodes. + + :type: [:class:`RequirementTemplate`] + """ + return relationship.one_to_many(cls, 'requirement_template', other_fk='node_template_fk') + + @declared_attr + def properties(cls): + """ + Declarations for associated immutable parameters. + + :type: {:obj:`basestring`: :class:`Property`} + """ + return relationship.one_to_many(cls, 'property', dict_key='name') + + @declared_attr + def attributes(cls): + """ + Declarations for associated mutable parameters. + + :type: {:obj:`basestring`: :class:`Attribute`} + """ + return relationship.one_to_many(cls, 'attribute', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def type(cls): + """ + Node type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + @declared_attr + def service_template(cls): + """ + Containing service template. + + :type: :class:`ServiceTemplate` + """ + return relationship.many_to_one(cls, 'service_template') + + # endregion + + # region association proxies + + @declared_attr + def service_template_name(cls): + return relationship.association_proxy('service_template', 'name') + + @declared_attr + def type_name(cls): + return relationship.association_proxy('type', 'name') + + # endregion + + # region foreign_keys + + @declared_attr + def type_fk(cls): + """For NodeTemplate many-to-one to Type""" + return relationship.foreign_key('type') + + @declared_attr + def service_template_fk(cls): + """For ServiceTemplate one-to-many to NodeTemplate""" + return relationship.foreign_key('service_template') + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + directives = Column(PickleType, doc=""" + Directives that apply to this node template. + + :type: [:obj:`basestring`] + """) + + default_instances = Column(Integer, default=1, doc=""" + Default number nodes that will appear in the service. + + :type: :obj:`int` + """) + + min_instances = Column(Integer, default=0, doc=""" + Minimum number nodes that will appear in the service. + + :type: :obj:`int` + """) + + max_instances = Column(Integer, default=None, doc=""" + Maximum number nodes that will appear in the service. + + :type: :obj:`int` + """) + + target_node_template_constraints = Column(PickleType, doc=""" + Constraints for filtering relationship targets. + + :type: [:class:`NodeTemplateConstraint`] + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('description', self.description), + ('type_name', self.type.name), + ('properties', formatting.as_raw_dict(self.properties)), + ('attributes', formatting.as_raw_dict(self.properties)), + ('interface_templates', formatting.as_raw_list(self.interface_templates)), + ('artifact_templates', formatting.as_raw_list(self.artifact_templates)), + ('capability_templates', formatting.as_raw_list(self.capability_templates)), + ('requirement_templates', formatting.as_raw_list(self.requirement_templates)))) + + def is_target_node_template_valid(self, target_node_template): + """ + Checks if ``target_node_template`` matches all our ``target_node_template_constraints``. + """ + + if self.target_node_template_constraints: + for node_template_constraint in self.target_node_template_constraints: + if not node_template_constraint.matches(self, target_node_template): + return False + return True + + @property + def _next_index(self): + """ + Next available node index. + + :returns: node index + :rtype: int + """ + + max_index = 0 + if self.nodes: + max_index = max(int(n.name.rsplit('_', 1)[-1]) for n in self.nodes) + return max_index + 1 + + @property + def _next_name(self): + """ + Next available node name. + + :returns: node name + :rtype: basestring + """ + + return '{name}_{index}'.format(name=self.name, index=self._next_index) + + @property + def scaling(self): + scaling = {} + + def extract_property(properties, name): + if name in scaling: + return + prop = properties.get(name) + if (prop is not None) and (prop.type_name == 'integer') and (prop.value is not None): + scaling[name] = prop.value + + def extract_properties(properties): + extract_property(properties, 'min_instances') + extract_property(properties, 'max_instances') + extract_property(properties, 'default_instances') + + # From our scaling capabilities + for capability_template in self.capability_templates.itervalues(): + if capability_template.type.role == 'scaling': + extract_properties(capability_template.properties) + + # From service scaling policies + for policy_template in self.service_template.policy_templates.itervalues(): + if policy_template.type.role == 'scaling': + if policy_template.is_for_node_template(self.name): + extract_properties(policy_template.properties) + + # Defaults + scaling.setdefault('min_instances', 0) + scaling.setdefault('max_instances', 1) + scaling.setdefault('default_instances', 1) + + return scaling + + +class GroupTemplateBase(TemplateModelMixin): + """ + Template for creating a :class:`Group` instance, which is a typed logical container for zero or + more :class:`Node` instances. + """ + + __tablename__ = 'group_template' + + __private_fields__ = ('type_fk', + 'service_template_fk') + + # region one_to_many relationships + + @declared_attr + def groups(cls): + """ + Instantiated groups. + + :type: [:class:`Group`] + """ + return relationship.one_to_many(cls, 'group') + + @declared_attr + def interface_templates(cls): + """ + Associated interface templates. + + :type: {:obj:`basestring`: :class:`InterfaceTemplate`} + """ + return relationship.one_to_many(cls, 'interface_template', dict_key='name') + + @declared_attr + def properties(cls): + """ + Declarations for associated immutable parameters. + + :type: {:obj:`basestring`: :class:`Property`} + """ + return relationship.one_to_many(cls, 'property', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def service_template(cls): + """ + Containing service template. + + :type: :class:`ServiceTemplate` + """ + return relationship.many_to_one(cls, 'service_template') + + @declared_attr + def type(cls): + """ + Group type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region many_to_many relationships + + @declared_attr + def node_templates(cls): + """ + Nodes instantiated by these templates will be members of the group. + + :type: [:class:`NodeTemplate`] + """ + return relationship.many_to_many(cls, 'node_template') + + # endregion + + # region foreign keys + + @declared_attr + def type_fk(cls): + """For GroupTemplate many-to-one to Type""" + return relationship.foreign_key('type') + + @declared_attr + def service_template_fk(cls): + """For ServiceTemplate one-to-many to GroupTemplate""" + return relationship.foreign_key('service_template') + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('description', self.description), + ('type_name', self.type.name), + ('properties', formatting.as_raw_dict(self.properties)), + ('interface_templates', formatting.as_raw_list(self.interface_templates)))) + + def contains_node_template(self, name): + for node_template in self.node_templates: + if node_template.name == name: + return True + return False + + +class PolicyTemplateBase(TemplateModelMixin): + """ + Template for creating a :class:`Policy` instance, which is a typed set of orchestration hints + applied to zero or more :class:`Node` or :class:`Group` instances. + """ + + __tablename__ = 'policy_template' + + __private_fields__ = ('type_fk', + 'service_template_fk') + + # region one_to_many relationships + + @declared_attr + def policies(cls): + """ + Instantiated policies. + + :type: [:class:`Policy`] + """ + return relationship.one_to_many(cls, 'policy') + + @declared_attr + def properties(cls): + """ + Declarations for associated immutable parameters. + + :type: {:obj:`basestring`: :class:`Property`} + """ + return relationship.one_to_many(cls, 'property', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def service_template(cls): + """ + Containing service template. + + :type: :class:`ServiceTemplate` + """ + return relationship.many_to_one(cls, 'service_template') + + @declared_attr + def type(cls): + """ + Policy type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region many_to_many relationships + + @declared_attr + def node_templates(cls): + """ + Policy will be enacted on all nodes instantiated by these templates. + + :type: {:obj:`basestring`: :class:`NodeTemplate`} + """ + return relationship.many_to_many(cls, 'node_template') + + @declared_attr + def group_templates(cls): + """ + Policy will be enacted on all nodes in all groups instantiated by these templates. + + :type: {:obj:`basestring`: :class:`GroupTemplate`} + """ + return relationship.many_to_many(cls, 'group_template') + + # endregion + + # region foreign keys + + @declared_attr + def type_fk(cls): + """For PolicyTemplate many-to-one to Type""" + return relationship.foreign_key('type') + + @declared_attr + def service_template_fk(cls): + """For ServiceTemplate one-to-many to PolicyTemplate""" + return relationship.foreign_key('service_template') + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('description', self.description), + ('type_name', self.type.name), + ('properties', formatting.as_raw_dict(self.properties)))) + + def is_for_node_template(self, name): + for node_template in self.node_templates: + if node_template.name == name: + return True + for group_template in self.group_templates: + if group_template.contains_node_template(name): + return True + return False + + def is_for_group_template(self, name): + for group_template in self.group_templates: + if group_template.name == name: + return True + return False + + +class SubstitutionTemplateBase(TemplateModelMixin): + """ + Template for creating a :class:`Substitution` instance, which exposes an entire instantiated + service as a single node. + """ + + __tablename__ = 'substitution_template' + + __private_fields__ = ('node_type_fk',) + + # region one_to_many relationships + + @declared_attr + def substitutions(cls): + """ + Instantiated substitutions. + + :type: [:class:`Substitution`] + """ + return relationship.one_to_many(cls, 'substitution') + + @declared_attr + def mappings(cls): + """ + Map requirement and capabilities to exposed node. + + :type: {:obj:`basestring`: :class:`SubstitutionTemplateMapping`} + """ + return relationship.one_to_many(cls, 'substitution_template_mapping', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def node_type(cls): + """ + Exposed node type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region foreign keys + + @declared_attr + def node_type_fk(cls): + """For SubstitutionTemplate many-to-one to Type""" + return relationship.foreign_key('type') + + # endregion + + @property + def as_raw(self): + return collections.OrderedDict(( + ('node_type_name', self.node_type.name), + ('mappings', formatting.as_raw_dict(self.mappings)))) + + +class SubstitutionTemplateMappingBase(TemplateModelMixin): + """ + Used by :class:`SubstitutionTemplate` to map a capability template or a requirement template to + the exposed node. + + The :attr:`name` field should match the capability or requirement name on the exposed node's + type. + + Only one of :attr:`capability_template` and :attr:`requirement_template` can be set. + """ + + __tablename__ = 'substitution_template_mapping' + + __private_fields__ = ('substitution_template_fk', + 'capability_template_fk', + 'requirement_template_fk') + + # region one_to_one relationships + + @declared_attr + def capability_template(cls): + """ + Capability template to expose (can be ``None``). + + :type: :class:`CapabilityTemplate` + """ + return relationship.one_to_one( + cls, 'capability_template', back_populates=relationship.NO_BACK_POP) + + @declared_attr + def requirement_template(cls): + """ + Requirement template to expose (can be ``None``). + + :type: :class:`RequirementTemplate` + """ + return relationship.one_to_one( + cls, 'requirement_template', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region many_to_one relationships + + @declared_attr + def substitution_template(cls): + """ + Containing substitution template. + + :type: :class:`SubstitutionTemplate` + """ + return relationship.many_to_one(cls, 'substitution_template', back_populates='mappings') + + # endregion + + # region foreign keys + + @declared_attr + def substitution_template_fk(cls): + """For SubstitutionTemplate one-to-many to SubstitutionTemplateMapping""" + return relationship.foreign_key('substitution_template') + + @declared_attr + def capability_template_fk(cls): + """For SubstitutionTemplate one-to-one to CapabilityTemplate""" + return relationship.foreign_key('capability_template', nullable=True) + + @declared_attr + def requirement_template_fk(cls): + """For SubstitutionTemplate one-to-one to RequirementTemplate""" + return relationship.foreign_key('requirement_template', nullable=True) + + # endregion + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name),)) + + +class RequirementTemplateBase(TemplateModelMixin): + """ + Template for creating :class:`Relationship` instances, which are optionally-typed edges in the + service topology, connecting a :class:`Node` to a :class:`Capability` of another node. + + Note that there is no equivalent "Requirement" instance model. Instead, during instantiation a + requirement template is matched with a capability and a :class:`Relationship` is instantiated. + + A requirement template *must* target a :class:`CapabilityType` or a capability name. It can + optionally target a specific :class:`NodeType` or :class:`NodeTemplate`. + + Requirement templates may optionally contain a :class:`RelationshipTemplate`. If they do not, + a :class:`Relationship` will be instantiated with default values. + """ + + __tablename__ = 'requirement_template' + + __private_fields__ = ('target_capability_type_fk', + 'target_node_template_fk', + 'target_node_type_fk', + 'relationship_template_fk', + 'node_template_fk') + + # region one_to_one relationships + + @declared_attr + def target_capability_type(cls): + """ + Target capability type. + + :type: :class:`CapabilityType` + """ + return relationship.one_to_one(cls, + 'type', + fk='target_capability_type_fk', + back_populates=relationship.NO_BACK_POP) + + @declared_attr + def target_node_template(cls): + """ + Target node template (can be ``None``). + + :type: :class:`NodeTemplate` + """ + return relationship.one_to_one(cls, + 'node_template', + fk='target_node_template_fk', + back_populates=relationship.NO_BACK_POP) + + @declared_attr + def relationship_template(cls): + """ + Associated relationship template (can be ``None``). + + :type: :class:`RelationshipTemplate` + """ + return relationship.one_to_one(cls, 'relationship_template') + + # endregion + + # region one_to_many relationships + + @declared_attr + def relationships(cls): + """ + Instantiated relationships. + + :type: [:class:`Relationship`] + """ + return relationship.one_to_many(cls, 'relationship') + + # endregion + + # region many_to_one relationships + + @declared_attr + def node_template(cls): + """ + Containing node template. + + :type: :class:`NodeTemplate` + """ + return relationship.many_to_one(cls, 'node_template', fk='node_template_fk') + + @declared_attr + def target_node_type(cls): + """ + Target node type (can be ``None``). + + :type: :class:`Type` + """ + return relationship.many_to_one( + cls, 'type', fk='target_node_type_fk', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region foreign keys + + @declared_attr + def target_node_type_fk(cls): + """For RequirementTemplate many-to-one to Type""" + return relationship.foreign_key('type', nullable=True) + + @declared_attr + def target_node_template_fk(cls): + """For RequirementTemplate one-to-one to NodeTemplate""" + return relationship.foreign_key('node_template', nullable=True) + + @declared_attr + def target_capability_type_fk(cls): + """For RequirementTemplate one-to-one to Type""" + return relationship.foreign_key('type', nullable=True) + + @declared_attr + def node_template_fk(cls): + """For NodeTemplate one-to-many to RequirementTemplate""" + return relationship.foreign_key('node_template') + + @declared_attr + def relationship_template_fk(cls): + """For RequirementTemplate one-to-one to RelationshipTemplate""" + return relationship.foreign_key('relationship_template', nullable=True) + + # endregion + + target_capability_name = Column(Text, doc=""" + Target capability name in node template or node type (can be ``None``). + + :type: :obj:`basestring` + """) + + target_node_template_constraints = Column(PickleType, doc=""" + Constraints for filtering relationship targets. + + :type: [:class:`NodeTemplateConstraint`] + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('target_node_type_name', self.target_node_type.name + if self.target_node_type is not None else None), + ('target_node_template_name', self.target_node_template.name + if self.target_node_template is not None else None), + ('target_capability_type_name', self.target_capability_type.name + if self.target_capability_type is not None else None), + ('target_capability_name', self.target_capability_name), + ('relationship_template', formatting.as_raw(self.relationship_template)))) + + +class RelationshipTemplateBase(TemplateModelMixin): + """ + Optional addition to a :class:`RequirementTemplate`. + + Note that a relationship template here is not exactly equivalent to a relationship template + entity in TOSCA. For example, a TOSCA requirement specifying a relationship type rather than a + relationship template would still be represented here as a relationship template. + """ + + __tablename__ = 'relationship_template' + + __private_fields__ = ('type_fk',) + + # region one_to_many relationships + + @declared_attr + def relationships(cls): + """ + Instantiated relationships. + + :type: [:class:`Relationship`] + """ + return relationship.one_to_many(cls, 'relationship') + + @declared_attr + def interface_templates(cls): + """ + Associated interface templates. + + :type: {:obj:`basestring`: :class:`InterfaceTemplate`} + """ + return relationship.one_to_many(cls, 'interface_template', dict_key='name') + + @declared_attr + def properties(cls): + """ + Declarations for associated immutable parameters. + + :type: {:obj:`basestring`: :class:`Property`} + """ + return relationship.one_to_many(cls, 'property', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def type(cls): + """ + Relationship type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region foreign keys + + @declared_attr + def type_fk(cls): + """For RelationshipTemplate many-to-one to Type""" + return relationship.foreign_key('type', nullable=True) + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('type_name', self.type.name if self.type is not None else None), + ('name', self.name), + ('description', self.description), + ('properties', formatting.as_raw_dict(self.properties)), + ('interface_templates', formatting.as_raw_list(self.interface_templates)))) + + +class CapabilityTemplateBase(TemplateModelMixin): + """ + Template for creating :class:`Capability` instances, typed attachments which serve two purposes: + to provide extra properties and attributes to :class:`Node` instances, and to expose targets for + :class:`Relationship` instances from other nodes. + """ + + __tablename__ = 'capability_template' + + __private_fields__ = ('type_fk', + 'node_template_fk') + + # region one_to_many relationships + + @declared_attr + def capabilities(cls): + """ + Instantiated capabilities. + + :type: [:class:`Capability`] + """ + return relationship.one_to_many(cls, 'capability') + + @declared_attr + def properties(cls): + """ + Declarations for associated immutable parameters. + + :type: {:obj:`basestring`: :class:`Property`} + """ + return relationship.one_to_many(cls, 'property', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def node_template(cls): + """ + Containing node template. + + :type: :class:`NodeTemplate` + """ + return relationship.many_to_one(cls, 'node_template') + + @declared_attr + def type(cls): + """ + Capability type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region many_to_many relationships + + @declared_attr + def valid_source_node_types(cls): + """ + Reject requirements that are not from these node types. + + :type: [:class:`Type`] + """ + return relationship.many_to_many(cls, 'type', prefix='valid_sources') + + # endregion + + # region foreign keys + + @declared_attr + def type_fk(cls): + """For CapabilityTemplate many-to-one to Type""" + return relationship.foreign_key('type') + + @declared_attr + def node_template_fk(cls): + """For NodeTemplate one-to-many to CapabilityTemplate""" + return relationship.foreign_key('node_template') + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + min_occurrences = Column(Integer, default=None, doc=""" + Minimum number of requirement matches required. + + :type: :obj:`int` + """) + + max_occurrences = Column(Integer, default=None, doc=""" + Maximum number of requirement matches allowed. + + :type: :obj:`int` + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('description', self.description), + ('type_name', self.type.name), + ('min_occurrences', self.min_occurrences), + ('max_occurrences', self.max_occurrences), + ('valid_source_node_types', [v.name for v in self.valid_source_node_types]), + ('properties', formatting.as_raw_dict(self.properties)))) + + +class InterfaceTemplateBase(TemplateModelMixin): + """ + Template for creating :class:`Interface` instances, which are typed bundles of + :class:`Operation` instances. + + Can be associated with a :class:`NodeTemplate`, a :class:`GroupTemplate`, or a + :class:`RelationshipTemplate`. + """ + + __tablename__ = 'interface_template' + + __private_fields__ = ('type_fk', + 'node_template_fk', + 'group_template_fk', + 'relationship_template_fk') + + # region one_to_many relationships + + @declared_attr + def inputs(cls): + """ + Declarations for externally provided parameters that can be used by all operations of the + interface. + + :type: {:obj:`basestring`: :class:`Input`} + """ + return relationship.one_to_many(cls, 'input', dict_key='name') + + @declared_attr + def interfaces(cls): + """ + Instantiated interfaces. + + :type: [:class:`Interface`] + """ + return relationship.one_to_many(cls, 'interface') + + @declared_attr + def operation_templates(cls): + """ + Associated operation templates. + + :type: {:obj:`basestring`: :class:`OperationTemplate`} + """ + return relationship.one_to_many(cls, 'operation_template', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def node_template(cls): + """ + Containing node template (can be ``None``). + + :type: :class:`NodeTemplate` + """ + return relationship.many_to_one(cls, 'node_template') + + @declared_attr + def group_template(cls): + """ + Containing group template (can be ``None``). + + :type: :class:`GroupTemplate` + """ + return relationship.many_to_one(cls, 'group_template') + + @declared_attr + def relationship_template(cls): + """ + Containing relationship template (can be ``None``). + + :type: :class:`RelationshipTemplate` + """ + return relationship.many_to_one(cls, 'relationship_template') + + @declared_attr + def type(cls): + """ + Interface type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region foreign keys + + @declared_attr + def type_fk(cls): + """For InterfaceTemplate many-to-one to Type""" + return relationship.foreign_key('type') + + @declared_attr + def node_template_fk(cls): + """For NodeTemplate one-to-many to InterfaceTemplate""" + return relationship.foreign_key('node_template', nullable=True) + + @declared_attr + def group_template_fk(cls): + """For GroupTemplate one-to-many to InterfaceTemplate""" + return relationship.foreign_key('group_template', nullable=True) + + @declared_attr + def relationship_template_fk(cls): + """For RelationshipTemplate one-to-many to InterfaceTemplate""" + return relationship.foreign_key('relationship_template', nullable=True) + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('description', self.description), + ('type_name', self.type.name), + ('inputs', formatting.as_raw_dict(self.inputs)), # pylint: disable=no-member + # TODO fix self.properties reference + ('operation_templates', formatting.as_raw_list(self.operation_templates)))) + + +class OperationTemplateBase(TemplateModelMixin): + """ + Template for creating :class:`Operation` instances, which are entry points to Python functions + called as part of a workflow execution. + """ + + __tablename__ = 'operation_template' + + __private_fields__ = ('service_template_fk', + 'interface_template_fk', + 'plugin_fk') + + # region one_to_one relationships + + @declared_attr + def plugin_specification(cls): + """ + Associated plugin specification. + + :type: :class:`PluginSpecification` + """ + return relationship.one_to_one( + cls, 'plugin_specification', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region one_to_many relationships + + @declared_attr + def operations(cls): + """ + Instantiated operations. + + :type: [:class:`Operation`] + """ + return relationship.one_to_many(cls, 'operation') + + @declared_attr + def inputs(cls): + """ + Declarations for parameters provided to the :attr:`implementation`. + + :type: {:obj:`basestring`: :class:`Input`} + """ + return relationship.one_to_many(cls, 'input', dict_key='name') + + @declared_attr + def configurations(cls): + """ + Configuration parameters for the operation instance Python :attr:`function`. + + :type: {:obj:`basestring`: :class:`Configuration`} + """ + return relationship.one_to_many(cls, 'configuration', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def service_template(cls): + """ + Containing service template (can be ``None``). For workflow operation templates. + + :type: :class:`ServiceTemplate` + """ + return relationship.many_to_one(cls, 'service_template', + back_populates='workflow_templates') + + @declared_attr + def interface_template(cls): + """ + Containing interface template (can be ``None``). + + :type: :class:`InterfaceTemplate` + """ + return relationship.many_to_one(cls, 'interface_template') + + # endregion + + # region foreign keys + + @declared_attr + def service_template_fk(cls): + """For ServiceTemplate one-to-many to OperationTemplate""" + return relationship.foreign_key('service_template', nullable=True) + + @declared_attr + def interface_template_fk(cls): + """For InterfaceTemplate one-to-many to OperationTemplate""" + return relationship.foreign_key('interface_template', nullable=True) + + @declared_attr + def plugin_specification_fk(cls): + """For OperationTemplate one-to-one to PluginSpecification""" + return relationship.foreign_key('plugin_specification', nullable=True) + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + relationship_edge = Column(Boolean, doc=""" + When ``True`` specifies that the operation is on the relationship's target edge; ``False`` is + the source edge (only used by operations on relationships) + + :type: :obj:`bool` + """) + + implementation = Column(Text, doc=""" + Implementation (usually the name of an artifact). + + :type: :obj:`basestring` + """) + + dependencies = Column(modeling_types.StrictList(item_cls=basestring), doc=""" + Dependencies (usually names of artifacts). + + :type: [:obj:`basestring`] + """) + + function = Column(Text, doc=""" + Full path to Python function. + + :type: :obj:`basestring` + """) + + executor = Column(Text, doc=""" + Name of executor. + + :type: :obj:`basestring` + """) + + max_attempts = Column(Integer, doc=""" + Maximum number of attempts allowed in case of task failure. + + :type: :obj:`int` + """) + + retry_interval = Column(Integer, doc=""" + Interval between task retry attemps (in seconds). + + :type: :obj:`float` + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('description', self.description), + ('implementation', self.implementation), + ('dependencies', self.dependencies), + ('inputs', formatting.as_raw_dict(self.inputs)))) + + +class ArtifactTemplateBase(TemplateModelMixin): + """ + Template for creating an :class:`Artifact` instance, which is a typed file, either provided in a + CSAR or downloaded from a repository. + """ + + __tablename__ = 'artifact_template' + + __private_fields__ = ('type_fk', + 'node_template_fk') + + # region one_to_many relationships + + @declared_attr + def artifacts(cls): + """ + Instantiated artifacts. + + :type: [:class:`Artifact`] + """ + return relationship.one_to_many(cls, 'artifact') + + @declared_attr + def properties(cls): + """ + Declarations for associated immutable parameters. + + :type: {:obj:`basestring`: :class:`Property`} + """ + return relationship.one_to_many(cls, 'property', dict_key='name') + + # endregion + + # region many_to_one relationships + + @declared_attr + def node_template(cls): + """ + Containing node template. + + :type: :class:`NodeTemplate` + """ + return relationship.many_to_one(cls, 'node_template') + + @declared_attr + def type(cls): + """ + Artifact type. + + :type: :class:`Type` + """ + return relationship.many_to_one(cls, 'type', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region foreign keys + + @declared_attr + def type_fk(cls): + """For ArtifactTemplate many-to-one to Type""" + return relationship.foreign_key('type') + + @declared_attr + def node_template_fk(cls): + """For NodeTemplate one-to-many to ArtifactTemplate""" + return relationship.foreign_key('node_template') + + # endregion + + description = Column(Text, doc=""" + Human-readable description. + + :type: :obj:`basestring` + """) + + source_path = Column(Text, doc=""" + Source path (in CSAR or repository). + + :type: :obj:`basestring` + """) + + target_path = Column(Text, doc=""" + Path at which to install at destination. + + :type: :obj:`basestring` + """) + + repository_url = Column(Text, doc=""" + Repository URL. + + :type: :obj:`basestring` + """) + + repository_credential = Column(modeling_types.StrictDict(basestring, basestring), doc=""" + Credentials for accessing the repository. + + :type: {:obj:`basestring`, :obj:`basestring`} + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('description', self.description), + ('type_name', self.type.name), + ('source_path', self.source_path), + ('target_path', self.target_path), + ('repository_url', self.repository_url), + ('repository_credential', formatting.as_agnostic(self.repository_credential)), + ('properties', formatting.as_raw_dict(self.properties)))) + + +class PluginSpecificationBase(TemplateModelMixin): + """ + Requirement for a :class:`Plugin`. + + The actual plugin to be selected depends on those currently installed in ARIA. + """ + + __tablename__ = 'plugin_specification' + + __private_fields__ = ('service_template_fk', + 'plugin_fk') + + # region many_to_one relationships + + @declared_attr + def service_template(cls): + """ + Containing service template. + + :type: :class:`ServiceTemplate` + """ + return relationship.many_to_one(cls, 'service_template') + + @declared_attr + def plugin(cls): # pylint: disable=method-hidden + """ + Matched plugin. + + :type: :class:`Plugin` + """ + return relationship.many_to_one(cls, 'plugin', back_populates=relationship.NO_BACK_POP) + + # endregion + + # region foreign keys + + @declared_attr + def service_template_fk(cls): + """For ServiceTemplate one-to-many to PluginSpecification""" + return relationship.foreign_key('service_template', nullable=True) + + @declared_attr + def plugin_fk(cls): + """For PluginSpecification many-to-one to Plugin""" + return relationship.foreign_key('plugin', nullable=True) + + # endregion + + version = Column(Text, doc=""" + Minimum plugin version. + + :type: :obj:`basestring` + """) + + enabled = Column(Boolean, nullable=False, default=True, doc=""" + Whether the plugin is enabled. + + :type: :obj:`bool` + """) + + @property + def as_raw(self): + return collections.OrderedDict(( + ('name', self.name), + ('version', self.version), + ('enabled', self.enabled))) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/types.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/types.py new file mode 100644 index 0000000..38240fa --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/types.py @@ -0,0 +1,318 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Allows JSON-serializable collections to be used as SQLAlchemy column types. +""" + +import json +from collections import namedtuple + +from sqlalchemy import ( + TypeDecorator, + VARCHAR, + event +) +from sqlalchemy.ext import mutable +from ruamel import yaml + +from . import exceptions + + +class _MutableType(TypeDecorator): + """ + Dict representation of type. + """ + @property + def python_type(self): + raise NotImplementedError + + def process_literal_param(self, value, dialect): + pass + + impl = VARCHAR + + def process_bind_param(self, value, dialect): + if value is not None: + value = json.dumps(value) + return value + + def process_result_value(self, value, dialect): + if value is not None: + value = json.loads(value) + return value + + +class Dict(_MutableType): + """ + JSON-serializable dict type for SQLAlchemy columns. + """ + @property + def python_type(self): + return dict + + +class List(_MutableType): + """ + JSON-serializable list type for SQLAlchemy columns. + """ + @property + def python_type(self): + return list + + +class _StrictDictMixin(object): + + @classmethod + def coerce(cls, key, value): + """ + Convert plain dictionaries to MutableDict. + """ + try: + if not isinstance(value, cls): + if isinstance(value, dict): + for k, v in value.items(): + cls._assert_strict_key(k) + cls._assert_strict_value(v) + return cls(value) + return mutable.MutableDict.coerce(key, value) + else: + return value + except ValueError as e: + raise exceptions.ValueFormatException('could not coerce to MutableDict', cause=e) + + def __setitem__(self, key, value): + self._assert_strict_key(key) + self._assert_strict_value(value) + super(_StrictDictMixin, self).__setitem__(key, value) + + def setdefault(self, key, value): + self._assert_strict_key(key) + self._assert_strict_value(value) + super(_StrictDictMixin, self).setdefault(key, value) + + def update(self, *args, **kwargs): + for k, v in kwargs.items(): + self._assert_strict_key(k) + self._assert_strict_value(v) + super(_StrictDictMixin, self).update(*args, **kwargs) + + @classmethod + def _assert_strict_key(cls, key): + if cls._key_cls is not None and not isinstance(key, cls._key_cls): + raise exceptions.ValueFormatException('key type was set strictly to {0}, but was {1}' + .format(cls._key_cls, type(key))) + + @classmethod + def _assert_strict_value(cls, value): + if cls._value_cls is not None and not isinstance(value, cls._value_cls): + raise exceptions.ValueFormatException('value type was set strictly to {0}, but was {1}' + .format(cls._value_cls, type(value))) + + +class _MutableDict(mutable.MutableDict): + """ + Enables tracking for dict values. + """ + + @classmethod + def coerce(cls, key, value): + """ + Convert plain dictionaries to MutableDict. + """ + try: + return mutable.MutableDict.coerce(key, value) + except ValueError as e: + raise exceptions.ValueFormatException('could not coerce value', cause=e) + + +class _StrictListMixin(object): + + @classmethod + def coerce(cls, key, value): + "Convert plain dictionaries to MutableDict." + try: + if not isinstance(value, cls): + if isinstance(value, list): + for item in value: + cls._assert_item(item) + return cls(value) + return mutable.MutableList.coerce(key, value) + else: + return value + except ValueError as e: + raise exceptions.ValueFormatException('could not coerce to MutableDict', cause=e) + + def __setitem__(self, index, value): + """ + Detect list set events and emit change events. + """ + self._assert_item(value) + super(_StrictListMixin, self).__setitem__(index, value) + + def append(self, item): + self._assert_item(item) + super(_StrictListMixin, self).append(item) + + def extend(self, item): + self._assert_item(item) + super(_StrictListMixin, self).extend(item) + + def insert(self, index, item): + self._assert_item(item) + super(_StrictListMixin, self).insert(index, item) + + @classmethod + def _assert_item(cls, item): + if cls._item_cls is not None and not isinstance(item, cls._item_cls): + raise exceptions.ValueFormatException('key type was set strictly to {0}, but was {1}' + .format(cls._item_cls, type(item))) + + +class _MutableList(mutable.MutableList): + + @classmethod + def coerce(cls, key, value): + """ + Convert plain dictionaries to MutableDict. + """ + try: + return mutable.MutableList.coerce(key, value) + except ValueError as e: + raise exceptions.ValueFormatException('could not coerce to MutableDict', cause=e) + + +_StrictDictID = namedtuple('_StrictDictID', 'key_cls, value_cls') +_StrictValue = namedtuple('_StrictValue', 'type_cls, listener_cls') + +class _StrictDict(object): + """ + This entire class functions as a factory for strict dicts and their listeners. No type class, + and no listener type class is created more than once. If a relevant type class exists it is + returned. + """ + _strict_map = {} + + def __call__(self, key_cls=None, value_cls=None): + strict_dict_map_key = _StrictDictID(key_cls=key_cls, value_cls=value_cls) + if strict_dict_map_key not in self._strict_map: + key_cls_name = getattr(key_cls, '__name__', str(key_cls)) + value_cls_name = getattr(value_cls, '__name__', str(value_cls)) + # Creating the type class itself. this class would be returned (used by the SQLAlchemy + # Column). + strict_dict_cls = type( + 'StrictDict_{0}_{1}'.format(key_cls_name, value_cls_name), + (Dict, ), + {} + ) + # Creating the type listening class. + # The new class inherits from both the _MutableDict class and the _StrictDictMixin, + # while setting the necessary _key_cls and _value_cls as class attributes. + listener_cls = type( + 'StrictMutableDict_{0}_{1}'.format(key_cls_name, value_cls_name), + (_StrictDictMixin, _MutableDict), + {'_key_cls': key_cls, '_value_cls': value_cls} + ) + yaml.representer.RoundTripRepresenter.add_representer( + listener_cls, yaml.representer.RoundTripRepresenter.represent_list) + self._strict_map[strict_dict_map_key] = _StrictValue(type_cls=strict_dict_cls, + listener_cls=listener_cls) + + return self._strict_map[strict_dict_map_key].type_cls + + +StrictDict = _StrictDict() +""" +JSON-serializable strict dict type for SQLAlchemy columns. + +:param key_cls: +:param value_cls: +""" + + +class _StrictList(object): + """ + This entire class functions as a factory for strict lists and their listeners. No type class, + and no listener type class is created more than once. If a relevant type class exists it is + returned. + """ + _strict_map = {} + + def __call__(self, item_cls=None): + + if item_cls not in self._strict_map: + item_cls_name = getattr(item_cls, '__name__', str(item_cls)) + # Creating the type class itself. this class would be returned (used by the SQLAlchemy + # Column). + strict_list_cls = type( + 'StrictList_{0}'.format(item_cls_name), + (List, ), + {} + ) + # Creating the type listening class. + # The new class inherits from both the _MutableList class and the _StrictListMixin, + # while setting the necessary _item_cls as class attribute. + listener_cls = type( + 'StrictMutableList_{0}'.format(item_cls_name), + (_StrictListMixin, _MutableList), + {'_item_cls': item_cls} + ) + yaml.representer.RoundTripRepresenter.add_representer( + listener_cls, yaml.representer.RoundTripRepresenter.represent_list) + self._strict_map[item_cls] = _StrictValue(type_cls=strict_list_cls, + listener_cls=listener_cls) + + return self._strict_map[item_cls].type_cls + + +StrictList = _StrictList() +""" +JSON-serializable strict list type for SQLAlchemy columns. + +:param item_cls: +""" + + +def _mutable_association_listener(mapper, cls): + strict_dict_type_to_listener = \ + dict((v.type_cls, v.listener_cls) for v in _StrictDict._strict_map.itervalues()) + + strict_list_type_to_listener = \ + dict((v.type_cls, v.listener_cls) for v in _StrictList._strict_map.itervalues()) + + for prop in mapper.column_attrs: + column_type = prop.columns[0].type + # Dict Listeners + if type(column_type) in strict_dict_type_to_listener: # pylint: disable=unidiomatic-typecheck + strict_dict_type_to_listener[type(column_type)].associate_with_attribute( + getattr(cls, prop.key)) + elif isinstance(column_type, Dict): + _MutableDict.associate_with_attribute(getattr(cls, prop.key)) + + # List Listeners + if type(column_type) in strict_list_type_to_listener: # pylint: disable=unidiomatic-typecheck + strict_list_type_to_listener[type(column_type)].associate_with_attribute( + getattr(cls, prop.key)) + elif isinstance(column_type, List): + _MutableList.associate_with_attribute(getattr(cls, prop.key)) + + +_LISTENER_ARGS = (mutable.mapper, 'mapper_configured', _mutable_association_listener) + + +def _register_mutable_association_listener(): + event.listen(*_LISTENER_ARGS) + +_register_mutable_association_listener() diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/utils.py b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/utils.py new file mode 100644 index 0000000..491b71a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/modeling/utils.py @@ -0,0 +1,185 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Miscellaneous modeling utilities. +""" + +import os +from json import JSONEncoder +from StringIO import StringIO + +from . import exceptions +from ..utils.type import validate_value_type +from ..utils.collections import OrderedDict +from ..utils.formatting import string_list_as_string + + +class ModelJSONEncoder(JSONEncoder): + """ + JSON encoder that automatically unwraps ``value`` attributes. + """ + def __init__(self, *args, **kwargs): + # Just here to make sure Sphinx doesn't grab the base constructor's docstring + super(ModelJSONEncoder, self).__init__(*args, **kwargs) + + def default(self, o): # pylint: disable=method-hidden + from .mixins import ModelMixin + if isinstance(o, ModelMixin): + if hasattr(o, 'value'): + dict_to_return = o.to_dict(fields=('value',)) + return dict_to_return['value'] + else: + return o.to_dict() + else: + return JSONEncoder.default(self, o) + + +class NodeTemplateContainerHolder(object): + """ + Wrapper that allows using a :class:`~aria.modeling.models.NodeTemplate` model directly as the + ``container_holder`` input for :func:`~aria.modeling.functions.evaluate`. + """ + + def __init__(self, node_template): + self.container = node_template + self.service = None + + @property + def service_template(self): + return self.container.service_template + + +# def validate_no_undeclared_inputs(declared_inputs, supplied_inputs): +# +# undeclared_inputs = [input for input in supplied_inputs if input not in declared_inputs] +# if undeclared_inputs: +# raise exceptions.UndeclaredInputsException( +# 'Undeclared inputs have been provided: {0}; Declared inputs: {1}' +# .format(string_list_as_string(undeclared_inputs), +# string_list_as_string(declared_inputs.keys()))) + + +def validate_required_inputs_are_supplied(declared_inputs, supplied_inputs): + required_inputs = [input for input in declared_inputs.values() if input.required] + missing_required_inputs = [input for input in required_inputs + if input.name not in supplied_inputs and not str(input.value)] + if missing_required_inputs: + raise exceptions.MissingRequiredInputsException( + 'Required inputs {0} have not been provided values' + .format(string_list_as_string(missing_required_inputs))) + + +def merge_parameter_values(provided_values, declared_parameters, model_cls=None): + """ + Merges parameter values according to those declared by a type. + + Exceptions will be raised for validation errors. + + :param provided_values: provided parameter values or None + :type provided_values: {:obj:`basestring`: object} + :param declared_parameters: declared parameters + :type declared_parameters: {:obj:`basestring`: :class:`~aria.modeling.models.Parameter`} + :param model_cls: the model class that should be created from a provided value + :type model_cls: :class:`~aria.modeling.models.Input` or :class:`~aria.modeling.models.Argument` + :return: the merged parameters + :rtype: {:obj:`basestring`: :class:`~aria.modeling.models.Parameter`} + :raises ~aria.modeling.exceptions.UndeclaredInputsException: if a key in + ``parameter_values`` does not exist in ``declared_parameters`` + :raises ~aria.modeling.exceptions.MissingRequiredInputsException: if a key in + ``declared_parameters`` does not exist in ``parameter_values`` and also has no default value + :raises ~aria.modeling.exceptions.ParametersOfWrongTypeException: if a value in + ``parameter_values`` does not match its type in ``declared_parameters`` + """ + + provided_values = provided_values or {} + provided_values_of_wrong_type = OrderedDict() + model_parameters = OrderedDict() + model_cls = model_cls or _get_class_from_sql_relationship(declared_parameters) + + for declared_parameter_name, declared_parameter in declared_parameters.iteritems(): + if declared_parameter_name in provided_values: + # a value has been provided + value = provided_values[declared_parameter_name] + + # Validate type + type_name = declared_parameter.type_name + try: + validate_value_type(value, type_name) + except ValueError: + provided_values_of_wrong_type[declared_parameter_name] = type_name + except RuntimeError: + # TODO This error shouldn't be raised (or caught), but right now we lack support + # for custom data_types, which will raise this error. Skipping their validation. + pass + model_parameters[declared_parameter_name] = model_cls( # pylint: disable=unexpected-keyword-arg + name=declared_parameter_name, + type_name=type_name, + description=declared_parameter.description, + value=value) + else: + # Copy default value from declaration + model_parameters[declared_parameter_name] = model_cls( + value=declared_parameter._value, + name=declared_parameter.name, + type_name=declared_parameter.type_name, + description=declared_parameter.description) + + if provided_values_of_wrong_type: + error_message = StringIO() + for param_name, param_type in provided_values_of_wrong_type.iteritems(): + error_message.write('Parameter "{0}" is not of declared type "{1}"{2}' + .format(param_name, param_type, os.linesep)) + raise exceptions.ParametersOfWrongTypeException(error_message.getvalue()) + + return model_parameters + + +def parameters_as_values(the_dict): + return dict((k, v.value) for k, v in the_dict.iteritems()) + + +def dict_as_arguments(the_dict): + return OrderedDict((name, value.as_argument()) for name, value in the_dict.iteritems()) + + +class classproperty(object): # pylint: disable=invalid-name + def __init__(self, f): + self._func = f + self.__doct__ = f.__doc__ + + def __get__(self, instance, owner): + return self._func(owner) + + +def fix_doc(cls): + """ + Class decorator to use the last base class's docstring and make sure Sphinx doesn't grab the + base constructor's docstring. + """ + original_init = cls.__init__ + def init(*args, **kwargs): + original_init(*args, **kwargs) + + cls.__init__ = init + cls.__doc__ = cls.__bases__[-1].__doc__ + + return cls + + +def _get_class_from_sql_relationship(field): + class_ = field._sa_adapter.owner_state.class_ + prop_name = field._sa_adapter.attr.key + return getattr(class_, prop_name).property.mapper.class_ diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/__init__.py new file mode 100644 index 0000000..24fee9e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/__init__.py @@ -0,0 +1,32 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Orchestrator package. +""" + +from .decorators import ( + workflow, + operation, + WORKFLOW_DECORATOR_RESERVED_ARGUMENTS, + OPERATION_DECORATOR_RESERVED_ARGUMENTS +) + +from . import ( + context, + events, + workflows, + decorators +) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/__init__.py new file mode 100644 index 0000000..a87828d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/__init__.py @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Contexts for workflows and operations. +""" + +from . import workflow, operation +from .toolbelt import toolbelt diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/common.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/common.py new file mode 100644 index 0000000..3c5f618 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/common.py @@ -0,0 +1,217 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 code for contexts. +""" + +import logging +from contextlib import contextmanager +from functools import partial + +import jinja2 + +from aria import ( + logger as aria_logger, + modeling +) +from aria.storage import exceptions + +from ...utils.uuid import generate_uuid + + +class BaseContext(object): + """ + Base class for contexts. + """ + + INSTRUMENTATION_FIELDS = ( + modeling.models.Service.inputs, + modeling.models.ServiceTemplate.inputs, + modeling.models.Policy.properties, + modeling.models.PolicyTemplate.properties, + modeling.models.Node.attributes, + modeling.models.Node.properties, + modeling.models.NodeTemplate.attributes, + modeling.models.NodeTemplate.properties, + modeling.models.Group.properties, + modeling.models.GroupTemplate.properties, + modeling.models.Capability.properties, + # TODO ARIA-279: modeling.models.Capability.attributes, + modeling.models.CapabilityTemplate.properties, + # TODO ARIA-279: modeling.models.CapabilityTemplate.attributes + modeling.models.Relationship.properties, + modeling.models.Artifact.properties, + modeling.models.ArtifactTemplate.properties, + modeling.models.Interface.inputs, + modeling.models.InterfaceTemplate.inputs, + modeling.models.Operation.inputs, + modeling.models.OperationTemplate.inputs + ) + + class PrefixedLogger(object): + def __init__(self, base_logger, task_id=None): + self._logger = base_logger + self._task_id = task_id + + def __getattr__(self, attribute): + if attribute.upper() in logging._levelNames: + return partial(self._logger_with_task_id, _level=attribute) + else: + return getattr(self._logger, attribute) + + def _logger_with_task_id(self, *args, **kwargs): + level = kwargs.pop('_level') + kwargs.setdefault('extra', {})['task_id'] = self._task_id + return getattr(self._logger, level)(*args, **kwargs) + + def __init__(self, + name, + service_id, + model_storage, + resource_storage, + execution_id, + workdir=None, + **kwargs): + super(BaseContext, self).__init__(**kwargs) + self._name = name + self._id = generate_uuid(variant='uuid') + self._model = model_storage + self._resource = resource_storage + self._service_id = service_id + self._workdir = workdir + self._execution_id = execution_id + self.logger = None + + def _register_logger(self, level=None, task_id=None): + self.logger = self.PrefixedLogger( + logging.getLogger(aria_logger.TASK_LOGGER_NAME), task_id=task_id) + self.logger.setLevel(level or logging.DEBUG) + if not self.logger.handlers: + self.logger.addHandler(self._get_sqla_handler()) + + def _get_sqla_handler(self): + return aria_logger.create_sqla_log_handler(model=self._model, + log_cls=modeling.models.Log, + execution_id=self._execution_id) + + def __repr__(self): + return ( + '{name}(name={self.name}, ' + 'deployment_id={self._service_id}, ' + .format(name=self.__class__.__name__, self=self)) + + @contextmanager + def logging_handlers(self, handlers=None): + handlers = handlers or [] + try: + for handler in handlers: + self.logger.addHandler(handler) + yield self.logger + finally: + for handler in handlers: + self.logger.removeHandler(handler) + + @property + def model(self): + """ + Storage model API ("MAPI"). + """ + return self._model + + @property + def resource(self): + """ + Storage resource API ("RAPI"). + """ + return self._resource + + @property + def service_template(self): + """ + Service template model. + """ + return self.service.service_template + + @property + def service(self): + """ + Service instance model. + """ + return self.model.service.get(self._service_id) + + @property + def name(self): + """ + Operation name. + """ + return self._name + + @property + def id(self): + """ + Operation ID. + """ + return self._id + + def download_resource(self, destination, path=None): + """ + Download a service template resource from the storage resource API ("RAPI"). + """ + try: + self.resource.service.download(entry_id=str(self.service.id), + destination=destination, + path=path) + except exceptions.StorageError: + self.resource.service_template.download(entry_id=str(self.service_template.id), + destination=destination, + path=path) + + def download_resource_and_render(self, destination, path=None, variables=None): + """ + Downloads a service template resource from the resource storage and renders its content as a + Jinja template using the provided variables. ``ctx`` is available to the template without + providing it explicitly. + """ + resource_content = self.get_resource(path=path) + resource_content = self._render_resource(resource_content=resource_content, + variables=variables) + with open(destination, 'wb') as f: + f.write(resource_content) + + def get_resource(self, path=None): + """ + Reads a service instance resource as string from the resource storage. + """ + try: + return self.resource.service.read(entry_id=str(self.service.id), path=path) + except exceptions.StorageError: + return self.resource.service_template.read(entry_id=str(self.service_template.id), + path=path) + + def get_resource_and_render(self, path=None, variables=None): + """ + Reads a service instance resource as string from the resource storage and renders it as a + Jinja template using the provided variables. ``ctx`` is available to the template without + providing it explicitly. + """ + resource_content = self.get_resource(path=path) + return self._render_resource(resource_content=resource_content, variables=variables) + + def _render_resource(self, resource_content, variables): + variables = variables or {} + variables.setdefault('ctx', self) + resource_template = jinja2.Template(resource_content) + return resource_template.render(variables) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/exceptions.py new file mode 100644 index 0000000..e46e2b1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/exceptions.py @@ -0,0 +1,27 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Context exceptions. +""" + +from ..exceptions import OrchestratorError + + +class ContextException(OrchestratorError): + """ + Context based exception + """ + pass diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/operation.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/operation.py new file mode 100644 index 0000000..8613ec3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/operation.py @@ -0,0 +1,174 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Operation contexts. +""" + +import threading +from contextlib import contextmanager + +import aria +from aria.utils import file +from . import common + + +class BaseOperationContext(common.BaseContext): + """ + Base class for contexts used during operation creation and execution. + """ + + def __init__(self, task_id, actor_id, **kwargs): + self._task_id = task_id + self._actor_id = actor_id + self._thread_local = threading.local() + self._destroy_session = kwargs.pop('destroy_session', False) + logger_level = kwargs.pop('logger_level', None) + super(BaseOperationContext, self).__init__(**kwargs) + self._register_logger(task_id=self.task.id, level=logger_level) + + def __repr__(self): + details = 'function={task.function}; ' \ + 'operation_arguments={task.arguments}'\ + .format(task=self.task) + return '{name}({0})'.format(details, name=self.name) + + @property + def task(self): + """ + The task in the model storage. + """ + # SQLAlchemy prevents from accessing an object which was created on a different thread. + # So we retrieve the object from the storage if the current thread isn't the same as the + # original thread. + + if not hasattr(self._thread_local, 'task'): + self._thread_local.task = self.model.task.get(self._task_id) + return self._thread_local.task + + @property + def plugin_workdir(self): + """ + A work directory that is unique to the plugin and the service ID. + """ + if self.task.plugin is None: + return None + plugin_workdir = '{0}/plugins/{1}/{2}'.format(self._workdir, + self.service.id, + self.task.plugin.name) + file.makedirs(plugin_workdir) + return plugin_workdir + + @property + def serialization_dict(self): + context_dict = { + 'name': self.name, + 'service_id': self._service_id, + 'task_id': self._task_id, + 'actor_id': self._actor_id, + 'workdir': self._workdir, + 'model_storage': self.model.serialization_dict if self.model else None, + 'resource_storage': self.resource.serialization_dict if self.resource else None, + 'execution_id': self._execution_id, + 'logger_level': self.logger.level + } + return { + 'context_cls': self.__class__, + 'context': context_dict + } + + @classmethod + def instantiate_from_dict(cls, model_storage=None, resource_storage=None, **kwargs): + if model_storage: + model_storage = aria.application_model_storage(**model_storage) + if resource_storage: + resource_storage = aria.application_resource_storage(**resource_storage) + + return cls(model_storage=model_storage, + resource_storage=resource_storage, + destroy_session=True, + **kwargs) + + def close(self): + if self._destroy_session: + self.model.log._session.remove() + self.model.log._engine.dispose() + + @property + @contextmanager + def persist_changes(self): + yield + self.model.task.update(self.task) + + +class NodeOperationContext(BaseOperationContext): + """ + Context for node operations. + """ + + @property + def node(self): + """ + The node of the current operation. + """ + return self.model.node.get(self._actor_id) + + @property + def node_template(self): + """ + The node template of the current operation. + """ + return self.node.node_template + + +class RelationshipOperationContext(BaseOperationContext): + """ + Context for relationship operations. + """ + + @property + def relationship(self): + """ + The relationship instance of the current operation. + """ + return self.model.relationship.get(self._actor_id) + + @property + def source_node(self): + """ + The relationship source node. + """ + return self.relationship.source_node + + @property + def source_node_template(self): + """ + The relationship source node template. + """ + return self.source_node.node_template + + @property + def target_node(self): + """ + The relationship target node. + """ + return self.relationship.target_node + + @property + def target_node_template(self): + """ + The relationship target node template. + """ + return self.target_node.node_template diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/toolbelt.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/toolbelt.py new file mode 100644 index 0000000..a2e1122 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/toolbelt.py @@ -0,0 +1,59 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Tools for operations. +""" + +from . import operation + + +class NodeToolBelt(object): + """ + Node operation tool belt. + """ + def __init__(self, operation_context): + self._op_context = operation_context + + @property + def host_ip(self): + """ + The host ip of the current node + :return: + """ + assert isinstance(self._op_context, operation.NodeOperationContext) + return self._op_context.node.host.attributes.get('ip') + + +class RelationshipToolBelt(object): + """ + Relationship operation tool belt. + """ + def __init__(self, operation_context): + self._op_context = operation_context + + +def toolbelt(operation_context): + """ + Get a toolbelt from to the current operation executor. + + :param operation_context: + """ + if isinstance(operation_context, operation.NodeOperationContext): + return NodeToolBelt(operation_context) + elif isinstance(operation_context, operation.RelationshipOperationContext): + return RelationshipToolBelt(operation_context) + else: + raise RuntimeError("Operation context not supported") diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/workflow.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/workflow.py new file mode 100644 index 0000000..738d2fd --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/context/workflow.py @@ -0,0 +1,135 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Workflow context. +""" + +import threading +from contextlib import contextmanager + +from .exceptions import ContextException +from .common import BaseContext + + +class WorkflowContext(BaseContext): + """ + Context used during workflow creation and execution. + """ + def __init__(self, + workflow_name, + parameters=None, + task_max_attempts=1, + task_retry_interval=0, + task_ignore_failure=False, + *args, **kwargs): + super(WorkflowContext, self).__init__(*args, **kwargs) + self._workflow_name = workflow_name + self._parameters = parameters or {} + self._task_max_attempts = task_max_attempts + self._task_retry_interval = task_retry_interval + self._task_ignore_failure = task_ignore_failure + self._execution_graph = None + self._register_logger() + + def __repr__(self): + return ( + '{name}(deployment_id={self._service_id}, ' + 'workflow_name={self._workflow_name}, execution_id={self._execution_id})'.format( + name=self.__class__.__name__, self=self)) + + @property + def workflow_name(self): + return self._workflow_name + + @property + def execution(self): + """ + Execution model. + """ + return self.model.execution.get(self._execution_id) + + @execution.setter + def execution(self, value): + """ + Stores the execution in the storage model API ("MAPI"). + """ + self.model.execution.put(value) + + @property + def node_templates(self): + """ + Iterates over nodes templates. + """ + key = 'service_{0}'.format(self.model.node_template.model_cls.name_column_name()) + + return self.model.node_template.iter( + filters={ + key: getattr(self.service, self.service.name_column_name()) + } + ) + + @property + def nodes(self): + """ + Iterates over nodes. + """ + key = 'service_{0}'.format(self.model.node.model_cls.name_column_name()) + return self.model.node.iter( + filters={ + key: getattr(self.service, self.service.name_column_name()) + } + ) + + @property + @contextmanager + def persist_changes(self): + yield + self._model.execution.update(self.execution) + + +class _CurrentContext(threading.local): + """ + Provides a thread-level context, with sugar for the task MAPI. + """ + + def __init__(self): + super(_CurrentContext, self).__init__() + self._workflow_context = None + + def _set(self, value): + self._workflow_context = value + + def get(self): + """ + Retrieves the current workflow context. + """ + if self._workflow_context is not None: + return self._workflow_context + raise ContextException("No context was set") + + @contextmanager + def push(self, workflow_context): + """ + Switches the current context to the provided context. + """ + prev_workflow_context = self._workflow_context + self._set(workflow_context) + try: + yield self + finally: + self._set(prev_workflow_context) + +current = _CurrentContext() diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/decorators.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/decorators.py new file mode 100644 index 0000000..4b163d6 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/decorators.py @@ -0,0 +1,85 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Workflow and operation decorators. +""" + +from functools import partial, wraps + +from ..utils.validation import validate_function_arguments +from ..utils.uuid import generate_uuid + +from . import context +from .workflows.api import task_graph + + +WORKFLOW_DECORATOR_RESERVED_ARGUMENTS = set(('ctx', 'graph')) +OPERATION_DECORATOR_RESERVED_ARGUMENTS = set(('ctx', 'toolbelt')) + + +def workflow(func=None, suffix_template=''): + """ + Workflow decorator. + """ + if func is None: + return partial(workflow, suffix_template=suffix_template) + + @wraps(func) + def _wrapper(ctx, **workflow_parameters): + + workflow_name = _generate_name( + func_name=func.__name__, + suffix_template=suffix_template, + ctx=ctx, + **workflow_parameters) + + workflow_parameters.setdefault('ctx', ctx) + workflow_parameters.setdefault('graph', task_graph.TaskGraph(workflow_name)) + validate_function_arguments(func, workflow_parameters) + with ctx.model.instrument(*ctx.INSTRUMENTATION_FIELDS): + with context.workflow.current.push(ctx): + func(**workflow_parameters) + return workflow_parameters['graph'] + return _wrapper + + +def operation(func=None, toolbelt=False, suffix_template='', logging_handlers=None): + """ + Operation decorator. + """ + + if func is None: + return partial(operation, + suffix_template=suffix_template, + toolbelt=toolbelt, + logging_handlers=logging_handlers) + + @wraps(func) + def _wrapper(**func_kwargs): + ctx = func_kwargs['ctx'] + if toolbelt: + operation_toolbelt = context.toolbelt(ctx) + func_kwargs.setdefault('toolbelt', operation_toolbelt) + validate_function_arguments(func, func_kwargs) + with ctx.model.instrument(*ctx.INSTRUMENTATION_FIELDS): + return func(**func_kwargs) + return _wrapper + + +def _generate_name(func_name, ctx, suffix_template, **custom_kwargs): + return '{func_name}.{suffix}'.format( + func_name=func_name, + suffix=suffix_template.format(ctx=ctx, **custom_kwargs) or generate_uuid(variant='uuid')) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/events.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/events.py new file mode 100644 index 0000000..ef84e5d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/events.py @@ -0,0 +1,34 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Orchestrator events. +""" + +from blinker import signal + +# workflow engine task signals: +sent_task_signal = signal('sent_task_signal') +start_task_signal = signal('start_task_signal') +on_success_task_signal = signal('success_task_signal') +on_failure_task_signal = signal('failure_task_signal') + +# workflow engine workflow signals: +start_workflow_signal = signal('start_workflow_signal') +on_cancelling_workflow_signal = signal('on_cancelling_workflow_signal') +on_cancelled_workflow_signal = signal('on_cancelled_workflow_signal') +on_success_workflow_signal = signal('on_success_workflow_signal') +on_failure_workflow_signal = signal('on_failure_workflow_signal') +on_resume_workflow_signal = signal('on_resume_workflow_signal') diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/exceptions.py new file mode 100644 index 0000000..384458f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/exceptions.py @@ -0,0 +1,85 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Orchestrator exceptions. +""" + +from aria.exceptions import AriaError + + +class OrchestratorError(AriaError): + """ + Orchestrator based exception + """ + pass + + +class InvalidPluginError(AriaError): + """ + Raised when an invalid plugin is validated unsuccessfully + """ + pass + + +class PluginAlreadyExistsError(AriaError): + """ + Raised when a plugin with the same package name and package version already exists + """ + pass + + +class TaskRetryException(RuntimeError): + """ + Used internally when ctx.task.retry is called + """ + def __init__(self, message, retry_interval=None): + super(TaskRetryException, self).__init__(message) + self.retry_interval = retry_interval + + +class TaskAbortException(RuntimeError): + """ + Used internally when ctx.task.abort is called + """ + pass + + +class UndeclaredWorkflowError(AriaError): + """ + Raised when attempting to execute an undeclared workflow + """ + pass + + +class ActiveExecutionsError(AriaError): + """ + Raised when attempting to execute a workflow on a service which already has an active execution + """ + pass + + +class WorkflowImplementationNotFoundError(AriaError): + """ + Raised when attempting to import a workflow's code but the implementation is not found + """ + pass + + +class InvalidWorkflowRunnerParams(AriaError): + """ + Raised when invalid combination of arguments is passed to the workflow runner + """ + pass diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/__init__.py new file mode 100644 index 0000000..d15de99 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/__init__.py @@ -0,0 +1,39 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Execution plugin package. +""" + +from contextlib import contextmanager +from . import instantiation + + +# Populated during execution of python scripts +ctx = None +inputs = None + + +@contextmanager +def python_script_scope(operation_ctx, operation_inputs): + global ctx + global inputs + try: + ctx = operation_ctx + inputs = operation_inputs + yield + finally: + ctx = None + inputs = None diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/common.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/common.py new file mode 100644 index 0000000..ce6746c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/common.py @@ -0,0 +1,154 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Execution plugin utilities. +""" + +import json +import os +import tempfile + +import requests + +from . import constants +from . import exceptions + + +def is_windows(): + return os.name == 'nt' + + +def download_script(ctx, script_path): + split = script_path.split('://') + schema = split[0] + suffix = script_path.split('/')[-1] + file_descriptor, dest_script_path = tempfile.mkstemp(suffix='-{0}'.format(suffix)) + os.close(file_descriptor) + try: + if schema in ('http', 'https'): + response = requests.get(script_path) + if response.status_code == 404: + ctx.task.abort('Failed to download script: {0} (status code: {1})' + .format(script_path, response.status_code)) + content = response.text + with open(dest_script_path, 'wb') as f: + f.write(content) + else: + ctx.download_resource(destination=dest_script_path, path=script_path) + except: + os.remove(dest_script_path) + raise + return dest_script_path + + +def create_process_config(script_path, process, operation_kwargs, quote_json_env_vars=False): + """ + Updates a process with its environment variables, and return it. + + Gets a dict representing a process and a dict representing the environment variables. Converts + each environment variable to a format of:: + + : + . + + Finally, updates the process with the newly formatted environment variables, and return the + process. + + :param process: dict representing a process + :type process: dict + :param operation_kwargs: dict representing environment variables that should exist in the + process's running environment. + :type operation_kwargs: dict + :return: process updated with its environment variables + :rtype: dict + """ + process = process or {} + env_vars = operation_kwargs.copy() + if 'ctx' in env_vars: + del env_vars['ctx'] + env_vars.update(process.get('env', {})) + for k, v in env_vars.items(): + if isinstance(v, (dict, list, tuple, bool, int, float)): + v = json.dumps(v) + if quote_json_env_vars: + v = "'{0}'".format(v) + if is_windows(): + # These environment variables will subsequently + # be used in a subprocess.Popen() call, as the `env` parameter. + # In some windows python versions, if an environment variable + # name is not of type str (e.g. unicode), the Popen call will + # fail. + k = str(k) + # The windows shell removes all double quotes - escape them + # to still be able to pass JSON in env vars to the shell. + v = v.replace('"', '\\"') + del env_vars[k] + env_vars[k] = str(v) + process['env'] = env_vars + args = process.get('args') + command = script_path + command_prefix = process.get('command_prefix') + if command_prefix: + command = '{0} {1}'.format(command_prefix, command) + if args: + command = ' '.join([command] + [str(a) for a in args]) + process['command'] = command + return process + + +def patch_ctx(ctx): + ctx._error = None + task = ctx.task + + def _validate_legal_action(): + if ctx._error is not None: + ctx._error = RuntimeError(constants.ILLEGAL_CTX_OPERATION_MESSAGE) + raise ctx._error + + def abort_operation(message=None): + _validate_legal_action() + ctx._error = exceptions.ScriptException(message=message, retry=False) + return ctx._error + task.abort = abort_operation + + def retry_operation(message=None, retry_interval=None): + _validate_legal_action() + ctx._error = exceptions.ScriptException(message=message, + retry=True, + retry_interval=retry_interval) + return ctx._error + task.retry = retry_operation + + +def check_error(ctx, error_check_func=None, reraise=False): + _error = ctx._error + # this happens when a script calls task.abort/task.retry more than once + if isinstance(_error, RuntimeError): + ctx.task.abort(str(_error)) + # ScriptException is populated by the ctx proxy server when task.abort or task.retry + # are called + elif isinstance(_error, exceptions.ScriptException): + if _error.retry: + ctx.task.retry(_error.message, _error.retry_interval) + else: + ctx.task.abort(_error.message) + # local and ssh operations may pass an additional logic check for errors here + if error_check_func: + error_check_func() + # if this function is called from within an ``except`` clause, a re-raise maybe required + if reraise: + raise # pylint: disable=misplaced-bare-raise + return _error diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/constants.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/constants.py new file mode 100644 index 0000000..1953912 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/constants.py @@ -0,0 +1,57 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Execution plugin constants. +""" +import os +import tempfile + +from . import exceptions + +# related to local +PYTHON_SCRIPT_FILE_EXTENSION = '.py' +POWERSHELL_SCRIPT_FILE_EXTENSION = '.ps1' +DEFAULT_POWERSHELL_EXECUTABLE = 'powershell' + +# related to both local and ssh +ILLEGAL_CTX_OPERATION_MESSAGE = 'ctx may only abort or retry once' + +# related to ssh +DEFAULT_BASE_DIR = os.path.join(tempfile.gettempdir(), 'aria-ctx') +FABRIC_ENV_DEFAULTS = { + 'connection_attempts': 5, + 'timeout': 10, + 'forward_agent': False, + 'abort_on_prompts': True, + 'keepalive': 0, + 'linewise': False, + 'pool_size': 0, + 'skip_bad_hosts': False, + 'status': False, + 'disable_known_hosts': True, + 'combine_stderr': True, + 'abort_exception': exceptions.TaskException, +} +VALID_FABRIC_GROUPS = set([ + 'status', + 'aborts', + 'warnings', + 'running', + 'stdout', + 'stderr', + 'user', + 'everything' +]) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ctx_proxy/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ctx_proxy/__init__.py new file mode 100644 index 0000000..46c8cf1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ctx_proxy/__init__.py @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +``ctx`` proxy. +""" + +from . import server, client diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ctx_proxy/client.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ctx_proxy/client.py new file mode 100644 index 0000000..84d66f1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ctx_proxy/client.py @@ -0,0 +1,114 @@ +#! /usr/bin/env python +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +``ctx`` proxy client implementation. +""" + +import argparse +import json +import os +import sys +import urllib2 + + +# Environment variable for the socket url (used by clients to locate the socket) +CTX_SOCKET_URL = 'CTX_SOCKET_URL' + + +class _RequestError(RuntimeError): + + def __init__(self, ex_message, ex_type, ex_traceback): + super(_RequestError, self).__init__(self, '{0}: {1}'.format(ex_type, ex_message)) + self.ex_type = ex_type + self.ex_message = ex_message + self.ex_traceback = ex_traceback + + +def _http_request(socket_url, request, method, timeout): + opener = urllib2.build_opener(urllib2.HTTPHandler) + request = urllib2.Request(socket_url, data=json.dumps(request)) + request.get_method = lambda: method + response = opener.open(request, timeout=timeout) + + if response.code != 200: + raise RuntimeError('Request failed: {0}'.format(response)) + return json.loads(response.read()) + + +def _client_request(socket_url, args, timeout, method='POST'): + response = _http_request( + socket_url=socket_url, + request={'args': args}, + method=method, + timeout=timeout + ) + payload = response.get('payload') + response_type = response.get('type') + if response_type == 'error': + ex_type = payload['type'] + ex_message = payload['message'] + ex_traceback = payload['traceback'] + raise _RequestError(ex_message, ex_type, ex_traceback) + elif response_type == 'stop_operation': + raise SystemExit(payload['message']) + else: + return payload + + +def _parse_args(args): + parser = argparse.ArgumentParser() + parser.add_argument('-t', '--timeout', type=int, default=30) + parser.add_argument('--socket-url', default=os.environ.get(CTX_SOCKET_URL)) + parser.add_argument('--json-arg-prefix', default='@') + parser.add_argument('-j', '--json-output', action='store_true') + parser.add_argument('args', nargs='*') + args = parser.parse_args(args=args) + if not args.socket_url: + raise RuntimeError('Missing CTX_SOCKET_URL environment variable ' + 'or socket_url command line argument. (ctx is supposed to be executed ' + 'within an operation context)') + return args + + +def _process_args(json_prefix, args): + processed_args = [] + for arg in args: + if arg.startswith(json_prefix): + arg = json.loads(arg[1:]) + processed_args.append(arg) + return processed_args + + +def main(args=None): + args = _parse_args(args) + response = _client_request( + args.socket_url, + args=_process_args(args.json_arg_prefix, args.args), + timeout=args.timeout) + if args.json_output: + response = json.dumps(response) + else: + if response is None: + response = '' + try: + response = str(response) + except UnicodeEncodeError: + response = unicode(response).encode('utf8') + sys.stdout.write(response) + +if __name__ == '__main__': + main() diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ctx_proxy/server.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ctx_proxy/server.py new file mode 100644 index 0000000..91b95d9 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ctx_proxy/server.py @@ -0,0 +1,244 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +``ctx`` proxy server implementation. +""" + +import json +import socket +import Queue +import StringIO +import threading +import traceback +import wsgiref.simple_server + +import bottle +from aria import modeling + +from .. import exceptions + + +class CtxProxy(object): + + def __init__(self, ctx, ctx_patcher=(lambda *args, **kwargs: None)): + self.ctx = ctx + self._ctx_patcher = ctx_patcher + self.port = _get_unused_port() + self.socket_url = 'http://localhost:{0}'.format(self.port) + self.server = None + self._started = Queue.Queue(1) + self.thread = self._start_server() + self._started.get(timeout=5) + + def _start_server(self): + + class BottleServerAdapter(bottle.ServerAdapter): + proxy = self + + def close_session(self): + self.proxy.ctx.model.log._session.remove() + + def run(self, app): + + class Server(wsgiref.simple_server.WSGIServer): + allow_reuse_address = True + bottle_server = self + + def handle_error(self, request, client_address): + pass + + def serve_forever(self, poll_interval=0.5): + try: + wsgiref.simple_server.WSGIServer.serve_forever(self, poll_interval) + finally: + # Once shutdown is called, we need to close the session. + # If the session is not closed properly, it might raise warnings, + # or even lock the database. + self.bottle_server.close_session() + + class Handler(wsgiref.simple_server.WSGIRequestHandler): + def address_string(self): + return self.client_address[0] + + def log_request(*args, **kwargs): # pylint: disable=no-method-argument + if not self.quiet: + return wsgiref.simple_server.WSGIRequestHandler.log_request(*args, + **kwargs) + server = wsgiref.simple_server.make_server( + host=self.host, + port=self.port, + app=app, + server_class=Server, + handler_class=Handler) + self.proxy.server = server + self.proxy._started.put(True) + server.serve_forever(poll_interval=0.1) + + def serve(): + # Since task is a thread_local object, we need to patch it inside the server thread. + self._ctx_patcher(self.ctx) + + bottle_app = bottle.Bottle() + bottle_app.post('/', callback=self._request_handler) + bottle.run( + app=bottle_app, + host='localhost', + port=self.port, + quiet=True, + server=BottleServerAdapter) + thread = threading.Thread(target=serve) + thread.daemon = True + thread.start() + return thread + + def close(self): + if self.server: + self.server.shutdown() + self.server.server_close() + + def _request_handler(self): + request = bottle.request.body.read() # pylint: disable=no-member + response = self._process(request) + return bottle.LocalResponse( + body=json.dumps(response, cls=modeling.utils.ModelJSONEncoder), + status=200, + headers={'content-type': 'application/json'} + ) + + def _process(self, request): + try: + with self.ctx.model.instrument(*self.ctx.INSTRUMENTATION_FIELDS): + payload = _process_request(self.ctx, request) + result_type = 'result' + if isinstance(payload, exceptions.ScriptException): + payload = dict(message=str(payload)) + result_type = 'stop_operation' + result = {'type': result_type, 'payload': payload} + except Exception as e: + traceback_out = StringIO.StringIO() + traceback.print_exc(file=traceback_out) + payload = { + 'type': type(e).__name__, + 'message': str(e), + 'traceback': traceback_out.getvalue() + } + result = {'type': 'error', 'payload': payload} + + return result + + def __enter__(self): + return self + + def __exit__(self, *args, **kwargs): + self.close() + + +class CtxError(RuntimeError): + pass + + +class CtxParsingError(CtxError): + pass + + +def _process_request(ctx, request): + request = json.loads(request) + args = request['args'] + return _process_arguments(ctx, args) + + +def _process_arguments(obj, args): + # Modifying? + try: + # TODO: should there be a way to escape "=" in case it is needed as real argument? + equals_index = args.index('=') # raises ValueError if not found + except ValueError: + equals_index = None + if equals_index is not None: + if equals_index == 0: + raise CtxParsingError('The "=" argument cannot be first') + elif equals_index != len(args) - 2: + raise CtxParsingError('The "=" argument must be penultimate') + modifying = True + modifying_key = args[-3] + modifying_value = args[-1] + args = args[:-3] + else: + modifying = False + modifying_key = None + modifying_value = None + + # Parse all arguments + while len(args) > 0: + obj, args = _process_next_operation(obj, args, modifying) + + if modifying: + if hasattr(obj, '__setitem__'): + # Modify item value (dict, list, and similar) + if isinstance(obj, (list, tuple)): + modifying_key = int(modifying_key) + obj[modifying_key] = modifying_value + elif hasattr(obj, modifying_key): + # Modify object attribute + setattr(obj, modifying_key, modifying_value) + else: + raise CtxError('Cannot modify `{0}` of `{1!r}`'.format(modifying_key, obj)) + + return obj + + +def _process_next_operation(obj, args, modifying): + args = list(args) + arg = args.pop(0) + + # Call? + if arg == '[': + # TODO: should there be a way to escape "[" and "]" in case they are needed as real + # arguments? + try: + closing_index = args.index(']') # raises ValueError if not found + except ValueError: + raise CtxParsingError('Opening "[" without a closing "]') + callable_args = args[:closing_index] + args = args[closing_index + 1:] + if not callable(obj): + raise CtxError('Used "[" and "] on an object that is not callable') + return obj(*callable_args), args + + # Attribute? + if isinstance(arg, basestring): + if hasattr(obj, arg): + return getattr(obj, arg), args + token_sugared = arg.replace('-', '_') + if hasattr(obj, token_sugared): + return getattr(obj, token_sugared), args + + # Item? (dict, lists, and similar) + if hasattr(obj, '__getitem__'): + if modifying and (arg not in obj) and hasattr(obj, '__setitem__'): + # Create nested dict + obj[arg] = {} + return obj[arg], args + + raise CtxParsingError('Cannot parse argument: `{0!r}`'.format(arg)) + + +def _get_unused_port(): + sock = socket.socket() + sock.bind(('127.0.0.1', 0)) + _, port = sock.getsockname() + sock.close() + return port diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/environment_globals.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/environment_globals.py new file mode 100644 index 0000000..6dec293 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/environment_globals.py @@ -0,0 +1,57 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Utilities for managing globals for the environment. +""" + +def create_initial_globals(path): + """ + Emulates a ``globals()`` call in a freshly loaded module. + + The implementation of this function is likely to raise a couple of questions. If you read the + implementation and nothing bothered you, feel free to skip the rest of this docstring. + + First, why is this function in its own module and not, say, in the same module of the other + environment-related functions? Second, why is it implemented in such a way that copies the + globals, then deletes the item that represents this function, and then changes some other + entries? + + Well, these two questions can be answered with one (elaborate) explanation. If this function was + in the same module with the other environment-related functions, then we would have had to + delete more items in globals than just ``create_initial_globals``. That is because all of the + other function names would also be in globals, and since there is no built-in mechanism that + return the name of the user-defined objects, this approach is quite an overkill. + + *But why do we rely on the copy-existing-globals-and-delete-entries method, when it seems to + force us to put ``create_initial_globals`` in its own file?* + + Well, because there is no easier method of creating globals of a newly loaded module. + + *How about hard coding a ``globals`` dict? It seems that there are very few entries: + ``__doc__``, ``__file__``, ``__name__``, ``__package__`` (but don't forget ``__builtins__``).* + + That would be coupling our implementation to a specific ``globals`` implementation. What if + ``globals`` were to change? + """ + copied_globals = globals().copy() + copied_globals.update({ + '__doc__': 'Dynamically executed script', + '__file__': path, + '__name__': '__main__', + '__package__': None + }) + del copied_globals[create_initial_globals.__name__] + return copied_globals diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/exceptions.py new file mode 100644 index 0000000..f201fae --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/exceptions.py @@ -0,0 +1,47 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Execution plugin exceptions. +""" + +class ProcessException(Exception): + """ + Raised when local scripts and remote SSH commands fail. + """ + + def __init__(self, stderr=None, stdout=None, command=None, exit_code=None): + super(ProcessException, self).__init__(stderr) + self.command = command + self.exit_code = exit_code + self.stdout = stdout + self.stderr = stderr + + +class TaskException(Exception): + """ + Raised when remote ssh scripts fail. + """ + + +class ScriptException(Exception): + """ + Used by the ``ctx`` proxy server when task.retry or task.abort are called by scripts. + """ + + def __init__(self, message=None, retry=None, retry_interval=None): + super(ScriptException, self).__init__(message) + self.retry = retry + self.retry_interval = retry_interval diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/instantiation.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/instantiation.py new file mode 100644 index 0000000..8b52015 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/instantiation.py @@ -0,0 +1,217 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Instantiation of :class:`~aria.modeling.models.Operation` models. +""" + +# TODO: this module will eventually be moved to a new "aria.instantiation" package +from ...modeling.functions import Function +from ... import utils + + +def configure_operation(operation, reporter): + host = None + interface = operation.interface + if interface.node is not None: + host = interface.node.host + elif interface.relationship is not None: + if operation.relationship_edge is True: + host = interface.relationship.target_node.host + else: # either False or None (None meaning that edge was not specified) + host = interface.relationship.source_node.host + + _configure_common(operation, reporter) + if host is None: + _configure_local(operation) + else: + _configure_remote(operation, reporter) + + # Any remaining un-handled configuration parameters will become extra arguments, available as + # kwargs in either "run_script_locally" or "run_script_with_ssh" + for key, value in operation.configurations.iteritems(): + if key not in ('process', 'ssh'): + operation.arguments[key] = value.instantiate(None) + + +def _configure_common(operation, reporter): + """ + Local and remote operations. + """ + + from ...modeling.models import Argument + operation.arguments['script_path'] = Argument.wrap('script_path', operation.implementation, + 'Relative path to the executable file.') + operation.arguments['process'] = Argument.wrap('process', _get_process(operation, reporter), + 'Sub-process configuration.') + + +def _configure_local(operation): + """ + Local operation. + """ + + from . import operations + operation.function = '{0}.{1}'.format(operations.__name__, + operations.run_script_locally.__name__) + + +def _configure_remote(operation, reporter): + """ + Remote SSH operation via Fabric. + """ + + from ...modeling.models import Argument + from . import operations + + ssh = _get_ssh(operation, reporter) + + # Defaults + # TODO: find a way to configure these generally in the service template + default_user = '' + default_password = '' + if 'user' not in ssh: + ssh['user'] = default_user + if ('password' not in ssh) and ('key' not in ssh) and ('key_filename' not in ssh): + ssh['password'] = default_password + + operation.arguments['use_sudo'] = Argument.wrap('use_sudo', ssh.get('use_sudo', False), + 'Whether to execute with sudo.') + + operation.arguments['hide_output'] = Argument.wrap('hide_output', ssh.get('hide_output', []), + 'Hide output of these Fabric groups.') + + fabric_env = {} + if 'warn_only' in ssh: + fabric_env['warn_only'] = ssh['warn_only'] + fabric_env['user'] = ssh.get('user') + fabric_env['password'] = ssh.get('password') + fabric_env['key'] = ssh.get('key') + fabric_env['key_filename'] = ssh.get('key_filename') + if 'address' in ssh: + fabric_env['host_string'] = ssh['address'] + + # Make sure we have a user + if fabric_env.get('user') is None: + reporter.report('must configure "ssh.user" for "{0}"'.format(operation.implementation), + level=reporter.Issue.BETWEEN_TYPES) + + # Make sure we have an authentication value + if (fabric_env.get('password') is None) and \ + (fabric_env.get('key') is None) and \ + (fabric_env.get('key_filename') is None): + reporter.report( + 'must configure "ssh.password", "ssh.key", or "ssh.key_filename" for "{0}"' + .format(operation.implementation), + level=reporter.Issue.BETWEEN_TYPES) + + operation.arguments['fabric_env'] = Argument.wrap('fabric_env', fabric_env, + 'Fabric configuration.') + + operation.function = '{0}.{1}'.format(operations.__name__, + operations.run_script_with_ssh.__name__) + + +def _get_process(operation, reporter): + value = (operation.configurations.get('process')._value + if 'process' in operation.configurations + else None) + if value is None: + return {} + _validate_type(value, dict, 'process', reporter) + value = utils.collections.OrderedDict(value) + for k, v in value.iteritems(): + if k == 'eval_python': + value[k] = _coerce_bool(v, 'process.eval_python', reporter) + elif k == 'cwd': + _validate_type(v, basestring, 'process.cwd', reporter) + elif k == 'command_prefix': + _validate_type(v, basestring, 'process.command_prefix', reporter) + elif k == 'args': + value[k] = _dict_to_list_of_strings(v, 'process.args', reporter) + elif k == 'env': + _validate_type(v, dict, 'process.env', reporter) + else: + reporter.report('unsupported configuration parameter: "process.{0}"'.format(k), + level=reporter.Issue.BETWEEN_TYPES) + return value + + +def _get_ssh(operation, reporter): + value = (operation.configurations.get('ssh')._value + if 'ssh' in operation.configurations + else None) + if value is None: + return {} + _validate_type(value, dict, 'ssh', reporter) + value = utils.collections.OrderedDict(value) + for k, v in value.iteritems(): + if k == 'use_sudo': + value[k] = _coerce_bool(v, 'ssh.use_sudo', reporter) + elif k == 'hide_output': + value[k] = _dict_to_list_of_strings(v, 'ssh.hide_output', reporter) + elif k == 'warn_only': + value[k] = _coerce_bool(v, 'ssh.warn_only', reporter) + elif k == 'user': + _validate_type(v, basestring, 'ssh.user', reporter) + elif k == 'password': + _validate_type(v, basestring, 'ssh.password', reporter) + elif k == 'key': + _validate_type(v, basestring, 'ssh.key', reporter) + elif k == 'key_filename': + _validate_type(v, basestring, 'ssh.key_filename', reporter) + elif k == 'address': + _validate_type(v, basestring, 'ssh.address', reporter) + else: + reporter.report('unsupported configuration parameter: "ssh.{0}"'.format(k), + level=reporter.Issue.BETWEEN_TYPES) + return value + + +def _validate_type(value, the_type, name, reporter): + if isinstance(value, Function): + return + if not isinstance(value, the_type): + reporter.report( + '"{0}" configuration is not a {1}: {2}'.format( + name, utils.type.full_type_name(the_type), utils.formatting.safe_repr(value)), + level=reporter.Issue.BETWEEN_TYPES) + + +def _coerce_bool(value, name, reporter): + if value is None: + return None + if isinstance(value, bool): + return value + _validate_type(value, basestring, name, reporter) + if value == 'true': + return True + elif value == 'false': + return False + else: + reporter.report( + '"{0}" configuration is not "true" or "false": {1}'.format( + name, utils.formatting.safe_repr(value)), + level=reporter.Issue.BETWEEN_TYPES) + + +def _dict_to_list_of_strings(the_dict, name, reporter): + _validate_type(the_dict, dict, name, reporter) + value = [] + for k in sorted(the_dict): + v = the_dict[k] + _validate_type(v, basestring, '{0}.{1}'.format(name, k), reporter) + value.append(v) + return value diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/local.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/local.py new file mode 100644 index 0000000..04b9ecd --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/local.py @@ -0,0 +1,128 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Local execution of operations. +""" + +import os +import subprocess +import threading +import StringIO + +from . import ctx_proxy +from . import exceptions +from . import common +from . import constants +from . import environment_globals +from . import python_script_scope + + +def run_script(ctx, script_path, process, **kwargs): + if not script_path: + ctx.task.abort('Missing script_path') + process = process or {} + script_path = common.download_script(ctx, script_path) + script_func = _get_run_script_func(script_path, process) + return script_func( + ctx=ctx, + script_path=script_path, + process=process, + operation_kwargs=kwargs) + + +def _get_run_script_func(script_path, process): + if _treat_script_as_python_script(script_path, process): + return _eval_script_func + else: + if _treat_script_as_powershell_script(script_path): + process.setdefault('command_prefix', constants.DEFAULT_POWERSHELL_EXECUTABLE) + return _execute_func + + +def _treat_script_as_python_script(script_path, process): + eval_python = process.get('eval_python') + script_extension = os.path.splitext(script_path)[1].lower() + return (eval_python is True or (script_extension == constants.PYTHON_SCRIPT_FILE_EXTENSION and + eval_python is not False)) + + +def _treat_script_as_powershell_script(script_path): + script_extension = os.path.splitext(script_path)[1].lower() + return script_extension == constants.POWERSHELL_SCRIPT_FILE_EXTENSION + + +def _eval_script_func(script_path, ctx, operation_kwargs, **_): + with python_script_scope(operation_ctx=ctx, operation_inputs=operation_kwargs): + execfile(script_path, environment_globals.create_initial_globals(script_path)) + + +def _execute_func(script_path, ctx, process, operation_kwargs): + os.chmod(script_path, 0755) + process = common.create_process_config( + script_path=script_path, + process=process, + operation_kwargs=operation_kwargs) + command = process['command'] + env = os.environ.copy() + env.update(process['env']) + ctx.logger.info('Executing: {0}'.format(command)) + with ctx_proxy.server.CtxProxy(ctx, common.patch_ctx) as proxy: + env[ctx_proxy.client.CTX_SOCKET_URL] = proxy.socket_url + running_process = subprocess.Popen( + command, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=env, + cwd=process.get('cwd'), + bufsize=1, + close_fds=not common.is_windows()) + stdout_consumer = _OutputConsumer(running_process.stdout) + stderr_consumer = _OutputConsumer(running_process.stderr) + exit_code = running_process.wait() + stdout_consumer.join() + stderr_consumer.join() + ctx.logger.info('Execution done (exit_code={0}): {1}'.format(exit_code, command)) + + def error_check_func(): + if exit_code: + raise exceptions.ProcessException( + command=command, + exit_code=exit_code, + stdout=stdout_consumer.read_output(), + stderr=stderr_consumer.read_output()) + return common.check_error(ctx, error_check_func=error_check_func) + + +class _OutputConsumer(object): + + def __init__(self, out): + self._out = out + self._buffer = StringIO.StringIO() + self._consumer = threading.Thread(target=self._consume_output) + self._consumer.daemon = True + self._consumer.start() + + def _consume_output(self): + for line in iter(self._out.readline, b''): + self._buffer.write(line) + self._out.close() + + def read_output(self): + return self._buffer.getvalue() + + def join(self): + self._consumer.join() diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/operations.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/operations.py new file mode 100644 index 0000000..0e987f4 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/operations.py @@ -0,0 +1,75 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Entry point functions. +""" + +from aria.orchestrator import operation +from . import local as local_operations + + +@operation +def run_script_locally(ctx, + script_path, + process=None, + **kwargs): + return local_operations.run_script( + ctx=ctx, + script_path=script_path, + process=process, + **kwargs) + + +@operation +def run_script_with_ssh(ctx, + script_path, + fabric_env=None, + process=None, + use_sudo=False, + hide_output=None, + **kwargs): + return _try_import_ssh().run_script( + ctx=ctx, + script_path=script_path, + fabric_env=fabric_env, + process=process, + use_sudo=use_sudo, + hide_output=hide_output, + **kwargs) + + +@operation +def run_commands_with_ssh(ctx, + commands, + fabric_env=None, + use_sudo=False, + hide_output=None, + **_): + return _try_import_ssh().run_commands( + ctx=ctx, + commands=commands, + fabric_env=fabric_env, + use_sudo=use_sudo, + hide_output=hide_output) + + +def _try_import_ssh(): + try: + from .ssh import operations as ssh_operations + return ssh_operations + except Exception as e: + print(e) + raise RuntimeError('Failed to import SSH modules; Have you installed the ARIA SSH extra?') diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ssh/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ssh/__init__.py new file mode 100644 index 0000000..474deef --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ssh/__init__.py @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Remote execution of operations over SSH. +""" diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ssh/operations.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ssh/operations.py new file mode 100644 index 0000000..c40e783 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ssh/operations.py @@ -0,0 +1,195 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Utilities for running commands remotely over SSH. +""" + +import os +import random +import string +import tempfile +import StringIO + +import fabric.api +import fabric.context_managers +import fabric.contrib.files + +from .. import constants +from .. import exceptions +from .. import common +from .. import ctx_proxy +from . import tunnel + + +_PROXY_CLIENT_PATH = ctx_proxy.client.__file__ +if _PROXY_CLIENT_PATH.endswith('.pyc'): + _PROXY_CLIENT_PATH = _PROXY_CLIENT_PATH[:-1] + + +def run_commands(ctx, commands, fabric_env, use_sudo, hide_output, **_): + """Runs the provider 'commands' in sequence + + :param commands: a list of commands to run + :param fabric_env: fabric configuration + """ + with fabric.api.settings(_hide_output(ctx, groups=hide_output), + **_fabric_env(ctx, fabric_env, warn_only=True)): + for command in commands: + ctx.logger.info('Running command: {0}'.format(command)) + run = fabric.api.sudo if use_sudo else fabric.api.run + result = run(command) + if result.failed: + raise exceptions.ProcessException( + command=result.command, + exit_code=result.return_code, + stdout=result.stdout, + stderr=result.stderr) + + +def run_script(ctx, script_path, fabric_env, process, use_sudo, hide_output, **kwargs): + process = process or {} + paths = _Paths(base_dir=process.get('base_dir', constants.DEFAULT_BASE_DIR), + local_script_path=common.download_script(ctx, script_path)) + with fabric.api.settings(_hide_output(ctx, groups=hide_output), + **_fabric_env(ctx, fabric_env, warn_only=False)): + # the remote host must have the ctx before running any fabric scripts + if not fabric.contrib.files.exists(paths.remote_ctx_path): + # there may be race conditions with other operations that + # may be running in parallel, so we pass -p to make sure + # we get 0 exit code if the directory already exists + fabric.api.run('mkdir -p {0} && mkdir -p {1}'.format(paths.remote_scripts_dir, + paths.remote_work_dir)) + # this file has to be present before using ctx + fabric.api.put(_PROXY_CLIENT_PATH, paths.remote_ctx_path) + process = common.create_process_config( + script_path=paths.remote_script_path, + process=process, + operation_kwargs=kwargs, + quote_json_env_vars=True) + fabric.api.put(paths.local_script_path, paths.remote_script_path) + with ctx_proxy.server.CtxProxy(ctx, _patch_ctx) as proxy: + local_port = proxy.port + with fabric.context_managers.cd(process.get('cwd', paths.remote_work_dir)): # pylint: disable=not-context-manager + with tunnel.remote(ctx, local_port=local_port) as remote_port: + local_socket_url = proxy.socket_url + remote_socket_url = local_socket_url.replace(str(local_port), str(remote_port)) + env_script = _write_environment_script_file( + process=process, + paths=paths, + local_socket_url=local_socket_url, + remote_socket_url=remote_socket_url) + fabric.api.put(env_script, paths.remote_env_script_path) + try: + command = 'source {0} && {1}'.format(paths.remote_env_script_path, + process['command']) + run = fabric.api.sudo if use_sudo else fabric.api.run + run(command) + except exceptions.TaskException: + return common.check_error(ctx, reraise=True) + return common.check_error(ctx) + + +def _patch_ctx(ctx): + common.patch_ctx(ctx) + original_download_resource = ctx.download_resource + original_download_resource_and_render = ctx.download_resource_and_render + + def _download_resource(func, destination, **kwargs): + handle, temp_local_path = tempfile.mkstemp() + os.close(handle) + try: + func(destination=temp_local_path, **kwargs) + return fabric.api.put(temp_local_path, destination) + finally: + os.remove(temp_local_path) + + def download_resource(destination, path=None): + _download_resource( + func=original_download_resource, + destination=destination, + path=path) + ctx.download_resource = download_resource + + def download_resource_and_render(destination, path=None, variables=None): + _download_resource( + func=original_download_resource_and_render, + destination=destination, + path=path, + variables=variables) + ctx.download_resource_and_render = download_resource_and_render + + +def _hide_output(ctx, groups): + """ Hides Fabric's output for every 'entity' in `groups` """ + groups = set(groups or []) + if not groups.issubset(constants.VALID_FABRIC_GROUPS): + ctx.task.abort('`hide_output` must be a subset of {0} (Provided: {1})' + .format(', '.join(constants.VALID_FABRIC_GROUPS), ', '.join(groups))) + return fabric.api.hide(*groups) + + +def _fabric_env(ctx, fabric_env, warn_only): + """Prepares fabric environment variables configuration""" + ctx.logger.debug('Preparing fabric environment...') + env = constants.FABRIC_ENV_DEFAULTS.copy() + env.update(fabric_env or {}) + env.setdefault('warn_only', warn_only) + # validations + if (not env.get('host_string')) and (ctx.task) and (ctx.task.actor) and (ctx.task.actor.host): + env['host_string'] = ctx.task.actor.host.host_address + if not env.get('host_string'): + ctx.task.abort('`host_string` not supplied and ip cannot be deduced automatically') + if not (env.get('password') or env.get('key_filename') or env.get('key')): + ctx.task.abort( + 'Access credentials not supplied ' + '(you must supply at least one of `key_filename`, `key` or `password`)') + if not env.get('user'): + ctx.task.abort('`user` not supplied') + ctx.logger.debug('Environment prepared successfully') + return env + + +def _write_environment_script_file(process, paths, local_socket_url, remote_socket_url): + env_script = StringIO.StringIO() + env = process['env'] + env['PATH'] = '{0}:$PATH'.format(paths.remote_ctx_dir) + env['PYTHONPATH'] = '{0}:$PYTHONPATH'.format(paths.remote_ctx_dir) + env_script.write('chmod +x {0}\n'.format(paths.remote_script_path)) + env_script.write('chmod +x {0}\n'.format(paths.remote_ctx_path)) + env.update({ + ctx_proxy.client.CTX_SOCKET_URL: remote_socket_url, + 'LOCAL_{0}'.format(ctx_proxy.client.CTX_SOCKET_URL): local_socket_url + }) + for key, value in env.iteritems(): + env_script.write('export {0}={1}\n'.format(key, value)) + return env_script + + +class _Paths(object): + + def __init__(self, base_dir, local_script_path): + self.local_script_path = local_script_path + self.remote_ctx_dir = base_dir + self.base_script_path = os.path.basename(self.local_script_path) + self.remote_ctx_path = '{0}/ctx'.format(self.remote_ctx_dir) + self.remote_scripts_dir = '{0}/scripts'.format(self.remote_ctx_dir) + self.remote_work_dir = '{0}/work'.format(self.remote_ctx_dir) + random_suffix = ''.join(random.choice(string.ascii_lowercase + string.digits) + for _ in range(8)) + remote_path_suffix = '{0}-{1}'.format(self.base_script_path, random_suffix) + self.remote_env_script_path = '{0}/env-{1}'.format(self.remote_scripts_dir, + remote_path_suffix) + self.remote_script_path = '{0}/{1}'.format(self.remote_scripts_dir, remote_path_suffix) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ssh/tunnel.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ssh/tunnel.py new file mode 100644 index 0000000..e76d525 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/execution_plugin/ssh/tunnel.py @@ -0,0 +1,107 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 implementation was copied from the Fabric project directly: +# https://github.com/fabric/fabric/blob/master/fabric/context_managers.py#L486 +# The purpose was to remove the rtunnel creation printouts here: +# https://github.com/fabric/fabric/blob/master/fabric/context_managers.py#L547 + + +import contextlib +import select +import socket + +import fabric.api +import fabric.state +import fabric.thread_handling + + +@contextlib.contextmanager +def remote(ctx, local_port, remote_port=0, local_host='localhost', remote_bind_address='127.0.0.1'): + """Create a tunnel forwarding a locally-visible port to the remote target.""" + sockets = [] + channels = [] + thread_handlers = [] + + def accept(channel, *args, **kwargs): + # This seemingly innocent statement seems to be doing nothing + # but the truth is far from it! + # calling fileno() on a paramiko channel the first time, creates + # the required plumbing to make the channel valid for select. + # While this would generally happen implicitly inside the _forwarder + # function when select is called, it may already be too late and may + # cause the select loop to hang. + # Specifically, when new data arrives to the channel, a flag is set + # on an "event" object which is what makes the select call work. + # problem is this will only happen if the event object is not None + # and it will be not-None only after channel.fileno() has been called + # for the first time. If we wait until _forwarder calls select for the + # first time it may be after initial data has reached the channel. + # calling it explicitly here in the paramiko transport main event loop + # guarantees this will not happen. + channel.fileno() + + channels.append(channel) + sock = socket.socket() + sockets.append(sock) + + try: + sock.connect((local_host, local_port)) + except Exception as e: + try: + channel.close() + except Exception as ex2: + close_error = ' (While trying to close channel: {0})'.format(ex2) + else: + close_error = '' + ctx.task.abort('[{0}] rtunnel: cannot connect to {1}:{2} ({3}){4}' + .format(fabric.api.env.host_string, local_host, local_port, e, + close_error)) + + thread_handler = fabric.thread_handling.ThreadHandler('fwd', _forwarder, channel, sock) + thread_handlers.append(thread_handler) + + transport = fabric.state.connections[fabric.api.env.host_string].get_transport() + remote_port = transport.request_port_forward( + remote_bind_address, remote_port, handler=accept) + + try: + yield remote_port + finally: + for sock, chan, thread_handler in zip(sockets, channels, thread_handlers): + sock.close() + chan.close() + thread_handler.thread.join() + thread_handler.raise_if_needed() + transport.cancel_port_forward(remote_bind_address, remote_port) + + +def _forwarder(chan, sock): + # Bidirectionally forward data between a socket and a Paramiko channel. + while True: + read = select.select([sock, chan], [], [])[0] + if sock in read: + data = sock.recv(1024) + if len(data) == 0: + break + chan.send(data) + if chan in read: + data = chan.recv(1024) + if len(data) == 0: + break + sock.send(data) + chan.close() + sock.close() diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/plugin.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/plugin.py new file mode 100644 index 0000000..756a28e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/plugin.py @@ -0,0 +1,171 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Plugin management. +""" + +import os +import tempfile +import subprocess +import sys +import zipfile +from datetime import datetime + +import wagon + +from . import exceptions +from ..utils import process as process_utils + +_IS_WIN = os.name == 'nt' + + +class PluginManager(object): + + def __init__(self, model, plugins_dir): + """ + :param plugins_dir: root directory in which to install plugins + """ + self._model = model + self._plugins_dir = plugins_dir + + def install(self, source): + """ + Install a wagon plugin. + """ + metadata = wagon.show(source) + cls = self._model.plugin.model_cls + + os_props = metadata['build_server_os_properties'] + + plugin = cls( + name=metadata['package_name'], + archive_name=metadata['archive_name'], + supported_platform=metadata['supported_platform'], + supported_py_versions=metadata['supported_python_versions'], + distribution=os_props.get('distribution'), + distribution_release=os_props['distribution_version'], + distribution_version=os_props['distribution_release'], + package_name=metadata['package_name'], + package_version=metadata['package_version'], + package_source=metadata['package_source'], + wheels=metadata['wheels'], + uploaded_at=datetime.now() + ) + if len(self._model.plugin.list(filters={'package_name': plugin.package_name, + 'package_version': plugin.package_version})): + raise exceptions.PluginAlreadyExistsError( + 'Plugin {0}, version {1} already exists'.format(plugin.package_name, + plugin.package_version)) + self._install_wagon(source=source, prefix=self.get_plugin_dir(plugin)) + self._model.plugin.put(plugin) + return plugin + + def load_plugin(self, plugin, env=None): + """ + Load the plugin into an environment. + + Loading the plugin means the plugin's code and binaries paths will be appended to the + environment's ``PATH`` and ``PYTHONPATH``, thereby allowing usage of the plugin. + + :param plugin: plugin to load + :param env: environment to load the plugin into; If ``None``, :obj:`os.environ` will be + used + """ + env = env or os.environ + plugin_dir = self.get_plugin_dir(plugin) + + # Update PATH environment variable to include plugin's bin dir + bin_dir = 'Scripts' if _IS_WIN else 'bin' + process_utils.append_to_path(os.path.join(plugin_dir, bin_dir), env=env) + + # Update PYTHONPATH environment variable to include plugin's site-packages + # directories + if _IS_WIN: + pythonpath_dirs = [os.path.join(plugin_dir, 'Lib', 'site-packages')] + else: + # In some linux environments, there will be both a lib and a lib64 directory + # with the latter, containing compiled packages. + pythonpath_dirs = [os.path.join( + plugin_dir, 'lib{0}'.format(b), + 'python{0}.{1}'.format(sys.version_info[0], sys.version_info[1]), + 'site-packages') for b in ('', '64')] + + process_utils.append_to_pythonpath(*pythonpath_dirs, env=env) + + def get_plugin_dir(self, plugin): + return os.path.join( + self._plugins_dir, + '{0}-{1}'.format(plugin.package_name, plugin.package_version)) + + @staticmethod + def validate_plugin(source): + """ + Validate a plugin archive. + + A valid plugin is a `wagon `__ in the zip format + (suffix may also be ``.wgn``). + """ + if not zipfile.is_zipfile(source): + raise exceptions.InvalidPluginError( + 'Archive {0} is of an unsupported type. Only ' + 'zip/wgn is allowed'.format(source)) + with zipfile.ZipFile(source, 'r') as zip_file: + infos = zip_file.infolist() + try: + package_name = infos[0].filename[:infos[0].filename.index('/')] + package_json_path = "{0}/{1}".format(package_name, 'package.json') + zip_file.getinfo(package_json_path) + except (KeyError, ValueError, IndexError): + raise exceptions.InvalidPluginError( + 'Failed to validate plugin {0} ' + '(package.json was not found in archive)'.format(source)) + + def _install_wagon(self, source, prefix): + pip_freeze_output = self._pip_freeze() + file_descriptor, constraint_path = tempfile.mkstemp(prefix='constraint-', suffix='.txt') + os.close(file_descriptor) + try: + with open(constraint_path, 'wb') as constraint: + constraint.write(pip_freeze_output) + # Install the provided wagon. + # * The --prefix install_arg will cause the plugin to be installed under + # plugins_dir/{package_name}-{package_version}, So different plugins don't step on + # each other and don't interfere with the current virtualenv + # * The --constraint flag points a file containing the output of ``pip freeze``. + # It is required, to handle cases where plugins depend on some python package with + # a different version than the one installed in the current virtualenv. Without this + # flag, the existing package will be **removed** from the parent virtualenv and the + # new package will be installed under prefix. With the flag, the existing version will + # remain, and the version requested by the plugin will be ignored. + wagon.install( + source=source, + install_args='--prefix="{prefix}" --constraint="{constraint}"'.format( + prefix=prefix, + constraint=constraint.name), + venv=os.environ.get('VIRTUAL_ENV')) + finally: + os.remove(constraint_path) + + @staticmethod + def _pip_freeze(): + """Run pip freeze in current environment and return the output""" + bin_dir = 'Scripts' if os.name == 'nt' else 'bin' + pip_path = os.path.join(sys.prefix, bin_dir, + 'pip{0}'.format('.exe' if os.name == 'nt' else '')) + pip_freeze = subprocess.Popen([pip_path, 'freeze'], stdout=subprocess.PIPE) + pip_freeze_output, _ = pip_freeze.communicate() + assert not pip_freeze.poll() + return pip_freeze_output diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/__init__.py new file mode 100644 index 0000000..099a950 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 .topology import Topology diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/common.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/common.py new file mode 100644 index 0000000..5124557 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/common.py @@ -0,0 +1,69 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 HandlerBase(object): + def __init__(self, topology, model): + self._topology = topology + self._model = model + + def coerce(self, **kwargs): + raise NotImplementedError + + def _coerce(self, *models, **kwargs): + for template in models: + self._topology.coerce(template, **kwargs) + + def validate(self, **kwargs): + raise NotImplementedError + + def _validate(self, *models, **kwargs): + for template in models: + self._topology.validate(template, **kwargs) + + def dump(self, out_stream): + raise NotImplementedError + + +class TemplateHandlerBase(HandlerBase): + """ + Base handler for template based models + """ + + def instantiate(self, instance_cls, **kwargs): + raise NotImplementedError + + +class InstanceHandlerBase(HandlerBase): + """ + Base handler for instance based models + + """ + def validate(self, **kwargs): + raise NotImplementedError + + def coerce(self, **kwargs): + raise NotImplementedError + + def dump(self, out_stream): + raise NotImplementedError + + +class ActorHandlerBase(HandlerBase): + """ + Base handler for any model which has (or contains a field which references) an operation + """ + def configure_operations(self): + raise NotImplementedError diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/instance_handler.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/instance_handler.py new file mode 100644 index 0000000..51f26c6 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/instance_handler.py @@ -0,0 +1,671 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ... parser.modeling import context +from ... modeling import models, functions +from ... utils import formatting +from .. import execution_plugin +from .. import decorators +from . import common + + +class Artifact(common.InstanceHandlerBase): + + def coerce(self, **kwargs): + self._topology.coerce(self._model.properties, **kwargs) + + def validate(self, **kwargs): + self._topology.validate(self._model.properties, **kwargs) + + def dump(self, out_stream): + with out_stream.indent(): + out_stream.write(out_stream.node_style(self._model.name)) + out_stream.write(out_stream.meta_style(self._model.description)) + with out_stream.indent(): + out_stream.write('Artifact type: {0}'.format(out_stream.type_style( + self._model.type.name))) + out_stream.write('Source path: {0}'.format( + out_stream.literal_style(self._model.source_path))) + if self._model.target_path is not None: + out_stream.write('Target path: {0}'.format( + out_stream.literal_style(self._model.target_path))) + if self._model.repository_url is not None: + out_stream.write('Repository URL: {0}'.format( + out_stream.literal_style(self._model.repository_url))) + if self._model.repository_credential: + out_stream.write('Repository credential: {0}'.format( + out_stream.literal_style(self._model.repository_credential))) + self._topology.dump(self._model.properties, out_stream, title='Properties') + + +class Capability(common.InstanceHandlerBase): + def coerce(self, **kwargs): + self._topology.coerce(self._model.properties, **kwargs) + + def validate(self, **kwargs): + self._topology.validate(self._model.properties, **kwargs) + + def dump(self, out_stream): + out_stream.write(out_stream.node_style(self._model.name)) + with out_stream.indent(): + out_stream.write('Type: {0}'.format(out_stream.type_style(self._model.type.name))) + out_stream.write('Occurrences: {0:d} ({1:d}{2})'.format( + self._model.occurrences, + self._model.min_occurrences or 0, + ' to {0:d}'.format(self._model.max_occurrences) + if self._model.max_occurrences is not None + else ' or more')) + self._topology.dump(self._model.properties, out_stream, title='Properties') + + +class Group(common.ActorHandlerBase): + + def coerce(self, **kwargs): + self._coerce(self._model.properties, self._model.interfaces, **kwargs) + + def validate(self, **kwargs): + self._validate(self._model.properties, + self._model.interfaces, + **kwargs) + + def dump(self, out_stream): + out_stream.write('Group: {0}'.format(out_stream.node_style(self._model.name))) + with out_stream.indent(): + out_stream.write('Type: {0}'.format(out_stream.type_style(self._model.type.name))) + self._topology.dump(self._model.properties, out_stream, title='Properties') + self._topology.dump(self._model.interfaces, out_stream, title='Interfaces') + if self._model.nodes: + out_stream.write('Member nodes:') + with out_stream.indent(): + for node in self._model.nodes: + out_stream.write(out_stream.node_style(node.name)) + + def configure_operations(self): + for interface in self._model.interfaces.values(): + self._topology.configure_operations(interface) + + +class Interface(common.ActorHandlerBase): + def coerce(self, **kwargs): + self._coerce(self._model.inputs, self._model.operations, **kwargs) + + def validate(self, **kwargs): + self._validate(self._model.inputs, + self._model.operations, + **kwargs) + + def dump(self, out_stream): + out_stream.write(out_stream.node_style(self._model.name)) + if self._model.description: + out_stream.write(out_stream.meta_style(self._model.description)) + with out_stream.indent(): + out_stream.write('Interface type: {0}'.format( + out_stream.type_style(self._model.type.name))) + self._topology.dump(self._model.inputs, out_stream, title='Inputs') + self._topology.dump(self._model.operations, out_stream, title='Operations') + + def configure_operations(self): + for operation in self._model.operations.values(): + self._topology.configure_operations(operation) + + +class Node(common.ActorHandlerBase): + def coerce(self, **kwargs): + self._coerce(self._model.properties, + self._model.attributes, + self._model.interfaces, + self._model.artifacts, + self._model.capabilities, + self._model.outbound_relationships, + **kwargs) + + def validate(self, **kwargs): + if len(self._model.name) > context.ID_MAX_LENGTH: + self._topology.report( + '"{0}" has an ID longer than the limit of {1:d} characters: {2:d}'.format( + self._model.name, context.ID_MAX_LENGTH, len(self._model.name)), + level=self._topology.Issue.BETWEEN_INSTANCES) + + self._validate(self._model.properties, + self._model.attributes, + self._model.interfaces, + self._model.artifacts, + self._model.capabilities, + self._model.outbound_relationships) + + def dump(self, out_stream): + out_stream.write('Node: {0}'.format(out_stream.node_style(self._model.name))) + with out_stream.indent(): + out_stream.write('Type: {0}'.format(out_stream.type_style(self._model.type.name))) + out_stream.write('Template: {0}'.format( + out_stream.node_style(self._model.node_template.name))) + self._topology.dump(self._model.properties, out_stream, title='Properties') + self._topology.dump(self._model.attributes, out_stream, title='Attributes') + self._topology.dump(self._model.interfaces, out_stream, title='Interfaces') + self._topology.dump(self._model.artifacts, out_stream, title='Artifacts') + self._topology.dump(self._model.capabilities, out_stream, title='Capabilities') + self._topology.dump(self._model.outbound_relationships, out_stream, + title='Relationships') + + def configure_operations(self): + for interface in self._model.interfaces.values(): + self._topology.configure_operations(interface) + for relationship in self._model.outbound_relationships: + self._topology.configure_operations(relationship) + + def validate_capabilities(self): + satisfied = False + for capability in self._model.capabilities.itervalues(): + if not capability.has_enough_relationships: + self._topology.report( + 'capability "{0}" of node "{1}" requires at least {2:d} ' + 'relationships but has {3:d}'.format(capability.name, + self._model.name, + capability.min_occurrences, + capability.occurrences), + level=self._topology.Issue.BETWEEN_INSTANCES) + satisfied = False + return satisfied + + def satisfy_requirements(self): + satisfied = True + for requirement_template in self._model.node_template.requirement_templates: + + # Since we try and satisfy requirements, which are node template bound, and use that + # information in the creation of the relationship, Some requirements may have been + # satisfied by a previous run on that node template. + # The entire mechanism of satisfying requirements needs to be refactored. + if any(rel.requirement_template == requirement_template + for rel in self._model.outbound_relationships): + continue + + # Find target template + target_node_template, target_node_capability = self._find_target(requirement_template) + if target_node_template is not None: + satisfied = self._satisfy_capability( + target_node_capability, target_node_template, requirement_template) + else: + self._topology.report('requirement "{0}" of node "{1}" has no target node template'. + format(requirement_template.name, self._model.name), + level=self._topology.Issue.BETWEEN_INSTANCES) + satisfied = False + return satisfied + + def _satisfy_capability(self, target_node_capability, target_node_template, + requirement_template): + # Find target nodes + target_nodes = target_node_template.nodes + if target_nodes: + target_node = None + target_capability = None + + if target_node_capability is not None: + # Relate to the first target node that has capacity + for node in target_nodes: + a_target_capability = node.capabilities.get(target_node_capability.name) + if a_target_capability.relate(): + target_node = node + target_capability = a_target_capability + break + else: + # Use first target node + target_node = target_nodes[0] + + if target_node is not None: + if requirement_template.relationship_template is not None: + relationship_model = self._topology.instantiate( + requirement_template.relationship_template) + else: + relationship_model = models.Relationship() + relationship_model.name = requirement_template.name + relationship_model.requirement_template = requirement_template + relationship_model.target_node = target_node + relationship_model.target_capability = target_capability + self._model.outbound_relationships.append(relationship_model) + return True + else: + self._topology.report( + 'requirement "{0}" of node "{1}" targets node ' + 'template "{2}" but its instantiated nodes do not ' + 'have enough capacity'.format( + requirement_template.name, self._model.name, target_node_template.name), + level=self._topology.Issue.BETWEEN_INSTANCES) + return False + else: + self._topology.report( + 'requirement "{0}" of node "{1}" targets node template ' + '"{2}" but it has no instantiated nodes'.format( + requirement_template.name, self._model.name, target_node_template.name), + level=self._topology.Issue.BETWEEN_INSTANCES) + return False + + def _find_target(self, requirement_template): + # We might already have a specific node template from the requirement template, so + # we'll just verify it + if requirement_template.target_node_template is not None: + if not self._model.node_template.is_target_node_template_valid( + requirement_template.target_node_template): + self._topology.report( + 'requirement "{0}" of node template "{1}" is for node ' + 'template "{2}" but it does not match constraints'.format( + requirement_template.name, + requirement_template.target_node_template.name, + self._model.node_template.name), + level=self._topology.Issue.BETWEEN_TYPES) + if (requirement_template.target_capability_type is not None or + requirement_template.target_capability_name is not None): + target_node_capability = self._get_capability(requirement_template) + if target_node_capability is None: + return None, None + else: + target_node_capability = None + + return requirement_template.target_node_template, target_node_capability + + # Find first node that matches the type + elif requirement_template.target_node_type is not None: + for target_node_template in \ + self._model.node_template.service_template.node_templates.itervalues(): + if requirement_template.target_node_type.get_descendant( + target_node_template.type.name) is None: + continue + + if not self._model.node_template.is_target_node_template_valid( + target_node_template): + continue + + target_node_capability = self._get_capability(requirement_template, + target_node_template) + + if target_node_capability is None: + continue + + return target_node_template, target_node_capability + + # Find the first node which has a capability of the required type + elif requirement_template.target_capability_type is not None: + for target_node_template in \ + self._model.node_template.service_template.node_templates.itervalues(): + target_node_capability = \ + self._get_capability(requirement_template, target_node_template) + if target_node_capability: + return target_node_template, target_node_capability + + return None, None + + def _get_capability(self, requirement_template, target_node_template=None): + target_node_template = target_node_template or requirement_template.target_node_template + + for capability_template in target_node_template.capability_templates.values(): + if self._satisfies_requirement( + capability_template, requirement_template, target_node_template): + return capability_template + + return None + + def _satisfies_requirement( + self, capability_template, requirement_template, target_node_template): + # Do we match the required capability type? + if (requirement_template.target_capability_type and + requirement_template.target_capability_type.get_descendant( + capability_template.type.name) is None): + return False + + # Are we in valid_source_node_types? + if capability_template.valid_source_node_types: + for valid_source_node_type in capability_template.valid_source_node_types: + if valid_source_node_type.get_descendant( + self._model.node_template.type.name) is None: + return False + + # Apply requirement constraints + if requirement_template.target_node_template_constraints: + for node_template_constraint in requirement_template.target_node_template_constraints: + if not node_template_constraint.matches( + self._model.node_template, target_node_template): + return False + + return True + + +class Operation(common.ActorHandlerBase): + def coerce(self, **kwargs): + self._coerce(self._model.inputs, + self._model.configurations, + self._model.arguments, + **kwargs) + + def validate(self, **kwargs): + self._validate(self._model.inputs, + self._model.configurations, + self._model.arguments, + **kwargs) + + def dump(self, out_stream): + out_stream.write(out_stream.node_style(self._model.name)) + if self._model.description: + out_stream.write(out_stream.meta_style(self._model.description)) + with out_stream.indent(): + if self._model.implementation is not None: + out_stream.write('Implementation: {0}'.format( + out_stream.literal_style(self._model.implementation))) + if self._model.dependencies: + out_stream.write( + 'Dependencies: {0}'.format(', '.join((str(out_stream.literal_style(v)) + for v in self._model.dependencies)))) + self._topology.dump(self._model.inputs, out_stream, title='Inputs') + if self._model.executor is not None: + out_stream.write('Executor: {0}'.format(out_stream.literal_style( + self._model.executor))) + if self._model.max_attempts is not None: + out_stream.write('Max attempts: {0}'.format(out_stream.literal_style( + self._model.max_attempts))) + if self._model.retry_interval is not None: + out_stream.write('Retry interval: {0}'.format( + out_stream.literal_style(self._model.retry_interval))) + if self._model.plugin is not None: + out_stream.write('Plugin: {0}'.format( + out_stream.literal_style(self._model.plugin.name))) + self._topology.dump(self._model.configurations, out_stream, title='Configuration') + if self._model.function is not None: + out_stream.write('Function: {0}'.format(out_stream.literal_style( + self._model.function))) + self._topology.dump(self._model.arguments, out_stream, title='Arguments') + + def configure_operations(self): + if self._model.implementation is None and self._model.function is None: + return + + if (self._model.interface is not None and + self._model.plugin is None and + self._model.function is None): + # ("interface" is None for workflow operations, which do not currently use "plugin") + # The default (None) plugin is the execution plugin + execution_plugin.instantiation.configure_operation(self._model, self._topology) + else: + # In the future plugins may be able to add their own "configure_operation" hook that + # can validate the configuration and otherwise create specially derived arguments. For + # now, we just send all configuration parameters as arguments without validation. + for key, conf in self._model.configurations.items(): + self._model.arguments[key] = self._topology.instantiate(conf.as_argument()) + + if self._model.interface is not None: + # Send all interface inputs as extra arguments + # ("interface" is None for workflow operations) + # Note that they will override existing arguments of the same names + for key, input in self._model.interface.inputs.items(): + self._model.arguments[key] = self._topology.instantiate(input.as_argument()) + + # Send all inputs as extra arguments + # Note that they will override existing arguments of the same names + for key, input in self._model.inputs.items(): + self._model.arguments[key] = self._topology.instantiate(input.as_argument()) + + # Check for reserved arguments + used_reserved_names = set(decorators.OPERATION_DECORATOR_RESERVED_ARGUMENTS).intersection( + self._model.arguments.keys()) + if used_reserved_names: + self._topology.report( + 'using reserved arguments in operation "{0}": {1}'.format( + self._model.name, formatting.string_list_as_string(used_reserved_names)), + level=self._topology.Issue.EXTERNAL) + + +class Policy(common.InstanceHandlerBase): + def coerce(self, **kwargs): + self._topology.coerce(self._model.properties, **kwargs) + + def validate(self, **kwargs): + self._topology.validate(self._model.properties, **kwargs) + + def dump(self, out_stream): + out_stream.write('Policy: {0}'.format(out_stream.node_style(self._model.name))) + with out_stream.indent(): + out_stream.write('Type: {0}'.format(out_stream.type_style(self._model.type.name))) + self._topology.dump(self._model.properties, out_stream, title='Properties') + if self._model.nodes: + out_stream.write('Target nodes:') + with out_stream.indent(): + for node in self._model.nodes: + out_stream.write(out_stream.node_style(node.name)) + if self._model.groups: + out_stream.write('Target groups:') + with out_stream.indent(): + for group in self._model.groups: + out_stream.write(out_stream.node_style(group.name)) + + +class Relationship(common.ActorHandlerBase): + def coerce(self, **kwargs): + self._coerce(self._model.properties, + self._model.interfaces, + **kwargs) + + def validate(self, **kwargs): + self._validate(self._model.properties, + self._model.interfaces, + **kwargs) + + def dump(self, out_stream): + if self._model.name: + out_stream.write('{0} ->'.format(out_stream.node_style(self._model.name))) + else: + out_stream.write('->') + with out_stream.indent(): + out_stream.write('Node: {0}'.format(out_stream.node_style( + self._model.target_node.name))) + if self._model.target_capability: + out_stream.write('Capability: {0}'.format(out_stream.node_style( + self._model.target_capability.name))) + if self._model.type is not None: + out_stream.write('Relationship type: {0}'.format( + out_stream.type_style(self._model.type.name))) + if (self._model.relationship_template is not None and + self._model.relationship_template.name): + out_stream.write('Relationship template: {0}'.format( + out_stream.node_style(self._model.relationship_template.name))) + self._topology.dump(self._model.properties, out_stream, title='Properties') + self._topology.dump(self._model.interfaces, out_stream, title='Interfaces') + + def configure_operations(self): + for interface in self._model.interfaces.values(): + self._topology.configure_operations(interface) + + +class Service(common.ActorHandlerBase): + def coerce(self, **kwargs): + self._coerce(self._model.meta_data, + self._model.nodes, + self._model.groups, + self._model.policies, + self._model.substitution, + self._model.inputs, + self._model.outputs, + self._model.workflows, + **kwargs) + + def validate(self, **kwargs): + self._validate(self._model.meta_data, + self._model.nodes, + self._model.groups, + self._model.policies, + self._model.substitution, + self._model.inputs, + self._model.outputs, + self._model.workflows, + **kwargs) + + def dump(self, out_stream): + if self._model.description is not None: + out_stream.write(out_stream.meta_style(self._model.description)) + self._topology.dump(self._model.meta_data, out_stream, title='Metadata') + self._topology.dump(self._model.nodes, out_stream) + self._topology.dump(self._model.groups, out_stream) + self._topology.dump(self._model.policies, out_stream) + self._topology.dump(self._model.substitution, out_stream) + self._topology.dump(self._model.inputs, out_stream, title='Inputs') + self._topology.dump(self._model.outputs, out_stream, title='Outputs') + self._topology.dump(self._model.workflows, out_stream, title='Workflows') + + def configure_operations(self): + for node in self._model.nodes.itervalues(): + self._topology.configure_operations(node) + for group in self._model.groups.itervalues(): + self._topology.configure_operations(group) + for operation in self._model.workflows.itervalues(): + self._topology.configure_operations(operation) + + def validate_capabilities(self): + satisfied = True + for node in self._model.nodes.values(): + if not self._topology.validate_capabilities(node): + satisfied = False + return satisfied + + def satisfy_requirements(self): + return all(self._topology.satisfy_requirements(node) + for node in self._model.nodes.values()) + + +class Substitution(common.InstanceHandlerBase): + def coerce(self, **kwargs): + self._topology.coerce(self._model.mappings, **kwargs) + + def validate(self, **kwargs): + self._topology.validate(self._model.mappings, **kwargs) + + def dump(self, out_stream): + out_stream.write('Substitution:') + with out_stream.indent(): + out_stream.write('Node type: {0}'.format(out_stream.type_style( + self._model.node_type.name))) + self._topology.dump(self._model.mappings, out_stream, title='Mappings') + + +class SubstitutionMapping(common.InstanceHandlerBase): + + def coerce(self, **kwargs): + pass + + def validate(self, **_): + if (self._model.capability is None) and (self._model.requirement_template is None): + self._topology.report( + 'mapping "{0}" refers to neither capability nor a requirement' + ' in node: {1}'.format( + self._model.name, formatting.safe_repr(self._model.node_style.name)), + level=self._topology.Issue.BETWEEN_TYPES) + + def dump(self, out_stream): + if self._model.capability is not None: + out_stream.write('{0} -> {1}.{2}'.format( + out_stream.node_style(self._model.name), + out_stream.node_style(self._model.capability.node.name), + out_stream.node_style(self._model.capability.name))) + else: + out_stream.write('{0} -> {1}.{2}'.format( + out_stream.node_style(self._model.name), + out_stream.node_style(self._model.node.name), + out_stream.node_style(self._model.requirement_template.name))) + + +class Metadata(common.InstanceHandlerBase): + + def dump(self, out_stream): + out_stream.write('{0}: {1}'.format( + out_stream.property_style(self._model.name), + out_stream.literal_style(self._model.value))) + + def coerce(self, **_): + pass + + def instantiate(self, instance_cls): + return instance_cls(name=self._model.name, value=self._model.value) + + def validate(self): + pass + + +class _Parameter(common.InstanceHandlerBase): + + def dump(self, out_stream): + if self._model.type_name is not None: + out_stream.write('{0}: {1} ({2})'.format( + out_stream.property_style(self._model.name), + out_stream.literal_style(formatting.as_raw(self._model.value)), + out_stream.type_style(self._model.type_name))) + else: + out_stream.write('{0}: {1}'.format( + out_stream.property_style(self._model.name), + out_stream.literal_style(formatting.as_raw(self._model.value)))) + if self._model.description: + out_stream.write(out_stream.meta_style(self._model.description)) + + def instantiate(self, instance_cls, **kwargs): + return instance_cls( + name=self._model.name, # pylint: disable=unexpected-keyword-arg + type_name=self._model.type_name, + _value=self._model._value, + description=self._model.description + ) + + def validate(self): + pass + + def coerce(self, report_issues): # pylint: disable=arguments-differ + value = self._model._value + if value is not None: + evaluation = functions.evaluate(value, self._model, report_issues) + if (evaluation is not None) and evaluation.final: + # A final evaluation can safely replace the existing value + self._model._value = evaluation.value + + +class Attribute(_Parameter): + pass + + +class Input(_Parameter): + pass + + +class Output(_Parameter): + pass + + +class Argument(_Parameter): + pass + + +class Property(_Parameter): + pass + + +class Configuration(_Parameter): + pass + + +class Type(common.InstanceHandlerBase): + def coerce(self, **_): + pass + + def dump(self, out_stream): + if self._model.name: + out_stream.write(out_stream.type_style(self._model.name)) + with out_stream.indent(): + for child in self._model.children: + self._topology.dump(child, out_stream) + + def validate(self, **kwargs): + pass diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/template_handler.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/template_handler.py new file mode 100644 index 0000000..dda5418 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/template_handler.py @@ -0,0 +1,609 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 datetime import datetime + +from ...utils import ( + formatting, + versions +) +from ...modeling import utils as modeling_utils +from . import utils, common + + +class ServiceTemplate(common.TemplateHandlerBase): + def dump(self, out_stream): + if self._model.description is not None: + out_stream.write(out_stream.meta_style(self._model.description)) + self._topology.dump(self._model.meta_data, out_stream, title='Metadata') + self._topology.dump(self._model.node_templates, out_stream) + self._topology.dump(self._model.group_templates, out_stream) + self._topology.dump(self._model.policy_templates, out_stream) + self._topology.dump(self._model.substitution_template, out_stream) + self._topology.dump(self._model.inputs, out_stream, title='Inputs') + self._topology.dump(self._model.outputs, out_stream, title='Outputs') + self._topology.dump(self._model.workflow_templates, out_stream, title='Workflow templates') + + def coerce(self, **kwargs): + self._coerce(self._model.meta_data, + self._model.node_templates, + self._model.group_templates, + self._model.policy_templates, + self._model.substitution_template, + self._model.inputs, + self._model.outputs, + self._model.workflow_templates, + **kwargs) + + def instantiate(self, instance_cls, inputs=None, plugins=None): # pylint: disable=arguments-differ + now = datetime.now() + + # modeling_utils.validate_no_undeclared_inputs( + # declared_inputs=self._model.inputs, supplied_inputs=inputs or {}) + modeling_utils.validate_required_inputs_are_supplied( + declared_inputs=self._model.inputs, supplied_inputs=inputs or {}) + + service = instance_cls( + created_at=now, + updated_at=now, + description=utils.deepcopy_with_locators(self._model.description), + service_template=self._model, + inputs=modeling_utils.merge_parameter_values(inputs, self._model.inputs) + ) + + for plugin_specification in self._model.plugin_specifications.itervalues(): + if plugin_specification.enabled and plugins: + if self._resolve_plugin_specification(plugin_specification, plugins): + plugin = plugin_specification.plugin + service.plugins[plugin.name] = plugin + else: + self._topology.report('specified plugin not found: {0}'.format( + plugin_specification.name), level=self._topology.Issue.EXTERNAL) + service.meta_data = self._topology.instantiate(self._model.meta_data) + + for node_template in self._model.node_templates.itervalues(): + for _ in range(self._scaling(node_template)['default_instances']): + node = self._topology.instantiate(node_template) + service.nodes[node.name] = node + + service.groups = self._topology.instantiate(self._model.group_templates) + service.policies = self._topology.instantiate(self._model.policy_templates) + service.workflows = self._topology.instantiate(self._model.workflow_templates) + service.substitution = self._topology.instantiate(self._model.substitution_template) + service.outputs = self._topology.instantiate(self._model.outputs) + + return service + + @staticmethod + def _resolve_plugin_specification(plugin_specification, plugins): + matching_plugins = [] + if plugins: + for plugin in plugins: + if (plugin.name == plugin_specification.name and + (plugin_specification.version is None or + versions.VersionString(plugin.package_version) >= + plugin_specification.version) + ): + matching_plugins.append(plugin) + plugin_specification.plugin = None + if matching_plugins: + # Return highest version of plugin + plugin_specification.plugin = \ + max(matching_plugins, + key=lambda plugin: versions.VersionString(plugin.package_version).key) + return plugin_specification.plugin is not None + + def _scaling(self, node_template): + scaling = node_template.scaling + + if any([scaling['min_instances'] < 0, + scaling['max_instances'] < scaling['min_instances'], + scaling['max_instances'] < 0, + + scaling['default_instances'] < 0, + scaling['default_instances'] < scaling['min_instances'], + scaling['default_instances'] > scaling['max_instances'] + ]): + self._topology.report( + 'invalid scaling parameters for node template "{0}": min={min_instances}, max=' + '{max_instances}, default={default_instances}'.format(self._model.name, **scaling), + level=self._topology.Issue.BETWEEN_TYPES) + + return scaling + + def validate(self, **kwargs): + self._validate( + self._model.meta_data, + self._model.node_templates, + self._model.group_templates, + self._model.policy_templates, + self._model.substitution_template, + self._model.inputs, + self._model.outputs, + self._model.workflow_templates, + self._model.node_types, + self._model.group_types, + self._model.policy_types, + self._model.relationship_types, + self._model.capability_types, + self._model.interface_types, + self._model.artifact_types, + **kwargs + ) + + +class ArtifactTemplate(common.TemplateHandlerBase): + def dump(self, out_stream): + out_stream.write(out_stream.node_style(self._model.name)) + if self._model.description: + out_stream.write(out_stream.meta_style(self._model.description)) + with out_stream.indent(): + out_stream.write('Artifact type: {0}'.format(out_stream.type_style( + self._model.type.name))) + out_stream.write('Source path: {0}'.format(out_stream.literal_style( + self._model.source_path))) + if self._model.target_path is not None: + out_stream.write('Target path: {0}'.format(out_stream.literal_style( + self._model.target_path))) + if self._model.repository_url is not None: + out_stream.write('Repository URL: {0}'.format( + out_stream.literal_style(self._model.repository_url))) + if self._model.repository_credential: + out_stream.write('Repository credential: {0}'.format( + out_stream.literal_style(self._model.repository_credential))) + self._topology.dump(self._model.properties, out_stream, title='Properties') + + def coerce(self, **kwargs): + self._topology.coerce(self._model.properties, **kwargs) + + def instantiate(self, instance_cls, **_): + return instance_cls( + name=self._model.name, + type=self._model.type, + description=utils.deepcopy_with_locators(self._model.description), + source_path=self._model.source_path, + target_path=self._model.target_path, + repository_url=self._model.repository_url, + repository_credential=self._model.repository_credential, + artifact_template=self._model) + + def validate(self, **kwargs): + self._topology.validate(self._model.properties, **kwargs) + + +class CapabilityTemplate(common.TemplateHandlerBase): + def dump(self, out_stream): + out_stream.write(out_stream.node_style(self._model.name)) + if self._model.description: + out_stream.write(out_stream.meta_style(self._model.description)) + with out_stream.indent(): + out_stream.write('Type: {0}'.format(out_stream.type_style(self._model.type.name))) + out_stream.write( + 'Occurrences: {0:d}{1}'.format( + self._model.min_occurrences or 0, + ' to {0:d}'.format(self._model.max_occurrences) + if self._model.max_occurrences is not None + else ' or more')) + if self._model.valid_source_node_types: + out_stream.write('Valid source node types: {0}'.format( + ', '.join((str(out_stream.type_style(v.name)) + for v in self._model.valid_source_node_types)))) + self._topology.dump(self._model.properties, out_stream, title='Properties') + + def coerce(self, **kwargs): + self._topology.coerce(self._model.properties, **kwargs) + + def instantiate(self, instance_cls, **_): + capability = instance_cls( + name=self._model.name, + type=self._model.type, + min_occurrences=self._model.min_occurrences, + max_occurrences=self._model.max_occurrences, + occurrences=0, + capability_template=self._model) + capability.properties = self._topology.instantiate(self._model.properties) + return capability + + def validate(self, **kwargs): + self._topology.validate(self._model.properties, **kwargs) + + +class RequirementTemplate(common.TemplateHandlerBase): + def dump(self, out_stream): + if self._model.name: + out_stream.write(out_stream.node_style(self._model.name)) + else: + out_stream.write('Requirement:') + with out_stream.indent(): + if self._model.target_node_type is not None: + out_stream.write('Target node type: {0}'.format( + out_stream.type_style(self._model.target_node_type.name))) + elif self._model.target_node_template is not None: + out_stream.write('Target node template: {0}'.format( + out_stream.node_style(self._model.target_node_template.name))) + if self._model.target_capability_type is not None: + out_stream.write('Target capability type: {0}'.format( + out_stream.type_style(self._model.target_capability_type.name))) + elif self._model.target_capability_name is not None: + out_stream.write('Target capability name: {0}'.format( + out_stream.node_style(self._model.target_capability_name))) + if self._model.target_node_template_constraints: + out_stream.write('Target node template constraints:') + with out_stream.indent(): + for constraint in self._model.target_node_template_constraints: + out_stream.write(out_stream.literal_style(constraint)) + if self._model.relationship_template: + out_stream.write('Relationship:') + with out_stream.indent(): + self._topology.dump(self._model.relationship_template, out_stream) + + def coerce(self, **kwargs): + self._topology.coerce(self._model.relationship_template, **kwargs) + + def instantiate(self, instance_cls, **_): + pass + + def validate(self, **kwargs): + self._topology.validate(self._model.relationship_template, **kwargs) + + +class GroupTemplate(common.TemplateHandlerBase): + def dump(self, out_stream): + out_stream.write('Group template: {0}'.format(out_stream.node_style(self._model.name))) + if self._model.description: + out_stream.write(out_stream.meta_style(self._model.description)) + with out_stream.indent(): + out_stream.write('Type: {0}'.format(out_stream.type_style(self._model.type.name))) + self._topology.dump(self._model.properties, out_stream, title='Properties') + self._topology.dump(self._model.interface_templates, out_stream, + title='Interface Templates') + if self._model.node_templates: + out_stream.write('Member node templates: {0}'.format(', '.join( + (str(out_stream.node_style(v.name)) for v in self._model.node_templates)))) + + def coerce(self, **kwargs): + self._coerce(self._model.properties, + self._model.interface_templates, + **kwargs) + + def instantiate(self, instance_cls, **_): + group = instance_cls( + name=self._model.name, + type=self._model.type, + description=utils.deepcopy_with_locators(self._model.description), + group_template=self._model) + group.properties = self._topology.instantiate(self._model.properties) + group.interfaces = self._topology.instantiate(self._model.interface_templates) + if self._model.node_templates: + for node_template in self._model.node_templates: + group.nodes += node_template.nodes + return group + + def validate(self, **kwargs): + self._validate(self._model.properties, + self._model.interface_templates, + **kwargs) + + +class InterfaceTemplate(common.TemplateHandlerBase): + def dump(self, out_stream): + out_stream.write(out_stream.node_style(self._model.name)) + if self._model.description: + out_stream.write(out_stream.meta_style(self._model.description)) + with out_stream.indent(): + out_stream.write('Interface type: {0}'.format(out_stream.type_style( + self._model.type.name))) + self._topology.dump(self._model.inputs, out_stream, title='Inputs') + self._topology.dump(self._model.operation_templates, out_stream, + title='Operation templates') + + def coerce(self, **kwargs): + self._coerce(self._model.inputs, + self._model.operation_templates, + **kwargs) + + def instantiate(self, instance_cls, **_): + interface = instance_cls( + name=self._model.name, + type=self._model.type, + description=utils.deepcopy_with_locators(self._model.description), + interface_template=self._model) + interface.inputs = self._topology.instantiate(self._model.inputs) + interface.operations = self._topology.instantiate(self._model.operation_templates) + return interface + + def validate(self, **kwargs): + self._validate(self._model.inputs, + self._model.operation_templates, + **kwargs) + + +class NodeTemplate(common.TemplateHandlerBase): + def dump(self, out_stream): + out_stream.write('Node template: {0}'.format(out_stream.node_style(self._model.name))) + with out_stream.indent(): + if self._model.description: + out_stream.write(out_stream.meta_style(self._model.description)) + out_stream.write('Type: {0}'.format(out_stream.type_style(self._model.type.name))) + self._topology.dump(self._model.properties, out_stream, title='Properties') + self._topology.dump(self._model.attributes, out_stream, title='Attributes') + self._topology.dump( + self._model.interface_templates, out_stream, title='Interface Templates') + self._topology.dump( + self._model.artifact_templates, out_stream, title='Artifact Templates') + self._topology.dump( + self._model.capability_templates, out_stream, title='Capability Templates') + self._topology.dump( + self._model.requirement_templates, out_stream, title='Requirement Templates') + + def coerce(self, **kwargs): + self._coerce(self._model.properties, + self._model.attributes, + self._model.interface_templates, + self._model.artifact_templates, + self._model.capability_templates, + self._model.requirement_templates, + **kwargs) + + def instantiate(self, instance_cls, **_): + node = instance_cls( + name=self._model._next_name, + type=self._model.type, + description=utils.deepcopy_with_locators(self._model.description), + node_template=self._model + ) + + node.properties = self._topology.instantiate(self._model.properties) + node.attributes = self._topology.instantiate(self._model.attributes) + node.interfaces = self._topology.instantiate(self._model.interface_templates) + node.artifacts = self._topology.instantiate(self._model.artifact_templates) + node.capabilities = self._topology.instantiate(self._model.capability_templates) + + # Default attributes + if 'tosca_name' in node.attributes and node.attributes['tosca_name'].type_name == 'string': + node.attributes['tosca_name'].value = self._model.name + if 'tosca_id' in node.attributes and node.attributes['tosca_id'].type_name == 'string': + node.attributes['tosca_id'].value = node.name + + return node + + def validate(self, **kwargs): + self._validate(self._model.properties, + self._model.attributes, + self._model.interface_templates, + self._model.artifact_templates, + self._model.capability_templates, + self._model.requirement_templates, + **kwargs) + + +class PolicyTemplate(common.TemplateHandlerBase): + def dump(self, out_stream): + out_stream.write('Policy template: {0}'.format(out_stream.node_style(self._model.name))) + if self._model.description: + out_stream.write(out_stream.meta_style(self._model.description)) + with out_stream.indent(): + out_stream.write('Type: {0}'.format(out_stream.type_style(self._model.type.name))) + self._topology.dump(self._model.properties, out_stream, title='Properties') + if self._model.node_templates: + out_stream.write('Target node templates: {0}'.format(', '.join( + (str(out_stream.node_style(v.name)) for v in self._model.node_templates)))) + if self._model.group_templates: + out_stream.write('Target group templates: {0}'.format(', '.join( + (str(out_stream.node_style(v.name)) for v in self._model.group_templates)))) + + def coerce(self, **kwargs): + self._topology.coerce(self._model.properties, **kwargs) + + def instantiate(self, instance_cls, **_): + policy = instance_cls( + name=self._model.name, + type=self._model.type, + description=utils.deepcopy_with_locators(self._model.description), + policy_template=self._model) + + policy.properties = self._topology.instantiate(self._model.properties) + if self._model.node_templates: + for node_template in self._model.node_templates: + policy.nodes += node_template.nodes + if self._model.group_templates: + for group_template in self._model.group_templates: + policy.groups += group_template.groups + return policy + + def validate(self, **kwargs): + self._topology.validate(self._model.properties, **kwargs) + + +class SubstitutionTemplate(common.TemplateHandlerBase): + + def dump(self, out_stream): + out_stream.write('Substitution template:') + with out_stream.indent(): + out_stream.write('Node type: {0}'.format(out_stream.type_style( + self._model.node_type.name))) + self._topology.dump(self._model.mappings, out_stream, title='Mappings') + + def coerce(self, **kwargs): + self._topology.coerce(self._model.mappings, **kwargs) + + def instantiate(self, instance_cls, **_): + return instance_cls(node_type=self._model.node_type, substitution_template=self._model) + + def validate(self, **kwargs): + self._topology.validate(self._model.mappings, **kwargs) + + +class SubstitutionTemplateMapping(common.TemplateHandlerBase): + + def dump(self, out_stream): + if self._model.capability_template is not None: + node_template = self._model.capability_template.node_template + else: + node_template = self._model.requirement_template.node_template + out_stream.write('{0} -> {1}.{2}'.format( + out_stream.node_style(self._model.name), + out_stream.node_style(node_template.name), + out_stream.node_style(self._model.capability_template.name + if self._model.capability_template + else self._model.requirement_template.name))) + + def coerce(self, **_): + pass + + def instantiate(self, instance_cls, **_): + substitution_mapping = instance_cls( + name=self._model.name, + requirement_template=self._model.requirement_template) + + if self._model.capability_template is not None: + node_template = self._model.capability_template.node_template + else: + node_template = self._model.requirement_template.node_template + nodes = node_template.nodes + if len(nodes) == 0: + self._topology.report( + 'mapping "{0}" refers to node template "{1}" but there are no node instances'. + format(self._model.mapped_name, self._model.node_template.name), + level=self._topology.Issue.BETWEEN_INSTANCES) + return None + # The TOSCA spec does not provide a way to choose the node, + # so we will just pick the first one + substitution_mapping.node_style = nodes[0] + if self._model.capability_template: + for a_capability in substitution_mapping.node_style.capabilities.itervalues(): + if a_capability.capability_template.name == \ + self._model.capability_template.name: + substitution_mapping.capability = a_capability + + return substitution_mapping + + def validate(self, **_): + if self._model.capability_template is None and self._model.requirement_template is None: + self._topology.report( + 'mapping "{0}" refers to neither capability nor a requirement ' + 'in node template: {1}'.format( + self._model.name, formatting.safe_repr(self._model.node_template.name)), + level=self._topology.Issue.BETWEEN_TYPES) + + +class RelationshipTemplate(common.TemplateHandlerBase): + def dump(self, out_stream): + if self._model.type is not None: + out_stream.write('Relationship type: {0}'.format(out_stream.type_style( + self._model.type.name))) + else: + out_stream.write('Relationship template: {0}'.format( + out_stream.node_style(self._model.name))) + if self._model.description: + out_stream.write(out_stream.meta_style(self._model.description)) + with out_stream.indent(): + self._topology.dump(self._model.properties, out_stream, title='Properties') + self._topology.dump(self._model.interface_templates, out_stream, + title='Interface Templates') + + def coerce(self, **kwargs): + self._coerce(self._model.properties, self._model.interface_templates, **kwargs) + + def instantiate(self, instance_cls, **_): + relationship = instance_cls( + name=self._model.name, + type=self._model.type, + relationship_template=self._model) + + relationship.properties = self._topology.instantiate(self._model.properties) + relationship.interfaces = self._topology.instantiate(self._model.interface_templates) + return relationship + + def validate(self, **kwargs): + self._validate(self._model.properties, self._model.interface_templates, **kwargs) + + +class OperationTemplate(common.TemplateHandlerBase): + + def dump(self, out_stream): + out_stream.write(out_stream.node_style(self._model.name)) + if self._model.description: + out_stream.write(out_stream.meta_style(self._model.description)) + with out_stream.indent(): + if self._model.implementation is not None: + out_stream.write('Implementation: {0}'.format( + out_stream.literal_style(self._model.implementation))) + if self._model.dependencies: + out_stream.write('Dependencies: {0}'.format(', '.join( + (str(out_stream.literal_style(v)) for v in self._model.dependencies)))) + self._topology.dump(self._model.inputs, out_stream, title='Inputs') + if self._model.executor is not None: + out_stream.write('Executor: {0}'.format( + out_stream.literal_style(self._model.executor))) + if self._model.max_attempts is not None: + out_stream.write('Max attempts: {0}'.format(out_stream.literal_style( + self._model.max_attempts))) + if self._model.retry_interval is not None: + out_stream.write('Retry interval: {0}'.format( + out_stream.literal_style(self._model.retry_interval))) + if self._model.plugin_specification is not None: + out_stream.write('Plugin specification: {0}'.format( + out_stream.literal_style(self._model.plugin_specification.name))) + self._topology.dump(self._model.configurations, out_stream, title='Configuration') + if self._model.function is not None: + out_stream.write('Function: {0}'.format(out_stream.literal_style( + self._model.function))) + + def coerce(self, **kwargs): + self._coerce(self._model.inputs, + self._model.configurations, + **kwargs) + + def instantiate(self, instance_cls, **_): + operation = instance_cls( + name=self._model.name, + description=utils.deepcopy_with_locators(self._model.description), + relationship_edge=self._model.relationship_edge, + implementation=self._model.implementation, + dependencies=self._model.dependencies, + executor=self._model.executor, + function=self._model.function, + max_attempts=self._model.max_attempts, + retry_interval=self._model.retry_interval, + operation_template=self._model) + + if (self._model.plugin_specification is not None and + self._model.plugin_specification.enabled): + operation.plugin = self._model.plugin_specification.plugin + + operation.inputs = self._topology.instantiate(self._model.inputs) + operation.configurations = self._topology.instantiate(self._model.configurations) + + return operation + + def validate(self, **kwargs): + self._validate(self._model.inputs, + self._model.configurations, + **kwargs) + + +class PluginSpecification(common.HandlerBase): + def validate(self, **kwargs): + pass + + def coerce(self, **kwargs): + pass + + def instantiate(self, **_): + pass + + def dump(self, out_stream): + pass diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/topology.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/topology.py new file mode 100644 index 0000000..f86c9dd --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/topology.py @@ -0,0 +1,223 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ...parser.validation import issue +from ...modeling import models +from ...utils import console +from . import ( + template_handler, + instance_handler, + common +) + + +class Topology(issue.ReporterMixin): + + _init_map = { + models.ServiceTemplate: models.Service, + models.ArtifactTemplate: models.Artifact, + models.CapabilityTemplate: models.Capability, + models.GroupTemplate: models.Group, + models.InterfaceTemplate: models.Interface, + models.NodeTemplate: models.Node, + models.PolicyTemplate: models.Policy, + models.SubstitutionTemplate: models.Substitution, + models.RelationshipTemplate: models.Relationship, + models.OperationTemplate: models.Operation, + models.SubstitutionTemplateMapping: models.SubstitutionMapping, + + # Common + models.Metadata: models.Metadata, + models.Attribute: models.Attribute, + models.Property: models.Property, + models.Input: models.Input, + models.Output: models.Output, + models.Configuration: models.Configuration, + models.Argument: models.Argument, + models.Type: models.Type + } + + def __init__(self, *args, **kwargs): + super(Topology, self).__init__(*args, **kwargs) + self._model_cls_to_handler = dict(self._init_handlers(instance_handler), + **self._init_handlers(template_handler)) + + @staticmethod + def _init_handlers(module_): + """ + Register handlers from a handler module to the models. + + :param module_: the module to look for handlers + :returns: dict where the key is the models class, and the value is the handler class + associated with it from the provided module + """ + handlers = {} + for attribute_name in dir(module_): + if attribute_name.startswith('_'): + continue + attribute = getattr(module_, attribute_name) + if isinstance(attribute, type) and issubclass(attribute, common.HandlerBase): + handlers[getattr(models, attribute_name)] = attribute + return handlers + + def instantiate(self, model, **kwargs): + """ + Instantiate the provided model. + + :param model: + :param kwargs: + :returns: + """ + if isinstance(model, dict): + return dict((name, self.instantiate(value, **kwargs)) + for name, value in model.iteritems()) + elif isinstance(model, list): + return list(self.instantiate(value, **kwargs) for value in model) + elif model is not None: + _handler = self._model_cls_to_handler[model.__class__] + model_instance_cls = self._init_map[model.__class__] + return _handler(self, model).instantiate(model_instance_cls, **kwargs) + + def validate(self, model, **kwargs): + if isinstance(model, dict): + return self.validate(model.values(), **kwargs) + elif isinstance(model, list): + return all(self.validate(value, **kwargs) for value in model) + elif model is not None: + _handler = self._model_cls_to_handler[model.__class__] + return _handler(self, model).validate(**kwargs) + + def dump(self, model, out_stream=None, title=None, **kwargs): + out_stream = out_stream or console.TopologyStylizer() + + # if model is empty, no need to print out the section name + if model and title: + out_stream.write('{0}:'.format(title)) + + if isinstance(model, dict): + if str(out_stream): + with out_stream.indent(): + return self.dump(model.values(), out_stream=out_stream, **kwargs) + else: + return self.dump(model.values(), out_stream=out_stream, **kwargs) + + elif isinstance(model, list): + for value in model: + self.dump(value, out_stream=out_stream, **kwargs) + + elif model is not None: + _handler = self._model_cls_to_handler[model.__class__] + _handler(self, model).dump(out_stream=out_stream, **kwargs) + + return out_stream + + def dump_graph(self, service): + out_stream = console.TopologyStylizer() + for node in service.nodes.itervalues(): + if not node.inbound_relationships: + self._dump_graph_node(out_stream, node) + return out_stream + + def _dump_graph_node(self, out_stream, node, capability=None): + out_stream.write(out_stream.node_style(node.name)) + if capability is not None: + out_stream.write('{0} ({1})'.format(out_stream.property_style(capability.name), + out_stream.type_style(capability.type.name))) + if node.outbound_relationships: + with out_stream.indent(): + for relationship_model in node.outbound_relationships: + styled_relationship_name = out_stream.property_style(relationship_model.name) + if relationship_model.type is not None: + out_stream.write('-> {0} ({1})'.format( + styled_relationship_name, + out_stream.type_style(relationship_model.type.name))) + else: + out_stream.write('-> {0}'.format(styled_relationship_name)) + with out_stream.indent(3): + self._dump_graph_node(out_stream, + relationship_model.target_node, + relationship_model.target_capability) + + def coerce(self, model, **kwargs): + if isinstance(model, dict): + return self.coerce(model.values(), **kwargs) + elif isinstance(model, list): + return all(self.coerce(value, **kwargs) for value in model) + elif model is not None: + _handler = self._model_cls_to_handler[model.__class__] + return _handler(self, model).coerce(**kwargs) + + def dump_types(self, service_template, out_stream=None): + out_stream = out_stream or console.TopologyStylizer() + self.dump(service_template.node_types, out_stream, 'Node types') + self.dump(service_template.group_types, out_stream, 'Group types') + self.dump(service_template.capability_types, out_stream, 'Capability types') + self.dump(service_template.relationship_types, out_stream, 'Relationship types') + self.dump(service_template.policy_types, out_stream, 'Policy types') + self.dump(service_template.artifact_types, out_stream, 'Artifact types') + self.dump(service_template.interface_types, out_stream, 'Interface types') + + return out_stream + + def satisfy_requirements(self, model, **kwargs): + if isinstance(model, dict): + return self.satisfy_requirements(model.values(), **kwargs) + elif isinstance(model, list): + return all(self.satisfy_requirements(value, **kwargs) for value in model) + elif model is not None: + _handler = self._model_cls_to_handler[model.__class__] + return _handler(self, model).satisfy_requirements(**kwargs) + + def validate_capabilities(self, model, **kwargs): + if isinstance(model, dict): + return self.validate_capabilities(model.values(), **kwargs) + elif isinstance(model, list): + return all(self.validate_capabilities(value, **kwargs) for value in model) + elif model is not None: + _handler = self._model_cls_to_handler[model.__class__] + return _handler(self, model).validate_capabilities(**kwargs) + + def _find_host(self, node): + if node.type.role == 'host': + return node + + def target_has_role(rel, role): + return (rel.target_capability is not None and + rel.target_capability.type.role == role) + + for outbound_relationship in node.outbound_relationships: + if target_has_role(outbound_relationship, 'host'): + host = self._find_host(outbound_relationship.target_node) + if host is not None: + return host + for inbound_relationship in node.inbound_relationships: + if target_has_role(inbound_relationship, 'feature'): + host = self._find_host(inbound_relationship.source_node) + if host is not None: + return host + return None + + def assign_hosts(self, service): + for node in service.nodes.values(): + node.host = self._find_host(node) + + def configure_operations(self, model, **kwargs): + if isinstance(model, dict): + return self.configure_operations(model.values(), **kwargs) + elif isinstance(model, list): + return all(self.configure_operations(value, **kwargs) for value in model) + elif model is not None: + _handler = self._model_cls_to_handler[model.__class__] + return _handler(self, model).configure_operations(**kwargs) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/utils.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/utils.py new file mode 100644 index 0000000..ec74391 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/topology/utils.py @@ -0,0 +1,48 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 copy import deepcopy + + +def deepcopy_with_locators(value): + """ + Like :func:`deepcopy`, but also copies over locators. + """ + + res = deepcopy(value) + copy_locators(res, value) + return res + + +def copy_locators(target, source): + """ + Copies over ``_locator`` for all elements, recursively. + + Assumes that target and source have exactly the same list/dict structure. + """ + + locator = getattr(source, '_locator', None) + if locator is not None: + try: + setattr(target, '_locator', locator) + except AttributeError: + pass + + if isinstance(target, list) and isinstance(source, list): + for i, _ in enumerate(target): + copy_locators(target[i], source[i]) + elif isinstance(target, dict) and isinstance(source, dict): + for k, v in target.items(): + copy_locators(v, source[k]) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflow_runner.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflow_runner.py new file mode 100644 index 0000000..0c52e32 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflow_runner.py @@ -0,0 +1,194 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Running workflows. +""" + +import os +import sys +from datetime import datetime + +from . import exceptions +from .context.workflow import WorkflowContext +from .workflows import builtin +from .workflows.core import engine, graph_compiler +from .workflows.executor.process import ProcessExecutor +from ..modeling import models +from ..modeling import utils as modeling_utils +from ..utils.imports import import_fullname + +DEFAULT_TASK_MAX_ATTEMPTS = 30 +DEFAULT_TASK_RETRY_INTERVAL = 30 + + +class WorkflowRunner(object): + + def __init__(self, model_storage, resource_storage, plugin_manager, + execution_id=None, retry_failed_tasks=False, + service_id=None, workflow_name=None, inputs=None, executor=None, + task_max_attempts=DEFAULT_TASK_MAX_ATTEMPTS, + task_retry_interval=DEFAULT_TASK_RETRY_INTERVAL): + """ + Manages a single workflow execution on a given service. + + :param workflow_name: workflow name + :param service_id: service ID + :param inputs: key-value dict of inputs for the execution + :param model_storage: model storage API ("MAPI") + :param resource_storage: resource storage API ("RAPI") + :param plugin_manager: plugin manager + :param executor: executor for tasks; defaults to a + :class:`~aria.orchestrator.workflows.executor.process.ProcessExecutor` instance + :param task_max_attempts: maximum attempts of repeating each failing task + :param task_retry_interval: retry interval between retry attempts of a failing task + """ + + if not (execution_id or (workflow_name and service_id)): + exceptions.InvalidWorkflowRunnerParams( + "Either provide execution id in order to resume a workflow or workflow name " + "and service id with inputs") + + self._is_resume = execution_id is not None + self._retry_failed_tasks = retry_failed_tasks + + self._model_storage = model_storage + self._resource_storage = resource_storage + + # the IDs are stored rather than the models themselves, so this module could be used + # by several threads without raising errors on model objects shared between threadsF + + if self._is_resume: + self._service_id = service_id + # self._service_id = self.execution.service.id + # self._workflow_name = model_storage.execution.get(self._execution_id).workflow_name + self._workflow_name = workflow_name + self._validate_workflow_exists_for_service() + self._execution_id = execution_id + + else: + self._service_id = service_id + self._workflow_name = workflow_name + self._validate_workflow_exists_for_service() + self._execution_id = self._create_execution_model(inputs).id + + self._create_execution_model(inputs, execution_id) + + self._workflow_context = WorkflowContext( + name=self.__class__.__name__, + model_storage=self._model_storage, + resource_storage=resource_storage, + service_id=service_id, + execution_id=execution_id, + workflow_name=self._workflow_name, + task_max_attempts=task_max_attempts, + task_retry_interval=task_retry_interval) + + # Set default executor and kwargs + executor = executor or ProcessExecutor(plugin_manager=plugin_manager) + + # transforming the execution inputs to dict, to pass them to the workflow function + # execution_inputs_dict = dict(inp.unwrapped for inp in self.execution.inputs.itervalues()) + + # if not self._is_resume: + # workflow_fn = self._get_workflow_fn() + # self._tasks_graph = workflow_fn(ctx=self._workflow_context, **execution_inputs_dict) + # compiler = graph_compiler.GraphCompiler(self._workflow_context, executor.__class__) + # compiler.compile(self._tasks_graph) + + self._engine = engine.Engine(executors={executor.__class__: executor}) + + @property + def execution_id(self): + return self._execution_id + + @property + def execution(self): + return self._model_storage.execution.get(self._execution_id) + + @property + def service(self): + return self._model_storage.service.get(self._service_id) + + def execute(self): + self._engine.execute(ctx=self._workflow_context, + resuming=self._is_resume, + retry_failed=self._retry_failed_tasks) + + def cancel(self): + self._engine.cancel_execution(ctx=self._workflow_context) + + def _create_execution_model(self, inputs, execution_id): + execution = models.Execution( + created_at=datetime.utcnow(), + service=self.service, + workflow_name=self._workflow_name, + inputs={}) + + if self._workflow_name in builtin.BUILTIN_WORKFLOWS: + workflow_inputs = dict() # built-in workflows don't have any inputs + else: + workflow_inputs = self.service.workflows[self._workflow_name].inputs + + # modeling_utils.validate_no_undeclared_inputs(declared_inputs=workflow_inputs, + # supplied_inputs=inputs or {}) + modeling_utils.validate_required_inputs_are_supplied(declared_inputs=workflow_inputs, + supplied_inputs=inputs or {}) + execution.inputs = modeling_utils.merge_parameter_values( + inputs, workflow_inputs, model_cls=models.Input) + execution.id = execution_id + # TODO: these two following calls should execute atomically + self._validate_no_active_executions(execution) + self._model_storage.execution.put(execution) + return execution + + def _validate_workflow_exists_for_service(self): + if self._workflow_name not in self.service.workflows and \ + self._workflow_name not in builtin.BUILTIN_WORKFLOWS: + raise exceptions.UndeclaredWorkflowError( + 'No workflow policy {0} declared in service {1}' + .format(self._workflow_name, self.service.name)) + + def _validate_no_active_executions(self, execution): + active_executions = [e for e in self.service.executions if e.is_active()] + if active_executions: + raise exceptions.ActiveExecutionsError( + "Can't start execution; Service {0} has an active execution with ID {1}" + .format(self.service.name, active_executions[0].id)) + + def _get_workflow_fn(self): + if self._workflow_name in builtin.BUILTIN_WORKFLOWS: + return import_fullname('{0}.{1}'.format(builtin.BUILTIN_WORKFLOWS_PATH_PREFIX, + self._workflow_name)) + + workflow = self.service.workflows[self._workflow_name] + + # TODO: Custom workflow support needs improvement, currently this code uses internal + # knowledge of the resource storage; Instead, workflows should probably be loaded + # in a similar manner to operation plugins. Also consider passing to import_fullname + # as paths instead of appending to sys path. + service_template_resources_path = os.path.join( + self._resource_storage.service_template.base_path, + str(self.service.service_template.id)) + sys.path.append(service_template_resources_path) + + try: + workflow_fn = import_fullname(workflow.function) + except ImportError: + raise exceptions.WorkflowImplementationNotFoundError( + 'Could not find workflow {0} function at {1}'.format( + self._workflow_name, workflow.function)) + + return workflow_fn diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/__init__.py new file mode 100644 index 0000000..1f6c368 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/__init__.py @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Workflows package. +""" + +# Import required so that logging signals are registered +from . import events_logging diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/api/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/api/__init__.py new file mode 100644 index 0000000..587eee3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/api/__init__.py @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Workflow API. +""" + +from . import task, task_graph diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/api/task.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/api/task.py new file mode 100644 index 0000000..6ce4a00 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/api/task.py @@ -0,0 +1,272 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Provides the tasks to be entered into the task graph +""" + +from ... import context +from ....modeling import models +from ....modeling import utils as modeling_utils +from ....utils.uuid import generate_uuid +from .. import exceptions + + +class BaseTask(object): + """ + Base class for tasks. + """ + + def __init__(self, ctx=None, **kwargs): + if ctx is not None: + self._workflow_context = ctx + else: + self._workflow_context = context.workflow.current.get() + self._id = generate_uuid(variant='uuid') + + @property + def id(self): + """ + UUID4 ID. + """ + return self._id + + @property + def workflow_context(self): + """ + Context of the current workflow. + """ + return self._workflow_context + + +class OperationTask(BaseTask): + """ + Executes an operation. + + :ivar name: formatted name (includes actor type, actor name, and interface/operation names) + :vartype name: basestring + :ivar actor: node or relationship + :vartype actor: :class:`~aria.modeling.models.Node` or + :class:`~aria.modeling.models.Relationship` + :ivar interface_name: interface name on actor + :vartype interface_name: basestring + :ivar operation_name: operation name on interface + :vartype operation_name: basestring + :ivar plugin: plugin (or None for default plugin) + :vartype plugin: :class:`~aria.modeling.models.Plugin` + :ivar function: path to Python function + :vartype function: basestring + :ivar arguments: arguments to send to Python function + :vartype arguments: {:obj:`basestring`: :class:`~aria.modeling.models.Argument`} + :ivar ignore_failure: whether to ignore failures + :vartype ignore_failure: bool + :ivar max_attempts: maximum number of attempts allowed in case of failure + :vartype max_attempts: int + :ivar retry_interval: interval between retries (in seconds) + :vartype retry_interval: float + """ + + NAME_FORMAT = '{interface}:{operation}@{type}:{name}' + + def __init__(self, + actor, + interface_name, + operation_name, + arguments=None, + ignore_failure=None, + max_attempts=None, + retry_interval=None): + """ + :param actor: node or relationship + :type actor: :class:`~aria.modeling.models.Node` or + :class:`~aria.modeling.models.Relationship` + :param interface_name: interface name on actor + :type interface_name: basestring + :param operation_name: operation name on interface + :type operation_name: basestring + :param arguments: override argument values + :type arguments: {:obj:`basestring`: object} + :param ignore_failure: override whether to ignore failures + :type ignore_failure: bool + :param max_attempts: override maximum number of attempts allowed in case of failure + :type max_attempts: int + :param retry_interval: override interval between retries (in seconds) + :type retry_interval: float + :raises ~aria.orchestrator.workflows.exceptions.OperationNotFoundException: if + ``interface_name`` and ``operation_name`` do not refer to an operation on the actor + """ + + # Creating OperationTask directly should raise an error when there is no + # interface/operation. + if not has_operation(actor, interface_name, operation_name): + raise exceptions.OperationNotFoundException( + 'Could not find operation "{operation_name}" on interface ' + '"{interface_name}" for {actor_type} "{actor.name}"'.format( + operation_name=operation_name, + interface_name=interface_name, + actor_type=type(actor).__name__.lower(), + actor=actor) + ) + + super(OperationTask, self).__init__() + + self.name = OperationTask.NAME_FORMAT.format(type=type(actor).__name__.lower(), + name=actor.name, + interface=interface_name, + operation=operation_name) + self.actor = actor + self.interface_name = interface_name + self.operation_name = operation_name + self.ignore_failure = \ + self.workflow_context._task_ignore_failure if ignore_failure is None else ignore_failure + self.max_attempts = max_attempts or self.workflow_context._task_max_attempts + self.retry_interval = retry_interval or self.workflow_context._task_retry_interval + + operation = self.actor.interfaces[self.interface_name].operations[self.operation_name] + self.plugin = operation.plugin + self.function = operation.function + self.arguments = modeling_utils.merge_parameter_values(arguments, operation.arguments) + + actor = self.actor + if hasattr(actor, '_wrapped'): + # Unwrap instrumented model + actor = actor._wrapped + + if isinstance(actor, models.Node): + self._context_cls = context.operation.NodeOperationContext + elif isinstance(actor, models.Relationship): + self._context_cls = context.operation.RelationshipOperationContext + else: + raise exceptions.TaskCreationException('Could not create valid context for ' + '{actor.__class__}'.format(actor=actor)) + + def __repr__(self): + return self.name + + +class StubTask(BaseTask): + """ + Enables creating empty tasks. + """ + + +class WorkflowTask(BaseTask): + """ + Executes a complete workflow. + """ + + def __init__(self, workflow_func, **kwargs): + """ + :param workflow_func: function to run + :param kwargs: kwargs that would be passed to the workflow_func + """ + super(WorkflowTask, self).__init__(**kwargs) + kwargs['ctx'] = self.workflow_context + self._graph = workflow_func(**kwargs) + + @property + def graph(self): + """ + Graph constructed by the sub workflow. + """ + return self._graph + + def __getattr__(self, item): + try: + return getattr(self._graph, item) + except AttributeError: + return super(WorkflowTask, self).__getattribute__(item) + + +def create_task(actor, interface_name, operation_name, **kwargs): + """ + Helper function that enables safe creation of :class:`OperationTask`. If the supplied interface + or operation do not exist, ``None`` is returned. + + :param actor: actor for this task + :param interface_name: name of the interface + :param operation_name: name of the operation + :param kwargs: any additional kwargs to be passed to the OperationTask + :return: OperationTask or None (if the interface/operation does not exists) + """ + try: + return OperationTask( + actor, + interface_name=interface_name, + operation_name=operation_name, + **kwargs + ) + except exceptions.OperationNotFoundException: + return None + + +def create_relationships_tasks( + node, interface_name, source_operation_name=None, target_operation_name=None, **kwargs): + """ + Creates a relationship task (source and target) for all of a node relationships. + + :param basestring source_operation_name: relationship operation name + :param basestring interface_name: name of the interface + :param source_operation_name: + :param target_operation_name: + :param node: source node + """ + sub_tasks = [] + for relationship in node.outbound_relationships: + relationship_operations = create_relationship_tasks( + relationship, + interface_name, + source_operation_name=source_operation_name, + target_operation_name=target_operation_name, + **kwargs) + sub_tasks.append(relationship_operations) + return sub_tasks + + +def create_relationship_tasks(relationship, interface_name, source_operation_name=None, + target_operation_name=None, **kwargs): + """ + Creates a relationship task (source and target). + + :param relationship: relationship instance itself + :param source_operation_name: + :param target_operation_name: + """ + operations = [] + if source_operation_name: + operations.append( + create_task( + relationship, + interface_name=interface_name, + operation_name=source_operation_name, + **kwargs + ) + ) + if target_operation_name: + operations.append( + create_task( + relationship, + interface_name=interface_name, + operation_name=target_operation_name, + **kwargs + ) + ) + + return [o for o in operations if o] + + +def has_operation(actor, interface_name, operation_name): + interface = actor.interfaces.get(interface_name, None) + return interface and interface.operations.get(operation_name, False) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/api/task_graph.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/api/task_graph.py new file mode 100644 index 0000000..900a0d1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/api/task_graph.py @@ -0,0 +1,295 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Task graph. +""" + +from collections import Iterable + +from networkx import DiGraph, topological_sort + +from ....utils.uuid import generate_uuid +from . import task as api_task + + +class TaskNotInGraphError(Exception): + """ + An error representing a scenario where a given task is not in the graph as expected. + """ + pass + + +def _filter_out_empty_tasks(func=None): + if func is None: + return lambda f: _filter_out_empty_tasks(func=f) + + def _wrapper(task, *tasks, **kwargs): + return func(*(t for t in (task,) + tuple(tasks) if t), **kwargs) + return _wrapper + + +class TaskGraph(object): + """ + Task graph builder. + """ + + def __init__(self, name): + self.name = name + self._id = generate_uuid(variant='uuid') + self._graph = DiGraph() + + def __repr__(self): + return '{name}(id={self._id}, name={self.name}, graph={self._graph!r})'.format( + name=self.__class__.__name__, self=self) + + @property + def id(self): + """ + ID of the graph + """ + return self._id + + # graph traversal methods + + @property + def tasks(self): + """ + Iterator over tasks in the graph. + """ + for _, data in self._graph.nodes_iter(data=True): + yield data['task'] + + def topological_order(self, reverse=False): + """ + Topological sort of the graph. + + :param reverse: whether to reverse the sort + :return: list which represents the topological sort + """ + for task_id in topological_sort(self._graph, reverse=reverse): + yield self.get_task(task_id) + + def get_dependencies(self, dependent_task): + """ + Iterates over the task's dependencies. + + :param dependent_task: task whose dependencies are requested + :raises ~aria.orchestrator.workflows.api.task_graph.TaskNotInGraphError: if + ``dependent_task`` is not in the graph + """ + if not self.has_tasks(dependent_task): + raise TaskNotInGraphError('Task id: {0}'.format(dependent_task.id)) + for _, dependency_id in self._graph.out_edges_iter(dependent_task.id): + yield self.get_task(dependency_id) + + def get_dependents(self, dependency_task): + """ + Iterates over the task's dependents. + + :param dependency_task: task whose dependents are requested + :raises ~aria.orchestrator.workflows.api.task_graph.TaskNotInGraphError: if + ``dependency_task`` is not in the graph + """ + if not self.has_tasks(dependency_task): + raise TaskNotInGraphError('Task id: {0}'.format(dependency_task.id)) + for dependent_id, _ in self._graph.in_edges_iter(dependency_task.id): + yield self.get_task(dependent_id) + + # task methods + + def get_task(self, task_id): + """ + Get a task instance that's been inserted to the graph by the task's ID. + + :param basestring task_id: task ID + :raises ~aria.orchestrator.workflows.api.task_graph.TaskNotInGraphError: if no task found in + the graph with the given ID + """ + if not self._graph.has_node(task_id): + raise TaskNotInGraphError('Task id: {0}'.format(task_id)) + data = self._graph.node[task_id] + return data['task'] + + @_filter_out_empty_tasks + def add_tasks(self, *tasks): + """ + Adds a task to the graph. + + :param task: task + :return: list of added tasks + :rtype: list + """ + assert all([isinstance(task, (api_task.BaseTask, Iterable)) for task in tasks]) + return_tasks = [] + + for task in tasks: + if isinstance(task, Iterable): + return_tasks += self.add_tasks(*task) + elif not self.has_tasks(task): + self._graph.add_node(task.id, task=task) + return_tasks.append(task) + + return return_tasks + + @_filter_out_empty_tasks + def remove_tasks(self, *tasks): + """ + Removes the provided task from the graph. + + :param task: task + :return: list of removed tasks + :rtype: list + """ + return_tasks = [] + + for task in tasks: + if isinstance(task, Iterable): + return_tasks += self.remove_tasks(*task) + elif self.has_tasks(task): + self._graph.remove_node(task.id) + return_tasks.append(task) + + return return_tasks + + @_filter_out_empty_tasks + def has_tasks(self, *tasks): + """ + Checks whether a task is in the graph. + + :param task: task + :return: ``True`` if all tasks are in the graph, otherwise ``False`` + :rtype: list + """ + assert all(isinstance(t, (api_task.BaseTask, Iterable)) for t in tasks) + return_value = True + + for task in tasks: + if isinstance(task, Iterable): + return_value &= self.has_tasks(*task) + else: + return_value &= self._graph.has_node(task.id) + + return return_value + + def add_dependency(self, dependent, dependency): + """ + Adds a dependency for one item (task, sequence or parallel) on another. + + The dependent will only be executed after the dependency terminates. If either of the items + is either a sequence or a parallel, multiple dependencies may be added. + + :param dependent: dependent (task, sequence or parallel) + :param dependency: dependency (task, sequence or parallel) + :return: ``True`` if the dependency between the two hadn't already existed, otherwise + ``False`` + :rtype: bool + :raises ~aria.orchestrator.workflows.api.task_graph.TaskNotInGraphError: if either the + dependent or dependency are tasks which are not in the graph + """ + if not (self.has_tasks(dependent) and self.has_tasks(dependency)): + raise TaskNotInGraphError() + + if self.has_dependency(dependent, dependency): + return + + if isinstance(dependent, Iterable): + for dependent_task in dependent: + self.add_dependency(dependent_task, dependency) + else: + if isinstance(dependency, Iterable): + for dependency_task in dependency: + self.add_dependency(dependent, dependency_task) + else: + self._graph.add_edge(dependent.id, dependency.id) + + def has_dependency(self, dependent, dependency): + """ + Checks whether one item (task, sequence or parallel) depends on another. + + Note that if either of the items is either a sequence or a parallel, and some of the + dependencies exist in the graph but not all of them, this method will return ``False``. + + :param dependent: dependent (task, sequence or parallel) + :param dependency: dependency (task, sequence or parallel) + :return: ``True`` if the dependency between the two exists, otherwise ``False`` + :rtype: bool + :raises ~aria.orchestrator.workflows.api.task_graph.TaskNotInGraphError: if either the + dependent or dependency are tasks which are not in the graph + """ + if not (dependent and dependency): + return False + elif not (self.has_tasks(dependent) and self.has_tasks(dependency)): + raise TaskNotInGraphError() + + return_value = True + + if isinstance(dependent, Iterable): + for dependent_task in dependent: + return_value &= self.has_dependency(dependent_task, dependency) + else: + if isinstance(dependency, Iterable): + for dependency_task in dependency: + return_value &= self.has_dependency(dependent, dependency_task) + else: + return_value &= self._graph.has_edge(dependent.id, dependency.id) + + return return_value + + def remove_dependency(self, dependent, dependency): + """ + Removes a dependency for one item (task, sequence or parallel) on another. + + Note that if either of the items is either a sequence or a parallel, and some of the + dependencies exist in the graph but not all of them, this method will not remove any of the + dependencies and return ``False``. + + :param dependent: dependent (task, sequence or parallel) + :param dependency: dependency (task, sequence or parallel) + :return: ``False`` if the dependency between the two hadn't existed, otherwise ``True`` + :rtype: bool + :raises ~aria.orchestrator.workflows.api.task_graph.TaskNotInGraphError: if either the + dependent or dependency are tasks which are not in the graph + """ + if not (self.has_tasks(dependent) and self.has_tasks(dependency)): + raise TaskNotInGraphError() + + if not self.has_dependency(dependent, dependency): + return + + if isinstance(dependent, Iterable): + for dependent_task in dependent: + self.remove_dependency(dependent_task, dependency) + elif isinstance(dependency, Iterable): + for dependency_task in dependency: + self.remove_dependency(dependent, dependency_task) + else: + self._graph.remove_edge(dependent.id, dependency.id) + + @_filter_out_empty_tasks + def sequence(self, *tasks): + """ + Creates and inserts a sequence into the graph, effectively each task i depends on i-1. + + :param tasks: iterable of dependencies + :return: provided tasks + """ + if tasks: + self.add_tasks(*tasks) + + for i in xrange(1, len(tasks)): + self.add_dependency(tasks[i], tasks[i-1]) + + return tasks diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/__init__.py new file mode 100644 index 0000000..1b2f390 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/__init__.py @@ -0,0 +1,36 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Built-in workflows. +""" + +from .install import install +from .uninstall import uninstall +from .start import start +from .stop import stop + + +BUILTIN_WORKFLOWS = ('install', 'uninstall', 'start', 'stop') +BUILTIN_WORKFLOWS_PATH_PREFIX = 'aria.orchestrator.workflows.builtin' + + +__all__ = [ + 'BUILTIN_WORKFLOWS', + 'install', + 'uninstall', + 'start', + 'stop' +] diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/execute_operation.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/execute_operation.py new file mode 100644 index 0000000..949f864 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/execute_operation.py @@ -0,0 +1,101 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Built-in operation execution Workflow. +""" + +from ... import workflow +from ..api import task + + +@workflow +def execute_operation( + ctx, + graph, + interface_name, + operation_name, + operation_kwargs, + run_by_dependency_order, + type_names, + node_template_ids, + node_ids, + **kwargs): + """ + Built-in operation execution Workflow. + + :param workflow_context: workflow context + :param graph: graph which will describe the workflow + :param operation: operation name to execute + :param operation_kwargs: + :param run_by_dependency_order: + :param type_names: + :param node_template_ids: + :param node_ids: + :param kwargs: + :return: + """ + subgraphs = {} + # filtering node instances + filtered_nodes = list(_filter_nodes( + context=ctx, + node_template_ids=node_template_ids, + node_ids=node_ids, + type_names=type_names)) + + if run_by_dependency_order: + filtered_node_ids = set(node_instance.id for node_instance in filtered_nodes) + for node in ctx.nodes: + if node.id not in filtered_node_ids: + subgraphs[node.id] = ctx.task_graph( + name='execute_operation_stub_{0}'.format(node.id)) + + # registering actual tasks to sequences + for node in filtered_nodes: + graph.add_tasks( + task.OperationTask( + node, + interface_name=interface_name, + operation_name=operation_name, + arguments=operation_kwargs + ) + ) + + for _, node_sub_workflow in subgraphs.items(): + graph.add_tasks(node_sub_workflow) + + # adding tasks dependencies if required + if run_by_dependency_order: + for node in ctx.nodes: + for relationship in node.relationships: + graph.add_dependency( + source_task=subgraphs[node.id], after=[subgraphs[relationship.target_id]]) + + +def _filter_nodes(context, node_template_ids=(), node_ids=(), type_names=()): + def _is_node_template_by_id(node_template_id): + return not node_template_ids or node_template_id in node_template_ids + + def _is_node_by_id(node_id): + return not node_ids or node_id in node_ids + + def _is_node_by_type(node_type): + return not node_type.name in type_names + + for node in context.nodes: + if all((_is_node_template_by_id(node.node_template.id), + _is_node_by_id(node.id), + _is_node_by_type(node.node_template.type))): + yield node diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/heal.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/heal.py new file mode 100644 index 0000000..07e27b1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/heal.py @@ -0,0 +1,179 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# pylint: skip-file + +""" +Built-in heal workflow. +""" + +from aria import workflow + +from .workflows import (install_node, uninstall_node) +from ..api import task + + +@workflow +def heal(ctx, graph, node_id): + """ + Built-in heal workflow.. + + :param ctx: workflow context + :param graph: graph which will describe the workflow. + :param node_id: ID of the node to heal + :return: + """ + failing_node = ctx.model.node.get(node_id) + host_node = ctx.model.node.get(failing_node.host.id) + failed_node_subgraph = _get_contained_subgraph(ctx, host_node) + failed_node_ids = list(n.id for n in failed_node_subgraph) + + targeted_nodes = [node for node in ctx.nodes + if node.id not in failed_node_ids] + + uninstall_subgraph = task.WorkflowTask( + heal_uninstall, + failing_nodes=failed_node_subgraph, + targeted_nodes=targeted_nodes + ) + + install_subgraph = task.WorkflowTask( + heal_install, + failing_nodes=failed_node_subgraph, + targeted_nodes=targeted_nodes) + + graph.sequence(uninstall_subgraph, install_subgraph) + + +@workflow(suffix_template='{failing_nodes}') +def heal_uninstall(ctx, graph, failing_nodes, targeted_nodes): + """ + Uninstall phase of the heal mechanism. + + :param ctx: workflow context + :param graph: task graph to edit + :param failing_nodes: failing nodes to heal + :param targeted_nodes: targets of the relationships where the failing node are + """ + node_sub_workflows = {} + + # Create install stub workflow for each unaffected node + for node in targeted_nodes: + node_stub = task.StubTask() + node_sub_workflows[node.id] = node_stub + graph.add_tasks(node_stub) + + # create install sub workflow for every node + for node in failing_nodes: + node_sub_workflow = task.WorkflowTask(uninstall_node, + node=node) + node_sub_workflows[node.id] = node_sub_workflow + graph.add_tasks(node_sub_workflow) + + # create dependencies between the node sub workflow + for node in failing_nodes: + node_sub_workflow = node_sub_workflows[node.id] + for relationship in reversed(node.outbound_relationships): + graph.add_dependency( + node_sub_workflows[relationship.target_node.id], + node_sub_workflow) + + # Add operations for intact nodes depending on a node belonging to nodes + for node in targeted_nodes: + node_sub_workflow = node_sub_workflows[node.id] + + for relationship in reversed(node.outbound_relationships): + + target_node = \ + ctx.model.node.get(relationship.target_node.id) + target_node_subgraph = node_sub_workflows[target_node.id] + graph.add_dependency(target_node_subgraph, node_sub_workflow) + + if target_node in failing_nodes: + dependency = task.create_relationship_tasks( + relationship=relationship, + operation_name='aria.interfaces.relationship_lifecycle.unlink') + graph.add_tasks(*dependency) + graph.add_dependency(node_sub_workflow, dependency) + + +@workflow(suffix_template='{failing_nodes}') +def heal_install(ctx, graph, failing_nodes, targeted_nodes): + """ + Install phase of the heal mechanism. + + :param ctx: workflow context + :param graph: task graph to edit. + :param failing_nodes: failing nodes to heal + :param targeted_nodes: targets of the relationships where the failing node are + """ + node_sub_workflows = {} + + # Create install sub workflow for each unaffected + for node in targeted_nodes: + node_stub = task.StubTask() + node_sub_workflows[node.id] = node_stub + graph.add_tasks(node_stub) + + # create install sub workflow for every node + for node in failing_nodes: + node_sub_workflow = task.WorkflowTask(install_node, + node=node) + node_sub_workflows[node.id] = node_sub_workflow + graph.add_tasks(node_sub_workflow) + + # create dependencies between the node sub workflow + for node in failing_nodes: + node_sub_workflow = node_sub_workflows[node.id] + if node.outbound_relationships: + dependencies = \ + [node_sub_workflows[relationship.target_node.id] + for relationship in node.outbound_relationships] + graph.add_dependency(node_sub_workflow, dependencies) + + # Add operations for intact nodes depending on a node + # belonging to nodes + for node in targeted_nodes: + node_sub_workflow = node_sub_workflows[node.id] + + for relationship in node.outbound_relationships: + target_node = ctx.model.node.get( + relationship.target_node.id) + target_node_subworkflow = node_sub_workflows[target_node.id] + graph.add_dependency(node_sub_workflow, target_node_subworkflow) + + if target_node in failing_nodes: + dependent = task.create_relationship_tasks( + relationship=relationship, + operation_name='aria.interfaces.relationship_lifecycle.establish') + graph.add_tasks(*dependent) + graph.add_dependency(dependent, node_sub_workflow) + + +def _get_contained_subgraph(context, host_node): + contained_instances = [node + for node in context.nodes + if node.host_fk == host_node.id and + node.host_fk != node.id] + result = [host_node] + + if not contained_instances: + return result + + result.extend(contained_instances) + for node in contained_instances: + result.extend(_get_contained_subgraph(context, node)) + + return set(result) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/install.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/install.py new file mode 100644 index 0000000..1e7c531 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/install.py @@ -0,0 +1,34 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Built-in install workflow. +""" + +from ... import workflow +from ..api import task as api_task +from . import workflows + + +@workflow +def install(ctx, graph): + """ + Built-in install workflow. + """ + tasks_and_nodes = [] + for node in ctx.nodes: + tasks_and_nodes.append((api_task.WorkflowTask(workflows.install_node, node=node), node)) + graph.add_tasks([task for task, _ in tasks_and_nodes]) + workflows.create_node_task_dependencies(graph, tasks_and_nodes) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/start.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/start.py new file mode 100644 index 0000000..c02a26d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/start.py @@ -0,0 +1,31 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Built-in start workflow. +""" + +from .workflows import start_node +from ... import workflow +from ..api import task as api_task + + +@workflow +def start(ctx, graph): + """ + Built-in start workflow. + """ + for node in ctx.model.node.iter(): + graph.add_tasks(api_task.WorkflowTask(start_node, node=node)) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/stop.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/stop.py new file mode 100644 index 0000000..6f9930b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/stop.py @@ -0,0 +1,31 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Built-in stop workflow. +""" + +from .workflows import stop_node +from ..api import task as api_task +from ... import workflow + + +@workflow +def stop(ctx, graph): + """ + Built-in stop workflow. + """ + for node in ctx.model.node.iter(): + graph.add_tasks(api_task.WorkflowTask(stop_node, node=node)) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/uninstall.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/uninstall.py new file mode 100644 index 0000000..7925f4b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/uninstall.py @@ -0,0 +1,34 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Built-in uninstall workflow. +""" + +from ... import workflow +from ..api import task as api_task +from . import workflows + + +@workflow +def uninstall(ctx, graph): + """ + Built-in uninstall workflow. + """ + tasks_and_nodes = [] + for node in ctx.nodes: + tasks_and_nodes.append((api_task.WorkflowTask(workflows.uninstall_node, node=node), node)) + graph.add_tasks([task for task, _ in tasks_and_nodes]) + workflows.create_node_task_dependencies(graph, tasks_and_nodes, reverse=True) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/workflows.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/workflows.py new file mode 100644 index 0000000..b286e98 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/builtin/workflows.py @@ -0,0 +1,149 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +TSOCA normative lifecycle workflows. +""" + +from ... import workflow +from ..api import task + + +NORMATIVE_STANDARD_INTERFACE = 'Standard' # 'tosca.interfaces.node.lifecycle.Standard' +NORMATIVE_CONFIGURE_INTERFACE = 'Configure' # 'tosca.interfaces.relationship.Configure' + +NORMATIVE_CREATE = 'create' +NORMATIVE_CONFIGURE = 'configure' +NORMATIVE_START = 'start' +NORMATIVE_STOP = 'stop' +NORMATIVE_DELETE = 'delete' + +NORMATIVE_PRE_CONFIGURE_SOURCE = 'pre_configure_source' +NORMATIVE_PRE_CONFIGURE_TARGET = 'pre_configure_target' +NORMATIVE_POST_CONFIGURE_SOURCE = 'post_configure_source' +NORMATIVE_POST_CONFIGURE_TARGET = 'post_configure_target' + +NORMATIVE_ADD_SOURCE = 'add_source' +NORMATIVE_ADD_TARGET = 'add_target' +NORMATIVE_REMOVE_TARGET = 'remove_target' +NORMATIVE_REMOVE_SOURCE = 'remove_source' +NORMATIVE_TARGET_CHANGED = 'target_changed' + + +__all__ = ( + 'NORMATIVE_STANDARD_INTERFACE', + 'NORMATIVE_CONFIGURE_INTERFACE', + 'NORMATIVE_CREATE', + 'NORMATIVE_START', + 'NORMATIVE_STOP', + 'NORMATIVE_DELETE', + 'NORMATIVE_CONFIGURE', + 'NORMATIVE_PRE_CONFIGURE_SOURCE', + 'NORMATIVE_PRE_CONFIGURE_TARGET', + 'NORMATIVE_POST_CONFIGURE_SOURCE', + 'NORMATIVE_POST_CONFIGURE_TARGET', + 'NORMATIVE_ADD_SOURCE', + 'NORMATIVE_ADD_TARGET', + 'NORMATIVE_REMOVE_SOURCE', + 'NORMATIVE_REMOVE_TARGET', + 'NORMATIVE_TARGET_CHANGED', + 'install_node', + 'uninstall_node', + 'start_node', + 'stop_node', +) + + +@workflow(suffix_template='{node.name}') +def install_node(graph, node, **kwargs): + # Create + sequence = [task.create_task(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_CREATE)] + + # Configure + sequence += task.create_relationships_tasks(node, + NORMATIVE_CONFIGURE_INTERFACE, + NORMATIVE_PRE_CONFIGURE_SOURCE, + NORMATIVE_PRE_CONFIGURE_TARGET) + sequence.append(task.create_task(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_CONFIGURE)) + sequence += task.create_relationships_tasks(node, + NORMATIVE_CONFIGURE_INTERFACE, + NORMATIVE_POST_CONFIGURE_SOURCE, + NORMATIVE_POST_CONFIGURE_TARGET) + # Start + sequence += _create_start_tasks(node) + + graph.sequence(*sequence) + + +@workflow(suffix_template='{node.name}') +def uninstall_node(graph, node, **kwargs): + # Stop + sequence = _create_stop_tasks(node) + + # Delete + sequence.append(task.create_task(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_DELETE)) + + graph.sequence(*sequence) + + +@workflow(suffix_template='{node.name}') +def start_node(graph, node, **kwargs): + graph.sequence(*_create_start_tasks(node)) + + +@workflow(suffix_template='{node.name}') +def stop_node(graph, node, **kwargs): + graph.sequence(*_create_stop_tasks(node)) + + +def _create_start_tasks(node): + sequence = [task.create_task(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_START)] + sequence += task.create_relationships_tasks(node, + NORMATIVE_CONFIGURE_INTERFACE, + NORMATIVE_ADD_SOURCE, NORMATIVE_ADD_TARGET) + return sequence + + +def _create_stop_tasks(node): + sequence = [task.create_task(node, NORMATIVE_STANDARD_INTERFACE, NORMATIVE_STOP)] + sequence += task.create_relationships_tasks(node, + NORMATIVE_CONFIGURE_INTERFACE, + NORMATIVE_REMOVE_SOURCE, NORMATIVE_REMOVE_TARGET) + return sequence + + +def create_node_task_dependencies(graph, tasks_and_nodes, reverse=False): + """ + Creates dependencies between tasks if there is a relationship (outbound) between their nodes. + """ + + def get_task(node_name): + for api_task, task_node in tasks_and_nodes: + if task_node.name == node_name: + return api_task + return None + + for api_task, node in tasks_and_nodes: + dependencies = [] + for relationship in node.outbound_relationships: + dependency = get_task(relationship.target_node.name) + if dependency: + dependencies.append(dependency) + if dependencies: + if reverse: + for dependency in dependencies: + graph.add_dependency(dependency, api_task) + else: + graph.add_dependency(api_task, dependencies) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/__init__.py new file mode 100644 index 0000000..3f28136 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/__init__.py @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Workflow core. +""" + +from . import engine diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/engine.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/engine.py new file mode 100644 index 0000000..0ec3cd8 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/engine.py @@ -0,0 +1,185 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Workflow execution. +""" + +import time +from datetime import datetime + +from aria import logger +from aria.modeling import models +from aria.orchestrator import events +from aria.orchestrator.context import operation + +from .. import exceptions +from ..executor.base import StubTaskExecutor +# Import required so all signals are registered +from . import events_handler # pylint: disable=unused-import + + +class Engine(logger.LoggerMixin): + """ + Executes workflows. + """ + + def __init__(self, executors, **kwargs): + super(Engine, self).__init__(**kwargs) + self._executors = executors.copy() + self._executors.setdefault(StubTaskExecutor, StubTaskExecutor()) + + def execute(self, ctx, resuming=False, retry_failed=False): + """ + Executes the workflow. + """ + if resuming: + events.on_resume_workflow_signal.send(ctx, retry_failed=retry_failed) + + tasks_tracker = _TasksTracker(ctx) + + try: + events.start_workflow_signal.send(ctx) + while True: + cancel = self._is_cancel(ctx) + if cancel: + break + for task in tasks_tracker.ended_tasks: + self._handle_ended_tasks(task) + tasks_tracker.finished(task) + for task in tasks_tracker.executable_tasks: + tasks_tracker.executing(task) + self._handle_executable_task(ctx, task) + if tasks_tracker.all_tasks_consumed: + break + else: + time.sleep(0.1) + if cancel: + self._terminate_tasks(tasks_tracker.executing_tasks) + events.on_cancelled_workflow_signal.send(ctx) + else: + events.on_success_workflow_signal.send(ctx) + except BaseException as e: + # Cleanup any remaining tasks + self._terminate_tasks(tasks_tracker.executing_tasks) + events.on_failure_workflow_signal.send(ctx, exception=e) + raise + + def _terminate_tasks(self, tasks): + for task in tasks: + try: + self._executors[task._executor].terminate(task.id) + except BaseException: + pass + + @staticmethod + def cancel_execution(ctx): + """ + Send a cancel request to the engine. If execution already started, execution status + will be modified to ``cancelling`` status. If execution is in pending mode, execution status + will be modified to ``cancelled`` directly. + """ + events.on_cancelling_workflow_signal.send(ctx) + + @staticmethod + def _is_cancel(ctx): + execution = ctx.model.execution.refresh(ctx.execution) + return execution.status in (models.Execution.CANCELLING, models.Execution.CANCELLED) + + def _handle_executable_task(self, ctx, task): + task_executor = self._executors[task._executor] + + # If the task is a stub, a default context is provided, else it should hold the context cls + context_cls = operation.BaseOperationContext if task._stub_type else task._context_cls + op_ctx = context_cls( + model_storage=ctx.model, + resource_storage=ctx.resource, + workdir=ctx._workdir, + task_id=task.id, + actor_id=task.actor.id if task.actor else None, + service_id=task.execution.service.id, + execution_id=task.execution.id, + name=task.name + ) + + if not task._stub_type: + events.sent_task_signal.send(op_ctx) + task_executor.execute(op_ctx) + + @staticmethod + def _handle_ended_tasks(task): + if task.status == models.Task.FAILED and not task.ignore_failure: + raise exceptions.ExecutorException('Workflow failed') + + +class _TasksTracker(object): + + def __init__(self, ctx): + self._ctx = ctx + + self._tasks = ctx.execution.tasks + self._executed_tasks = [task for task in self._tasks if task.has_ended()] + self._executable_tasks = list(set(self._tasks) - set(self._executed_tasks)) + self._executing_tasks = [] + + @property + def all_tasks_consumed(self): + return len(self._executed_tasks) == len(self._tasks) and len(self._executing_tasks) == 0 + + def executing(self, task): + # Task executing could be retrying (thus removed and added earlier) + if task not in self._executing_tasks: + self._executable_tasks.remove(task) + self._executing_tasks.append(task) + + def finished(self, task): + self._executing_tasks.remove(task) + self._executed_tasks.append(task) + + @property + def ended_tasks(self): + for task in self.executing_tasks: + if task.has_ended(): + yield task + + @property + def executable_tasks(self): + now = datetime.utcnow() + # we need both lists since retrying task are in the executing task list. + for task in self._update_tasks(set(self._executing_tasks + self._executable_tasks)): + if all([task.is_waiting(), + task.due_at <= now, + all(dependency in self._executed_tasks for dependency in task.dependencies) + ]): + yield task + + @property + def executing_tasks(self): + for task in self._update_tasks(self._executing_tasks): + yield task + + @property + def executed_tasks(self): + for task in self._update_tasks(self._executed_tasks): + yield task + + @property + def tasks(self): + for task in self._update_tasks(self._tasks): + yield task + + def _update_tasks(self, tasks): + for task in tasks: + yield self._ctx.model.task.refresh(task) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/events_handler.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/events_handler.py new file mode 100644 index 0000000..473475e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/events_handler.py @@ -0,0 +1,170 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Workflow event handling. +""" + +from datetime import ( + datetime, + timedelta, +) + +from ... import events +from ... import exceptions + + +@events.sent_task_signal.connect +def _task_sent(ctx, *args, **kwargs): + with ctx.persist_changes: + ctx.task.status = ctx.task.SENT + + +@events.start_task_signal.connect +def _task_started(ctx, *args, **kwargs): + with ctx.persist_changes: + ctx.task.started_at = datetime.utcnow() + ctx.task.status = ctx.task.STARTED + _update_node_state_if_necessary(ctx, is_transitional=True) + + +@events.on_failure_task_signal.connect +def _task_failed(ctx, exception, *args, **kwargs): + with ctx.persist_changes: + should_retry = all([ + not isinstance(exception, exceptions.TaskAbortException), + ctx.task.attempts_count < ctx.task.max_attempts or + ctx.task.max_attempts == ctx.task.INFINITE_RETRIES, + # ignore_failure check here means the task will not be retried and it will be marked + # as failed. The engine will also look at ignore_failure so it won't fail the + # workflow. + not ctx.task.ignore_failure + ]) + if should_retry: + retry_interval = None + if isinstance(exception, exceptions.TaskRetryException): + retry_interval = exception.retry_interval + if retry_interval is None: + retry_interval = ctx.task.retry_interval + ctx.task.status = ctx.task.RETRYING + ctx.task.attempts_count += 1 + ctx.task.due_at = datetime.utcnow() + timedelta(seconds=retry_interval) + else: + ctx.task.ended_at = datetime.utcnow() + ctx.task.status = ctx.task.FAILED + + +@events.on_success_task_signal.connect +def _task_succeeded(ctx, *args, **kwargs): + with ctx.persist_changes: + ctx.task.ended_at = datetime.utcnow() + ctx.task.status = ctx.task.SUCCESS + ctx.task.attempts_count += 1 + + _update_node_state_if_necessary(ctx) + + +@events.start_workflow_signal.connect +def _workflow_started(workflow_context, *args, **kwargs): + with workflow_context.persist_changes: + execution = workflow_context.execution + # the execution may already be in the process of cancelling + if execution.status in (execution.CANCELLING, execution.CANCELLED): + return + execution.status = execution.STARTED + execution.started_at = datetime.utcnow() + + +@events.on_failure_workflow_signal.connect +def _workflow_failed(workflow_context, exception, *args, **kwargs): + with workflow_context.persist_changes: + execution = workflow_context.execution + execution.error = str(exception) + execution.status = execution.FAILED + execution.ended_at = datetime.utcnow() + + +@events.on_success_workflow_signal.connect +def _workflow_succeeded(workflow_context, *args, **kwargs): + with workflow_context.persist_changes: + execution = workflow_context.execution + execution.status = execution.SUCCEEDED + execution.ended_at = datetime.utcnow() + + +@events.on_cancelled_workflow_signal.connect +def _workflow_cancelled(workflow_context, *args, **kwargs): + with workflow_context.persist_changes: + execution = workflow_context.execution + # _workflow_cancelling function may have called this function already + if execution.status == execution.CANCELLED: + return + # the execution may have already been finished + elif execution.status in (execution.SUCCEEDED, execution.FAILED): + _log_tried_to_cancel_execution_but_it_already_ended(workflow_context, execution.status) + else: + execution.status = execution.CANCELLED + execution.ended_at = datetime.utcnow() + + +@events.on_resume_workflow_signal.connect +def _workflow_resume(workflow_context, retry_failed=False, *args, **kwargs): + with workflow_context.persist_changes: + execution = workflow_context.execution + execution.status = execution.PENDING + # Any non ended task would be put back to pending state + for task in execution.tasks: + if not task.has_ended(): + task.status = task.PENDING + + if retry_failed: + for task in execution.tasks: + if task.status == task.FAILED and not task.ignore_failure: + task.attempts_count = 0 + task.status = task.PENDING + + + +@events.on_cancelling_workflow_signal.connect +def _workflow_cancelling(workflow_context, *args, **kwargs): + with workflow_context.persist_changes: + execution = workflow_context.execution + if execution.status == execution.PENDING: + return _workflow_cancelled(workflow_context=workflow_context) + # the execution may have already been finished + elif execution.status in (execution.SUCCEEDED, execution.FAILED): + _log_tried_to_cancel_execution_but_it_already_ended(workflow_context, execution.status) + else: + execution.status = execution.CANCELLING + + +def _update_node_state_if_necessary(ctx, is_transitional=False): + # TODO: this is not the right way to check! the interface name is arbitrary + # and also will *never* be the type name + node = ctx.task.node if ctx.task is not None else None + if (node is not None) and \ + (ctx.task.interface_name in ('Standard', 'tosca.interfaces.node.lifecycle.Standard', + 'tosca:Standard')): + state = node.determine_state(op_name=ctx.task.operation_name, + is_transitional=is_transitional) + if state: + node.state = state + ctx.model.node.update(node) + + +def _log_tried_to_cancel_execution_but_it_already_ended(workflow_context, status): + workflow_context.logger.info( + "'{workflow_name}' workflow execution {status} before the cancel request" + "was fully processed".format(workflow_name=workflow_context.workflow_name, status=status)) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/graph_compiler.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/graph_compiler.py new file mode 100644 index 0000000..81543d5 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/core/graph_compiler.py @@ -0,0 +1,118 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ....modeling import models +from .. import executor, api + + +class GraphCompiler(object): + def __init__(self, ctx, default_executor): + self._ctx = ctx + self._default_executor = default_executor + self._stub_executor = executor.base.StubTaskExecutor + self._model_to_api_id = {} + + def compile(self, + task_graph, + start_stub_type=models.Task.START_WORKFLOW, + end_stub_type=models.Task.END_WORKFLOW, + depends_on=()): + """ + Translates the user graph to the execution graph + :param task_graph: The user's graph + :param start_stub_type: internal use + :param end_stub_type: internal use + :param depends_on: internal use + """ + depends_on = list(depends_on) + + # Insert start marker + start_task = self._create_stub_task( + start_stub_type, depends_on, self._start_graph_suffix(task_graph.id), task_graph.name, + ) + + for task in task_graph.topological_order(reverse=True): + dependencies = \ + (self._get_tasks_from_dependencies(task_graph.get_dependencies(task)) + or [start_task]) + + if isinstance(task, api.task.OperationTask): + self._create_operation_task(task, dependencies) + + elif isinstance(task, api.task.WorkflowTask): + # Build the graph recursively while adding start and end markers + self.compile( + task, models.Task.START_SUBWROFKLOW, models.Task.END_SUBWORKFLOW, dependencies + ) + elif isinstance(task, api.task.StubTask): + self._create_stub_task(models.Task.STUB, dependencies, task.id) + else: + raise RuntimeError('Undefined state') + + # Insert end marker + self._create_stub_task( + end_stub_type, + self._get_non_dependent_tasks(self._ctx.execution) or [start_task], + self._end_graph_suffix(task_graph.id), + task_graph.name + ) + + def _create_stub_task(self, stub_type, dependencies, api_id, name=None): + model_task = models.Task( + name=name, + dependencies=dependencies, + execution=self._ctx.execution, + _executor=self._stub_executor, + _stub_type=stub_type) + self._ctx.model.task.put(model_task) + self._model_to_api_id[model_task.id] = api_id + return model_task + + def _create_operation_task(self, api_task, dependencies): + model_task = models.Task.from_api_task( + api_task, self._default_executor, dependencies=dependencies) + self._ctx.model.task.put(model_task) + self._model_to_api_id[model_task.id] = api_task.id + return model_task + + @staticmethod + def _start_graph_suffix(api_id): + return '{0}-Start'.format(api_id) + + @staticmethod + def _end_graph_suffix(api_id): + return '{0}-End'.format(api_id) + + @staticmethod + def _get_non_dependent_tasks(execution): + tasks_with_dependencies = set() + for task in execution.tasks: + tasks_with_dependencies.update(task.dependencies) + return list(set(execution.tasks) - set(tasks_with_dependencies)) + + def _get_tasks_from_dependencies(self, dependencies): + """ + Returns task list from dependencies. + """ + tasks = [] + for dependency in dependencies: + if isinstance(dependency, (api.task.StubTask, api.task.OperationTask)): + dependency_name = dependency.id + else: + dependency_name = self._end_graph_suffix(dependency.id) + tasks.extend(task for task in self._ctx.execution.tasks + if self._model_to_api_id.get(task.id, None) == dependency_name) + return tasks diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/events_logging.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/events_logging.py new file mode 100644 index 0000000..9eee1e1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/events_logging.py @@ -0,0 +1,85 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + + +""" +Workflow event logging. +""" + +from .. import events +from ... import modeling + + +def _get_task_name(task): + if isinstance(task.actor, modeling.model_bases.service_instance.RelationshipBase): + return '{source_node.name}->{target_node.name}'.format( + source_node=task.actor.source_node, target_node=task.actor.target_node) + else: + return task.actor.name + + +@events.start_task_signal.connect +def _start_task_handler(ctx, **kwargs): + # If the task has no function this is an empty task. + if ctx.task.function: + suffix = 'started...' + logger = ctx.logger.info + else: + suffix = 'has no implementation' + logger = ctx.logger.debug + + logger('{name} {task.interface_name}.{task.operation_name} {suffix}'.format( + name=_get_task_name(ctx.task), task=ctx.task, suffix=suffix)) + + +@events.on_success_task_signal.connect +def _success_task_handler(ctx, **kwargs): + if not ctx.task.function: + return + ctx.logger.info('{name} {task.interface_name}.{task.operation_name} successful' + .format(name=_get_task_name(ctx.task), task=ctx.task)) + + +@events.on_failure_task_signal.connect +def _failure_operation_handler(ctx, traceback, **kwargs): + ctx.logger.error( + '{name} {task.interface_name}.{task.operation_name} failed' + .format(name=_get_task_name(ctx.task), task=ctx.task), extra=dict(traceback=traceback) + ) + + +@events.start_workflow_signal.connect +def _start_workflow_handler(context, **kwargs): + context.logger.info("Starting '{ctx.workflow_name}' workflow execution".format(ctx=context)) + + +@events.on_failure_workflow_signal.connect +def _failure_workflow_handler(context, **kwargs): + context.logger.info("'{ctx.workflow_name}' workflow execution failed".format(ctx=context)) + + +@events.on_success_workflow_signal.connect +def _success_workflow_handler(context, **kwargs): + context.logger.info("'{ctx.workflow_name}' workflow execution succeeded".format(ctx=context)) + + +@events.on_cancelled_workflow_signal.connect +def _cancel_workflow_handler(context, **kwargs): + context.logger.info("'{ctx.workflow_name}' workflow execution canceled".format(ctx=context)) + + +@events.on_cancelling_workflow_signal.connect +def _cancelling_workflow_handler(context, **kwargs): + context.logger.info("Cancelling '{ctx.workflow_name}' workflow execution".format(ctx=context)) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/exceptions.py new file mode 100644 index 0000000..2a1d6b1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/exceptions.py @@ -0,0 +1,91 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Workflow exceptions. +""" + +import os + +from .. import exceptions + + +class ExecutorException(exceptions.AriaError): + """ + General executor exception. + """ + pass + + +class ProcessException(ExecutorException): + """ + Raised when subprocess execution fails. + """ + + def __init__(self, command, stderr=None, stdout=None, return_code=None): + """ + Process class Exception + :param list command: child process command + :param str message: custom message + :param str stderr: child process stderr + :param str stdout: child process stdout + :param int return_code: child process exit code + """ + super(ProcessException, self).__init__("child process failed") + self.command = command + self.stderr = stderr + self.stdout = stdout + self.return_code = return_code + + @property + def explanation(self): + """ + Describes the error in detail + """ + return ( + 'Command "{error.command}" executed with an error.{0}' + 'code: {error.return_code}{0}' + 'error: {error.stderr}{0}' + 'output: {error.stdout}'.format(os.linesep, error=self)) + + +class AriaEngineError(exceptions.AriaError): + """ + Raised by the workflow engine. + """ + + +class TaskException(exceptions.AriaError): + """ + Raised by the task. + """ + + +class TaskCreationException(TaskException): + """ + Could not create the task. + """ + + +class OperationNotFoundException(TaskCreationException): + """ + Could not find an operation on the node or relationship. + """ + + +class PluginNotFoundException(TaskCreationException): + """ + Could not find a plugin matching the plugin specification. + """ diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/__init__.py new file mode 100644 index 0000000..cafab74 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/__init__.py @@ -0,0 +1,22 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Task executors. +""" + + +from . import process, thread +from .base import BaseExecutor diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/base.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/base.py new file mode 100644 index 0000000..e7d03ea --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/base.py @@ -0,0 +1,75 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Base class for task executors. +""" + +from aria import logger +from aria.orchestrator import events + + +class BaseExecutor(logger.LoggerMixin): + """ + Base class for task executors. + """ + def _execute(self, ctx): + raise NotImplementedError + + def execute(self, ctx): + """ + Executes a task. + + :param task: task to execute + """ + if ctx.task.function: + self._execute(ctx) + else: + # In this case the task is missing a function. This task still gets to an + # executor, but since there is nothing to run, we by default simply skip the + # execution itself. + self._task_started(ctx) + self._task_succeeded(ctx) + + def close(self): + """ + Closes the executor. + """ + pass + + def terminate(self, task_id): + """ + Terminate the executing task + :return: + """ + pass + + @staticmethod + def _task_started(ctx): + events.start_task_signal.send(ctx) + + @staticmethod + def _task_failed(ctx, exception, traceback=None): + events.on_failure_task_signal.send(ctx, exception=exception, traceback=traceback) + + @staticmethod + def _task_succeeded(ctx): + events.on_success_task_signal.send(ctx) + + +class StubTaskExecutor(BaseExecutor): # pylint: disable=abstract-method + def execute(self, ctx, *args, **kwargs): + with ctx.persist_changes: + ctx.task.status = ctx.task.SUCCESS diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/celery.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/celery.py new file mode 100644 index 0000000..a2b3513 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/celery.py @@ -0,0 +1,97 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Celery task executor. +""" + +import threading +import Queue + +from aria.orchestrator.workflows.executor import BaseExecutor + + +class CeleryExecutor(BaseExecutor): + """ + Celery task executor. + """ + + def __init__(self, app, *args, **kwargs): + super(CeleryExecutor, self).__init__(*args, **kwargs) + self._app = app + self._started_signaled = False + self._started_queue = Queue.Queue(maxsize=1) + self._tasks = {} + self._results = {} + self._receiver = None + self._stopped = False + self._receiver_thread = threading.Thread(target=self._events_receiver) + self._receiver_thread.daemon = True + self._receiver_thread.start() + self._started_queue.get(timeout=30) + + def _execute(self, ctx): + self._tasks[ctx.id] = ctx + arguments = dict(arg.unwrapped for arg in ctx.task.arguments.itervalues()) + arguments['ctx'] = ctx.context + self._results[ctx.id] = self._app.send_task( + ctx.operation_mapping, + kwargs=arguments, + task_id=ctx.task.id, + queue=self._get_queue(ctx)) + + def close(self): + self._stopped = True + if self._receiver: + self._receiver.should_stop = True + self._receiver_thread.join() + + @staticmethod + def _get_queue(task): + return None if task else None # TODO + + def _events_receiver(self): + with self._app.connection() as connection: + self._receiver = self._app.events.Receiver(connection, handlers={ + 'task-started': self._celery_task_started, + 'task-succeeded': self._celery_task_succeeded, + 'task-failed': self._celery_task_failed, + }) + for _ in self._receiver.itercapture(limit=None, timeout=None, wakeup=True): + if not self._started_signaled: + self._started_queue.put(True) + self._started_signaled = True + if self._stopped: + return + + def _celery_task_started(self, event): + self._task_started(self._tasks[event['uuid']]) + + def _celery_task_succeeded(self, event): + task, _ = self._remove_task(event['uuid']) + self._task_succeeded(task) + + def _celery_task_failed(self, event): + task, async_result = self._remove_task(event['uuid']) + try: + exception = async_result.result + except BaseException as e: + exception = RuntimeError( + 'Could not de-serialize exception of task {0} --> {1}: {2}' + .format(task.name, type(e).__name__, str(e))) + self._task_failed(task, exception=exception) + + def _remove_task(self, task_id): + return self._tasks.pop(task_id), self._results.pop(task_id) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/dry.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/dry.py new file mode 100644 index 0000000..9314e5d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/dry.py @@ -0,0 +1,54 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Dry task executor. +""" + +from datetime import datetime + +from . import base + + +class DryExecutor(base.BaseExecutor): # pylint: disable=abstract-method + """ + Dry task executor: prints task information without causing any side effects. + """ + def execute(self, ctx): + with ctx.persist_changes: + # updating the task manually instead of calling self._task_started(task), + # to avoid any side effects raising that event might cause + ctx.task.started_at = datetime.utcnow() + ctx.task.status = ctx.task.STARTED + + dry_msg = ' {name} {task.interface_name}.{task.operation_name} {suffix}' + logger = ctx.logger.info if ctx.task.function else ctx.logger.debug + + if hasattr(ctx.task.actor, 'source_node'): + name = '{source_node.name}->{target_node.name}'.format( + source_node=ctx.task.actor.source_node, target_node=ctx.task.actor.target_node) + else: + name = ctx.task.actor.name + + if ctx.task.function: + logger(dry_msg.format(name=name, task=ctx.task, suffix='started...')) + logger(dry_msg.format(name=name, task=ctx.task, suffix='successful')) + else: + logger(dry_msg.format(name=name, task=ctx.task, suffix='has no implementation')) + + # updating the task manually instead of calling self._task_succeeded(task), + # to avoid any side effects raising that event might cause + ctx.task.ended_at = datetime.utcnow() + ctx.task.status = ctx.task.SUCCESS diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/process.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/process.py new file mode 100644 index 0000000..185f15f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/process.py @@ -0,0 +1,350 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Sub-process task executor. +""" + +# pylint: disable=wrong-import-position + +import os +import sys + +# As part of the process executor implementation, subprocess are started with this module as their +# entry point. We thus remove this module's directory from the python path if it happens to be +# there + +from collections import namedtuple + +script_dir = os.path.dirname(__file__) +if script_dir in sys.path: + sys.path.remove(script_dir) + +import contextlib +import io +import threading +import socket +import struct +import subprocess +import tempfile +import Queue +import pickle + +import psutil +import jsonpickle + +import aria +from aria.orchestrator.workflows.executor import base +from aria.extension import process_executor +from aria.utils import ( + imports, + exceptions, + process as process_utils +) + + +_INT_FMT = 'I' +_INT_SIZE = struct.calcsize(_INT_FMT) +UPDATE_TRACKED_CHANGES_FAILED_STR = \ + 'Some changes failed writing to storage. For more info refer to the log.' + + +_Task = namedtuple('_Task', 'proc, ctx') + + +class ProcessExecutor(base.BaseExecutor): + """ + Sub-process task executor. + """ + + def __init__(self, plugin_manager=None, python_path=None, *args, **kwargs): + super(ProcessExecutor, self).__init__(*args, **kwargs) + self._plugin_manager = plugin_manager + + # Optional list of additional directories that should be added to + # subprocesses python path + self._python_path = python_path or [] + + # Flag that denotes whether this executor has been stopped + self._stopped = False + + # Contains reference to all currently running tasks + self._tasks = {} + + self._request_handlers = { + 'started': self._handle_task_started_request, + 'succeeded': self._handle_task_succeeded_request, + 'failed': self._handle_task_failed_request, + } + + # Server socket used to accept task status messages from subprocesses + self._server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self._server_socket.bind(('localhost', 0)) + self._server_socket.listen(10) + self._server_port = self._server_socket.getsockname()[1] + + # Used to send a "closed" message to the listener when this executor is closed + self._messenger = _Messenger(task_id=None, port=self._server_port) + + # Queue object used by the listener thread to notify this constructed it has started + # (see last line of this __init__ method) + self._listener_started = Queue.Queue() + + # Listener thread to handle subprocesses task status messages + self._listener_thread = threading.Thread(target=self._listener) + self._listener_thread.daemon = True + self._listener_thread.start() + + # Wait for listener thread to actually start before returning + self._listener_started.get(timeout=60) + + def close(self): + if self._stopped: + return + self._stopped = True + # Listener thread may be blocked on "accept" call. This will wake it up with an explicit + # "closed" message + self._messenger.closed() + self._server_socket.close() + self._listener_thread.join(timeout=60) + + # we use set(self._tasks) since tasks may change in the process of closing + for task_id in set(self._tasks): + self.terminate(task_id) + + def terminate(self, task_id): + task = self._remove_task(task_id) + # The process might have managed to finish, thus it would not be in the tasks list + if task: + try: + parent_process = psutil.Process(task.proc.pid) + for child_process in reversed(parent_process.children(recursive=True)): + try: + child_process.kill() + except BaseException: + pass + parent_process.kill() + except BaseException: + pass + + def _execute(self, ctx): + self._check_closed() + + # Temporary file used to pass arguments to the started subprocess + file_descriptor, arguments_json_path = tempfile.mkstemp(prefix='executor-', suffix='.json') + os.close(file_descriptor) + with open(arguments_json_path, 'wb') as f: + f.write(pickle.dumps(self._create_arguments_dict(ctx))) + + env = self._construct_subprocess_env(task=ctx.task) + # Asynchronously start the operation in a subprocess + proc = subprocess.Popen( + [ + sys.executable, + os.path.expanduser(os.path.expandvars(__file__)), + os.path.expanduser(os.path.expandvars(arguments_json_path)) + ], + env=env) + + self._tasks[ctx.task.id] = _Task(ctx=ctx, proc=proc) + + def _remove_task(self, task_id): + return self._tasks.pop(task_id, None) + + def _check_closed(self): + if self._stopped: + raise RuntimeError('Executor closed') + + def _create_arguments_dict(self, ctx): + return { + 'task_id': ctx.task.id, + 'function': ctx.task.function, + 'operation_arguments': dict(arg.unwrapped for arg in ctx.task.arguments.itervalues()), + 'port': self._server_port, + 'context': ctx.serialization_dict + } + + def _construct_subprocess_env(self, task): + env = os.environ.copy() + + if task.plugin_fk and self._plugin_manager: + # If this is a plugin operation, + # load the plugin on the subprocess env we're constructing + self._plugin_manager.load_plugin(task.plugin, env=env) + + # Add user supplied directories to injected PYTHONPATH + if self._python_path: + process_utils.append_to_pythonpath(*self._python_path, env=env) + + return env + + def _listener(self): + # Notify __init__ method this thread has actually started + self._listener_started.put(True) + while not self._stopped: + try: + with self._accept_request() as (request, response): + request_type = request['type'] + if request_type == 'closed': + break + request_handler = self._request_handlers.get(request_type) + if not request_handler: + raise RuntimeError('Invalid request type: {0}'.format(request_type)) + task_id = request['task_id'] + request_handler(task_id=task_id, request=request, response=response) + except BaseException as e: + self.logger.debug('Error in process executor listener: {0}'.format(e)) + + @contextlib.contextmanager + def _accept_request(self): + with contextlib.closing(self._server_socket.accept()[0]) as connection: + message = _recv_message(connection) + response = {} + try: + yield message, response + except BaseException as e: + response['exception'] = exceptions.wrap_if_needed(e) + raise + finally: + _send_message(connection, response) + + def _handle_task_started_request(self, task_id, **kwargs): + self._task_started(self._tasks[task_id].ctx) + + def _handle_task_succeeded_request(self, task_id, **kwargs): + task = self._remove_task(task_id) + if task: + self._task_succeeded(task.ctx) + + def _handle_task_failed_request(self, task_id, request, **kwargs): + task = self._remove_task(task_id) + if task: + self._task_failed( + task.ctx, exception=request['exception'], traceback=request['traceback']) + + +def _send_message(connection, message): + + # Packing the length of the entire msg using struct.pack. + # This enables later reading of the content. + def _pack(data): + return struct.pack(_INT_FMT, len(data)) + + data = jsonpickle.dumps(message) + msg_metadata = _pack(data) + connection.send(msg_metadata) + connection.sendall(data) + + +def _recv_message(connection): + # Retrieving the length of the msg to come. + def _unpack(conn): + return struct.unpack(_INT_FMT, _recv_bytes(conn, _INT_SIZE))[0] + + msg_metadata_len = _unpack(connection) + msg = _recv_bytes(connection, msg_metadata_len) + return jsonpickle.loads(msg) + + +def _recv_bytes(connection, count): + result = io.BytesIO() + while True: + if not count: + return result.getvalue() + read = connection.recv(count) + if not read: + return result.getvalue() + result.write(read) + count -= len(read) + + +class _Messenger(object): + + def __init__(self, task_id, port): + self.task_id = task_id + self.port = port + + def started(self): + """Task started message""" + self._send_message(type='started') + + def succeeded(self): + """Task succeeded message""" + self._send_message(type='succeeded') + + def failed(self, exception): + """Task failed message""" + self._send_message(type='failed', exception=exception) + + def closed(self): + """Executor closed message""" + self._send_message(type='closed') + + def _send_message(self, type, exception=None): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.connect(('localhost', self.port)) + try: + _send_message(sock, { + 'type': type, + 'task_id': self.task_id, + 'exception': exceptions.wrap_if_needed(exception), + 'traceback': exceptions.get_exception_as_string(*sys.exc_info()), + }) + response = _recv_message(sock) + response_exception = response.get('exception') + if response_exception: + raise response_exception + finally: + sock.close() + + +def _main(): + arguments_json_path = sys.argv[1] + with open(arguments_json_path) as f: + arguments = pickle.loads(f.read()) + + # arguments_json_path is a temporary file created by the parent process. + # so we remove it here + os.remove(arguments_json_path) + + task_id = arguments['task_id'] + port = arguments['port'] + messenger = _Messenger(task_id=task_id, port=port) + + function = arguments['function'] + operation_arguments = arguments['operation_arguments'] + context_dict = arguments['context'] + + try: + ctx = context_dict['context_cls'].instantiate_from_dict(**context_dict['context']) + except BaseException as e: + messenger.failed(e) + return + + try: + messenger.started() + task_func = imports.load_attribute(function) + aria.install_aria_extensions() + for decorate in process_executor.decorate(): + task_func = decorate(task_func) + task_func(ctx=ctx, **operation_arguments) + ctx.close() + messenger.succeeded() + except BaseException as e: + ctx.close() + messenger.failed(e) + +if __name__ == '__main__': + _main() diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/thread.py b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/thread.py new file mode 100644 index 0000000..170620e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/orchestrator/workflows/executor/thread.py @@ -0,0 +1,79 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Thread task executor. +""" + +import Queue +import threading + +import sys + +from aria.utils import imports, exceptions + +from .base import BaseExecutor + + +class ThreadExecutor(BaseExecutor): + """ + Thread task executor. + + It's easier writing tests using this executor rather than the full-blown sub-process executor. + + Note: This executor is incapable of running plugin operations. + """ + + def __init__(self, pool_size=1, close_timeout=5, *args, **kwargs): + super(ThreadExecutor, self).__init__(*args, **kwargs) + self._stopped = False + self._close_timeout = close_timeout + self._queue = Queue.Queue() + self._pool = [] + for i in range(pool_size): + name = 'ThreadExecutor-{index}'.format(index=i+1) + thread = threading.Thread(target=self._processor, name=name) + thread.daemon = True + thread.start() + self._pool.append(thread) + + def _execute(self, ctx): + self._queue.put(ctx) + + def close(self): + self._stopped = True + for thread in self._pool: + if self._close_timeout is None: + thread.join() + else: + thread.join(self._close_timeout) + + def _processor(self): + while not self._stopped: + try: + ctx = self._queue.get(timeout=1) + self._task_started(ctx) + try: + task_func = imports.load_attribute(ctx.task.function) + arguments = dict(arg.unwrapped for arg in ctx.task.arguments.itervalues()) + task_func(ctx=ctx, **arguments) + self._task_succeeded(ctx) + except BaseException as e: + self._task_failed(ctx, + exception=e, + traceback=exceptions.get_exception_as_string(*sys.exc_info())) + # Daemon threads + except BaseException as e: + pass diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/__init__.py new file mode 100644 index 0000000..7903b52 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/__init__.py @@ -0,0 +1,34 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Parser package. +""" + +from .specification import implements_specification, iter_specifications + + +MODULES = ( + 'consumption', + 'loading', + 'modeling', + 'presentation', + 'reading', + 'validation') + +__all__ = ( + 'MODULES', + 'implements_specification', + 'iter_specifications') diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/__init__.py new file mode 100644 index 0000000..f9caf5f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/__init__.py @@ -0,0 +1,84 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Consumption package. + +.. autosummary:: + :nosignatures: + + aria.parser.consumption.ConsumptionContext + +Consumers +--------- + +.. autosummary:: + :nosignatures: + + aria.parser.consumption.Consumer + aria.parser.consumption.ConsumerChain + aria.parser.consumption.ConsumerException + aria.parser.consumption.Inputs + aria.parser.consumption.ServiceTemplate + aria.parser.consumption.Types + aria.parser.consumption.CoerceServiceInstanceValues + aria.parser.consumption.ValidateServiceInstance + aria.parser.consumption.SatisfyRequirements + aria.parser.consumption.ValidateCapabilities + aria.parser.consumption.FindHosts + aria.parser.consumption.ConfigureOperations + aria.parser.consumption.ServiceInstance + aria.parser.consumption.Read + aria.parser.consumption.Validate +""" + +from .exceptions import ConsumerException +from .context import ConsumptionContext +from .consumer import ( + Consumer, + ConsumerChain +) +from .presentation import Read +from .validation import Validate +from .modeling import ( + ServiceTemplate, + Types, + ServiceInstance, + FindHosts, + ValidateServiceInstance, + ConfigureOperations, + SatisfyRequirements, + ValidateCapabilities, + CoerceServiceInstanceValues +) +from .inputs import Inputs + +__all__ = ( + 'ConsumerException', + 'ConsumptionContext', + 'Consumer', + 'ConsumerChain', + 'Read', + 'Validate', + 'ServiceTemplate', + 'Types', + 'ServiceInstance', + 'FindHosts', + 'ValidateServiceInstance', + 'ConfigureOperations', + 'SatisfyRequirements', + 'ValidateCapabilities', + 'CoerceServiceInstanceValues' +) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/consumer.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/consumer.py new file mode 100644 index 0000000..878a161 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/consumer.py @@ -0,0 +1,93 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ...exceptions import AriaException +from ...utils.exceptions import print_exception +from ..validation import Issue + + +class Consumer(object): + """ + Base class for ARIA consumers. + + Consumers provide useful functionality by consuming presentations. + """ + + def __init__(self, context): + from ...orchestrator import topology + + self.topology = topology.Topology() + self.context = context + + def consume(self): + pass + + def dump(self): + pass + + def _handle_exception(self, e): + if hasattr(e, 'issue') and isinstance(e.issue, Issue): + self.context.validation.report(issue=e.issue) + else: + self.context.validation.report(exception=e) + if not isinstance(e, AriaException): + print_exception(e) + + +class ConsumerChain(Consumer): + """ + ARIA consumer chain. + + Calls consumers in order, handling exception by calling ``_handle_exception`` on them, and stops + the chain if there are any validation issues. + """ + + def __init__(self, context, consumer_classes=None, handle_exceptions=True): + super(ConsumerChain, self).__init__(context) + self.handle_exceptions = handle_exceptions + self.consumers = [] + if consumer_classes: + for consumer_class in consumer_classes: + self.append(consumer_class) + + def append(self, *consumer_classes): + for consumer_class in consumer_classes: + self.consumers.append(consumer_class(self.context)) + + def consume(self): + for consumer in self.consumers: + try: + consumer.consume() + except BaseException as e: + if self.handle_exceptions: + handle_exception(consumer, e) + else: + raise e + + if consumer.topology.has_issues: + self.context.validation.extend_issues(consumer.topology.issues) + + if self.context.validation.has_issues: + break + + +def handle_exception(consumer, e): + if isinstance(e, AriaException) and e.issue: + consumer.context.validation.report(issue=e.issue) + else: + consumer.context.validation.report(exception=e) + if not isinstance(e, AriaException): + print_exception(e) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/context.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/context.py new file mode 100644 index 0000000..9164984 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/context.py @@ -0,0 +1,106 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 sys +import threading + +from ...utils import console +from ..validation import ValidationContext +from ..loading import LoadingContext +from ..reading import ReadingContext +from ..presentation import PresentationContext +from ..modeling import ModelingContext + + +_thread_locals = threading.local() + + +class ConsumptionContext(object): + """ + Consumption context. + + :ivar args: runtime arguments (usually provided on the command line) + :ivar out: message output stream (defaults to stdout) + :ivar style: message output style + :vartype style: Style + :ivar validation: validation context + :vartype validation: :class:`ValidationContext` + :ivar loading: loading context + :vartype loading: :class:`LoadingContext` + :ivar reading: reading context + :vartype reading: :class:`ReadingContext` + :ivar presentation: presentation context + :vartype presentation: :class:`PresentationContext` + :ivar modeling: modeling context + :vartype modeling: :class:`ModelingContext` + """ + + @staticmethod + def get_thread_local(): + """ + Gets the context attached to the current thread if there is one. + """ + + return getattr(_thread_locals, 'aria_consumption_context', None) + + def __init__(self, set_thread_local=True): + self.args = [] + self.out = sys.stdout + self.validation = ValidationContext() + self.loading = LoadingContext() + self.reading = ReadingContext() + self.presentation = PresentationContext() + self.modeling = ModelingContext() + self.style = console.TopologyStylizer() + + if set_thread_local: + self.set_thread_local() + + def set_thread_local(self): + """ + Attaches this context to the current thread. + """ + + _thread_locals.aria_consumption_context = self + + def write(self, string): + """ + Writes to our ``out``, making sure to encode UTF-8 if required. + """ + + try: + self.out.write(string) + except UnicodeEncodeError: + self.out.write(string.encode('utf8')) + + def has_arg_switch(self, name): + name = '--%s' % name + return name in self.args + + def get_arg_value(self, name, default=None): + name = '--%s=' % name + for arg in self.args: + if arg.startswith(name): + return arg[len(name):] + return default + + def get_arg_value_int(self, name, default=None): + value = self.get_arg_value(name) + if value is not None: + try: + return int(value) + except (TypeError, ValueError): + pass + return default diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/exceptions.py new file mode 100644 index 0000000..78509cb --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/exceptions.py @@ -0,0 +1,23 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ...exceptions import AriaException + + +class ConsumerException(AriaException): + """ + ARIA consumer exception. + """ diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/inputs.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/inputs.py new file mode 100644 index 0000000..fe7e192 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/inputs.py @@ -0,0 +1,53 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ...utils.formatting import safe_repr +from ..loading import UriLocation, LiteralLocation +from ..reading import JsonReader +from .consumer import Consumer + + +class Inputs(Consumer): + """ + Fills in the inputs if provided as arguments. + """ + + def consume(self): + inputs = self.context.get_arg_value('inputs') + if inputs is None: + return + + if inputs.endswith('.json') or inputs.endswith('.yaml'): + location = UriLocation(inputs) + else: + location = LiteralLocation(inputs) + + loader = self.context.loading.loader_source.get_loader(self.context.loading, location, None) + + if isinstance(location, LiteralLocation): + reader = JsonReader(self.context.reading, location, loader) + else: + reader = self.context.reading.reader_source.get_reader(self.context.reading, + location, loader) + + inputs = reader.read() + + if not isinstance(inputs, dict): + self.context.validation.report( + 'Inputs consumer: inputs are not a dict: %s' % safe_repr(inputs)) + return + + for name, value in inputs.iteritems(): + self.context.modeling.set_input(name, value) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/modeling.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/modeling.py new file mode 100644 index 0000000..221b308 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/modeling.py @@ -0,0 +1,198 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 .consumer import Consumer, ConsumerChain +from ...utils.formatting import json_dumps, yaml_dumps + + +class DeriveServiceTemplate(Consumer): + """ + Derives the service template from the presenter. + """ + + def consume(self): + if self.context.presentation.presenter is None: + self.context.validation.report('DeriveServiceTemplate consumer: missing presenter') + return + + if not hasattr(self.context.presentation.presenter, '_get_model'): + self.context.validation.report('DeriveServiceTemplate consumer: presenter does not' + ' support "_get_model"') + return + + self.context.modeling.template = \ + self.context.presentation.presenter._get_model(self.context) + + +class CoerceServiceTemplateValues(Consumer): + """ + Coerces values in the service template. + """ + + def consume(self): + self.topology.coerce(self.context.modeling.template, report_issues=True) + + +class ValidateServiceTemplate(Consumer): + """ + Validates the service template. + """ + + def consume(self): + self.topology.validate(self.context.modeling.template) + + +class ServiceTemplate(ConsumerChain): + """ + Generates the service template from the presenter. + """ + + def __init__(self, context): + super(ServiceTemplate, self).__init__(context, (DeriveServiceTemplate, + CoerceServiceTemplateValues, + ValidateServiceTemplate)) + + def dump(self): + if self.context.has_arg_switch('yaml'): + indent = self.context.get_arg_value_int('indent', 2) + raw = self.context.modeling.template_as_raw + self.context.write(yaml_dumps(raw, indent=indent)) + elif self.context.has_arg_switch('json'): + indent = self.context.get_arg_value_int('indent', 2) + raw = self.context.modeling.template_as_raw + self.context.write(json_dumps(raw, indent=indent)) + else: + self.context.write(self.topology.dump(self.context.modeling.template)) + + +class Types(Consumer): + """ + Used to just dump the types. + """ + + def dump(self): + if self.context.has_arg_switch('yaml'): + indent = self.context.get_arg_value_int('indent', 2) + raw = self.context.modeling.types_as_raw + self.context.write(yaml_dumps(raw, indent=indent)) + elif self.context.has_arg_switch('json'): + indent = self.context.get_arg_value_int('indent', 2) + raw = self.context.modeling.types_as_raw + self.context.write(json_dumps(raw, indent=indent)) + else: + self.topology.dump_types(self.context, self.context.modeling.template) + + +class InstantiateServiceInstance(Consumer): + """ + Instantiates the service template into a service instance. + """ + + def consume(self): + if self.context.modeling.template is None: + self.context.validation.report('InstantiateServiceInstance consumer: missing service ' + 'template') + return + self.context.modeling.instance = self.topology.instantiate( + self.context.modeling.template, + inputs=dict(self.context.modeling.inputs) + ) + + +class CoerceServiceInstanceValues(Consumer): + """ + Coerces values in the service instance. + """ + + def consume(self): + self.topology.coerce(self.context.modeling.instance, report_issues=True) + + +class ValidateServiceInstance(Consumer): + """ + Validates the service instance. + """ + + def consume(self): + self.topology.validate(self.context.modeling.instance) + + +class SatisfyRequirements(Consumer): + """ + Satisfies node requirements in the service instance. + """ + + def consume(self): + self.topology.satisfy_requirements(self.context.modeling.instance) + + +class ValidateCapabilities(Consumer): + """ + Validates capabilities in the service instance. + """ + + def consume(self): + self.topology.validate_capabilities(self.context.modeling.instance) + + +class FindHosts(Consumer): + """ + Find hosts for all nodes in the service instance. + """ + + def consume(self): + self.topology.assign_hosts(self.context.modeling.instance) + + +class ConfigureOperations(Consumer): + """ + Configures all operations in the service instance. + """ + + def consume(self): + self.topology.configure_operations(self.context.modeling.instance) + + +class ServiceInstance(ConsumerChain): + """ + Generates the service instance by instantiating the service template. + """ + + def __init__(self, context): + super(ServiceInstance, self).__init__(context, (InstantiateServiceInstance, + CoerceServiceInstanceValues, + ValidateServiceInstance, + CoerceServiceInstanceValues, + SatisfyRequirements, + CoerceServiceInstanceValues, + ValidateCapabilities, + FindHosts, + ConfigureOperations, + CoerceServiceInstanceValues)) + + def dump(self): + if self.context.has_arg_switch('graph'): + self.context.modeling.instance.dump_graph() + elif self.context.has_arg_switch('yaml'): + indent = self.context.get_arg_value_int('indent', 2) + raw = self.context.modeling.instance_as_raw + self.context.write(yaml_dumps(raw, indent=indent)) + elif self.context.has_arg_switch('json'): + indent = self.context.get_arg_value_int('indent', 2) + raw = self.context.modeling.instance_as_raw + self.context.write(json_dumps(raw, indent=indent)) + else: + str_rep = self.topology.dump(self.context.modeling.instance) + self.context.write(str_rep) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/presentation.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/presentation.py new file mode 100644 index 0000000..542b3f0 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/presentation.py @@ -0,0 +1,137 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ...utils.threading import FixedThreadPoolExecutor +from ...utils.formatting import json_dumps, yaml_dumps +from ..loading import UriLocation +from ..reading import AlreadyReadException +from ..presentation import PresenterNotFoundError +from .consumer import Consumer + + +class Read(Consumer): + """ + Reads the presentation, handling imports recursively. + + It works by consuming a data source via appropriate :class:`~aria.parser.loading.Loader`, + :class:`~aria.parser.reading.Reader`, and :class:`~aria.parser.presentation.Presenter` + instances. + + It supports agnostic raw data composition for presenters that have + ``_get_import_locations`` and ``_merge_import``. + + To improve performance, loaders are called asynchronously on separate threads. + + Note that parsing may internally trigger more than one loading/reading/presentation + cycle, for example if the agnostic raw data has dependencies that must also be parsed. + """ + + def consume(self): + if self.context.presentation.location is None: + self.context.validation.report('Presentation consumer: missing location') + return + + presenter = None + imported_presentations = None + + executor = FixedThreadPoolExecutor(size=self.context.presentation.threads, + timeout=self.context.presentation.timeout) + executor.print_exceptions = self.context.presentation.print_exceptions + try: + presenter = self._present(self.context.presentation.location, None, None, executor) + executor.drain() + + # Handle exceptions + for e in executor.exceptions: + self._handle_exception(e) + + imported_presentations = executor.returns + finally: + executor.close() + + # Merge imports + if (imported_presentations is not None) and hasattr(presenter, '_merge_import'): + for imported_presentation in imported_presentations: + okay = True + if hasattr(presenter, '_validate_import'): + okay = presenter._validate_import(self.context, imported_presentation) + if okay: + presenter._merge_import(imported_presentation) + + self.context.presentation.presenter = presenter + + def dump(self): + if self.context.has_arg_switch('yaml'): + indent = self.context.get_arg_value_int('indent', 2) + raw = self.context.presentation.presenter._raw + self.context.write(yaml_dumps(raw, indent=indent)) + elif self.context.has_arg_switch('json'): + indent = self.context.get_arg_value_int('indent', 2) + raw = self.context.presentation.presenter._raw + self.context.write(json_dumps(raw, indent=indent)) + else: + self.context.presentation.presenter._dump(self.context) + + def _handle_exception(self, e): + if isinstance(e, AlreadyReadException): + return + super(Read, self)._handle_exception(e) + + def _present(self, location, origin_location, presenter_class, executor): + # Link the context to this thread + self.context.set_thread_local() + + raw = self._read(location, origin_location) + + if self.context.presentation.presenter_class is not None: + # The presenter class we specified in the context overrides everything + presenter_class = self.context.presentation.presenter_class + else: + try: + presenter_class = self.context.presentation.presenter_source.get_presenter(raw) + except PresenterNotFoundError: + if presenter_class is None: + raise + # We'll use the presenter class we were given (from the presenter that imported us) + if presenter_class is None: + raise PresenterNotFoundError('presenter not found') + + presentation = presenter_class(raw=raw) + + if presentation is not None and hasattr(presentation, '_link_locators'): + presentation._link_locators() + + # Submit imports to executor + if hasattr(presentation, '_get_import_locations'): + import_locations = presentation._get_import_locations(self.context) + if import_locations: + for import_location in import_locations: + # The imports inherit the parent presenter class and use the current location as + # their origin location + import_location = UriLocation(import_location) + executor.submit(self._present, import_location, location, presenter_class, + executor) + + return presentation + + def _read(self, location, origin_location): + if self.context.reading.reader is not None: + return self.context.reading.reader.read() + loader = self.context.loading.loader_source.get_loader(self.context.loading, location, + origin_location) + reader = self.context.reading.reader_source.get_reader(self.context.reading, location, + loader) + return reader.read() diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/validation.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/validation.py new file mode 100644 index 0000000..a7bc3b8 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/consumption/validation.py @@ -0,0 +1,30 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 .consumer import Consumer + + +class Validate(Consumer): + """ + Validates the presentation. + """ + + def consume(self): + if self.context.presentation.presenter is None: + self.context.validation.report('Validation consumer: missing presenter') + return + + self.context.presentation.presenter._validate(self.context) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/exceptions.py new file mode 100644 index 0000000..a1f7012 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/exceptions.py @@ -0,0 +1,33 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Parser exceptions. +""" + +from ..exceptions import AriaException +from .validation import Issue + + +class InvalidValueError(AriaException): + """ + ARIA error: value is invalid. + """ + + def __init__(self, message, cause=None, cause_tb=None, location=None, line=None, column=None, + locator=None, snippet=None, level=Issue.FIELD): + super(InvalidValueError, self).__init__(message, cause, cause_tb) + self.issue = Issue(message, location=location, line=line, column=column, locator=locator, + snippet=snippet, level=level, exception=cause) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/__init__.py new file mode 100644 index 0000000..834675e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/__init__.py @@ -0,0 +1,80 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Loading package. + +.. autosummary:: + :nosignatures: + + aria.parser.loading.LoadingContext + aria.parser.loading.LoaderException + aria.parser.loading.LoaderNotFoundError + aria.parser.loading.DocumentNotFoundException + aria.parser.loading.LoaderSource + aria.parser.loading.DefaultLoaderSource + +Loaders +------- + +.. autosummary:: + :nosignatures: + + aria.parser.loading.Loader + aria.parser.loading.FileTextLoader + aria.parser.loading.LiteralLoader + aria.parser.loading.RequestLoader + aria.parser.loading.RequestTextLoader + aria.parser.loading.UriTextLoader + +Locations +--------- + +.. autosummary:: + :nosignatures: + + aria.parser.loading.Location + aria.parser.loading.UriLocation +""" + +from .exceptions import LoaderException, LoaderNotFoundError, DocumentNotFoundException +from .context import LoadingContext +from .loader import Loader +from .source import LoaderSource, DefaultLoaderSource +from .location import Location, UriLocation, LiteralLocation +from .literal import LiteralLoader +from .uri import UriTextLoader +from .request import SESSION, SESSION_CACHE_PATH, RequestLoader, RequestTextLoader +from .file import FileTextLoader + + +__all__ = ( + 'LoaderException', + 'LoaderNotFoundError', + 'DocumentNotFoundException', + 'LoadingContext', + 'Loader', + 'LoaderSource', + 'DefaultLoaderSource', + 'Location', + 'UriLocation', + 'LiteralLocation', + 'LiteralLoader', + 'UriTextLoader', + 'SESSION', + 'SESSION_CACHE_PATH', + 'RequestLoader', + 'RequestTextLoader', + 'FileTextLoader') diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/context.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/context.py new file mode 100644 index 0000000..59727c9 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/context.py @@ -0,0 +1,33 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ...utils.collections import StrictList +from .source import DefaultLoaderSource + + +class LoadingContext(object): + """ + Loading context. + + :ivar loader_source: for finding loader instances + :vartype loader_source: ~aria.parser.loading.LoaderSource + :ivar prefixes: additional prefixes for :class:`UriTextLoader` + :vartype prefixes: [:obj:`basestring`] + """ + + def __init__(self): + self.loader_source = DefaultLoaderSource() + self.prefixes = StrictList(value_class=basestring) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/exceptions.py new file mode 100644 index 0000000..6e8267a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/exceptions.py @@ -0,0 +1,35 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ...exceptions import AriaException + + +class LoaderException(AriaException): + """ + ARIA loader exception. + """ + + +class LoaderNotFoundError(LoaderException): + """ + ARIA loader error: loader not found for source. + """ + + +class DocumentNotFoundException(LoaderException): + """ + ARIA loader exception: document not found. + """ diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/file.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/file.py new file mode 100644 index 0000000..a02bd69 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/file.py @@ -0,0 +1,64 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 codecs + +from .loader import Loader +from .exceptions import LoaderException, DocumentNotFoundException + + +class FileTextLoader(Loader): + """ + ARIA file text loader. + + Extracts a text document from a file. The default encoding is UTF-8, but other supported + encoding can be specified instead. + """ + + def __init__(self, context, path, encoding='utf-8'): + self.context = context + self.path = path + self.encoding = encoding + self._file = None + + def open(self): + try: + self._file = codecs.open(self.path, mode='r', encoding=self.encoding, buffering=1) + except IOError as e: + if e.errno == 2: + raise DocumentNotFoundException('file not found: "%s"' % self.path, cause=e) + else: + raise LoaderException('file I/O error: "%s"' % self.path, cause=e) + except Exception as e: + raise LoaderException('file error: "%s"' % self.path, cause=e) + + def close(self): + if self._file is not None: + try: + self._file.close() + except IOError as e: + raise LoaderException('file I/O error: "%s"' % self.path, cause=e) + except Exception as e: + raise LoaderException('file error: "%s"' % self.path, cause=e) + + def load(self): + if self._file is not None: + try: + return self._file.read() + except IOError as e: + raise LoaderException('file I/O error: "%s"' % self.path, cause=e) + except Exception as e: + raise LoaderException('file error %s' % self.path, cause=e) + return None diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/literal.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/literal.py new file mode 100644 index 0000000..7865008 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/literal.py @@ -0,0 +1,31 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 .loader import Loader + + +class LiteralLoader(Loader): + """ + ARIA literal loader. + + See :class:`~aria.parser.loading.LiteralLocation`. + """ + + def __init__(self, location): + self.location = location + + def load(self): + return self.location.content diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/loader.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/loader.py new file mode 100644 index 0000000..e1abfbf --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/loader.py @@ -0,0 +1,34 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 Loader(object): + """ + Base class for ARIA loaders. + + Loaders extract a document by consuming a document source. + + Though the extracted document is often textual (a string or string-like + data), loaders may provide any format. + """ + + def open(self): + pass + + def close(self): + pass + + def load(self): + raise NotImplementedError diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/location.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/location.py new file mode 100644 index 0000000..902e856 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/location.py @@ -0,0 +1,82 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ...utils.uris import as_file + + +class Location(object): + """ + Base class for ARIA locations. + + Locations are used by :class:`~aria.parser.loading.LoaderSource` to delegate to + an appropriate :class:`~aria.parser.loading.Loader`. + """ + + def is_equivalent(self, location): + raise NotImplementedError + + @property + def prefix(self): + return None + + +class UriLocation(Location): + """ + A URI location can be absolute or relative, and can include a scheme or not. + + If no scheme is included, it should be treated as a filesystem path. + + See :class:`~aria.parser.loading.UriTextLoader`. + """ + + def __init__(self, uri): + self.uri = uri + + def is_equivalent(self, location): + return isinstance(location, UriLocation) and (location.uri == self.uri) + + @property + def prefix(self): + prefix = os.path.dirname(self.uri) + if prefix and (as_file(prefix) is None): + # Yes, it's weird, but dirname handles URIs, + # too: http://stackoverflow.com/a/35616478/849021 + # We just need to massage it with a trailing slash + prefix += '/' + return prefix + + def __str__(self): + return self.uri + + +class LiteralLocation(Location): + """ + A location that embeds content. + + See :class:`~aria.parser.loading.LiteralLoader`. + """ + + def __init__(self, content, name='literal'): + self.content = content + self.name = name + + def is_equivalent(self, location): + return isinstance(location, LiteralLocation) and (location.content == self.content) + + def __str__(self): + return '<%s>' % self.name diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/request.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/request.py new file mode 100644 index 0000000..a809347 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/request.py @@ -0,0 +1,88 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 tempfile + +from requests import Session +from requests.exceptions import (ConnectionError, InvalidSchema) +from cachecontrol import CacheControl +from cachecontrol.caches import FileCache + +from .exceptions import LoaderException, DocumentNotFoundException +from .loader import Loader + +SESSION = None +SESSION_CACHE_PATH = os.path.join(tempfile.gettempdir(), 'aria_requests') + + +class RequestLoader(Loader): + """ + Base class for ARIA request-based loaders. + + Extracts a document from a URI by performing a request. + + Note that the "file:" schema is not supported: :class:`FileTextLoader` should + be used instead. + """ + + def __init__(self, context, uri, headers=None): + if headers is None: + headers = {} + self.context = context + self.uri = uri + self.headers = headers + self._response = None + + def load(self): + pass + + def open(self): + global SESSION + if SESSION is None: + SESSION = CacheControl(Session(), cache=FileCache(SESSION_CACHE_PATH)) + + try: + self._response = SESSION.get(self.uri, headers=self.headers) + except InvalidSchema as e: + raise DocumentNotFoundException('document not found: "%s"' % self.uri, cause=e) + except ConnectionError as e: + raise LoaderException('request connection error: "%s"' % self.uri, cause=e) + except Exception as e: + raise LoaderException('request error: "%s"' % self.uri, cause=e) + + status = self._response.status_code + if status == 404: + self._response = None + raise DocumentNotFoundException('document not found: "%s"' % self.uri) + elif status != 200: + self._response = None + raise LoaderException('request error %d: "%s"' % (status, self.uri)) + + +class RequestTextLoader(RequestLoader): + """ + ARIA request-based text loader. + """ + + def load(self): + if self._response is not None: + try: + if self._response.encoding is None: + self._response.encoding = 'utf8' + return self._response.text + except Exception as e: + raise LoaderException('request error: %s' % self.uri, cause=e) + return None diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/source.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/source.py new file mode 100644 index 0000000..bcd6dd1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/source.py @@ -0,0 +1,44 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 .location import LiteralLocation, UriLocation +from .literal import LiteralLoader +from .uri import UriTextLoader + + +class LoaderSource(object): + """ + Base class for ARIA loader sources. + + Loader sources provide appropriate :class:`Loader` instances for locations. + """ + + def get_loader(self, context, location, origin_location): + raise NotImplementedError + + +class DefaultLoaderSource(LoaderSource): + """ + The default ARIA loader source will generate a :class:`UriTextLoader` for + :class:`UriLocation` and a :class:`LiteralLoader` for a :class:`LiteralLocation`. + """ + + def get_loader(self, context, location, origin_location): + if isinstance(location, UriLocation): + return UriTextLoader(context, location, origin_location) + elif isinstance(location, LiteralLocation): + return LiteralLoader(location) + + return super(DefaultLoaderSource, self).get_loader(context, location, origin_location) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/uri.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/uri.py new file mode 100644 index 0000000..a5a18e6 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/loading/uri.py @@ -0,0 +1,97 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 urlparse import urljoin + +from ...extension import parser +from ...utils.collections import StrictList +from ...utils.uris import as_file +from .loader import Loader +from .file import FileTextLoader +from .request import RequestTextLoader +from .exceptions import DocumentNotFoundException + + +class UriTextLoader(Loader): + """ + Base class for ARIA URI loaders. + + See :class:`~aria.parser.loading.UriLocation`. + + Supports a list of search prefixes that are tried in order if the URI cannot be found. + They will be: + + * If ``origin_location`` is provided its prefix will come first. + * Then the prefixes in the :class:`LoadingContext` will be added. + * Finally, the parser can supply a ``uri_loader_prefix`` function with extra prefixes. + """ + + def __init__(self, context, location, origin_location=None): + self.context = context + self.location = location + self._prefixes = StrictList(value_class=basestring) + self._loader = None + + def add_prefix(prefix): + if prefix and (prefix not in self._prefixes): + self._prefixes.append(prefix) + + def add_prefixes(prefixes): + for prefix in prefixes: + add_prefix(prefix) + + if origin_location is not None: + add_prefix(origin_location.prefix) + + add_prefixes(context.prefixes) + add_prefixes(parser.uri_loader_prefix()) + + def open(self): + try: + self._open(self.location.uri) + return + except DocumentNotFoundException: + # Try prefixes in order + for prefix in self._prefixes: + prefix_as_file = as_file(prefix) + if prefix_as_file is not None: + uri = os.path.join(prefix_as_file, self.location.uri) + else: + uri = urljoin(prefix, self.location.uri) + try: + self._open(uri) + return + except DocumentNotFoundException: + pass + raise DocumentNotFoundException('document not found at URI: "%s"' % self.location) + + def close(self): + if self._loader is not None: + self._loader.close() + + def load(self): + return self._loader.load() if self._loader is not None else None + + def _open(self, uri): + the_file = as_file(uri) + if the_file is not None: + uri = the_file + loader = FileTextLoader(self.context, uri) + else: + loader = RequestTextLoader(self.context, uri) + loader.open() # might raise an exception + self._loader = loader + self.location.uri = uri diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/modeling/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/modeling/__init__.py new file mode 100644 index 0000000..4b1c995 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/modeling/__init__.py @@ -0,0 +1,26 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Modeling package. +""" + +from .context import IdType, ModelingContext + + +__all__ = ( + 'IdType', + 'ModelingContext' +) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/modeling/context.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/modeling/context.py new file mode 100644 index 0000000..d8a1f7a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/modeling/context.py @@ -0,0 +1,107 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 itertools + +from ...utils.collections import StrictDict, prune +from ...utils.uuid import generate_uuid + + +# See: http://www.faqs.org/rfcs/rfc1035.html +ID_MAX_LENGTH = 63 + + +class IdType(object): + LOCAL_SERIAL = 0 + """ + Locally unique serial ID: a running integer. + """ + + LOCAL_RANDOM = 1 + """ + Locally unique ID: 6 random safe characters. + """ + + UNIVERSAL_RANDOM = 2 + """ + Universally unique ID (UUID): 22 random safe characters. + """ + + +class ModelingContext(object): + """ + Modeling context. + + :ivar template: generated service template + :vartype template: aria.modeling.models.ServiceTemplate + :ivar instance: generated service instance + :vartype instance: aria.modeling.models.Service + :ivar node_id_format: format for node instance IDs + :vartype node_id_format: basestring + :ivar id_type: type of IDs to use for instances + :vartype id_type: basestring + :ivar id_max_length: maximum allowed instance ID length + :vartype id_max_length: int + :ivar inputs: inputs values + :vartype inputs: {:obj:`basestring`, object} + """ + + def __init__(self): + self.template = None + self.instance = None + self.node_id_format = '{template}_{id}' + #self.id_type = IdType.LOCAL_SERIAL + #self.id_type = IdType.LOCAL_RANDOM + self.id_type = IdType.UNIVERSAL_RANDOM + self.id_max_length = ID_MAX_LENGTH + self.inputs = StrictDict(key_class=basestring) + + self._serial_id_counter = itertools.count(1) + self._locally_unique_ids = set() + + def store(self, model_storage): + if self.template is not None: + model_storage.service_template.put(self.template) + if self.instance is not None: + model_storage.service.put(self.instance) + + def generate_id(self): + if self.id_type == IdType.LOCAL_SERIAL: + return self._serial_id_counter.next() + + elif self.id_type == IdType.LOCAL_RANDOM: + the_id = generate_uuid(6) + while the_id in self._locally_unique_ids: + the_id = generate_uuid(6) + self._locally_unique_ids.add(the_id) + return the_id + + return generate_uuid() + + def set_input(self, name, value): + self.inputs[name] = value + # TODO: coerce to validate type + + @property + def template_as_raw(self): + raw = self.template.as_raw + prune(raw) + return raw + + @property + def instance_as_raw(self): + raw = self.instance.as_raw + prune(raw) + return raw diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/__init__.py new file mode 100644 index 0000000..5633e7b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/__init__.py @@ -0,0 +1,158 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Presentation package. + +.. autosummary:: + :nosignatures: + + aria.parser.presentation.PresentationContext + aria.parser.presentation.PresenterException + aria.parser.presentation.PresenterNotFoundError + aria.parser.presentation.Field + aria.parser.presentation.NULL + aria.parser.presentation.none_to_null + aria.parser.presentation.null_to_none + aria.parser.presentation.Value + aria.parser.presentation.Presenter + aria.parser.presentation.PresenterSource + aria.parser.presentation.DefaultPresenterSource + +Presentations +------------- + +.. autosummary:: + :nosignatures: + + aria.parser.presentation.PresentationBase + aria.parser.presentation.Presentation + aria.parser.presentation.AsIsPresentation + +Field decorators +---------------- + +.. autosummary:: + :nosignatures: + + aria.parser.presentation.has_fields + aria.parser.presentation.short_form_field + aria.parser.presentation.allow_unknown_fields + aria.parser.presentation.primitive_field + aria.parser.presentation.primitive_list_field + aria.parser.presentation.primitive_dict_field + aria.parser.presentation.primitive_dict_unknown_fields + aria.parser.presentation.object_field + aria.parser.presentation.object_list_field + aria.parser.presentation.object_dict_field + aria.parser.presentation.object_sequenced_list_field + aria.parser.presentation.object_dict_unknown_fields + aria.parser.presentation.field_getter + aria.parser.presentation.field_setter + aria.parser.presentation.field_validator + +Field validators +---------------- + +.. autosummary:: + :nosignatures: + + aria.parser.presentation.type_validator + aria.parser.presentation.list_type_validator + aria.parser.presentation.list_length_validator + aria.parser.presentation.derived_from_validator + +Utilities +--------- + +.. autosummary:: + :nosignatures: + + aria.parser.presentation.get_locator + aria.parser.presentation.parse_types_dict_names + aria.parser.presentation.validate_primitive + aria.parser.presentation.validate_no_short_form + aria.parser.presentation.validate_no_unknown_fields + aria.parser.presentation.validate_known_fields + aria.parser.presentation.get_parent_presentation + aria.parser.presentation.report_issue_for_unknown_type + aria.parser.presentation.report_issue_for_parent_is_self + aria.parser.presentation.report_issue_for_unknown_parent_type + aria.parser.presentation.report_issue_for_circular_type_hierarchy +""" + +from .exceptions import PresenterException, PresenterNotFoundError +from .context import PresentationContext +from .presenter import Presenter +from .presentation import Value, PresentationBase, Presentation, AsIsPresentation +from .source import PresenterSource, DefaultPresenterSource +from .null import NULL, none_to_null, null_to_none +from .fields import (Field, has_fields, short_form_field, allow_unknown_fields, primitive_field, + primitive_list_field, primitive_dict_field, primitive_dict_unknown_fields, + object_field, object_list_field, object_dict_field, + object_sequenced_list_field, object_dict_unknown_fields, field_getter, + field_setter, field_validator) +from .field_validators import (type_validator, list_type_validator, list_length_validator, + derived_from_validator) +from .utils import (get_locator, parse_types_dict_names, validate_primitive, validate_no_short_form, + validate_no_unknown_fields, validate_known_fields, get_parent_presentation, + report_issue_for_unknown_type, report_issue_for_unknown_parent_type, + report_issue_for_parent_is_self, report_issue_for_circular_type_hierarchy) + +__all__ = ( + 'PresenterException', + 'PresenterNotFoundError', + 'PresentationContext', + 'Presenter', + 'Value', + 'PresentationBase', + 'Presentation', + 'AsIsPresentation', + 'PresenterSource', + 'DefaultPresenterSource', + 'NULL', + 'none_to_null', + 'null_to_none', + 'Field', + 'has_fields', + 'short_form_field', + 'allow_unknown_fields', + 'primitive_field', + 'primitive_list_field', + 'primitive_dict_field', + 'primitive_dict_unknown_fields', + 'object_field', + 'object_list_field', + 'object_dict_field', + 'object_sequenced_list_field', + 'object_dict_unknown_fields', + 'field_getter', + 'field_setter', + 'field_validator', + 'type_validator', + 'list_type_validator', + 'list_length_validator', + 'derived_from_validator', + 'get_locator', + 'parse_types_dict_names', + 'validate_primitive', + 'validate_no_short_form', + 'validate_no_unknown_fields', + 'validate_known_fields', + 'get_parent_presentation', + 'report_issue_for_unknown_type', + 'report_issue_for_unknown_parent_type', + 'report_issue_for_parent_is_self', + 'report_issue_for_circular_type_hierarchy') diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/context.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/context.py new file mode 100644 index 0000000..44a6f82 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/context.py @@ -0,0 +1,65 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 .source import DefaultPresenterSource + + +class PresentationContext(object): + """ + Presentation context. + + :ivar presenter: the generated presenter instance + :vartype presenter: ~aria.parser.presentation.Presenter + :ivar location: from where we will generate the presenter + :vartype location: ~aria.parser.loading.Location + :ivar presenter_source: for finding presenter classes + :vartype presenter_source: ~aria.parser.presentation.PresenterSource + :ivar presenter_class: overrides ``presenter_source`` with a specific class + :vartype presenter_class: type + :ivar import_profile: whether to import the profile by default (defaults to ``True``) + :vartype import_profile: bool + :ivar threads: number of threads to use when reading data + :vartype threads: int + :ivar timeout: timeout in seconds for loading data + :vartype timeout: float + :ivar print_exceptions: whether to print exceptions while reading data + :vartype print_exceptions: bool + """ + + def __init__(self): + self.presenter = None + self.location = None + self.presenter_source = DefaultPresenterSource() + self.presenter_class = None # overrides + self.import_profile = True + self.threads = 8 # reasonable default for networking multithreading + self.timeout = 10 # in seconds + self.print_exceptions = False + + def get(self, *names): + """ + Gets attributes recursively from the presenter. + """ + + return self.presenter._get(*names) if self.presenter is not None else None + + def get_from_dict(self, *names): + """ + Gets attributes recursively from the presenter, except for the last name which is used + to get a value from the last dict. + """ + + return self.presenter._get_from_dict(*names) if self.presenter is not None else None diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/exceptions.py new file mode 100644 index 0000000..cd7eb07 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/exceptions.py @@ -0,0 +1,29 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ...exceptions import AriaException + + +class PresenterException(AriaException): + """ + ARIA presenter exception. + """ + + +class PresenterNotFoundError(PresenterException): + """ + ARIA presenter error: presenter not found for raw. + """ diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/field_validators.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/field_validators.py new file mode 100644 index 0000000..aa04913 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/field_validators.py @@ -0,0 +1,164 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ..validation import Issue +from .utils import (parse_types_dict_names, report_issue_for_unknown_type, + report_issue_for_parent_is_self, report_issue_for_unknown_parent_type, + report_issue_for_circular_type_hierarchy) + + +def type_validator(type_name, *types_dict_names): + """ + Makes sure that the field refers to an existing type defined in the root presenter. + + The arguments from the second onwards are used to locate a nested field under + ``service_template`` under the root presenter. The first of these can optionally be a function, + in which case it will be called to convert type names. This can be used to support shorthand + type names, aliases, etc. + + Can be used with the :func:`field_validator` decorator. + """ + + types_dict_names, convert = parse_types_dict_names(types_dict_names) + + def validator_fn(field, presentation, context): + field.default_validate(presentation, context) + + # Make sure type exists + value = getattr(presentation, field.name) + if value is not None: + types_dict = context.presentation.get('service_template', *types_dict_names) or {} + + if convert: + value = convert(context, value, types_dict) + + if value not in types_dict: + report_issue_for_unknown_type(context, presentation, type_name, field.name) + + return validator_fn + + +def list_type_validator(type_name, *types_dict_names): + """ + Makes sure that the field's elements refer to existing types defined in the root presenter. + + Assumes that the field is a list. + + The arguments from the second onwards are used to locate a nested field under + ``service_template`` under the root presenter. The first of these can optionally be a function, + in which case it will be called to convert type names. This can be used to support shorthand + type names, aliases, etc. + + Can be used with the :func:`field_validator` decorator. + """ + + types_dict_names, convert = parse_types_dict_names(types_dict_names) + + def validator_fn(field, presentation, context): + field.default_validate(presentation, context) + + # Make sure types exist + values = getattr(presentation, field.name) + if values is not None: + types_dict = context.presentation.get('service_template', *types_dict_names) or {} + + for value in values: + if convert: + value = convert(context, value, types_dict) + + if value not in types_dict: + report_issue_for_unknown_type(context, presentation, type_name, field.name) + + return validator_fn + + +def list_length_validator(length): + """ + Makes sure the field has exactly a specific number of elements. + + Assumes that the field is a list. + + Can be used with the :func:`field_validator` decorator. + """ + + def validator_fn(field, presentation, context): + field.default_validate(presentation, context) + + # Make sure list has exactly the length + values = getattr(presentation, field.name) + if isinstance(values, list): + if len(values) != length: + context.validation.report('field "%s" does not have exactly %d elements in "%s"' + % (field.name, length, presentation._fullname), + locator=presentation._get_child_locator(field.name), + level=Issue.FIELD) + + return validator_fn + + +def derived_from_validator(*types_dict_names): + """ + Makes sure that the field refers to a valid parent type defined in the root presenter. + + Checks that we do not derive from ourselves and that we do not cause a circular hierarchy. + + The arguments are used to locate a nested field under ``service_template`` under the root + presenter. The first of these can optionally be a function, in which case it will be called to + convert type names. This can be used to support shorthand type names, aliases, etc. + + Can be used with the :func:`field_validator` decorator. + """ + + types_dict_names, convert = parse_types_dict_names(types_dict_names) + + def validator_fn(field, presentation, context): + field.default_validate(presentation, context) + + value = getattr(presentation, field.name) + if value is not None: + types_dict = context.presentation.get('service_template', *types_dict_names) or {} + + if convert: + value = convert(context, value, types_dict) + + # Make sure not derived from self + if value == presentation._name: + report_issue_for_parent_is_self(context, presentation, field.name) + # Make sure derived from type exists + elif value not in types_dict: + report_issue_for_unknown_parent_type(context, presentation, field.name) + else: + # Make sure derivation hierarchy is not circular + hierarchy = [presentation._name] + presentation_tmp = presentation + while presentation_tmp.derived_from is not None: + derived_from = presentation_tmp.derived_from + if convert: + derived_from = convert(context, derived_from, types_dict) + + if derived_from == presentation_tmp._name: + # This should cause a validation issue at that type + break + elif derived_from not in types_dict: + # This should cause a validation issue at that type + break + presentation_tmp = types_dict[derived_from] + if presentation_tmp._name in hierarchy: + report_issue_for_circular_type_hierarchy(context, presentation, field.name) + break + hierarchy.append(presentation_tmp._name) + + return validator_fn diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/fields.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/fields.py new file mode 100644 index 0000000..5c3e074 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/fields.py @@ -0,0 +1,757 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 threading +from functools import wraps +from types import MethodType + +from ...exceptions import AriaException +from ...utils.collections import FrozenDict, FrozenList, deepcopy_with_locators, merge, OrderedDict +from ...utils.caching import cachedmethod +from ...utils.console import puts +from ...utils.formatting import as_raw, safe_repr +from ...utils.type import full_type_name +from ...utils.exceptions import print_exception +from ..exceptions import InvalidValueError + +from .null import NULL +from .utils import validate_primitive + +# +# Class decorators +# + +# pylint: disable=unused-argument + +def has_fields(cls): + """ + Class decorator for validated field support. + + 1. Adds a ``FIELDS`` class property that is a dict of all the fields. Will inherit and merge + ``FIELDS`` properties from base classes if they have them. + + 2. Generates automatic ``@property`` implementations for the fields with the help of a set of + special function decorators. + + The class also works with the Python dict protocol, so that fields can be accessed via dict + semantics. The functionality is identical to that of using attribute access. + + The class will also gain two utility methods, ``_iter_field_names`` and ``_iter_fields``. + """ + + # Make sure we have FIELDS + if 'FIELDS' not in cls.__dict__: + setattr(cls, 'FIELDS', OrderedDict()) + + # Inherit FIELDS from base classes + for base in cls.__bases__: + if hasattr(base, 'FIELDS'): + cls.FIELDS.update(base.FIELDS) + + # We could do this: + # + # for name, field in cls.__dict__.iteritems(): + # + # But dir() is better because it has a deterministic order (alphabetical) + + for name in dir(cls): + field = getattr(cls, name) + + if isinstance(field, Field): + # Accumulate + cls.FIELDS[name] = field + + field.name = name + field.container_cls = cls + + # This function is here just to create an enclosed scope for "field" + def closure(field): + + # By convention, we have the getter wrap the original function. + # (It is, for example, where the Python help() function will look for + # docstrings when encountering a property.) + @cachedmethod + @wraps(field.func) + def getter(self): + return field.get(self, None) + + def setter(self, value): + field.set(self, None, value) + + # Convert to Python property + return property(fget=getter, fset=setter) + + setattr(cls, name, closure(field)) + + # Bind methods + setattr(cls, '_iter_field_names', MethodType(has_fields_iter_field_names, None, cls)) + setattr(cls, '_iter_fields', MethodType(has_fields_iter_fields, None, cls)) + + # Behave like a dict + setattr(cls, '__len__', MethodType(has_fields_len, None, cls)) + setattr(cls, '__getitem__', MethodType(has_fields_getitem, None, cls)) + setattr(cls, '__setitem__', MethodType(has_fields_setitem, None, cls)) + setattr(cls, '__delitem__', MethodType(has_fields_delitem, None, cls)) + setattr(cls, '__iter__', MethodType(has_fields_iter, None, cls)) + setattr(cls, '__contains__', MethodType(has_fields_contains, None, cls)) + + return cls + + +def short_form_field(name): + """ + Class decorator for specifying the short form field. + + The class must be decorated with :func:`has_fields`. + """ + + def decorator(cls): + if hasattr(cls, name) and hasattr(cls, 'FIELDS') and (name in cls.FIELDS): + setattr(cls, 'SHORT_FORM_FIELD', name) + return cls + else: + raise AttributeError('@short_form_field must be used with ' + 'a Field name in @has_fields class') + return decorator + + +def allow_unknown_fields(cls): + """ + Class decorator specifying that the class allows unknown fields. + + The class must be decorated with :func:`has_fields`. + """ + + if hasattr(cls, 'FIELDS'): + setattr(cls, 'ALLOW_UNKNOWN_FIELDS', True) + return cls + else: + raise AttributeError('@allow_unknown_fields must be used with a @has_fields class') + +# +# Method decorators +# + + +def primitive_field(cls=None, default=None, allowed=None, required=False): + """ + Method decorator for primitive fields. + + The function must be a method in a class decorated with :func:`has_fields`. + """ + + def decorator(func): + return Field(field_variant='primitive', func=func, cls=cls, default=default, + allowed=allowed, required=required) + return decorator + + +def primitive_list_field(cls=None, default=None, allowed=None, required=False): + """ + Method decorator for list of primitive fields. + + The function must be a method in a class decorated with :func:`has_fields`. + """ + + def decorator(func): + return Field(field_variant='primitive_list', func=func, cls=cls, default=default, + allowed=allowed, required=required) + return decorator + + +def primitive_dict_field(cls=None, default=None, allowed=None, required=False): + """ + Method decorator for dict of primitive fields. + + The function must be a method in a class decorated with :func:`has_fields`. + """ + def decorator(func): + return Field(field_variant='primitive_dict', func=func, cls=cls, default=default, + allowed=allowed, required=required) + return decorator + + +def primitive_dict_unknown_fields(cls=None, default=None, allowed=None, required=False): + """ + Method decorator for dict of primitive fields, for all the fields that are + not already decorated. + + The function must be a method in a class decorated with :func:`has_fields`. + """ + + def decorator(func): + return Field(field_variant='primitive_dict_unknown_fields', func=func, cls=cls, + default=default, allowed=allowed, required=required) + return decorator + + +def object_field(cls, default=None, allowed=None, required=False): + """ + Method decorator for object fields. + + The function must be a method in a class decorated with :func:`has_fields`. + """ + def decorator(func): + return Field(field_variant='object', func=func, cls=cls, default=default, allowed=allowed, + required=required) + return decorator + + +def object_list_field(cls, default=None, allowed=None, required=False): + """ + Method decorator for list of object fields. + + The function must be a method in a class decorated with :func:`has_fields`. + """ + + def decorator(func): + return Field(field_variant='object_list', func=func, cls=cls, default=default, + allowed=allowed, required=required) + return decorator + + +def object_dict_field(cls, default=None, allowed=None, required=False): + """ + Method decorator for dict of object fields. + + The function must be a method in a class decorated with :func:`has_fields`. + """ + + def decorator(func): + return Field(field_variant='object_dict', func=func, cls=cls, default=default, + allowed=allowed, required=required) + return decorator + + +def object_sequenced_list_field(cls, default=None, allowed=None, required=False): + """ + Method decorator for sequenced list of object fields. + + The function must be a method in a class decorated with :func:`has_fields`. + """ + + def decorator(func): + return Field(field_variant='sequenced_object_list', func=func, cls=cls, default=default, + allowed=allowed, required=required) + return decorator + + +def object_dict_unknown_fields(cls, default=None, allowed=None, required=False): + """ + Method decorator for dict of object fields, for all the fields that are not already decorated. + + The function must be a method in a class decorated with :func:`has_fields`. + """ + def decorator(func): + return Field(field_variant='object_dict_unknown_fields', func=func, cls=cls, + default=default, allowed=allowed, required=required) + return decorator + + +def field_getter(getter_func): + """ + Method decorator for overriding the getter function of a field. + + The signature of the getter function must be: ``f(field, presentation, context)``. + The default getter can be accessed as ```field.default_get(presentation, context)``. + + The function must already be decorated with a field decorator. + """ + + def decorator(field): + if isinstance(field, Field): + field.get = MethodType(getter_func, field, Field) + return field + else: + raise AttributeError('@field_getter must be used with a Field') + return decorator + + +def field_setter(setter_func): + """ + Method decorator for overriding the setter function of a field. + + The signature of the setter function must be: ``f(field, presentation, context, value)``. + The default setter can be accessed as ``field.default_set(presentation, context, value)``. + + The function must already be decorated with a field decorator. + """ + + def decorator(field): + if isinstance(field, Field): + field.set = MethodType(setter_func, field, Field) + return field + else: + raise AttributeError('@field_setter must be used with a Field') + return decorator + + +def field_validator(validator_fn): + """ + Method decorator for overriding the validator function of a field. + + The signature of the validator function must be: ``f(field, presentation, context)``. + The default validator can be accessed as ``field.default_validate(presentation, context)``. + + The function must already be decorated with a field decorator. + """ + + def decorator(field): + if isinstance(field, Field): + field.validate = MethodType(validator_fn, field, Field) + return field + else: + raise AttributeError('@field_validator must be used with a Field') + return decorator + +# +# Utils +# + + +def has_fields_iter_field_names(self): + for name in self.__class__.FIELDS: + yield name + + +def has_fields_iter_fields(self): + return self.FIELDS.iteritems() + + +def has_fields_len(self): + return len(self.__class__.FIELDS) + + +def has_fields_getitem(self, key): + if not isinstance(key, basestring): + raise TypeError('key must be a string') + if key not in self.__class__.FIELDS: + raise KeyError('no \'%s\' property' % key) + return getattr(self, key) + + +def has_fields_setitem(self, key, value): + if not isinstance(key, basestring): + raise TypeError('key must be a string') + if key not in self.__class__.FIELDS: + raise KeyError('no \'%s\' property' % key) + return setattr(self, key, value) + + +def has_fields_delitem(self, key): + if not isinstance(key, basestring): + raise TypeError('key must be a string') + if key not in self.__class__.FIELDS: + raise KeyError('no \'%s\' property' % key) + return setattr(self, key, None) + + +def has_fields_iter(self): + return self.__class__.FIELDS.iterkeys() + + +def has_fields_contains(self, key): + if not isinstance(key, basestring): + raise TypeError('key must be a string') + return key in self.__class__.FIELDS + + +class Field(object): + """ + Field handler used by ``@has_fields`` decorator. + """ + + def __init__(self, field_variant, func, cls=None, default=None, allowed=None, required=False): + if cls == str: + # Use "unicode" instead of "str" + cls = unicode + + self.container_cls = None + self.name = None + self.field_variant = field_variant + self.func = func + self.cls = cls + self.default = default + self.allowed = allowed + self.required = required + + @property + def full_name(self): + return 'field "%s" in "%s"' % (self.name, full_type_name(self.container_cls)) + + @property + def full_cls_name(self): + name = full_type_name(self.cls) + if name == 'unicode': + # For simplicity, display "unicode" as "str" + name = 'str' + return name + + def get(self, presentation, context): + return self.default_get(presentation, context) + + def set(self, presentation, context, value): + return self.default_set(presentation, context, value) + + def validate(self, presentation, context): + self.default_validate(presentation, context) + + def get_locator(self, raw): + if hasattr(raw, '_locator'): + locator = raw._locator + if locator is not None: + return locator.get_child(self.name) + return None + + def dump(self, presentation, context): + value = getattr(presentation, self.name) + if value is None: + return + + dumper = getattr(self, '_dump_%s' % self.field_variant) + dumper(context, value) + + def default_get(self, presentation, context): + # Handle raw + + default_raw = (presentation._get_default_raw() + if hasattr(presentation, '_get_default_raw') + else None) + + if default_raw is None: + raw = presentation._raw + else: + # Handle default raw value + raw = deepcopy_with_locators(default_raw) + merge(raw, presentation._raw) + + # Handle unknown fields (only dict can have unknown fields, lists can't have them) + + if self.field_variant == 'primitive_dict_unknown_fields': + return self._get_primitive_dict_unknown_fields(presentation, raw, context) + elif self.field_variant == 'object_dict_unknown_fields': + return self._get_object_dict_unknown_fields(presentation, raw, context) + + is_short_form_field = (self.container_cls.SHORT_FORM_FIELD == self.name + if hasattr(self.container_cls, 'SHORT_FORM_FIELD') + else False) + is_dict = isinstance(raw, dict) + + # Find value + + value = self._find_value(is_short_form_field, is_dict, raw) + + # Handle required + + if value is None: + if self.required: + raise InvalidValueError('required %s does not have a value' % self.full_name, + locator=self.get_locator(raw)) + else: + return None + + # Handle allowed values + + if self.allowed is not None: + if value not in self.allowed: + raise InvalidValueError('%s is not %s' + % (self.full_name, ' or '.join([safe_repr(v) + for v in self.allowed])), + locator=self.get_locator(raw)) + + # Handle get according to variant + + getter = getattr(self, '_get_{field_variant}'.format(field_variant=self.field_variant), + None) + + if getter is None: + locator = self.get_locator(raw) + location = (' @%s' % locator) if locator is not None else '' + raise AttributeError('%s has unsupported field variant: "%s"%s' + % (self.full_name, self.field_variant, location)) + + return getter(presentation, raw, value, context) + + def _find_value(self, is_short_form_field, is_dict, raw): + value = None + if is_short_form_field and not is_dict: + # Handle short form + value = raw + elif is_dict: + if self.name in raw: + value = raw[self.name] + if value is None: + # An explicit null + value = NULL + else: + value = self.default + return value + + def default_set(self, presentation, context, value): + raw = presentation._raw + old = self.get(presentation, context) + raw[self.name] = value + try: + self.validate(presentation, context) + except Exception as e: + raw[self.name] = old + raise e + return old + + def default_validate(self, presentation, context): + value = None + + try: + value = self.get(presentation, context) + except AriaException as e: + if e.issue: + context.validation.report(issue=e.issue) + except Exception as e: + context.validation.report(exception=e) + print_exception(e) + + self.validate_value(value, context) + + def validate_value(self, value, context): + if isinstance(value, list): + if self.field_variant == 'object_list': + for element in value: + if hasattr(element, '_validate'): + element._validate(context) + elif self.field_variant == 'sequenced_object_list': + for _, element in value: + if hasattr(element, '_validate'): + element._validate(context) + elif isinstance(value, dict): + if self.field_variant in ('object_dict', 'object_dict_unknown_fields'): + for inner_value in value.itervalues(): + if hasattr(inner_value, '_validate'): + inner_value._validate(context) + + if hasattr(value, '_validate'): + value._validate(context) + + @staticmethod + def _get_context(): + thread_locals = threading.local() + return getattr(thread_locals, 'aria_consumption_context', None) + + def _coerce_primitive(self, value, context): + if context is None: + context = Field._get_context() + allow_primitive_coercion = (context.validation.allow_primitive_coersion + if context is not None + else True) + return validate_primitive(value, self.cls, allow_primitive_coercion) + + # primitive + + def _get_primitive(self, presentation, raw, value, context): + if (self.cls is not None and not isinstance(value, self.cls) + and value is not None and value is not NULL): + try: + return self._coerce_primitive(value, context) + except ValueError as e: + raise InvalidValueError('%s is not a valid "%s": %s' % + (self.full_name, self.full_cls_name, safe_repr(value)), + locator=self.get_locator(raw), cause=e) + return value + + def _dump_primitive(self, context, value): + if hasattr(value, 'as_raw'): + value = as_raw(value) + puts('%s: %s' % (self.name, context.style.literal_style(value))) + + # primitive list + + def _get_primitive_list(self, presentation, raw, value, context): + if not isinstance(value, list): + raise InvalidValueError('%s is not a list: %s' % (self.full_name, safe_repr(value)), + locator=self.get_locator(raw)) + primitive_list = value + if self.cls is not None: + if context is None: + context = Field._get_context() + primitive_list = [] + for i, _ in enumerate(value): + primitive = value[i] + try: + primitive = self._coerce_primitive(primitive, context) + except ValueError as e: + raise InvalidValueError('%s is not a list of "%s": element %d is %s' + % (self.full_name, + self.full_cls_name, + i, + safe_repr(primitive)), + locator=self.get_locator(raw), cause=e) + if primitive in primitive_list: + raise InvalidValueError('%s has a duplicate "%s": %s' + % (self.full_name, + self.full_cls_name, + safe_repr(primitive)), + locator=self.get_locator(raw)) + primitive_list.append(primitive) + return FrozenList(primitive_list) + + def _dump_primitive_list(self, context, value): + puts('%s:' % self.name) + with context.style.indent(): + for primitive in value: + if hasattr(primitive, 'as_raw'): + primitive = as_raw(primitive) + puts(context.style.literal_style(primitive)) + + # primitive dict + + def _get_primitive_dict(self, presentation, raw, value, context): + if not isinstance(value, dict): + raise InvalidValueError('%s is not a dict: %s' % (self.full_name, safe_repr(value)), + locator=self.get_locator(raw)) + primitive_dict = value + if self.cls is not None: + if context is None: + context = Field._get_context() + primitive_dict = OrderedDict() + for k, v in value.iteritems(): + try: + primitive_dict[k] = self._coerce_primitive(v, context) + except ValueError as e: + raise InvalidValueError('%s is not a dict of "%s" values: entry "%d" is %s' + % (self.full_name, self.full_cls_name, k, safe_repr(v)), + locator=self.get_locator(raw), + cause=e) + return FrozenDict(primitive_dict) + + def _dump_primitive_dict(self, context, value): + puts('%s:' % self.name) + with context.style.indent(): + for v in value.itervalues(): + if hasattr(v, 'as_raw'): + v = as_raw(v) + puts(context.style.literal_style(v)) + + # object + + def _get_object(self, presentation, raw, value, context): + try: + return self.cls(name=self.name, raw=value, container=presentation) + except TypeError as e: + raise InvalidValueError('%s cannot not be initialized to an instance of "%s": %s' + % (self.full_name, self.full_cls_name, safe_repr(value)), + cause=e, + locator=self.get_locator(raw)) + + def _dump_object(self, context, value): + puts('%s:' % self.name) + with context.style.indent(): + if hasattr(value, '_dump'): + value._dump(context) + + # object list + + def _get_object_list(self, presentation, raw, value, context): + if not isinstance(value, list): + raise InvalidValueError('%s is not a list: %s' + % (self.full_name, safe_repr(value)), + locator=self.get_locator(raw)) + return FrozenList((self.cls(name=self.name, raw=v, container=presentation) for v in value)) + + def _dump_object_list(self, context, value): + puts('%s:' % self.name) + with context.style.indent(): + for v in value: + if hasattr(v, '_dump'): + v._dump(context) + + # object dict + + def _get_object_dict(self, presentation, raw, value, context): + if not isinstance(value, dict): + raise InvalidValueError('%s is not a dict: %s' % (self.full_name, safe_repr(value)), + locator=self.get_locator(raw)) + return FrozenDict(((k, self.cls(name=k, raw=v, container=presentation)) + for k, v in value.iteritems())) + + def _dump_object_dict(self, context, value): + puts('%s:' % self.name) + with context.style.indent(): + for v in value.itervalues(): + if hasattr(v, '_dump'): + v._dump(context) + + # sequenced object list + + def _get_sequenced_object_list(self, presentation, raw, value, context): + if not isinstance(value, list): + raise InvalidValueError('%s is not a sequenced list (a list of dicts, ' + 'each with exactly one key): %s' + % (self.full_name, safe_repr(value)), + locator=self.get_locator(raw)) + sequence = [] + for v in value: + if not isinstance(v, dict): + raise InvalidValueError('%s list elements are not all dicts with ' + 'exactly one key: %s' % (self.full_name, safe_repr(value)), + locator=self.get_locator(raw)) + if len(v) != 1: + raise InvalidValueError('%s list elements do not all have exactly one key: %s' + % (self.full_name, safe_repr(value)), + locator=self.get_locator(raw)) + key, value = v.items()[0] + sequence.append((key, self.cls(name=key, raw=value, container=presentation))) + return FrozenList(sequence) + + def _dump_sequenced_object_list(self, context, value): + puts('%s:' % self.name) + for _, v in value: + if hasattr(v, '_dump'): + v._dump(context) + + # primitive dict for unknown fields + + def _get_primitive_dict_unknown_fields(self, presentation, raw, context): + if isinstance(raw, dict): + primitive_dict = raw + if self.cls is not None: + if context is None: + context = Field._get_context() + primitive_dict = OrderedDict() + for k, v in raw.iteritems(): + if k not in presentation.FIELDS: + try: + primitive_dict[k] = self._coerce_primitive(v, context) + except ValueError as e: + raise InvalidValueError('%s is not a dict of "%s" values:' + ' entry "%d" is %s' + % (self.full_name, self.full_cls_name, + k, safe_repr(v)), + locator=self.get_locator(raw), + cause=e) + return FrozenDict(primitive_dict) + return None + + def _dump_primitive_dict_unknown_fields(self, context, value): + self._dump_primitive_dict(context, value) + + # object dict for unknown fields + + def _get_object_dict_unknown_fields(self, presentation, raw, context): + if isinstance(raw, dict): + return FrozenDict(((k, self.cls(name=k, raw=v, container=presentation)) + for k, v in raw.iteritems() if k not in presentation.FIELDS)) + return None + + def _dump_object_dict_unknown_fields(self, context, value): + self._dump_object_dict(context, value) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/null.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/null.py new file mode 100644 index 0000000..287d2ba --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/null.py @@ -0,0 +1,67 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ...utils.collections import deepcopy_with_locators + + +class Null(object): + """ + Represents an explicit null value provided by the user, which is different from + not supplying a value at all. + + It is a singleton. + """ + + @property + def as_raw(self): + return None + +NULL = Null() + + +def none_to_null(value): + """ + Convert ``None`` to ``NULL``, recursively. + """ + + if value is None: + return NULL + if isinstance(value, list): + value = deepcopy_with_locators(value) + for i, _ in enumerate(value): + value[i] = none_to_null(value[i]) + elif isinstance(value, dict): + value = deepcopy_with_locators(value) + for k, v in value.iteritems(): + value[k] = none_to_null(v) + return value + + +def null_to_none(value): + """ + Convert ``NULL`` to ``None``, recursively. + """ + + if value is NULL: + return None + if isinstance(value, list): + value = deepcopy_with_locators(value) + for i, _ in enumerate(value): + value[i] = none_to_null(value[i]) + elif isinstance(value, dict): + value = deepcopy_with_locators(value) + for k, v in value.iteritems(): + value[k] = none_to_null(v) + return value diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/presentation.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/presentation.py new file mode 100644 index 0000000..3f9f86d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/presentation.py @@ -0,0 +1,248 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ...utils.caching import HasCachedMethods +from ...utils.collections import deepcopy_with_locators +from ...utils.formatting import safe_repr +from ...utils.type import full_type_name +from ...utils.console import puts +from ..validation import Issue +from .null import none_to_null +from .utils import (get_locator, validate_no_short_form, validate_no_unknown_fields, + validate_known_fields, validate_primitive) + + +class Value(object): + """ + Encapsulates a typed value assignment. + """ + + def __init__(self, type_name, value, description, required): + self.type = deepcopy_with_locators(type_name) + self.value = deepcopy_with_locators(value) + self.description = deepcopy_with_locators(description) + self.required = deepcopy_with_locators(required) + + def _dump(self, context): + if self.type is not None: + puts(context.style.type_style(self.type)) + if self.value is not None: + puts(context.style.literal_style(self.value)) + if self.description is not None: + puts(context.style.meta_style(self.description)) + if self.required is not None: + puts(context.style.required_style(self.required)) + + +class PresentationBase(HasCachedMethods): + """ + Base class for ARIA presentation classes. + """ + + def __init__(self, name=None, raw=None, container=None): + self._name = name + self._raw = raw + self._container = container + super(PresentationBase, self).__init__() + + @property + def as_raw(self): + return self._raw + + def _validate(self, context): + """ + Validates the presentation while reporting errors in the validation context but *not* + raising exceptions. + + The base class does not thing, but subclasses may override this for specialized validation. + """ + + @property + def _fullname(self): + """ + Always returns a usable full name of the presentation, whether it itself is named, or + recursing to its container, and finally defaulting to the class name. + """ + + if self._name is not None: + return self._name + elif self._container is not None: + return self._container._fullname + return full_type_name(self) + + @property + def _locator(self): + """ + Attempts to return the most relevant locator, whether we have one, or recursing to our + container. + + :rtype: :class:`aria.parser.reading.Locator` + """ + + return get_locator(self._raw, self._container) + + def _get(self, *names): + """ + Gets attributes recursively. + """ + + obj = self + if (obj is not None) and names: + for name in names: + obj = getattr(obj, name, None) + if obj is None: + break + return obj + + def _get_from_dict(self, *names): + """ + Gets attributes recursively, except for the last name which is used to get a value from the + last dict. + """ + + if names: + obj = self._get(*names[:-1]) + if isinstance(obj, dict): + return obj.get(names[-1]) # pylint: disable=no-member + return None + + def _get_child_locator(self, *names): + """ + Attempts to return the locator of one our children. Will default to our locator if not + found. + + :rtype: :class:`aria.parser.reading.Locator` + """ + + if hasattr(self._raw, '_locator'): + locator = self._raw._locator + if locator is not None: + return locator.get_child(*names) + return self._locator + + def _dump(self, context): + """ + Emits a colorized representation. + + The base class will emit a sensible default representation of the fields, (by calling + ``_dump_content``), but subclasses may override this for specialized dumping. + """ + + if self._name: + puts(context.style.node(self._name)) + with context.style.indent(): + self._dump_content(context) + else: + self._dump_content(context) + + def _dump_content(self, context, field_names=None): + """ + Emits a colorized representation of the contents. + + The base class will call ``_dump_field`` on all the fields, but subclasses may override + this for specialized dumping. + """ + + if field_names: + for field_name in field_names: + self._dump_field(context, field_name) + elif hasattr(self, '_iter_field_names'): + for field_name in self._iter_field_names(): # pylint: disable=no-member + self._dump_field(context, field_name) + else: + puts(context.style.literal_style(self._raw)) + + def _dump_field(self, context, field_name): + """ + Emits a colorized representation of the field. + + According to the field type, this may trigger nested recursion. The nested types will + delegate to their ``_dump`` methods. + """ + + field = self.FIELDS[field_name] # pylint: disable=no-member + field.dump(self, context) + + def _clone(self, container=None): + """ + Creates a clone of this presentation, optionally allowing for a new container. + """ + + raw = deepcopy_with_locators(self._raw) + if container is None: + container = self._container + return self.__class__(name=self._name, raw=raw, container=container) + + +class Presentation(PresentationBase): + """ + Base class for ARIA presentations. A presentation is a Pythonic wrapper around agnostic raw + data, adding the ability to read and modify the data with proper validation. + + ARIA presentation classes will often be decorated with :func:`has_fields`, as that mechanism + automates a lot of field-specific validation. However, that is not a requirement. + + Make sure that your utility property and method names begin with a ``_``, because those names + without a ``_`` prefix are normally reserved for fields. + """ + + def _validate(self, context): + validate_no_short_form(context, self) + validate_no_unknown_fields(context, self) + validate_known_fields(context, self) + + +class AsIsPresentation(PresentationBase): + """ + Base class for trivial ARIA presentations that provide the raw value as is. + """ + + def __init__(self, name=None, raw=None, container=None, cls=None): + super(AsIsPresentation, self).__init__(name, raw, container) + self.cls = cls + + @property + def value(self): + return none_to_null(self._raw) + + @value.setter + def value(self, value): + self._raw = value + + @property + def _full_cls_name(self): + name = full_type_name(self.cls) if self.cls is not None else None + if name == 'unicode': + # For simplicity, display "unicode" as "str" + name = 'str' + return name + + def _validate(self, context): + try: + validate_primitive(self._raw, self.cls, context.validation.allow_primitive_coersion) + except ValueError as e: + context.validation.report('"%s" is not a valid "%s": %s' + % (self._fullname, self._full_cls_name, safe_repr(self._raw)), + locator=self._locator, + level=Issue.FIELD, + exception=e) + + def _dump(self, context): + if hasattr(self._raw, '_dump'): + puts(context.style.node(self._name)) + with context.style.indent(): + self._raw._dump(context) + else: + super(AsIsPresentation, self)._dump(context) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/presenter.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/presenter.py new file mode 100644 index 0000000..9fd296f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/presenter.py @@ -0,0 +1,70 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ...utils.collections import merge +from ...utils.formatting import safe_repr +from ..validation import Issue +from .presentation import Presentation + + +class Presenter(Presentation): + """ + Base class for ARIA presenters. + + Presenters provide a robust API over agnostic raw data. + """ + + DSL_VERSIONS = None + ALLOWED_IMPORTED_DSL_VERSIONS = None + + @classmethod + def can_present(cls, raw): + dsl = raw.get('tosca_definitions_version') + assert cls.DSL_VERSIONS + return dsl in cls.DSL_VERSIONS + + def _validate_import(self, context, presentation): + tosca_definitions_version = presentation.service_template.tosca_definitions_version + assert self.ALLOWED_IMPORTED_DSL_VERSIONS + if tosca_definitions_version is not None \ + and tosca_definitions_version not in self.__class__.ALLOWED_IMPORTED_DSL_VERSIONS: + context.validation.report( + 'import "tosca_definitions_version" is not one of %s: %s' + % (' or '.join([safe_repr(v) + for v in self.__class__.ALLOWED_IMPORTED_DSL_VERSIONS]), + presentation.service_template.tosca_definitions_version), + locator=presentation._get_child_locator('inputs'), + level=Issue.BETWEEN_TYPES) + return False + return True + + def _merge_import(self, presentation): + merge(self._raw, presentation._raw) + if hasattr(self._raw, '_locator') and hasattr(presentation._raw, '_locator'): + self._raw._locator.merge(presentation._raw._locator) + + def _link_locators(self): + if hasattr(self._raw, '_locator'): + locator = self._raw._locator + delattr(self._raw, '_locator') + locator.link(self._raw) + + @staticmethod + def _get_import_locations(context): + raise NotImplementedError + + @staticmethod + def _get_deployment_template(context): + raise NotImplementedError diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/source.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/source.py new file mode 100644 index 0000000..4bfb8e1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/source.py @@ -0,0 +1,55 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ...extension import parser + +from .exceptions import PresenterNotFoundError + + +class PresenterSource(object): + """ + Base class for ARIA presenter sources. + + Presenter sources provide appropriate :class:`Presenter` classes for agnostic raw data. + """ + + def get_presenter(self, raw): # pylint: disable=unused-argument,no-self-use + raise PresenterNotFoundError('presenter not found') + + +class DefaultPresenterSource(PresenterSource): + """ + The default ARIA presenter source. + """ + + def __init__(self, classes=None): + if classes is None: + classes = parser.presenter_class() + self.classes = classes + + def get_presenter(self, raw): + for cls in self.classes: + if cls.can_present(raw): + return cls + + if 'tosca_definitions_version' in raw: + if raw['tosca_definitions_version'] is None: + raise PresenterNotFoundError("'tosca_definitions_version' is not specified") + if not isinstance(raw['tosca_definitions_version'], basestring): + raise PresenterNotFoundError("'tosca_definitions_version' is not a string") + if not raw['tosca_definitions_version']: + raise PresenterNotFoundError("'tosca_definitions_version' is not specified") + return super(DefaultPresenterSource, self).get_presenter(raw) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/utils.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/utils.py new file mode 100644 index 0000000..f0fd390 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/presentation/utils.py @@ -0,0 +1,187 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 types import FunctionType + +from ...utils.formatting import safe_repr +from ...utils.type import full_type_name +from ..validation import Issue +from .null import NULL + + +def get_locator(*values): + """ + Gets the first available locator. + + :rtype: :class:`aria.parser.reading.Locator` + """ + + for v in values: + if hasattr(v, '_locator'): + locator = v._locator + if locator is not None: + return locator + return None + + +def parse_types_dict_names(types_dict_names): + """ + If the first element in the array is a function, extracts it out. + """ + + convert = None + if isinstance(types_dict_names[0], FunctionType): + convert = types_dict_names[0] + types_dict_names = types_dict_names[1:] + return types_dict_names, convert + + +def validate_primitive(value, cls, coerce=False): + """ + Checks if the value is of the primitive type, optionally attempting to coerce it + if it is not. + + :raises ValueError: if not a primitive type or if coercion failed. + """ + + if (cls is not None) and (value is not None) and (value is not NULL): + if (cls is unicode) or (cls is str): # These two types are interchangeable + valid = isinstance(value, basestring) + elif cls is int: + # In Python, a bool is an int + valid = isinstance(value, int) and not isinstance(value, bool) + else: + valid = isinstance(value, cls) + if not valid: + if coerce: + value = cls(value) + else: + raise ValueError('not a "%s": %s' % (full_type_name(cls), safe_repr(value))) + return value + + +def validate_no_short_form(context, presentation): + """ + Makes sure that we can use short form definitions only if we allowed it. + """ + + if not hasattr(presentation, 'SHORT_FORM_FIELD') and not isinstance(presentation._raw, dict): + context.validation.report('short form not allowed for field "%s"' % presentation._fullname, + locator=presentation._locator, + level=Issue.BETWEEN_FIELDS) + + +def validate_no_unknown_fields(context, presentation): + """ + Make sure that we can use unknown fields only if we allowed it. + """ + + if not getattr(presentation, 'ALLOW_UNKNOWN_FIELDS', False) \ + and not context.validation.allow_unknown_fields \ + and isinstance(presentation._raw, dict) \ + and hasattr(presentation, 'FIELDS'): + for k in presentation._raw: + if k not in presentation.FIELDS: + context.validation.report('field "%s" is not supported in "%s"' + % (k, presentation._fullname), + locator=presentation._get_child_locator(k), + level=Issue.BETWEEN_FIELDS) + + +def validate_known_fields(context, presentation): + """ + Validates all known fields. + """ + + if hasattr(presentation, '_iter_fields'): + for _, field in presentation._iter_fields(): + field.validate(presentation, context) + + +def get_parent_presentation(context, presentation, *types_dict_names): + """ + Returns the parent presentation according to the ``derived_from`` field, or ``None`` if invalid. + + Checks that we do not derive from ourselves and that we do not cause a circular hierarchy. + + The arguments from the third onwards are used to locate a nested field under + ``service_template`` under the root presenter. The first of these can optionally be a function, + in which case it will be called to convert type names. This can be used to support shorthand + type names, aliases, etc. + """ + + type_name = presentation.derived_from + + if type_name is None: + return None + + types_dict_names, convert = parse_types_dict_names(types_dict_names) + types_dict = context.presentation.get('service_template', *types_dict_names) or {} + + if convert: + type_name = convert(context, type_name, types_dict) + + # Make sure not derived from self + if type_name == presentation._name: + return None + # Make sure derived from type exists + elif type_name not in types_dict: + return None + else: + # Make sure derivation hierarchy is not circular + hierarchy = [presentation._name] + presentation_copy = presentation + while presentation_copy.derived_from is not None: + derived_from = presentation_copy.derived_from + if convert: + derived_from = convert(context, derived_from, types_dict) + + if derived_from == presentation_copy._name or derived_from not in types_dict: + return None + presentation_copy = types_dict[derived_from] + if presentation_copy._name in hierarchy: + return None + hierarchy.append(presentation_copy._name) + + return types_dict[type_name] + + +def report_issue_for_unknown_type(context, presentation, type_name, field_name, value=None): + if value is None: + value = getattr(presentation, field_name) + context.validation.report('"%s" refers to an unknown %s in "%s": %s' + % (field_name, type_name, presentation._fullname, safe_repr(value)), + locator=presentation._get_child_locator(field_name), + level=Issue.BETWEEN_TYPES) + + +def report_issue_for_parent_is_self(context, presentation, field_name): + context.validation.report('parent type of "%s" is self' % presentation._fullname, + locator=presentation._get_child_locator(field_name), + level=Issue.BETWEEN_TYPES) + + +def report_issue_for_unknown_parent_type(context, presentation, field_name): + context.validation.report('unknown parent type "%s" in "%s"' + % (getattr(presentation, field_name), presentation._fullname), + locator=presentation._get_child_locator(field_name), + level=Issue.BETWEEN_TYPES) + + +def report_issue_for_circular_type_hierarchy(context, presentation, field_name): + context.validation.report('"%s" of "%s" creates a circular type hierarchy' + % (getattr(presentation, field_name), presentation._fullname), + locator=presentation._get_child_locator(field_name), + level=Issue.BETWEEN_TYPES) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/__init__.py new file mode 100644 index 0000000..c110585 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/__init__.py @@ -0,0 +1,60 @@ +# 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. + +""" +Reading package. + +.. autosummary:: + :nosignatures: + + aria.parser.reading.ReadingContext + ReaderException + ReaderNotFoundError + ReaderSyntaxError + AlreadyReadException + JinjaReader + JsonReader + Locator + RawReader + Reader + ReaderSource + DefaultReaderSource + YamlReader +""" + +from .raw import RawReader +from .reader import Reader +from .yaml import YamlReader +from .locator import Locator +from .json import JsonReader +from .jinja import JinjaReader +from .context import ReadingContext +from .source import ReaderSource, DefaultReaderSource +from .exceptions import (ReaderException, + ReaderNotFoundError, + ReaderSyntaxError, + AlreadyReadException) + +__all__ = ( + 'ReaderException', + 'ReaderNotFoundError', + 'ReaderSyntaxError', + 'AlreadyReadException', + 'Reader', + 'ReaderSource', + 'DefaultReaderSource', + 'ReadingContext', + 'RawReader', + 'Locator', + 'YamlReader', + 'JsonReader', + 'JinjaReader') diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/context.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/context.py new file mode 100644 index 0000000..233e407 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/context.py @@ -0,0 +1,31 @@ +# 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 ...utils.threading import LockedList +from .source import DefaultReaderSource + + +class ReadingContext(object): + """ + Reading context. + + :ivar reader_source: for finding reader instances + :vartype reader_source: ReaderSource + :ivar reader: overrides ``reader_source`` with a specific class + :vartype reader: type + """ + + def __init__(self): + self.reader_source = DefaultReaderSource() + self.reader = None + + self._locations = LockedList() # for keeping track of locations already read diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/exceptions.py new file mode 100644 index 0000000..3699729 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/exceptions.py @@ -0,0 +1,44 @@ +# 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 ...exceptions import AriaException +from ..validation import Issue + + +class ReaderException(AriaException): + """ + ARIA reader exception. + """ + + +class ReaderNotFoundError(ReaderException): + """ + ARIA reader error: reader not found for source. + """ + + +class ReaderSyntaxError(ReaderException): + """ + ARIA read format error. + """ + + def __init__(self, message, cause=None, cause_tb=None, location=None, line=None, + column=None, locator=None, snippet=None, level=Issue.SYNTAX): + super(ReaderSyntaxError, self).__init__(message, cause, cause_tb) + self.issue = Issue(message, location=location, line=line, column=column, + locator=locator, snippet=snippet, level=level) + + +class AlreadyReadException(ReaderException): + """ + ARIA reader exception: already read. + """ diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/jinja.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/jinja.py new file mode 100644 index 0000000..687317a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/jinja.py @@ -0,0 +1,55 @@ +# 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 jinja2 import Template + +from ... import __version__ as version +from ..loading import LiteralLocation, LiteralLoader +from .reader import Reader +from .exceptions import ReaderSyntaxError + + +# TODO: we could put a lot of other useful stuff here. +CONTEXT = { + 'ARIA_VERSION': version, + 'ENV': os.environ} + + +class JinjaReader(Reader): + """ + ARIA Jinja reader. + + Forwards the rendered result to a new reader in the reader source. + """ + + def read(self): + data = self.load() + try: + data = str(data) + template = Template(data) + literal = template.render(CONTEXT) + # TODO: might be useful to write the literal result to a file for debugging + location = self.location + if isinstance(location, basestring) and location.endswith('.jinja'): + # Use reader based on the location with the ".jinja" prefix stripped off + location = location[:-6] + next_reader = self.context.reading.reader_source.get_reader( + self.context, LiteralLocation(literal, name=location), LiteralLoader(literal)) + else: + # Use reader for literal loader + next_reader = self.context.reading.reader_source.get_reader( + self.context, LiteralLocation(literal), LiteralLoader(literal)) + return next_reader.read() + except Exception as e: + raise ReaderSyntaxError('Jinja: %s' % e, cause=e) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/json.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/json.py new file mode 100644 index 0000000..d144f80 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/json.py @@ -0,0 +1,33 @@ +# 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 __future__ import absolute_import # so we can import standard 'json' + +import json + +from ...utils.collections import OrderedDict +from .reader import Reader +from .exceptions import ReaderSyntaxError + + +class JsonReader(Reader): + """ + ARIA JSON reader. + """ + + def read(self): + data = self.load() + try: + data = unicode(data) + return json.loads(data, object_pairs_hook=OrderedDict) + except Exception as e: + raise ReaderSyntaxError('JSON: %s' % e, cause=e) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/locator.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/locator.py new file mode 100644 index 0000000..57b4d50 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/locator.py @@ -0,0 +1,119 @@ +# 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 ...utils.console import puts, Colored, indent + + +# We are inheriting the primitive types in order to add the ability to set +# an attribute (_locator) on them. + +class LocatableString(unicode): + pass + + +class LocatableInt(int): + pass + + +class LocatableFloat(float): + pass + + +def wrap(value): + if isinstance(value, basestring): + return True, LocatableString(value) + elif isinstance(value, int) and \ + not isinstance(value, bool): # Note: bool counts as int in Python! + return True, LocatableInt(value) + elif isinstance(value, float): + return True, LocatableFloat(value) + return False, value + + +class Locator(object): + """ + Stores location information (line and column numbers) for agnostic raw data. + """ + def __init__(self, location, line, column, children=None): + self.location = location + self.line = line + self.column = column + self.children = children + + def get_child(self, *names): + if (not names) or (not isinstance(self.children, dict)): + return self + name = names[0] + if name not in self.children: + return self + child = self.children[name] + return child.get_child(names[1:]) + + def link(self, raw, path=None): + if hasattr(raw, '_locator'): + # This can happen when we use anchors + return + + try: + setattr(raw, '_locator', self) + except AttributeError: + return + + if isinstance(raw, list): + for i, raw_element in enumerate(raw): + wrapped, raw_element = wrap(raw_element) + if wrapped: + raw[i] = raw_element + child_path = '%s.%d' % (path, i) if path else str(i) + try: + self.children[i].link(raw_element, child_path) + except KeyError: + raise ValueError('location map does not match agnostic raw data: %s' % + child_path) + elif isinstance(raw, dict): + for k, raw_element in raw.iteritems(): + wrapped, raw_element = wrap(raw_element) + if wrapped: + raw[k] = raw_element + child_path = '%s.%s' % (path, k) if path else k + try: + self.children[k].link(raw_element, child_path) + except KeyError: + raise ValueError('location map does not match agnostic raw data: %s' % + child_path) + + def merge(self, locator): + if isinstance(self.children, dict) and isinstance(locator.children, dict): + for k, loc in locator.children.iteritems(): + if k in self.children: + self.children[k].merge(loc) + else: + self.children[k] = loc + + def dump(self, key=None): + if key: + puts('%s "%s":%d:%d' % + (Colored.red(key), Colored.blue(self.location), self.line, self.column)) + else: + puts('"%s":%d:%d' % (Colored.blue(self.location), self.line, self.column)) + if isinstance(self.children, list): + with indent(2): + for loc in self.children: + loc.dump() + elif isinstance(self.children, dict): + with indent(2): + for k, loc in self.children.iteritems(): + loc.dump(k) + + def __str__(self): + # Should be in same format as Issue.locator_as_str + return '"%s":%d:%d' % (self.location, self.line, self.column) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/raw.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/raw.py new file mode 100644 index 0000000..ed980ac --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/raw.py @@ -0,0 +1,24 @@ +# 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 .reader import Reader + + +class RawReader(Reader): + """ + ARIA raw reader. + + Expects to receive agnostic raw data from the loader, and so does nothing to it. + """ + + def read(self): + return self.load() diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/reader.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/reader.py new file mode 100644 index 0000000..1a29f11 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/reader.py @@ -0,0 +1,44 @@ +# 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 ...utils.openclose import OpenClose +from .exceptions import ReaderException, AlreadyReadException + + +class Reader(object): + """ + Base class for ARIA readers. + + Readers provide agnostic raw data by consuming :class:`aria.parser.loading.Loader` instances. + """ + + def __init__(self, context, location, loader): + self.context = context + self.location = location + self.loader = loader + + def load(self): + with OpenClose(self.loader) as loader: + if self.context is not None: + with self.context._locations: + for location in self.context._locations: + if location.is_equivalent(loader.location): + raise AlreadyReadException('already read: %s' % loader.location) + self.context._locations.append(loader.location) + + data = loader.load() + if data is None: + raise ReaderException('loader did not provide data: %s' % loader) + return data + + def read(self): + raise NotImplementedError diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/source.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/source.py new file mode 100644 index 0000000..6fff2f6 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/source.py @@ -0,0 +1,59 @@ +# 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 ..loading import LiteralLocation, UriLocation +from .yaml import YamlReader +from .json import JsonReader +from .jinja import JinjaReader +from .exceptions import ReaderNotFoundError + + +EXTENSIONS = { + '.yaml': YamlReader, + '.json': JsonReader, + '.jinja': JinjaReader} + + +class ReaderSource(object): + """ + Base class for ARIA reader sources. + + Reader sources provide appropriate :class:`Reader` instances for locations. + """ + + @staticmethod + def get_reader(context, location, loader): # pylint: disable=unused-argument + raise ReaderNotFoundError('location: %s' % location) + + +class DefaultReaderSource(ReaderSource): + """ + The default ARIA reader source will generate a :class:`YamlReader` for + locations that end in ".yaml", a :class:`JsonReader` for locations that + end in ".json", and a :class:`JinjaReader` for locations that end in + ".jinja". + """ + + def __init__(self, literal_reader_class=YamlReader): + super(DefaultReaderSource, self).__init__() + self.literal_reader_class = literal_reader_class + + def get_reader(self, context, location, loader): + if isinstance(location, LiteralLocation): + return self.literal_reader_class(context, location, loader) + + elif isinstance(location, UriLocation): + for extension, reader_class in EXTENSIONS.iteritems(): + if location.uri.endswith(extension): + return reader_class(context, location, loader) + + return super(DefaultReaderSource, self).get_reader(context, location, loader) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/yaml.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/yaml.py new file mode 100644 index 0000000..f5eac43 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/reading/yaml.py @@ -0,0 +1,113 @@ +# 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 ruamel import yaml # @UnresolvedImport + +from ...utils.collections import OrderedDict +from .reader import Reader +from .locator import Locator +from .exceptions import ReaderSyntaxError +from .locator import LocatableString, LocatableInt, LocatableFloat + +# Add our types to ruamel.yaml +yaml.representer.RoundTripRepresenter.add_representer( + LocatableString, yaml.representer.RoundTripRepresenter.represent_unicode) +yaml.representer.RoundTripRepresenter.add_representer( + LocatableInt, yaml.representer.RoundTripRepresenter.represent_int) +yaml.representer.RoundTripRepresenter.add_representer( + LocatableFloat, yaml.representer.RoundTripRepresenter.represent_float) + +MERGE_TAG = u'tag:yaml.org,2002:merge' +MAP_TAG = u'tag:yaml.org,2002:map' + + +class YamlLocator(Locator): + """ + Map for agnostic raw data read from YAML. + """ + + def add_children(self, node): + if isinstance(node, yaml.SequenceNode): + self.children = [] + for child_node in node.value: + self.add_child(child_node) + elif isinstance(node, yaml.MappingNode): + self.children = {} + for k, child_node in node.value: + self.add_child(child_node, k) + + def add_child(self, node, key=None): + locator = YamlLocator(self.location, node.start_mark.line + 1, node.start_mark.column + 1) + if key is not None: + # Dict + if key.tag == MERGE_TAG: + for merge_key, merge_node in node.value: + self.add_child(merge_node, merge_key) + else: + self.children[key.value] = locator + else: + # List + self.children.append(locator) + locator.add_children(node) + + +def construct_yaml_map(self, node): + data = OrderedDict() + yield data + value = self.construct_mapping(node) + data.update(value) + + +yaml.constructor.SafeConstructor.add_constructor(MAP_TAG, construct_yaml_map) + + +class YamlReader(Reader): + """ + ARIA YAML reader. + """ + + def read(self): + data = self.load() + try: + data = unicode(data) + # see issue here: + # https://bitbucket.org/ruamel/yaml/issues/61/roundtriploader-causes-exceptions-with + #yaml_loader = yaml.RoundTripLoader(data) + yaml_loader = yaml.SafeLoader(data) + try: + node = yaml_loader.get_single_node() + locator = YamlLocator(self.loader.location, 0, 0) + if node is not None: + locator.add_children(node) + raw = yaml_loader.construct_document(node) + else: + raw = OrderedDict() + #locator.dump() + setattr(raw, '_locator', locator) + return raw + finally: + yaml_loader.dispose() + except yaml.parser.MarkedYAMLError as e: + context = e.context or 'while parsing' + problem = e.problem + line = e.problem_mark.line + column = e.problem_mark.column + snippet = e.problem_mark.get_snippet() + raise ReaderSyntaxError('YAML %s: %s %s' % + (e.__class__.__name__, problem, context), + location=self.loader.location, + line=line, + column=column, + snippet=snippet, + cause=e) + except Exception as e: + raise ReaderSyntaxError('YAML: %s' % e, cause=e) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/specification.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/specification.py new file mode 100644 index 0000000..4f452b8 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/specification.py @@ -0,0 +1,69 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Utilities for cross-referencing code with specification documents. +""" + +import re + +from ..extension import parser +from ..utils.collections import OrderedDict +from ..utils.specification import (DSL_SPECIFICATIONS, implements_specification) # pylint: disable=unused-import + + +def iter_specifications(): + """ + Iterates all specification assignments in the codebase. + """ + def iter_sections(spec, sections): + for k in sorted(sections.keys(), key=_section_key): + details = OrderedDict() + details['code'] = sections[k]['code'] + yield k, _fix_details(sections[k], spec) + + for spec, sections in DSL_SPECIFICATIONS.iteritems(): + yield spec, iter_sections(spec, sections) + + +def _section_key(value): + try: + parts = value.split('-', 1) + first = (int(v) for v in parts[0].split('.')) + second = parts[1] if len(parts) > 1 else None + return (first, second) + except ValueError: + return value + + +def _fix_details(details, spec): + code = details.get('code') + doc = details.get('doc') + url = parser.specification_url().get(spec) + + if (url is not None) and (doc is not None): + # Look for a URL in ReST docstring that begins with our url + pattern = r']+)>' + match = re.search(pattern, doc) + if match: + url = re.sub(r'\s+', '', match.group(1)) + + return OrderedDict(( + ('code', code), + ('url', url))) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/validation/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/validation/__init__.py new file mode 100644 index 0000000..21632ba --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/validation/__init__.py @@ -0,0 +1,25 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Validation package. +""" + +from .issue import Issue +from .context import ValidationContext + +__all__ = ( + 'ValidationContext', + 'Issue') diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/validation/context.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/validation/context.py new file mode 100644 index 0000000..da9eef6 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/validation/context.py @@ -0,0 +1,36 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 . import issue + + +class ValidationContext(issue.ReporterMixin): + """ + Validation context. + + :ivar allow_unknown_fields: when ``False`` (the default) will report an issue if an unknown + field is used + :vartype allow_unknown_fields: bool + :ivar allow_primitive_coersion`: when ``False`` (the default) will not attempt to coerce + primitive field types + :vartype allow_primitive_coersion: bool + :ivar max_level: maximum validation level to report (default is all) + :vartype max_level: int + """ + + def __init__(self, *args, **kwargs): + super(ValidationContext, self).__init__(*args, **kwargs) + self.allow_unknown_fields = False + self.allow_primitive_coersion = False diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/parser/validation/issue.py b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/validation/issue.py new file mode 100644 index 0000000..42fc580 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/parser/validation/issue.py @@ -0,0 +1,190 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 __future__ import absolute_import # so we can import standard 'collections' + +from ...utils import ( + collections, + type, + threading, + exceptions, + console, + formatting +) + + +class Issue(object): + PLATFORM = 0 + """ + Platform error (e.g. I/O, hardware, a bug in ARIA) + """ + + SYNTAX = 1 + """ + Syntax and format (e.g. YAML, XML, JSON) + """ + + FIELD = 2 + """ + Single field + """ + + BETWEEN_FIELDS = 3 + """ + Relationships between fields within the type (internal grammar) + """ + + BETWEEN_TYPES = 4 + """ + Relationships between types (e.g. inheritance, external grammar) + """ + + BETWEEN_INSTANCES = 5 + """ + Topology (e.g. static requirements and capabilities) + """ + + EXTERNAL = 6 + """ + External (e.g. live requirements and capabilities) + """ + + ALL = 100 + + def __init__(self, message=None, exception=None, location=None, line=None, + column=None, locator=None, snippet=None, level=0): + if message is not None: + self.message = str(message) + elif exception is not None: + self.message = str(exception) + else: + self.message = 'unknown issue' + + self.exception = exception + + if locator is not None: + self.location = locator.location + self.line = locator.line + self.column = locator.column + else: + self.location = location + self.line = line + self.column = column + + self.snippet = snippet + self.level = level + + @property + def as_raw(self): + return collections.OrderedDict(( + ('level', self.level), + ('message', self.message), + ('location', self.location), + ('line', self.line), + ('column', self.column), + ('snippet', self.snippet), + ('exception', type.full_type_name(self.exception) if self.exception else None))) + + @property + def locator_as_str(self): + if self.location is not None: + if self.line is not None: + if self.column is not None: + return '"%s":%d:%d' % (self.location, self.line, self.column) + else: + return '"%s":%d' % (self.location, self.line) + else: + return '"%s"' % self.location + else: + return None + + @property + def heading_as_str(self): + return '%d: %s' % (self.level, self.message) + + @property + def details_as_str(self): + details_str = '' + locator = self.locator_as_str + if locator is not None: + details_str += '@%s' % locator + if self.snippet is not None: + details_str += '\n%s' % self.snippet + return details_str + + def __str__(self): + heading_str = self.heading_as_str + details = self.details_as_str + if details: + heading_str += ', ' + details + return heading_str + + +class ReporterMixin(object): + + Issue = Issue + + def __init__(self, *args, **kwargs): + super(ReporterMixin, self).__init__(*args, **kwargs) + self._issues = threading.LockedList() + self.max_level = self.Issue.ALL + + def report(self, message=None, exception=None, location=None, line=None, + column=None, locator=None, snippet=None, level=Issue.PLATFORM, issue=None): + if issue is None: + issue = self.Issue(message, exception, location, line, column, locator, snippet, level) + + # Avoid duplicate issues + with self._issues: + for i in self._issues: + if str(i) == str(issue): + return + + self._issues.append(issue) + + @property + def has_issues(self): + return len(self._issues) > 0 + + @property + def issues(self): + issues = [i for i in self._issues if i.level <= self.max_level] + issues.sort(key=lambda i: (i.level, i.location, i.line, i.column, i.message)) + return collections.FrozenList(issues) + + @property + def issues_as_raw(self): + return [formatting.as_raw(i) for i in self.issues] + + def extend_issues(self, *issues): + with self._issues: + self._issues.extend(*issues) + + def dump_issues(self): + issues = self.issues + if issues: + console.puts(console.Colored.blue('Validation issues:', bold=True)) + with console.indent(2): + for issue in issues: + console.puts(console.Colored.blue(issue.heading_as_str)) + details = issue.details_as_str + if details: + with console.indent(3): + console.puts(details) + if issue.exception is not None: + with console.indent(3): + exceptions.print_exception(issue.exception) + return True + return False diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/storage/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/__init__.py new file mode 100644 index 0000000..a553ca7 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/__init__.py @@ -0,0 +1,41 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Storage package. +""" + +from .core import ( + Storage, + ModelStorage, + ResourceStorage, +) +from . import ( + exceptions, + api, + core, + filesystem_rapi, + sql_mapi, +) + +__all__ = ( + 'exceptions', + 'Storage', + 'ModelStorage', + 'ResourceStorage', + 'filesystem_rapi', + 'sql_mapi', + 'api', +) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/storage/api.py b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/api.py new file mode 100644 index 0000000..a337743 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/api.py @@ -0,0 +1,186 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Storage APIs. +""" + +import threading + + +class StorageAPI(object): + """ + Base class for storage APIs. + """ + def create(self, **kwargs): + """ + Create a storage API. + :param kwargs: + :return: + """ + raise NotImplementedError('Subclass must implement abstract create method') + + +class ModelAPI(StorageAPI): + """ + Base class for model APIs ("MAPI"). + """ + def __init__(self, model_cls, name=None, **kwargs): + """ + :param model_cls: representing class of the model + :param name: name of the model + """ + super(ModelAPI, self).__init__(**kwargs) + self._model_cls = model_cls + self._name = name or model_cls.__modelname__ + self._thread_local = threading.local() + self._thread_local._instrumentation = [] + + @property + def _instrumentation(self): + if not hasattr(self._thread_local, '_instrumentation'): + self._thread_local._instrumentation = [] + return self._thread_local._instrumentation + + + @property + def name(self): + """ + Name of the class. + + :type: :obj:`basestring` + """ + return self._name + + @property + def model_cls(self): + """ + Class representing the model + + :type: :obj:`Type` + """ + return self._model_cls + + def get(self, entry_id, filters=None, **kwargs): + """ + Gets a model from storage. + + :param entry_id: + """ + raise NotImplementedError('Subclass must implement abstract get method') + + def put(self, entry, **kwargs): + """ + Puts a model in storage. + + :param entry: + """ + raise NotImplementedError('Subclass must implement abstract store method') + + def delete(self, entry_id, **kwargs): + """ + Deletes a model from storage. + + :param entry_id: + """ + raise NotImplementedError('Subclass must implement abstract delete method') + + def __iter__(self): + return self.iter() + + def iter(self, **kwargs): + """ + Iterate over all models in storage. + """ + raise NotImplementedError('Subclass must implement abstract iter method') + + def update(self, entry, **kwargs): + """ + Update a model in storage. + + :param entry: + :param kwargs: + """ + raise NotImplementedError('Subclass must implement abstract update method') + + +class ResourceAPI(StorageAPI): + """ + Base class for resource APIs ("RAPI"). + """ + def __init__(self, name, **kwargs): + """ + :param name: resource type + """ + super(ResourceAPI, self).__init__(**kwargs) + self._name = name + + @property + def name(self): + """ + Name of resource. + + :type: :obj:`basestring` + """ + return self._name + + def read(self, entry_id, path, **kwargs): + """ + Get a bytesteam for a resource from storage. + + :param entry_id: + :param path: + """ + raise NotImplementedError('Subclass must implement abstract read method') + + def delete(self, entry_id, path, **kwargs): + """ + Delete a resource from storage. + + :param entry_id: + :param path: + """ + raise NotImplementedError('Subclass must implement abstract delete method') + + def download(self, entry_id, destination, path=None, **kwargs): + """ + Download a resource from storage. + + :param entry_id: + :param destination: + :param path: + """ + raise NotImplementedError('Subclass must implement abstract download method') + + def upload(self, entry_id, source, path=None, **kwargs): + """ + Upload a resource to storage. + + :param entry_id: + :param source: + :param path: + """ + raise NotImplementedError('Subclass must implement abstract upload method') + + +def generate_lower_name(model_cls): + """ + Generates the name of the class from the class object, e.g. ``SomeClass`` -> ``some_class`` + + :param model_cls: class to evaluate + :return: lowercase name + :rtype: basestring + """ + return getattr(model_cls, '__mapiname__', model_cls.__tablename__) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/storage/collection_instrumentation.py b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/collection_instrumentation.py new file mode 100644 index 0000000..6154e5d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/collection_instrumentation.py @@ -0,0 +1,314 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Utilities for instrumenting collections of models in storage. +""" + +from . import exceptions + + +class _InstrumentedCollection(object): + + def __init__(self, + mapi, + parent, + field_name, + field_cls, + seq=None, + is_top_level=True, + **kwargs): + self._mapi = mapi + self._parent = parent + self._field_name = field_name + self._is_top_level = is_top_level + self._field_cls = field_cls + self._load(seq, **kwargs) + + @property + def _raw(self): + raise NotImplementedError + + def _load(self, seq, **kwargs): + """ + Instantiates the object from existing seq. + + :param seq: the original sequence to load from + """ + raise NotImplementedError + + def _set(self, key, value): + """ + Sets the changes for the current object (not in the database). + + :param key: + :param value: + """ + raise NotImplementedError + + def _del(self, collection, key): + raise NotImplementedError + + def _instrument(self, key, value): + """ + Instruments any collection to track changes (and ease of access). + + :param key: + :param value: + """ + if isinstance(value, _InstrumentedCollection): + return value + elif isinstance(value, dict): + instrumentation_cls = _InstrumentedDict + elif isinstance(value, list): + instrumentation_cls = _InstrumentedList + else: + return value + + return instrumentation_cls(self._mapi, self, key, self._field_cls, value, False) + + def _raw_value(self, value): + """ + Gets the raw value. + + :param value: + """ + if isinstance(value, self._field_cls): + return value.value + return value + + def _encapsulate_value(self, key, value): + """ + Creates a new item class if needed. + + :param key: + :param value: + """ + if isinstance(value, self._field_cls): + return value + # If it is not wrapped + return self._field_cls.wrap(key, value) + + def __setitem__(self, key, value): + """ + Updates the values in both the local and the database locations. + + :param key: + :param value: + """ + self._set(key, value) + if self._is_top_level: + # We are at the top level + field = getattr(self._parent, self._field_name) + self._set_field( + field, key, value if key in field else self._encapsulate_value(key, value)) + self._mapi.update(self._parent) + else: + # We are not at the top level + self._set_field(self._parent, self._field_name, self) + + def _set_field(self, collection, key, value): + """ + Enables updating the current change in the ancestors. + + :param collection: collection to change + :param key: key for the specific field + :param value: new value + """ + if isinstance(value, _InstrumentedCollection): + value = value._raw + if key in collection and isinstance(collection[key], self._field_cls): + if isinstance(collection[key], _InstrumentedCollection): + self._del(collection, key) + collection[key].value = value + else: + collection[key] = value + return collection[key] + + def __deepcopy__(self, *args, **kwargs): + return self._raw + + +class _InstrumentedDict(_InstrumentedCollection, dict): + + def _load(self, dict_=None, **kwargs): + dict.__init__( + self, + tuple((key, self._raw_value(value)) for key, value in (dict_ or {}).iteritems()), + **kwargs) + + def update(self, dict_=None, **kwargs): + dict_ = dict_ or {} + for key, value in dict_.iteritems(): + self[key] = value + for key, value in kwargs.iteritems(): + self[key] = value + + def __getitem__(self, key): + return self._instrument(key, dict.__getitem__(self, key)) + + def _set(self, key, value): + dict.__setitem__(self, key, self._raw_value(value)) + + @property + def _raw(self): + return dict(self) + + def _del(self, collection, key): + del collection[key] + + +class _InstrumentedList(_InstrumentedCollection, list): + + def _load(self, list_=None, **kwargs): + list.__init__(self, list(item for item in list_ or [])) + + def append(self, value): + self.insert(len(self), value) + + def insert(self, index, value): + list.insert(self, index, self._raw_value(value)) + if self._is_top_level: + field = getattr(self._parent, self._field_name) + field.insert(index, self._encapsulate_value(index, value)) + else: + self._parent[self._field_name] = self + + def __getitem__(self, key): + return self._instrument(key, list.__getitem__(self, key)) + + def _set(self, key, value): + list.__setitem__(self, key, value) + + def _del(self, collection, key): + del collection[key] + + @property + def _raw(self): + return list(self) + + +class _WrappedBase(object): + + def __init__(self, wrapped, instrumentation, instrumentation_kwargs=None): + """ + :param wrapped: model to be instrumented + :param instrumentation: instrumentation dict + :param instrumentation_kwargs: arguments for instrumentation class + """ + self._wrapped = wrapped + self._instrumentation = instrumentation + self._instrumentation_kwargs = instrumentation_kwargs or {} + + def _wrap(self, value): + if value.__class__ in set(class_.class_ for class_ in self._instrumentation): + return _create_instrumented_model( + value, instrumentation=self._instrumentation, **self._instrumentation_kwargs) + # Check that the value is a SQLAlchemy model (it should have metadata) or a collection + elif hasattr(value, 'metadata') or isinstance(value, (dict, list)): + return _create_wrapped_model( + value, instrumentation=self._instrumentation, **self._instrumentation_kwargs) + return value + + def __getattr__(self, item): + if hasattr(self, '_wrapped'): + return self._wrap(getattr(self._wrapped, item)) + else: + super(_WrappedBase, self).__getattribute__(item) + + +class _InstrumentedModel(_WrappedBase): + + def __init__(self, mapi, *args, **kwargs): + """ + The original model. + + :param mapi: MAPI for the wrapped model + :param wrapped: model to be instrumented + :param instrumentation: instrumentation dict + :param instrumentation_kwargs: arguments for instrumentation class + """ + super(_InstrumentedModel, self).__init__(instrumentation_kwargs=dict(mapi=mapi), + *args, **kwargs) + self._mapi = mapi + self._apply_instrumentation() + + def _apply_instrumentation(self): + for field in self._instrumentation: + if not issubclass(type(self._wrapped), field.parent.class_): + # Do not apply if this field is not for our class + continue + + field_name = field.key + field_cls = field.mapper.class_ + + field = getattr(self._wrapped, field_name) + + # Preserve the original field, e.g. original "attributes" would be located under + # "_attributes" + setattr(self, '_{0}'.format(field_name), field) + + # Set instrumented value + if isinstance(field, dict): + instrumentation_cls = _InstrumentedDict + elif isinstance(field, list): + instrumentation_cls = _InstrumentedList + else: + # TODO: raise proper error + raise exceptions.StorageError( + "ARIA supports instrumentation for dict and list. Field {field} of the " + "class `{model}` is of type `{type}`.".format( + field=field, + model=self._wrapped, + type=type(field))) + + instrumented_class = instrumentation_cls(seq=field, + parent=self._wrapped, + mapi=self._mapi, + field_name=field_name, + field_cls=field_cls) + setattr(self, field_name, instrumented_class) + + +class _WrappedModel(_WrappedBase): + + def __getitem__(self, item): + return self._wrap(self._wrapped[item]) + + def __iter__(self): + for item in self._wrapped.__iter__(): + yield self._wrap(item) + + +def _create_instrumented_model(original_model, mapi, instrumentation): + return type('Instrumented{0}'.format(original_model.__class__.__name__), + (_InstrumentedModel,), + {})(wrapped=original_model, instrumentation=instrumentation, mapi=mapi) + + +def _create_wrapped_model(original_model, mapi, instrumentation): + return type('Wrapped{0}'.format(original_model.__class__.__name__), + (_WrappedModel, ), + {})(wrapped=original_model, + instrumentation=instrumentation, + instrumentation_kwargs=dict(mapi=mapi)) + + +def instrument(instrumentation, original_model, mapi): + for instrumented_field in instrumentation: + if isinstance(original_model, instrumented_field.class_): + return _create_instrumented_model(original_model, mapi, instrumentation) + + return _create_wrapped_model(original_model, mapi, instrumentation) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/storage/core.py b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/core.py new file mode 100644 index 0000000..7e9b201 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/core.py @@ -0,0 +1,160 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Storage API management. +""" + +import copy +from contextlib import contextmanager + +from aria.logger import LoggerMixin +from . import sql_mapi + +__all__ = ( + 'Storage', + 'ModelStorage', + 'ResourceStorage' +) + + +class Storage(LoggerMixin): + """ + Base class for storage managers. + """ + def __init__(self, + api_cls, + api_kwargs=None, + items=(), + initiator=None, + initiator_kwargs=None, + **kwargs): + """ + :param api_cls: API class for each entry + :param api_kwargs: + :param items: items to register + :param initiator: function which initializes the storage before the first use; this function + should return a dict, this dict would be passed in addition to the API kwargs; this enables + the creation of non-serializable objects + :param initiator_kwargs: + :param kwargs: + """ + super(Storage, self).__init__(**kwargs) + self.api = api_cls + self.registered = {} + self._initiator = initiator + self._initiator_kwargs = initiator_kwargs or {} + self._api_kwargs = api_kwargs or {} + self._additional_api_kwargs = {} + if self._initiator: + self._additional_api_kwargs = self._initiator(**self._initiator_kwargs) + for item in items: + self.register(item) + self.logger.debug('{name} object is ready: {0!r}'.format( + self, name=self.__class__.__name__)) + + @property + def _all_api_kwargs(self): + kwargs = self._api_kwargs.copy() + kwargs.update(self._additional_api_kwargs) + return kwargs + + def __repr__(self): + return '{name}(api={self.api})'.format(name=self.__class__.__name__, self=self) + + def __getattr__(self, item): + try: + return self.registered[item] + except KeyError: + return super(Storage, self).__getattribute__(item) + + @property + def serialization_dict(self): + return { + 'api': self.api, + 'api_kwargs': self._api_kwargs, + 'initiator': self._initiator, + 'initiator_kwargs': self._initiator_kwargs + } + + def register(self, entry): + """ + Register an API. + + :param entry: + """ + raise NotImplementedError('Subclass must implement abstract register method') + + +class ResourceStorage(Storage): + """ + Manages storage resource APIs ("RAPIs"). + """ + def register(self, name): + """ + Register a storage resource API ("RAPI"). + + :param name: name + """ + self.registered[name] = self.api(name=name, **self._all_api_kwargs) + self.registered[name].create() + self.logger.debug('setup {name} in storage {self!r}'.format(name=name, self=self)) + + +class ModelStorage(Storage): + """ + Manages storage model APIs ("MAPIs"). + """ + def __init__(self, *args, **kwargs): + if kwargs.get('initiator', None) is None: + kwargs['initiator'] = sql_mapi.init_storage + super(ModelStorage, self).__init__(*args, **kwargs) + + def register(self, model_cls): + """ + Register a storage model API ("MAPI"). + + :param model_cls: model API to register + """ + model_name = model_cls.__modelname__ + if model_name in self.registered: + self.logger.debug('{name} already in storage {self!r}'.format(name=model_name, + self=self)) + return + self.registered[model_name] = self.api(name=model_name, + model_cls=model_cls, + **self._all_api_kwargs) + self.registered[model_name].create() + self.logger.debug('setup {name} in storage {self!r}'.format(name=model_name, self=self)) + + def drop(self): + """ + Drop all the tables. + """ + for mapi in self.registered.itervalues(): + mapi.drop() + + @contextmanager + def instrument(self, *instrumentation): + original_instrumentation = {} + + try: + for mapi in self.registered.itervalues(): + original_instrumentation[mapi] = copy.copy(mapi._instrumentation) + mapi._instrumentation.extend(instrumentation) + yield self + finally: + for mapi in self.registered.itervalues(): + mapi._instrumentation[:] = original_instrumentation[mapi] diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/storage/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/exceptions.py new file mode 100644 index 0000000..c538876 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/exceptions.py @@ -0,0 +1,31 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Storage exceptions. +""" + +from .. import exceptions + + +class StorageError(exceptions.AriaError): + """ + General storage exception + """ + pass + + +class NotFoundError(StorageError): + pass diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/storage/filesystem_rapi.py b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/filesystem_rapi.py new file mode 100644 index 0000000..b425fa2 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/filesystem_rapi.py @@ -0,0 +1,165 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +File system implementation of the storage resource API ("RAPI"). +""" + +import os +import shutil +from multiprocessing import RLock +from contextlib import contextmanager +from functools import partial +from distutils import dir_util # https://github.com/PyCQA/pylint/issues/73; pylint: disable=no-name-in-module + +from aria.storage import ( + api, + exceptions +) + + +class FileSystemResourceAPI(api.ResourceAPI): + """ + File system implementation of the storage resource API ("RAPI"). + """ + + def __init__(self, directory, **kwargs): + """ + :param directory: root dir for storage + """ + super(FileSystemResourceAPI, self).__init__(**kwargs) + self.directory = directory + self.base_path = os.path.join(self.directory, self.name) + self._join_path = partial(os.path.join, self.base_path) + self._lock = RLock() + + @contextmanager + def connect(self): + """ + Establishes a connection and destroys it after use. + """ + try: + self._establish_connection() + yield self + except BaseException as e: + raise exceptions.StorageError(str(e)) + finally: + self._destroy_connection() + + def _establish_connection(self): + """ + Establishes a connection. Used in the ``connect`` context manager. + """ + self._lock.acquire() + + def _destroy_connection(self): + """ + Destroys a connection. Used in the ``connect`` context manager. + """ + self._lock.release() + + def __repr__(self): + return '{cls.__name__}(directory={self.directory})'.format( + cls=self.__class__, self=self) + + def create(self, **kwargs): + """ + Creates a directory in by path. Tries to create the root directory as well. + + :param name: path of directory + """ + try: + os.makedirs(self.directory) + except (OSError, IOError): + pass + try: + os.makedirs(self.base_path) + except (OSError, IOError): + pass + + def read(self, entry_id, path, **_): + """ + Retrieves the contents of a file. + + :param entry_id: entry ID + :param path: path to resource + :return: contents of the file + :rtype: bytes + """ + resource_relative_path = os.path.join(self.name, entry_id, path or '') + resource = os.path.join(self.directory, resource_relative_path) + if not os.path.exists(resource): + raise exceptions.StorageError("Resource {0} does not exist". + format(resource_relative_path)) + if not os.path.isfile(resource): + resources = os.listdir(resource) + if len(resources) != 1: + raise exceptions.StorageError( + 'Failed to read {0}; Reading a directory is ' + 'only allowed when it contains a single resource'.format(resource)) + resource = os.path.join(resource, resources[0]) + with open(resource, 'rb') as resource_file: + return resource_file.read() + + def download(self, entry_id, destination, path=None, **_): + """ + Downloads a file or directory. + + :param entry_id: entry ID + :param destination: download destination + :param path: path to download relative to the root of the entry (otherwise all) + """ + resource_relative_path = os.path.join(self.name, entry_id, path or '') + resource = os.path.join(self.directory, resource_relative_path) + if not os.path.exists(resource): + raise exceptions.StorageError("Resource {0} does not exist". + format(resource_relative_path)) + if os.path.isfile(resource): + shutil.copy2(resource, destination) + else: + dir_util.copy_tree(resource, destination) # pylint: disable=no-member + + def upload(self, entry_id, source, path=None, **_): + """ + Uploads a file or directory. + + :param entry_id: entry ID + :param source: source of the files to upload + :param path: the destination of the file/s relative to the entry root dir. + """ + resource_directory = os.path.join(self.directory, self.name, entry_id) + if not os.path.exists(resource_directory): + os.makedirs(resource_directory) + destination = os.path.join(resource_directory, path or '') + if os.path.isfile(source): + shutil.copy2(source, destination) + else: + dir_util.copy_tree(source, destination) # pylint: disable=no-member + + def delete(self, entry_id, path=None, **_): + """ + Deletes a file or directory. + + :param entry_id: entry ID + :param path: path to delete relative to the root of the entry (otherwise all) + """ + destination = os.path.join(self.directory, self.name, entry_id, path or '') + if os.path.exists(destination): + if os.path.isfile(destination): + os.remove(destination) + else: + shutil.rmtree(destination) + return True + return False diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/storage/sql_mapi.py b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/sql_mapi.py new file mode 100644 index 0000000..975ada7 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/storage/sql_mapi.py @@ -0,0 +1,439 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +SQLAlchemy implementation of the storage model API ("MAPI"). +""" + +import os +import platform + +from sqlalchemy import ( + create_engine, + orm, +) +from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.orm.exc import StaleDataError + +from aria.utils.collections import OrderedDict +from . import ( + api, + exceptions, + collection_instrumentation +) + +_predicates = {'ge': '__ge__', + 'gt': '__gt__', + 'lt': '__lt__', + 'le': '__le__', + 'eq': '__eq__', + 'ne': '__ne__'} + + +class SQLAlchemyModelAPI(api.ModelAPI): + """ + SQLAlchemy implementation of the storage model API ("MAPI"). + """ + + def __init__(self, + engine, + session, + **kwargs): + super(SQLAlchemyModelAPI, self).__init__(**kwargs) + self._engine = engine + self._session = session + + def get(self, entry_id, include=None, **kwargs): + """ + Returns a single result based on the model class and element ID + """ + query = self._get_query(include, {'id': entry_id}) + result = query.first() + + if not result: + raise exceptions.NotFoundError( + 'Requested `{0}` with ID `{1}` was not found' + .format(self.model_cls.__name__, entry_id) + ) + return self._instrument(result) + + def get_by_name(self, entry_name, include=None, **kwargs): + assert hasattr(self.model_cls, 'name') + result = self.list(include=include, filters={'name': entry_name}) + if not result: + raise exceptions.NotFoundError( + 'Requested {0} with name `{1}` was not found' + .format(self.model_cls.__name__, entry_name) + ) + elif len(result) > 1: + raise exceptions.StorageError( + 'Requested {0} with name `{1}` returned more than 1 value' + .format(self.model_cls.__name__, entry_name) + ) + else: + return result[0] + + def list(self, + include=None, + filters=None, + pagination=None, + sort=None, + **kwargs): + query = self._get_query(include, filters, sort) + + results, total, size, offset = self._paginate(query, pagination) + + return ListResult( + dict(total=total, size=size, offset=offset), + [self._instrument(result) for result in results] + ) + + def iter(self, + include=None, + filters=None, + sort=None, + **kwargs): + """ + Returns a (possibly empty) list of ``model_class`` results. + """ + for result in self._get_query(include, filters, sort): + yield self._instrument(result) + + def put(self, entry, **kwargs): + """ + Creatse a ``model_class`` instance from a serializable ``model`` object. + + :param entry: dict with relevant kwargs, or an instance of a class that has a ``to_dict`` + method, and whose attributes match the columns of ``model_class`` (might also be just an + instance of ``model_class``) + :return: an instance of ``model_class`` + """ + self._session.add(entry) + self._safe_commit() + return entry + + def delete(self, entry, **kwargs): + """ + Deletes a single result based on the model class and element ID. + """ + self._load_relationships(entry) + self._session.delete(entry) + self._safe_commit() + return entry + + def update(self, entry, **kwargs): + """ + Adds ``instance`` to the database session, and attempts to commit. + + :return: updated instance + """ + return self.put(entry) + + def refresh(self, entry): + """ + Reloads the instance with fresh information from the database. + + :param entry: instance to be re-loaded from the database + :return: refreshed instance + """ + self._session.refresh(entry) + self._load_relationships(entry) + return entry + + def _destroy_connection(self): + pass + + def _establish_connection(self): + pass + + def create(self, checkfirst=True, create_all=True, **kwargs): + self.model_cls.__table__.create(self._engine, checkfirst=checkfirst) + + if create_all: + # In order to create any models created dynamically (e.g. many-to-many helper tables are + # created at runtime). + self.model_cls.metadata.create_all(bind=self._engine, checkfirst=checkfirst) + + def drop(self): + """ + Drops the table. + """ + self.model_cls.__table__.drop(self._engine) + + def _safe_commit(self): + """ + Try to commit changes in the session. Roll back if exception raised SQLAlchemy errors and + rolls back if they're caught. + """ + try: + self._session.commit() + except StaleDataError as e: + self._session.rollback() + raise exceptions.StorageError('Version conflict: {0}'.format(str(e))) + except (SQLAlchemyError, ValueError) as e: + self._session.rollback() + raise exceptions.StorageError('SQL Storage error: {0}'.format(str(e))) + + def _get_base_query(self, include, joins): + """ + Create the initial query from the model class and included columns. + + :param include: (possibly empty) list of columns to include in the query + :return: SQLAlchemy AppenderQuery object + """ + # If only some columns are included, query through the session object + if include: + # Make sure that attributes come before association proxies + include.sort(key=lambda x: x.is_clause_element) + query = self._session.query(*include) + else: + # If all columns should be returned, query directly from the model + query = self._session.query(self.model_cls) + + query = query.join(*joins) + return query + + @staticmethod + def _get_joins(model_class, columns): + """ + Gets a list of all the tables on which we need to join. + + :param columns: set of all attributes involved in the query + """ + + # Using a list instead of a set because order is important + joins = OrderedDict() + for column_name in columns: + column = getattr(model_class, column_name) + while not column.is_attribute: + join_attr = column.local_attr + # This is a hack, to deal with the fact that SQLA doesn't + # fully support doing something like: `if join_attr in joins`, + # because some SQLA elements have their own comparators + join_attr_name = str(join_attr) + if join_attr_name not in joins: + joins[join_attr_name] = join_attr + column = column.remote_attr + + return joins.values() + + @staticmethod + def _sort_query(query, sort=None): + """ + Adds sorting clauses to the query. + + :param query: base SQL query + :param sort: optional dictionary where keys are column names to sort by, and values are + the order (asc/desc) + :return: SQLAlchemy AppenderQuery object + """ + if sort: + for column, order in sort.items(): + if order == 'desc': + column = column.desc() + query = query.order_by(column) + return query + + def _filter_query(self, query, filters): + """ + Adds filter clauses to the query. + + :param query: base SQL query + :param filters: optional dictionary where keys are column names to filter by, and values + are values applicable for those columns (or lists of such values) + :return: SQLAlchemy AppenderQuery object + """ + return self._add_value_filter(query, filters) + + @staticmethod + def _add_value_filter(query, filters): + for column, value in filters.items(): + if isinstance(value, dict): + for predicate, operand in value.items(): + query = query.filter(getattr(column, predicate)(operand)) + elif isinstance(value, (list, tuple)): + query = query.filter(column.in_(value)) + else: + query = query.filter(column == value) + + return query + + def _get_query(self, + include=None, + filters=None, + sort=None): + """ + Gets a SQL query object based on the params passed. + + :param model_class: SQL database table class + :param include: optional list of columns to include in the query + :param filters: optional dictionary where keys are column names to filter by, and values + are values applicable for those columns (or lists of such values) + :param sort: optional dictionary where keys are column names to sort by, and values are the + order (asc/desc) + :return: sorted and filtered query with only the relevant columns + """ + include, filters, sort, joins = self._get_joins_and_converted_columns( + include, filters, sort + ) + filters = self._convert_operands(filters) + + query = self._get_base_query(include, joins) + query = self._filter_query(query, filters) + query = self._sort_query(query, sort) + return query + + @staticmethod + def _convert_operands(filters): + for column, conditions in filters.items(): + if isinstance(conditions, dict): + for predicate, operand in conditions.items(): + if predicate not in _predicates: + raise exceptions.StorageError( + "{0} is not a valid predicate for filtering. Valid predicates are {1}" + .format(predicate, ', '.join(_predicates.keys()))) + del filters[column][predicate] + filters[column][_predicates[predicate]] = operand + + + return filters + + def _get_joins_and_converted_columns(self, + include, + filters, + sort): + """ + Gets a list of tables on which we need to join and the converted ``include``, ``filters`` + and ```sort`` arguments (converted to actual SQLAlchemy column/label objects instead of + column names). + """ + include = include or [] + filters = filters or dict() + sort = sort or OrderedDict() + + all_columns = set(include) | set(filters.keys()) | set(sort.keys()) + joins = self._get_joins(self.model_cls, all_columns) + + include, filters, sort = self._get_columns_from_field_names( + include, filters, sort + ) + return include, filters, sort, joins + + def _get_columns_from_field_names(self, + include, + filters, + sort): + """ + Gooes over the optional parameters (include, filters, sort), and replace column names with + actual SQLAlechmy column objects. + """ + include = [self._get_column(c) for c in include] + filters = dict((self._get_column(c), filters[c]) for c in filters) + sort = OrderedDict((self._get_column(c), sort[c]) for c in sort) + + return include, filters, sort + + def _get_column(self, column_name): + """ + Returns the column on which an action (filtering, sorting, etc.) would need to be performed. + Can be either an attribute of the class, or an association proxy linked to a relationship + in the class. + """ + column = getattr(self.model_cls, column_name) + if column.is_attribute: + return column + else: + # We need to get to the underlying attribute, so we move on to the + # next remote_attr until we reach one + while not column.remote_attr.is_attribute: + column = column.remote_attr + # Put a label on the remote attribute with the name of the column + return column.remote_attr.label(column_name) + + @staticmethod + def _paginate(query, pagination): + """ + Paginates the query by size and offset. + + :param query: current SQLAlchemy query object + :param pagination: optional dict with size and offset keys + :return: tuple with four elements: + * results: ``size`` items starting from ``offset`` + * the total count of items + * ``size`` [default: 0] + * ``offset`` [default: 0] + """ + if pagination: + size = pagination.get('size', 0) + offset = pagination.get('offset', 0) + total = query.order_by(None).count() # Fastest way to count + results = query.limit(size).offset(offset).all() + return results, total, size, offset + else: + results = query.all() + return results, len(results), 0, 0 + + @staticmethod + def _load_relationships(instance): + """ + Helper method used to overcome a problem where the relationships that rely on joins aren't + being loaded automatically. + """ + for rel in instance.__mapper__.relationships: + getattr(instance, rel.key) + + def _instrument(self, model): + if self._instrumentation: + return collection_instrumentation.instrument(self._instrumentation, model, self) + else: + return model + + +def init_storage(base_dir, filename='db.sqlite'): + """ + Built-in ModelStorage initiator. + + Creates a SQLAlchemy engine and a session to be passed to the MAPI. + + ``initiator_kwargs`` must be passed to the ModelStorage which must hold the ``base_dir`` for the + location of the database file, and an option filename. This would create an SQLite database. + + :param base_dir: directory of the database + :param filename: database file name. + :return: + """ + uri = 'sqlite:///{platform_char}{path}'.format( + # Handles the windows behavior where there is not root, but drivers. + # Thus behaving as relative path. + platform_char='' if 'Windows' in platform.system() else '/', + + path=os.path.join(base_dir, filename)) + + engine = create_engine(uri, connect_args=dict(timeout=15)) + + session_factory = orm.sessionmaker(bind=engine) + session = orm.scoped_session(session_factory=session_factory) + + return dict(engine=engine, session=session) + + +class ListResult(list): + """ + Contains results about the requested items. + """ + def __init__(self, metadata, *args, **qwargs): + super(ListResult, self).__init__(*args, **qwargs) + self.metadata = metadata + self.items = self diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/__init__.py new file mode 100644 index 0000000..43dd882 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/__init__.py @@ -0,0 +1,65 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +General-purpose utilities package. +""" + +from . import ( + archive, + argparse, + caching, + collections, + console, + exceptions, + file, + formatting, + http, + imports, + openclose, + plugin, + process, + specification, + threading, + type, + uris, + uuid, + validation, + versions +) + + +__all__ = ( + 'archive', + 'argparse', + 'caching', + 'collections', + 'console', + 'exceptions', + 'file', + 'formatting', + 'http', + 'imports', + 'openclose', + 'plugin', + 'process', + 'specification', + 'threading', + 'type', + 'uris', + 'uuid', + 'validation', + 'versions' +) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/archive.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/archive.py new file mode 100644 index 0000000..29efcb1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/archive.py @@ -0,0 +1,66 @@ +# 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. + +""" +Archive utilities. +""" + +import os +import tarfile +import zipfile +import tempfile +from contextlib import closing + + +def is_archive(source): + return tarfile.is_tarfile(source) or zipfile.is_zipfile(source) + + +def extract_archive(source): + if tarfile.is_tarfile(source): + return untar(source) + elif zipfile.is_zipfile(source): + return unzip(source) + raise ValueError( + 'Unsupported archive type provided or archive is not valid: {0}.'.format(source)) + + +def tar(source, destination): + with closing(tarfile.open(destination, 'w:gz')) as tar_archive: + tar_archive.add(source, arcname=os.path.basename(source)) + + +def untar(archive, destination=None): + if not destination: + destination = tempfile.mkdtemp() + with closing(tarfile.open(name=archive)) as tar_archive: + tar_archive.extractall(path=destination, members=tar_archive.getmembers()) + return destination + + +def zip(source, destination): + with closing(zipfile.ZipFile(destination, 'w')) as zip_file: + for root, _, files in os.walk(source): + for filename in files: + file_path = os.path.join(root, filename) + source_dir = os.path.dirname(source) + zip_file.write( + file_path, os.path.relpath(file_path, source_dir)) + return destination + + +def unzip(archive, destination=None): + if not destination: + destination = tempfile.mkdtemp() + with closing(zipfile.ZipFile(archive, 'r')) as zip_file: + zip_file.extractall(destination) + return destination diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/argparse.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/argparse.py new file mode 100644 index 0000000..a05a841 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/argparse.py @@ -0,0 +1,118 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Enhancements to Python's ``argparse`` module. +""" + +from __future__ import absolute_import # so we can import standard 'argparse' + +from argparse import ArgumentParser as BaseArgumentParser + + +class ArgumentParser(BaseArgumentParser): + """ + Enhanced argument parser. + + Applied patch to fix `this issue `__. + """ + + def add_flag_argument(self, name, help_true=None, help_false=None, default=False): + """ + Adds a flag argument as two arguments: ``--my-flag`` and ``--no-my-flag``. + """ + + dest = name.replace('-', '_') + + if default: + if help_true is not None: + help_true += ' (default)' + else: + help_true = '(default)' + else: + if help_false is not None: + help_false += ' (default)' + else: + help_false = '(default)' + + group = self.add_mutually_exclusive_group() + group.add_argument('--%s' % name, action='store_true', help=help_true) + group.add_argument('--no-%s' % name, dest=dest, action='store_false', help=help_false) + + self.set_defaults(**{dest: default}) + + def _parse_optional(self, arg_string): + + if self._is_positional(arg_string): + return None + + # if the option string is present in the parser, return the action + if arg_string in self._option_string_actions: + action = self._option_string_actions[arg_string] + return action, arg_string, None + + # if the option string before the "=" is present, return the action + if '=' in arg_string: + option_string, explicit_arg = arg_string.split('=', 1) + if option_string in self._option_string_actions: + action = self._option_string_actions[option_string] + return action, option_string, explicit_arg + + # search through all possible prefixes of the option string + # and all actions in the parser for possible interpretations + option_tuples = self._get_option_tuples(arg_string) + + # if multiple actions match, the option string was ambiguous + if len(option_tuples) > 1: + options = ', '.join( + [option_string for action, option_string, explicit_arg in option_tuples]) + tup = arg_string, options + self.error('ambiguous option: %s could match %s' % tup) + + # if exactly one action matched, this segmentation is good, + # so return the parsed action + elif len(option_tuples) == 1: + option_tuple = option_tuples + return option_tuple + + # if it was not found as an option, but it looks like a negative + # number, it was meant to be positional + # unless there are negative-number-like options + if self._negative_number_matcher.match(arg_string): + if not self._has_negative_number_optionals: + return None + + # it was meant to be an optional but there is no such option + # in this parser (though it might be a valid option in a subparser) + return None, arg_string, None + + def _is_positional(self, arg_string): + # if it's an empty string, it was meant to be a positional + if not arg_string: + return True + + # if it doesn't start with a prefix, it was meant to be positional + if not arg_string[0] in self.prefix_chars: + return True + + # if it's just a single character, it was meant to be positional + if len(arg_string) == 1: + return True + + # if it contains a space, it was meant to be a positional + if ' ' in arg_string and arg_string[0] not in self.prefix_chars: + return True + + return False diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/caching.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/caching.py new file mode 100644 index 0000000..5f8cd88 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/caching.py @@ -0,0 +1,137 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Caching utilities. +""" + +from __future__ import absolute_import # so we can import standard 'collections' and 'threading' + +from threading import Lock +from functools import partial + +from .collections import OrderedDict + + +class cachedmethod(object): # pylint: disable=invalid-name + """ + Decorator for caching method return values. + + The implementation is thread-safe. + + Supports ``cache_info`` to be compatible with Python 3's ``functools.lru_cache``. Note that the + statistics are combined for all instances of the class. + + Won't use the cache if not called when bound to an object, allowing you to override the cache. + + Adapted from `this solution + `__. + """ + + ENABLED = True + + def __init__(self, func): + self.__doc__ = func.__doc__ + self.func = func + self.hits = 0 + self.misses = 0 + self.lock = Lock() + + def cache_info(self): + with self.lock: + return (self.hits, self.misses, None, self.misses) + + def reset_cache_info(self): + with self.lock: + self.hits = 0 + self.misses = 0 + + def __get__(self, instance, owner): + if instance is None: + # Don't use cache if not bound to an object + # Note: This is also a way for callers to override the cache + return self.func + return partial(self, instance) + + def __call__(self, *args, **kwargs): + if not self.ENABLED: + return self.func(*args, **kwargs) + + instance = args[0] + if not hasattr(instance, '_method_cache'): + instance._method_cache = {} + method_cache = instance._method_cache + + key = (self.func, args[1:], frozenset(kwargs.items())) + + try: + with self.lock: + return_value = method_cache[key] + self.hits += 1 + except KeyError: + return_value = self.func(*args, **kwargs) + with self.lock: + method_cache[key] = return_value + self.misses += 1 + # Another thread may override our cache entry here, so we need to read + # it again to make sure all threads use the same return value + return_value = method_cache.get(key, return_value) + + return return_value + + +class HasCachedMethods(object): + """ + Provides convenience methods for working with :class:`cachedmethod`. + """ + + def __init__(self, method_cache=None): + self._method_cache = method_cache or {} + + @property + def _method_cache_info(self): + """ + The cache infos of all cached methods. + + :rtype: dict of str, 4-tuple + """ + + cached_info = OrderedDict() + for k, v in self.__class__.__dict__.iteritems(): + if isinstance(v, property): + # The property getter might be cached + v = v.fget + if hasattr(v, 'cache_info'): + cached_info[k] = v.cache_info() + return cached_info + + def _reset_method_cache(self): + """ + Resets the caches of all cached methods. + """ + + if hasattr(self, '_method_cache'): + self._method_cache = {} + + # Note: Another thread may already be storing entries in the cache here. + # But it's not a big deal! It only means that our cache_info isn't + # guaranteed to be accurate. + + for entry in self.__class__.__dict__.itervalues(): + if isinstance(entry, property): + # The property getter might be cached + entry = entry.fget + if hasattr(entry, 'reset_cache_info'): + entry.reset_cache_info() diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/collections.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/collections.py new file mode 100644 index 0000000..ccc37a1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/collections.py @@ -0,0 +1,303 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Additional collection classes and collection utilities. +""" + +from __future__ import absolute_import # so we can import standard 'collections' + +from copy import deepcopy +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict + + +def cls_name(cls): + module = str(cls.__module__) + name = str(cls.__name__) + return name if module == '__builtin__' else '%s.%s' % (module, name) + + +class FrozenList(list): + """ + An immutable list. + + After initialization it will raise :class:`~exceptions.TypeError` exceptions if modification is + attempted. + + Note that objects stored in the list may not be immutable. + """ + def __init__(self, *args, **kwargs): + self.locked = False + super(FrozenList, self).__init__(*args, **kwargs) + self.locked = True + + def __setitem__(self, index, value): + if self.locked: + raise TypeError('frozen list') + return super(FrozenList, self).__setitem__(index, value) + + def __delitem__(self, index): + if self.locked: + raise TypeError('frozen list') + return super(FrozenList, self).__delitem__(index) + + def __iadd__(self, values): + if self.locked: + raise TypeError('frozen list') + return super(FrozenList, self).__iadd__(values) + + def __deepcopy__(self, memo): + res = [deepcopy(v, memo) for v in self] + return FrozenList(res) + + def append(self, value): + if self.locked: + raise TypeError('frozen list') + return super(FrozenList, self).append(value) + + def extend(self, values): + if self.locked: + raise TypeError('frozen list') + return super(FrozenList, self).append(values) + + def insert(self, index, value): + if self.locked: + raise TypeError('frozen list') + return super(FrozenList, self).insert(index, value) + +EMPTY_READ_ONLY_LIST = FrozenList() + + +class FrozenDict(OrderedDict): + """ + An immutable ordered dict. + + After initialization it will raise :class:`~exceptions.TypeError` exceptions if modification is + attempted. + + Note that objects stored in the dict may not be immutable. + """ + + def __init__(self, *args, **kwargs): + self.locked = False + super(FrozenDict, self).__init__(*args, **kwargs) + self.locked = True + + def __setitem__(self, key, value, **_): + if self.locked: + raise TypeError('frozen dict') + return super(FrozenDict, self).__setitem__(key, value) + + def __delitem__(self, key, **_): + if self.locked: + raise TypeError('frozen dict') + return super(FrozenDict, self).__delitem__(key) + + def __deepcopy__(self, memo): + res = [(deepcopy(k, memo), deepcopy(v, memo)) for k, v in self.iteritems()] + return FrozenDict(res) + +EMPTY_READ_ONLY_DICT = FrozenDict() + + +class StrictList(list): + """ + A list that raises :class:`~exceptions.TypeError` exceptions when objects of the wrong type are + inserted. + """ + + def __init__(self, + items=None, + value_class=None, + wrapper_function=None, + unwrapper_function=None): + super(StrictList, self).__init__() + if isinstance(items, StrictList): + self.value_class = items.value_class + self.wrapper_function = items.wrapper_function + self.unwrapper_function = items.unwrapper_function + self.value_class = value_class + self.wrapper_function = wrapper_function + self.unwrapper_function = unwrapper_function + if items: + for item in items: + self.append(item) + + def _wrap(self, value): + if (self.value_class is not None) and (not isinstance(value, self.value_class)): + raise TypeError('value must be a "%s": %s' % (cls_name(self.value_class), repr(value))) + if self.wrapper_function is not None: + value = self.wrapper_function(value) + return value + + def _unwrap(self, value): + if self.unwrapper_function is not None: + value = self.unwrapper_function(value) + return value + + def __getitem__(self, index): + value = super(StrictList, self).__getitem__(index) + value = self._unwrap(value) + return value + + def __setitem__(self, index, value): + value = self._wrap(value) + return super(StrictList, self).__setitem__(index, value) + + def __iadd__(self, values): + values = [self._wrap(v) for v in values] + return super(StrictList, self).__iadd__(values) + + def append(self, value): + value = self._wrap(value) + return super(StrictList, self).append(value) + + def extend(self, values): + values = [self._wrap(v) for v in values] + return super(StrictList, self).extend(values) + + def insert(self, index, value): + value = self._wrap(value) + return super(StrictList, self).insert(index, value) + + +class StrictDict(OrderedDict): + """ + An ordered dict that raises :class:`~exceptions.TypeError` exceptions when keys or values of the + wrong type are used. + """ + + def __init__(self, + items=None, + key_class=None, + value_class=None, + wrapper_function=None, + unwrapper_function=None): + super(StrictDict, self).__init__() + if isinstance(items, StrictDict): + self.key_class = items.key_class + self.value_class = items.value_class + self.wrapper_function = items.wrapper_function + self.unwrapper_function = items.unwrapper_function + self.key_class = key_class + self.value_class = value_class + self.wrapper_function = wrapper_function + self.unwrapper_function = unwrapper_function + if items: + for k, v in items: + self[k] = v + + def __getitem__(self, key): + if (self.key_class is not None) and (not isinstance(key, self.key_class)): + raise TypeError('key must be a "%s": %s' % (cls_name(self.key_class), repr(key))) + value = super(StrictDict, self).__getitem__(key) + if self.unwrapper_function is not None: + value = self.unwrapper_function(value) + return value + + def __setitem__(self, key, value, **_): + if (self.key_class is not None) and (not isinstance(key, self.key_class)): + raise TypeError('key must be a "%s": %s' % (cls_name(self.key_class), repr(key))) + if (self.value_class is not None) and (not isinstance(value, self.value_class)): + raise TypeError('value must be a "%s": %s' % (cls_name(self.value_class), repr(value))) + if self.wrapper_function is not None: + value = self.wrapper_function(value) + return super(StrictDict, self).__setitem__(key, value) + + +def merge(dict_a, dict_b, path=None, strict=False): + """ + Merges dicts, recursively. + """ + + # TODO: a.add_yaml_merge(b), see https://bitbucket.org/ruamel/yaml/src/ + # TODO: 86622a1408e0f171a12e140d53c4ffac4b6caaa3/comments.py?fileviewer=file-view-default + + path = path or [] + for key, value_b in dict_b.iteritems(): + if key in dict_a: + value_a = dict_a[key] + if isinstance(value_a, dict) and isinstance(value_b, dict): + merge(value_a, value_b, path + [str(key)], strict) + elif value_a != value_b: + if strict: + raise ValueError('dict merge conflict at %s' % '.'.join(path + [str(key)])) + else: + dict_a[key] = value_b + else: + dict_a[key] = value_b + return dict_a + + +def is_removable(_container, _key, v): + return (v is None) or ((isinstance(v, dict) or isinstance(v, list)) and (len(v) == 0)) + + +def prune(value, is_removable_function=is_removable): + """ + Deletes ``None`` and empty lists and dicts, recursively. + """ + + if isinstance(value, list): + for i, v in enumerate(value): + if is_removable_function(value, i, v): + del value[i] + else: + prune(v, is_removable_function) + elif isinstance(value, dict): + for k, v in value.items(): + if is_removable_function(value, k, v): + del value[k] + else: + prune(v, is_removable_function) + + return value + + +# TODO: Move following two methods to some place parser specific + +def deepcopy_with_locators(value): + """ + Like :func:`~copy.deepcopy`, but also copies over locators. + """ + + res = deepcopy(value) + copy_locators(res, value) + return res + + +def copy_locators(target, source): + """ + Copies over ``_locator`` for all elements, recursively. + + Assumes that target and source have exactly the same list/dict structure. + """ + + locator = getattr(source, '_locator', None) + if locator is not None: + try: + setattr(target, '_locator', locator) + except AttributeError: + pass + + if isinstance(target, list) and isinstance(source, list): + for i, _ in enumerate(target): + copy_locators(target[i], source[i]) + elif isinstance(target, dict) and isinstance(source, dict): + for k, v in target.iteritems(): + copy_locators(v, source[k]) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/console.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/console.py new file mode 100644 index 0000000..81e8cf8 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/console.py @@ -0,0 +1,132 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Abstraction API above terminal color libraries. +""" + +import os +import sys +from StringIO import StringIO + +from contextlib import contextmanager + +from ..cli import color +from . import formatting + + +_indent_string = '' + + +class TopologyStylizer(object): + def __init__(self, indentation=0): + self._str = StringIO() + self._indentation = indentation + + def write(self, string): + self._str.write(' ' * self._indentation) + self._str.write(string) + self._str.write(os.linesep) + + @contextmanager + def indent(self, indentation=2): + self._indentation += indentation + yield + self._indentation -= indentation + + @staticmethod + def type_style(value): + return Colored.blue(value, bold=True) + + @staticmethod + def node_style(value): + return Colored.red(value, bold=True) + + @staticmethod + def property_style(value): + return Colored.magenta(value, bold=True) + + @staticmethod + def literal_style(value): + return Colored.magenta(formatting.safe_repr(value)) + + @staticmethod + def required_style(value): + return Colored.white(value) + + @staticmethod + def meta_style(value): + return Colored.green(value) + + def __str__(self): + return self._str.getvalue() + + +def puts(string='', newline=True, stream=sys.stdout): + stream.write(_indent_string) + stream.write(formatting.safe_str(string)) + if newline: + stream.write(os.linesep) + + +@contextmanager +def indent(size=4): + global _indent_string + original_indent_string = _indent_string + try: + _indent_string += ' ' * size + yield + finally: + _indent_string = original_indent_string + + +class Colored(object): + @staticmethod + def black(string, always=False, bold=False): + return Colored._color(string, color.Colors.Fore.BLACK, bold) + + @staticmethod + def red(string, always=False, bold=False): + return Colored._color(string, color.Colors.Fore.RED, bold) + + @staticmethod + def green(string, always=False, bold=False): + return Colored._color(string, color.Colors.Fore.GREEN, bold) + + @staticmethod + def yellow(string, always=False, bold=False): + return Colored._color(string, color.Colors.Fore.YELLOW, bold) + + @staticmethod + def blue(string, always=False, bold=False): + return Colored._color(string, color.Colors.Fore.BLUE, bold) + + @staticmethod + def magenta(string, always=False, bold=False): + return Colored._color(string, color.Colors.Fore.MAGENTA, bold) + + @staticmethod + def cyan(string, always=False, bold=False): + return Colored._color(string, color.Colors.Fore.CYAN, bold) + + @staticmethod + def white(string, always=False, bold=False): + return Colored._color(string, color.Colors.Fore.WHITE, bold) + + @staticmethod + def _color(string, fore, bold): + return color.StringStylizer(string, color.ColorSpec( + fore=fore, + style=color.Colors.Style.BRIGHT if bold else color.Colors.Style.NORMAL)) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/exceptions.py new file mode 100644 index 0000000..5bb0e6d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/exceptions.py @@ -0,0 +1,120 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Utilities for extracting and formatting Python exceptions. +""" + +import sys +import linecache +import StringIO +import traceback as tb + +import jsonpickle + +from .console import (puts, indent, Colored) + + +ENTRY_FORMAT = 'File "{filename}", line {lineno}, in {name}' + + +def print_exception(e, full=True, cause=False, traceback=None): + """ + Prints the exception with nice colors and such. + """ + def format_heading(e): + return '{0}{1}: {2}'.format( + Colored.red('Caused by ') if cause else '', + Colored.red(e.__class__.__name__, bold=True), + Colored.red(e)) + + puts(format_heading(e)) + if full: + if cause: + if traceback: + print_traceback(traceback, True) + else: + print_traceback() + if hasattr(e, 'cause') and e.cause: + traceback = e.cause_traceback if hasattr(e, 'cause_traceback') else None + print_exception(e.cause, full=full, cause=True, traceback=traceback) + + +def print_traceback(traceback=None, print_last_stack=False): + """ + Prints the traceback with nice colors and such. + """ + + if traceback is None: + _, _, traceback = sys.exc_info() + while traceback is not None: + frame = traceback.tb_frame + code = frame.f_code + filename = code.co_filename + lineno = traceback.tb_lineno + name = code.co_name + with indent(2): + puts(ENTRY_FORMAT.format(filename=Colored.blue(filename), + lineno=Colored.cyan(lineno), + name=Colored.cyan(name))) + linecache.checkcache(filename) + line = linecache.getline(filename, lineno, frame.f_globals) + if line: + with indent(2): + puts(line.strip()) + traceback = traceback.tb_next + if print_last_stack and (traceback is None): + # Print stack of *last* traceback + _print_stack(frame) + + +def _print_stack(frame): + entries = tb.extract_stack(frame) + if not entries: + return + puts(Colored.red('Call stack:')) + with indent(2): + for filename, lineno, name, line in entries: + puts(ENTRY_FORMAT.format(filename=Colored.blue(filename), + lineno=Colored.cyan(lineno), + name=Colored.cyan(name))) + with indent(2): + puts(line) + + +def get_exception_as_string(exc_type, exc_val, traceback): + s_traceback = StringIO.StringIO() + tb.print_exception( + etype=exc_type, + value=exc_val, + tb=traceback, + file=s_traceback) + return s_traceback.getvalue() + + +class _WrappedException(Exception): + + def __init__(self, exception_type, exception_str): + super(_WrappedException, self).__init__(exception_type, exception_str) + self.exception_type = exception_type + self.exception_str = exception_str + + +def wrap_if_needed(exception): + try: + jsonpickle.loads(jsonpickle.dumps(exception)) + return exception + except BaseException: + return _WrappedException(type(exception).__name__, str(exception)) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/file.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/file.py new file mode 100644 index 0000000..75f2859 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/file.py @@ -0,0 +1,46 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +File utilities. +""" + +import errno +import os +import shutil + + +def makedirs(path): + """ + Enhancement of :func:`os.makedirs` that doesn't fail if the directory already exists. + """ + if os.path.isdir(path): + return + try: + os.makedirs(path) + except IOError as e: + if e.errno != errno.EEXIST: + raise + +def remove_if_exists(path): + try: + if os.path.isfile(path): + os.remove(path) + if os.path.isdir(path): + shutil.rmtree(path) + + except OSError as e: + if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory + raise # re-raise exception if a different error occurred diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/formatting.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/formatting.py new file mode 100644 index 0000000..fa34b7d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/formatting.py @@ -0,0 +1,235 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +String formatting and string-based format utilities. +""" + +import json +from types import MethodType + +from ruamel import yaml # @UnresolvedImport + +from .collections import FrozenList, FrozenDict, StrictList, StrictDict, OrderedDict + + +PLURALIZE_EXCEPTIONS = {} + + +# Add our types to ruamel.yaml (for round trips) +yaml.representer.RoundTripRepresenter.add_representer( + FrozenList, yaml.representer.RoundTripRepresenter.represent_list) +yaml.representer.RoundTripRepresenter.add_representer( + FrozenDict, yaml.representer.RoundTripRepresenter.represent_dict) +yaml.representer.RoundTripRepresenter.add_representer( + StrictList, yaml.representer.RoundTripRepresenter.represent_list) +yaml.representer.RoundTripRepresenter.add_representer( + StrictDict, yaml.representer.RoundTripRepresenter.represent_dict) + +# Without this, ruamel.yaml will output "!!omap" types, which is +# technically correct but unnecessarily verbose for our uses +yaml.representer.RoundTripRepresenter.add_representer( + OrderedDict, yaml.representer.RoundTripRepresenter.represent_dict) + + +class JsonAsRawEncoder(json.JSONEncoder): + """ + A :class:`JSONEncoder` that will use the ``as_raw`` property of objects if available. + """ + def raw_encoder_default(self, obj): + try: + return iter(obj) + except TypeError: + if hasattr(obj, 'as_raw'): + return as_raw(obj) + return str(obj) + return super(JsonAsRawEncoder, self).default(obj) + + def __init__(self, *args, **kwargs): + kwargs['default'] = self.raw_encoder_default + super(JsonAsRawEncoder, self).__init__(*args, **kwargs) + + +class YamlAsRawDumper(yaml.dumper.RoundTripDumper): # pylint: disable=too-many-ancestors + """ + A :class:`RoundTripDumper` that will use the ``as_raw`` property of objects if available. + """ + + def represent_data(self, data): + if hasattr(data, 'as_raw'): + data = as_raw(data) + return super(YamlAsRawDumper, self).represent_data(data) + + +def decode_list(data): + decoded_list = [] + for item in data: + if isinstance(item, unicode): + item = item.encode('utf-8') + elif isinstance(item, list): + item = decode_list(item) + elif isinstance(item, dict): + item = decode_dict(item) + decoded_list.append(item) + return decoded_list + + +def decode_dict(data): + decoded_dict = {} + for key, value in data.iteritems(): + if isinstance(key, unicode): + key = key.encode('utf-8') + if isinstance(value, unicode): + value = value.encode('utf-8') + elif isinstance(value, list): + value = decode_list(value) + elif isinstance(value, dict): + value = decode_dict(value) + decoded_dict[key] = value + return decoded_dict + + +def safe_str(value): + """ + Like :class:`str` coercion, but makes sure that Unicode strings are properly encoded, and will + never return ``None``. + """ + + try: + return str(value) + except UnicodeEncodeError: + return unicode(value).encode('utf8') + + +def safe_repr(value): + """ + Like :func:`repr`, but calls :func:`as_raw` and :func:`as_agnostic` first. + """ + + return repr(as_agnostic(as_raw(value))) + + +def string_list_as_string(strings): + """ + Nice representation of a list of strings. + """ + + if not strings: + return 'none' + return ', '.join('"{0}"'.format(safe_str(v)) for v in strings) + + +def pluralize(noun): + plural = PLURALIZE_EXCEPTIONS.get(noun) + if plural is not None: + return plural + elif noun.endswith('s'): + return '{0}es'.format(noun) + elif noun.endswith('y'): + return '{0}ies'.format(noun[:-1]) + else: + return '{0}s'.format(noun) + + +def as_raw(value): + """ + Converts values using their ``as_raw`` property, if it exists, recursively. + """ + + if hasattr(value, 'as_raw'): + value = value.as_raw + if isinstance(value, MethodType): + # Old-style Python classes don't support properties + value = value() + elif isinstance(value, list): + value = list(value) + for i, v in enumerate(value): + value[i] = as_raw(v) + elif isinstance(value, dict): + value = dict(value) + for k, v in value.iteritems(): + value[k] = as_raw(v) + return value + + +def as_raw_list(value): + """ + Assuming value is a list, converts its values using :func:`as_raw`. + """ + + if value is None: + return [] + if isinstance(value, dict): + value = value.itervalues() + return [as_raw(v) for v in value] + + +def as_raw_dict(value): + """ + Assuming value is a dict, converts its values using :func:`as_raw`. The keys are left as is. + """ + + if value is None: + return OrderedDict() + return OrderedDict(( + (k, as_raw(v)) for k, v in value.iteritems())) + + +def as_agnostic(value): + """ + Converts subclasses of list and dict to standard lists and dicts, and Unicode strings to + non-Unicode if possible, recursively. + + Useful for creating human-readable output of structures. + """ + + if isinstance(value, unicode): + try: + value = str(value) + except UnicodeEncodeError: + pass + elif isinstance(value, list): + value = list(value) + elif isinstance(value, dict): + value = dict(value) + + if isinstance(value, list): + for i, _ in enumerate(value): + value[i] = as_agnostic(value[i]) + elif isinstance(value, dict): + for k, v in value.iteritems(): + value[k] = as_agnostic(v) + + return value + + +def json_dumps(value, indent=2): + """ + JSON dumps that supports Unicode and the ``as_raw`` property of objects if available. + """ + + return json.dumps(value, indent=indent, ensure_ascii=False, cls=JsonAsRawEncoder) + + +def yaml_dumps(value, indent=2): + """ + YAML dumps that supports Unicode and the ``as_raw`` property of objects if available. + """ + + return yaml.dump(value, indent=indent, allow_unicode=True, Dumper=YamlAsRawDumper) + + +def yaml_loads(value): + return yaml.load(value, Loader=yaml.SafeLoader) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/http.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/http.py new file mode 100644 index 0000000..c8357e9 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/http.py @@ -0,0 +1,66 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 utilities. +""" + +import os +import tempfile + +import requests + + +def download_file(url, destination=None, logger=None, progress_handler=None): + """ + Download file. + + :param url: URL from which to download + :type url: basestring + :param destination: path where the file should be saved or ``None`` to auto-generate + :type destination: basestring + :returns: path where the file was saved + :rtype: basestring + :raises exceptions.IOError: + :raises requests.exceptions.RequestException: + """ + chunk_size = 1024 + + if not destination: + file_descriptor, destination = tempfile.mkstemp() + os.close(file_descriptor) + if logger: + logger.info('Downloading {0} to {1}...'.format(url, destination)) + + response = requests.get(url, stream=True) + final_url = response.url + if final_url != url and logger: + logger.debug('Redirected to {0}'.format(final_url)) + + read_bytes = 0 + total_size = int(response.headers['Content-Length']) \ + if 'Content-Length' in response.headers else None + try: + with open(destination, 'wb') as destination_file: + for chunk in response.iter_content(chunk_size): + destination_file.write(chunk) + if total_size and progress_handler: + # Only showing progress bar if we have the total content length + read_bytes += chunk_size + progress_handler(read_bytes, total_size) + finally: + response.close() + + return destination diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/imports.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/imports.py new file mode 100644 index 0000000..14ad09e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/imports.py @@ -0,0 +1,96 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Utilities for dynamically loading Python code. +""" + +import pkgutil +import importlib + + +def import_fullname(name, paths=None): + """ + Imports a variable or class based on a full name, optionally searching for it in the paths. + """ + paths = paths or [] + if name is None: + return None + + def do_import(name): + if name and ('.' in name): + module_name, name = name.rsplit('.', 1) + return getattr(__import__(module_name, fromlist=[name], level=0), name) + else: + raise ImportError('import not found: %s' % name) + + try: + return do_import(name) + except ImportError: + for path in paths: + try: + return do_import('%s.%s' % (path, name)) + except Exception as e: + raise ImportError('cannot import %s, because %s' % (name, e)) + + raise ImportError('import not found: %s' % name) + + +def import_modules(name): + """ + Imports a module and all its sub-modules, recursively. Relies on modules defining a ``MODULES`` + attribute listing their sub-module names. + """ + + module = __import__(name, fromlist=['MODULES'], level=0) + if hasattr(module, 'MODULES'): + for module_ in module.MODULES: + import_modules('%s.%s' % (name, module_)) + + +# TODO merge with import_fullname +def load_attribute(attribute_path): + """ + Dynamically load an attribute based on the path to it. E.g. + ``some_package.some_module.some_attribute``, will load ``some_attribute`` from the + ``some_package.some_module`` module. + """ + module_name, attribute_name = attribute_path.rsplit('.', 1) + try: + module = importlib.import_module(module_name) + return getattr(module, attribute_name) + except ImportError: + # TODO: handle + raise + except AttributeError: + # TODO: handle + raise + + +def iter_modules(): + # apparently pkgutil had some issues in python 2.6. Accessing any root level directories + # failed. and it got the entire process of importing fail. Since we only need any + # aria_extension related loading, in the meantime we could try to import only those + # (and assume they are not located at the root level. + # [In python 2.7 it does actually ignore any OSError]. + yielded = {} + for importer in pkgutil.iter_importers(): + try: + for module_name, ispkg in pkgutil.iter_importer_modules(importer): + if module_name not in yielded: + yielded[module_name] = True + yield importer, module_name, ispkg + except OSError: + pass diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/openclose.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/openclose.py new file mode 100644 index 0000000..722885c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/openclose.py @@ -0,0 +1,36 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Utilities for working with open/close patterns. +""" + +class OpenClose(object): + """ + Wraps an object that has ``open()`` and ``close()`` methods to support the ``with`` keyword. + """ + + def __init__(self, wrapped): + self.wrapped = wrapped + + def __enter__(self): + if hasattr(self.wrapped, 'open'): + self.wrapped.open() + return self.wrapped + + def __exit__(self, the_type, value, traceback): + if hasattr(self.wrapped, 'close'): + self.wrapped.close() + return False diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/plugin.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/plugin.py new file mode 100644 index 0000000..4fb6a8e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/plugin.py @@ -0,0 +1,24 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Plugin utilities. +""" + +import wagon + + +def create(source, destination_dir): + return wagon.create(source=source, archive_destination_dir=destination_dir) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/process.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/process.py new file mode 100644 index 0000000..ec4a72d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/process.py @@ -0,0 +1,51 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Process utilities. +""" + +import os + + +def append_to_path(*args, **kwargs): + """ + Appends one or more paths to the system path of an environment. + The environment will be that of the current process unless another is passed using the + 'env' keyword argument. + :param args: paths to append + :param kwargs: 'env' may be used to pass a custom environment to use + """ + _append_to_path('PATH', *args, **kwargs) + + +def append_to_pythonpath(*args, **kwargs): + """ + Appends one or more paths to the python path of an environment. + The environment will be that of the current process unless another is passed using the + 'env' keyword argument. + :param args: paths to append + :param kwargs: 'env' may be used to pass a custom environment to use + """ + _append_to_path('PYTHONPATH', *args, **kwargs) + + +def _append_to_path(path, *args, **kwargs): + env = kwargs.get('env') or os.environ + env[path] = '{0}{1}{2}'.format( + os.pathsep.join(args), + os.pathsep, + env.get(path, '') + ) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/specification.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/specification.py new file mode 100644 index 0000000..8c51134 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/specification.py @@ -0,0 +1,57 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Utilities for cross-referencing code with specification documents. +""" + +from .collections import OrderedDict + + +DSL_SPECIFICATIONS = {} + + +def implements_specification(section, spec): + """ + Decorator for specification implementations. + + Used for documentation and standards compliance. + """ + + from .type import full_type_name + + def decorator(obj): + specification = DSL_SPECIFICATIONS.get(spec) + + if specification is None: + specification = {} + DSL_SPECIFICATIONS[spec] = specification + + if section in specification: + raise Exception('you cannot specify the same @implements_specification twice, consider' + ' adding \'-1\', \'-2\', etc.: {0}, {1}'.format(spec, section)) + + specification[section] = OrderedDict(( + ('code', full_type_name(obj)), + ('doc', obj.__doc__))) + + try: + setattr(obj, '_dsl_specifications', {section: section, spec: spec}) + except BaseException: + pass + + return obj + + return decorator diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/threading.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/threading.py new file mode 100644 index 0000000..f5ca302 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/threading.py @@ -0,0 +1,286 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Threading utilities. +""" + +from __future__ import absolute_import # so we can import standard 'threading' + +import sys +import itertools +import multiprocessing +from threading import (Thread, Lock) +from Queue import (Queue, Full, Empty) + +from .exceptions import print_exception + +class ExecutorException(Exception): + pass + + +class DaemonThread(Thread): + def __init__(self, *args, **kwargs): + super(DaemonThread, self).__init__(*args, **kwargs) + self.daemon = True + + def run(self): + """ + We're overriding ``Thread.run`` in order to avoid annoying (but harmless) error messages + during shutdown. The problem is that CPython nullifies the global state _before_ shutting + down daemon threads, so that exceptions might happen, and then ``Thread.__bootstrap_inner`` + prints them out. + + Our solution is to swallow these exceptions here. + + The side effect is that uncaught exceptions in our own thread code will _not_ be printed out + as usual, so it's our responsibility to catch them in our code. + """ + + try: + super(DaemonThread, self).run() + except SystemExit as e: + # This exception should be bubbled up + raise e + except BaseException: + # Exceptions might occur in daemon threads during interpreter shutdown + pass + + +# https://gist.github.com/tliron/81dd915166b0bfc64be08b4f8e22c835 +class FixedThreadPoolExecutor(object): + """ + Executes tasks in a fixed thread pool. + + Makes sure to gather all returned results and thrown exceptions in one place, in order of task + submission. + + Example:: + + def sum(arg1, arg2): + return arg1 + arg2 + + executor = FixedThreadPoolExecutor(10) + try: + for value in range(100): + executor.submit(sum, value, value) + executor.drain() + except: + executor.close() + executor.raise_first() + print executor.returns + + You can also use it with the Python ``with`` keyword, in which case you don't need to call + ``close`` explicitly:: + + with FixedThreadPoolExecutor(10) as executor: + for value in range(100): + executor.submit(sum, value, value) + executor.drain() + executor.raise_first() + print executor.returns + """ + + _CYANIDE = object() # Special task marker used to kill worker threads. + + def __init__(self, + size=None, + timeout=None, + print_exceptions=False): + """ + :param size: number of threads in the pool; if ``None`` will use an optimal number for the + platform + :param timeout: timeout in seconds for all blocking operations (``None`` means no timeout) + :param print_exceptions: set to ``True`` in order to print exceptions from tasks + """ + if not size: + try: + size = multiprocessing.cpu_count() * 2 + 1 + except NotImplementedError: + size = 3 + + self.size = size + self.timeout = timeout + self.print_exceptions = print_exceptions + + self._tasks = Queue() + self._returns = {} + self._exceptions = {} + self._id_creator = itertools.count() + self._lock = Lock() # for console output + + self._workers = [] + for index in range(size): + worker = DaemonThread( + name='%s%d' % (self.__class__.__name__, index), + target=self._thread_worker) + worker.start() + self._workers.append(worker) + + def submit(self, func, *args, **kwargs): + """ + Submit a task for execution. + + The task will be called ASAP on the next available worker thread in the pool. + + :raises ExecutorException: if cannot be submitted + """ + + try: + self._tasks.put((self._id_creator.next(), func, args, kwargs), timeout=self.timeout) + except Full: + raise ExecutorException('cannot submit task: queue is full') + + def close(self): + """ + Blocks until all current tasks finish execution and all worker threads are dead. + + You cannot submit tasks anymore after calling this. + + This is called automatically upon exit if you are using the ``with`` keyword. + """ + + self.drain() + while self.is_alive: + try: + self._tasks.put(self._CYANIDE, timeout=self.timeout) + except Full: + raise ExecutorException('cannot close executor: a thread seems to be hanging') + self._workers = None + + def drain(self): + """ + Blocks until all current tasks finish execution, but leaves the worker threads alive. + """ + + self._tasks.join() # oddly, the API does not support a timeout parameter + + @property + def is_alive(self): + """ + True if any of the worker threads are alive. + """ + + for worker in self._workers: + if worker.is_alive(): + return True + return False + + @property + def returns(self): + """ + The returned values from all tasks, in order of submission. + """ + + return [self._returns[k] for k in sorted(self._returns)] + + @property + def exceptions(self): + """ + The raised exceptions from all tasks, in order of submission. + """ + + return [self._exceptions[k] for k in sorted(self._exceptions)] + + def raise_first(self): + """ + If exceptions were thrown by any task, then the first one will be raised. + + This is rather arbitrary: proper handling would involve iterating all the exceptions. + However, if you want to use the "raise" mechanism, you are limited to raising only one of + them. + """ + + exceptions = self.exceptions + if exceptions: + raise exceptions[0] + + def _thread_worker(self): + while True: + if not self._execute_next_task(): + break + + def _execute_next_task(self): + try: + task = self._tasks.get(timeout=self.timeout) + except Empty: + # Happens if timeout is reached + return True + if task == self._CYANIDE: + # Time to die :( + return False + self._execute_task(*task) + return True + + def _execute_task(self, task_id, func, args, kwargs): + try: + result = func(*args, **kwargs) + self._returns[task_id] = result + except Exception as e: + self._exceptions[task_id] = e + if self.print_exceptions: + with self._lock: + print_exception(e) + self._tasks.task_done() + + def __enter__(self): + return self + + def __exit__(self, the_type, value, traceback): + self.close() + return False + + +class LockedList(list): + """ + A list that supports the ``with`` keyword with a built-in lock. + + Though Python lists are thread-safe in that they will not raise exceptions during concurrent + access, they do not guarantee atomicity. This class will let you gain atomicity when needed. + """ + + def __init__(self, *args, **kwargs): + super(LockedList, self).__init__(*args, **kwargs) + self.lock = Lock() + + def __enter__(self): + return self.lock.__enter__() + + def __exit__(self, the_type, value, traceback): + return self.lock.__exit__(the_type, value, traceback) + + +class ExceptionThread(Thread): + """ + A thread from which top level exceptions can be retrieved or re-raised. + """ + def __init__(self, *args, **kwargs): + Thread.__init__(self, *args, **kwargs) + self.exception = None + self.daemon = True + + def run(self): + try: + super(ExceptionThread, self).run() + except BaseException: + self.exception = sys.exc_info() + + def is_error(self): + return self.exception is not None + + def raise_error_if_exists(self): + if self.is_error(): + type_, value, trace = self.exception + raise type_, value, trace diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/type.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/type.py new file mode 100644 index 0000000..fe88a62 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/type.py @@ -0,0 +1,156 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Type utilities. +""" + +import datetime + +from .specification import implements_specification + + +BASE_TYPES_TO_CANONICAL_NAMES = { + # TOSCA aliases: + None.__class__: 'null', + basestring: 'string', + int: 'integer', + float: 'float', + bool: 'boolean', + list: 'list', + tuple: 'list', + dict: 'map', + datetime.datetime: 'timestamp' +} + +NAMES_TO_CANONICAL_TYPES = { + # Python: + 'none': None.__class__, + 'basestring': unicode, + 'str': unicode, + 'unicode': unicode, + 'int': int, + 'float': float, # also a TOSCA alias + 'bool': bool, + 'list': list, # also a TOSCA alias + 'tuple': list, + 'dict': dict, + 'datetime': datetime.datetime, + + # YAML 1.2: + 'tag:yaml.org,2002:null': None.__class__, + 'tag:yaml.org,2002:str': unicode, + 'tag:yaml.org,2002:integer': int, + 'tag:yaml.org,2002:float': float, + 'tag:yaml.org,2002:bool': bool, + + # TOSCA aliases: + 'null': None.__class__, + 'string': unicode, + 'integer': int, + 'boolean': bool, + + # TOSCA custom types: + 'map': dict, + 'timestamp': datetime.datetime +} + + +def full_type_name(value): + """ + The full class name of a type or instance. + """ + + if not isinstance(value, type): + value = value.__class__ + module = str(value.__module__) + name = str(value.__name__) + return name if module == '__builtin__' else '{0}.{1}'.format(module, name) + + +@implements_specification('3.2.1-1', 'tosca-simple-1.0') +def canonical_type_name(value): + """ + Returns the canonical TOSCA type name of a primitive value, or ``None`` if unknown. + + For a list of TOSCA type names, see the `TOSCA Simple Profile v1.0 + cos01 specification `__ + """ + + for the_type, name in BASE_TYPES_TO_CANONICAL_NAMES.iteritems(): + if isinstance(value, the_type): + return name + return None + + +@implements_specification('3.2.1-2', 'tosca-simple-1.0') +def canonical_type(type_name): + """ + Return the canonical type for any Python, YAML, or TOSCA type name or alias, or ``None`` if + unsupported. + + :param type_name: Type name (case insensitive) + """ + + return NAMES_TO_CANONICAL_TYPES.get(type_name.lower()) + + +def validate_value_type(value, type_name): + """ + Validate that a value is of a specific type. Supports Python, YAML, and TOSCA type names and + aliases. + + :param type_name: type name (case insensitive) + :raises ~exceptions.ValueError: on type mismatch + """ + + the_type = canonical_type(type_name) + if the_type is None: + raise RuntimeError('Unsupported type name: {0}'.format(type_name)) + + # The following Python types do not inherit from the canonical type, but are considered valid + if (the_type is unicode) and isinstance(value, str): + return + if (the_type is list) and isinstance(value, tuple): + return + + if not isinstance(value, the_type): + raise ValueError('Value {0} is not of type {1}'.format(value, type_name)) + + +def convert_value_to_type(str_value, python_type_name): + """ + Converts a value to a specific Python primitive type. + + :param python_type_name: Python primitive type name (case insensitive) + :raises ~exceptions.ValueError: for unsupported types or conversion failure + """ + + python_type_name = python_type_name.lower() + try: + if python_type_name in ('str', 'unicode'): + return str_value.decode('utf-8') + elif python_type_name == 'int': + return int(str_value) + elif python_type_name == 'bool': + return bool(str_value) + elif python_type_name == 'float': + return float(str_value) + else: + raise ValueError('Unsupported Python type name: {0}'.format(python_type_name)) + except ValueError: + raise ValueError('Failed to to convert {0} to {1}'.format(str_value, + python_type_name)) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/uris.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/uris.py new file mode 100644 index 0000000..49881f2 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/uris.py @@ -0,0 +1,48 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +URI utilities. +""" + +import os +import urlparse + + +_IS_WINDOWS = (os.name == 'nt') + + +def as_file(uri): + """ + If the URI is a file (either the ``file`` scheme or no scheme), then returns the normalized + path. Otherwise, returns ``None``. + """ + + if _IS_WINDOWS: + # We need this extra check in Windows before urlparse because paths might have a drive + # prefix, e.g. "C:" which will be considered a scheme for urlparse below + path = uri.replace('/', '\\') + if os.path.exists(path): + return os.path.normpath(path) + + url = urlparse.urlparse(uri) + scheme = url.scheme + if (not scheme) or (scheme == 'file'): + path = url.path + if _IS_WINDOWS: + path = path.replace('/', '\\') + return os.path.normpath(path) + + return None diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/uuid.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/uuid.py new file mode 100644 index 0000000..d6c9ced --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/uuid.py @@ -0,0 +1,70 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +UUID generation utilities. +""" + +from __future__ import absolute_import # so we can import standard 'uuid' + +from random import randrange +from uuid import uuid4 + +from shortuuid import ShortUUID + + +# Alphanumeric without visually ambiguous characters; default length is 22 +UUID_BASE57 = ShortUUID() + +# Lower-case alphanumeric; default length is 25 +UUID_LOWERCASE_ALPHANUMERIC = ShortUUID(alphabet='abcdefghijklmnopqrstuvwxyz0123456789') + + +def generate_uuid(length=None, variant='base57'): + """ + A random string with varying degrees of guarantee of universal uniqueness. + + :param variant: + * ``base57`` (the default) uses a mix of upper and lowercase alphanumerics ensuring no visually + ambiguous characters; default length 22 + * ``alphanumeric`` uses lowercase alphanumeric; default length 25 + * ``uuid`` uses lowercase hexadecimal in the classic UUID format, including dashes; length is + always 36 + * ``hex`` uses lowercase hexadecimal characters but has no guarantee of uniqueness; default + length of 5 + """ + + if variant == 'base57': + the_id = UUID_BASE57.uuid() + if length is not None: + the_id = the_id[:length] + + elif variant == 'alphanumeric': + the_id = UUID_LOWERCASE_ALPHANUMERIC.uuid() + if length is not None: + the_id = the_id[:length] + + elif variant == 'uuid': + the_id = str(uuid4()) + + elif variant == 'hex': + length = length or 5 + # See: http://stackoverflow.com/a/2782859 + the_id = ('%0' + str(length) + 'x') % randrange(16 ** length) + + else: + raise ValueError('unsupported UUID variant: {0}'.format(variant)) + + return the_id diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/validation.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/validation.py new file mode 100644 index 0000000..06989a7 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/validation.py @@ -0,0 +1,97 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Validation utilities. +""" + +from .formatting import string_list_as_string + + +class ValidatorMixin(object): + """ + A mix0in that should be added to classes that require validating user input. + """ + + _ARGUMENT_TYPE_MESSAGE = '{name} argument must be {type} based, got {arg!r}' + _ARGUMENT_CHOICE_MESSAGE = '{name} argument must be in {choices}, got {arg!r}' + + @classmethod + def validate_in_choice(cls, name, argument, choices): + """ + Validate ``argument`` is in ``choices`` + """ + if argument not in choices: + raise TypeError(cls._ARGUMENT_CHOICE_MESSAGE.format( + name=name, choices=choices, arg=argument)) + + @classmethod + def validate_type(cls, argument_name, argument, expected_type): + """ + Validate ``argument`` is a subclass of ``expected_type`` + """ + if not issubclass(argument, expected_type): + raise TypeError(cls._ARGUMENT_TYPE_MESSAGE.format( + name=argument_name, type=expected_type, arg=argument)) + + @classmethod + def validate_instance(cls, argument_name, argument, expected_type): + """ + Validate ``argument`` is a instance of ``expected_type`` + """ + if not isinstance(argument, expected_type): + raise TypeError(cls._ARGUMENT_TYPE_MESSAGE.format( + name=argument_name, type=expected_type, arg=argument)) + + @classmethod + def validate_callable(cls, argument_name, argument): + """ + Validate ``argument`` is callable + """ + if not callable(argument): + raise TypeError(cls._ARGUMENT_TYPE_MESSAGE.format( + name=argument_name, type='callable', arg=argument)) + + +def validate_function_arguments(func, func_kwargs): + """ + Validates all required arguments are supplied to ``func`` and that no additional arguments are + supplied. + """ + + _kwargs_flags = 8 + + has_kwargs = func.func_code.co_flags & _kwargs_flags != 0 + args_count = func.func_code.co_argcount + + # all args without the ones with default values + args = func.func_code.co_varnames[:args_count] + non_default_args = args[:len(args) - len(func.func_defaults)] if func.func_defaults else args + + # Check if any args without default values is missing in the func_kwargs + for arg in non_default_args: + if arg not in func_kwargs: + raise ValueError( + 'The argument "{arg}" is not provided and does not have a default value for ' + 'function "{func.__name__}"'.format(arg=arg, func=func)) + + # check if there are any extra kwargs + extra_kwargs = [arg for arg in func_kwargs.keys() if arg not in args] + + # assert that the function has kwargs + if extra_kwargs and not has_kwargs: + raise ValueError("The following extra kwargs were supplied: {extra_kwargs}".format( + extra_kwargs=string_list_as_string(extra_kwargs) + )) diff --git a/azure/aria/aria-extension-cloudify/src/aria/aria/utils/versions.py b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/versions.py new file mode 100644 index 0000000..521004c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/aria/utils/versions.py @@ -0,0 +1,163 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Verion string utilities. +""" + +import re + + +_INF = float('inf') + +_NULL = (), _INF + +_DIGITS_RE = re.compile(r'^\d+$') + +_PREFIXES = { + 'dev': 0.0001, + 'alpha': 0.001, + 'beta': 0.01, + 'rc': 0.1 +} + + +class VersionString(unicode): + """ + Version string that can be compared, sorted, made unique in a set, and used as a unique dict + key. + + The primary part of the string is one or more dot-separated natural numbers. Trailing zeroes + are treated as redundant, e.g. "1.0.0" == "1.0" == "1". + + An optional qualifier can be added after a "-". The qualifier can be a natural number or a + specially treated prefixed natural number, e.g. "1.1-beta1" > "1.1-alpha2". The case of the + prefix is ignored. + + Numeric qualifiers will always be greater than prefixed integer qualifiers, e.g. "1.1-1" > + "1.1-beta1". + + Versions without a qualifier will always be greater than their equivalents with a qualifier, + e.g. e.g. "1.1" > "1.1-1". + + Any value that does not conform to this format will be treated as a zero version, which would + be lesser than any non-zero version. + + For efficient list sorts use the ``key`` property, e.g.:: + + sorted(versions, key=lambda x: x.key) + """ + + NULL = None # initialized below + + def __init__(self, value=None): + if value is not None: + super(VersionString, self).__init__(value) + self.key = parse_version_string(self) + + def __eq__(self, version): + if not isinstance(version, VersionString): + version = VersionString(version) + return self.key == version.key + + def __lt__(self, version): + if not isinstance(version, VersionString): + version = VersionString(version) + return self.key < version.key + + def __hash__(self): + return self.key.__hash__() + + +def parse_version_string(version): # pylint: disable=too-many-branches + """ + Parses a version string. + + :param version: version string + :returns: primary tuple and qualifier float + :rtype: ((:obj:`int`), :obj:`float`) + """ + + if version is None: + return _NULL + version = unicode(version) + + # Split to primary and qualifier on '-' + split = version.split('-', 1) + if len(split) == 2: + primary, qualifier = split + else: + primary = split[0] + qualifier = None + + # Parse primary + split = primary.split('.') + primary = [] + for element in split: + if _DIGITS_RE.match(element) is None: + # Invalid version string + return _NULL + try: + element = int(element) + except ValueError: + # Invalid version string + return _NULL + primary.append(element) + + # Remove redundant zeros + for element in reversed(primary): + if element == 0: + primary.pop() + else: + break + primary = tuple(primary) + + # Parse qualifier + if qualifier is not None: + if _DIGITS_RE.match(qualifier) is not None: + # Integer qualifier + try: + qualifier = float(int(qualifier)) + except ValueError: + # Invalid version string + return _NULL + else: + # Prefixed integer qualifier + value = None + qualifier = qualifier.lower() + for prefix, factor in _PREFIXES.iteritems(): + if qualifier.startswith(prefix): + value = qualifier[len(prefix):] + if _DIGITS_RE.match(value) is None: + # Invalid version string + return _NULL + try: + value = float(int(value)) * factor + except ValueError: + # Invalid version string + return _NULL + break + if value is None: + # Invalid version string + return _NULL + qualifier = value + else: + # Version strings with no qualifiers are higher + qualifier = _INF + + return primary, qualifier + + +VersionString.NULL = VersionString() diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/.gitignore b/azure/aria/aria-extension-cloudify/src/aria/docs/.gitignore new file mode 100644 index 0000000..5ccff1a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/.gitignore @@ -0,0 +1 @@ +html/ diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/_static/.gitkeep b/azure/aria/aria-extension-cloudify/src/aria/docs/_static/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.cli.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.cli.rst new file mode 100644 index 0000000..c325cf0 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.cli.rst @@ -0,0 +1,100 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + +:mod:`aria.cli` +=============== + +.. automodule:: aria.cli + +:mod:`aria.cli.color` +--------------------- + +.. automodule:: aria.cli.color + +:mod:`aria.cli.csar` +-------------------- + +.. automodule:: aria.cli.csar + +:mod:`aria.cli.defaults` +------------------------ + +.. automodule:: aria.cli.defaults + +:mod:`aria.cli.exceptions` +-------------------------- + +.. automodule:: aria.cli.exceptions + +:mod:`aria.cli.execution_logging` +--------------------------------- + +.. automodule:: aria.cli.execution_logging + +:mod:`aria.cli.helptexts` +------------------------- + +.. automodule:: aria.cli.helptexts + +:mod:`aria.cli.inputs` +---------------------- + +.. automodule:: aria.cli.inputs + +:mod:`aria.cli.logger` +---------------------- + +.. automodule:: aria.cli.logger + +:mod:`aria.cli.main` +-------------------- + +.. automodule:: aria.cli.main + +:mod:`aria.cli.service_template_utils` +-------------------------------------- + +.. automodule:: aria.cli.service_template_utils + +:mod:`aria.cli.table` +--------------------- + +.. automodule:: aria.cli.table + +:mod:`aria.cli.utils` +--------------------- + +.. automodule:: aria.cli.utils + +:mod:`aria.cli.config` +---------------------- + +.. automodule:: aria.cli.config + +:mod:`aria.cli.config.config` +----------------------------- + +.. automodule:: aria.cli.config.config + +:mod:`aria.cli.core` +-------------------- + +.. automodule:: aria.cli.core + +:mod:`aria.cli.core.aria` +------------------------- + +.. automodule:: aria.cli.core.aria diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.modeling.models.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.modeling.models.rst new file mode 100644 index 0000000..6431780 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.modeling.models.rst @@ -0,0 +1,21 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + +:mod:`aria.modeling.models` +=========================== + +.. automodule:: aria.modeling.models + :no-show-inheritance: diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.modeling.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.modeling.rst new file mode 100644 index 0000000..b85e22c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.modeling.rst @@ -0,0 +1,56 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.modeling` +==================== + +.. automodule:: aria.modeling + +:mod:`aria.modeling.constraints` +-------------------------------- + +.. automodule:: aria.modeling.constraints + +:mod:`aria.modeling.exceptions` +------------------------------- + +.. automodule:: aria.modeling.exceptions + +:mod:`aria.modeling.functions` +------------------------------ + +.. automodule:: aria.modeling.functions + +:mod:`aria.modeling.mixins` +--------------------------- + +.. automodule:: aria.modeling.mixins + +:mod:`aria.modeling.relationship` +--------------------------------- + +.. automodule:: aria.modeling.relationship + +:mod:`aria.modeling.types` +-------------------------- + +.. automodule:: aria.modeling.types + +:mod:`aria.modeling.utils` +-------------------------- + +.. automodule:: aria.modeling.utils diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.context.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.context.rst new file mode 100644 index 0000000..395befc --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.context.rst @@ -0,0 +1,46 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.orchestrator.context` +================================ + +.. automodule:: aria.orchestrator.context + +:mod:`aria.orchestrator.context.common` +--------------------------------------- + +.. automodule:: aria.orchestrator.context.common + +:mod:`aria.orchestrator.context.exceptions` +------------------------------------------- + +.. automodule:: aria.orchestrator.context.exceptions + +:mod:`aria.orchestrator.context.operation` +------------------------------------------ + +.. automodule:: aria.orchestrator.context.operation + +:mod:`aria.orchestrator.context.toolbelt` +----------------------------------------- + +.. automodule:: aria.orchestrator.context.toolbelt + +:mod:`aria.orchestrator.context.workflow` +----------------------------------------- + +.. automodule:: aria.orchestrator.context.workflow diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.execution_plugin.ctx_proxy.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.execution_plugin.ctx_proxy.rst new file mode 100644 index 0000000..47ed598 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.execution_plugin.ctx_proxy.rst @@ -0,0 +1,31 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.orchestrator.execution_plugin.ctx_proxy` +=================================================== + +.. automodule:: aria.orchestrator.execution_plugin.ctx_proxy + +:mod:`aria.orchestrator.execution_plugin.ctx_proxy.client` +---------------------------------------------------------- + +.. automodule:: aria.orchestrator.execution_plugin.ctx_proxy.client + +:mod:`aria.orchestrator.execution_plugin.ctx_proxy.server` +---------------------------------------------------------- + +.. automodule:: aria.orchestrator.execution_plugin.ctx_proxy.server diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.execution_plugin.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.execution_plugin.rst new file mode 100644 index 0000000..177a316 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.execution_plugin.rst @@ -0,0 +1,56 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.orchestrator.execution_plugin` +========================================= + +.. automodule:: aria.orchestrator.execution_plugin + +:mod:`aria.orchestrator.execution_plugin.common` +------------------------------------------------ + +.. automodule:: aria.orchestrator.execution_plugin.common + +:mod:`aria.orchestrator.execution_plugin.constants` +--------------------------------------------------- + +.. automodule:: aria.orchestrator.execution_plugin.constants + +:mod:`aria.orchestrator.execution_plugin.environment_globals` +------------------------------------------------------------- + +.. automodule:: aria.orchestrator.execution_plugin.environment_globals + +:mod:`aria.orchestrator.execution_plugin.exceptions` +---------------------------------------------------- + +.. automodule:: aria.orchestrator.execution_plugin.exceptions + +:mod:`aria.orchestrator.execution_plugin.instantiation` +------------------------------------------------------- + +.. automodule:: aria.orchestrator.execution_plugin.instantiation + +:mod:`aria.orchestrator.execution_plugin.local` +----------------------------------------------- + +.. automodule:: aria.orchestrator.execution_plugin.local + +:mod:`aria.orchestrator.execution_plugin.operations` +---------------------------------------------------- + +.. automodule:: aria.orchestrator.execution_plugin.operations diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.execution_plugin.ssh.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.execution_plugin.ssh.rst new file mode 100644 index 0000000..8bbaa57 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.execution_plugin.ssh.rst @@ -0,0 +1,31 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.orchestrator.execution_plugin.ssh` +============================================= + +.. automodule:: aria.orchestrator.execution_plugin.ssh + +:mod:`aria.orchestrator.execution_plugin.ssh.operations` +-------------------------------------------------------- + +.. automodule:: aria.orchestrator.execution_plugin.ssh.operations + +:mod:`aria.orchestrator.execution_plugin.ssh.tunnel` +---------------------------------------------------- + +.. automodule:: aria.orchestrator.execution_plugin.ssh.tunnel diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.rst new file mode 100644 index 0000000..33454e6 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.rst @@ -0,0 +1,46 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.orchestrator` +======================== + +.. automodule:: aria.orchestrator + +:mod:`aria.orchestrator.decorators` +----------------------------------- + +.. automodule:: aria.orchestrator.decorators + +:mod:`aria.orchestrator.events` +------------------------------- + +.. automodule:: aria.orchestrator.events + +:mod:`aria.orchestrator.exceptions` +----------------------------------- + +.. automodule:: aria.orchestrator.exceptions + +:mod:`aria.orchestrator.plugin` +------------------------------- + +.. automodule:: aria.orchestrator.plugin + +:mod:`aria.orchestrator.workflow_runner` +---------------------------------------- + +.. automodule:: aria.orchestrator.workflow_runner diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.api.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.api.rst new file mode 100644 index 0000000..7ecac75 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.api.rst @@ -0,0 +1,31 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.orchestrator.workflows.api` +====================================== + +.. automodule:: aria.orchestrator.workflows.api + +:mod:`aria.orchestrator.workflows.api.task_graph` +------------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.api.task_graph + +:mod:`aria.orchestrator.workflows.api.task` +------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.api.task diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.builtin.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.builtin.rst new file mode 100644 index 0000000..de1a8f9 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.builtin.rst @@ -0,0 +1,57 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + + +:mod:`aria.orchestrator.workflows.builtin` +========================================== + +.. automodule:: aria.orchestrator.workflows.builtin + +:mod:`aria.orchestrator.workflows.builtin.execute_operation` +------------------------------------------------------------ + +.. automodule:: aria.orchestrator.workflows.builtin.execute_operation + +:mod:`aria.orchestrator.workflows.builtin.heal` +----------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.builtin.heal + +:mod:`aria.orchestrator.workflows.builtin.install` +-------------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.builtin.install + +:mod:`aria.orchestrator.workflows.builtin.start` +------------------------------------------------ + +.. automodule:: aria.orchestrator.workflows.builtin.start + +:mod:`aria.orchestrator.workflows.builtin.stop` +----------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.builtin.stop + +:mod:`aria.orchestrator.workflows.builtin.uninstall` +---------------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.builtin.uninstall + +:mod:`aria.orchestrator.workflows.builtin.workflows` +---------------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.builtin.workflows diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.executor.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.executor.rst new file mode 100644 index 0000000..cde0a77 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.executor.rst @@ -0,0 +1,46 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.orchestrator.workflows.executor` +=========================================== + +.. automodule:: aria.orchestrator.workflows.executor + +:mod:`aria.orchestrator.workflows.executor.base` +------------------------------------------------ + +.. automodule:: aria.orchestrator.workflows.executor.base + +:mod:`aria.orchestrator.workflows.executor.celery` +-------------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.executor.celery + +:mod:`aria.orchestrator.workflows.executor.dry` +----------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.executor.dry + +:mod:`aria.orchestrator.workflows.executor.process` +--------------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.executor.process + +:mod:`aria.orchestrator.workflows.executor.thread` +-------------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.executor.thread diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.rst new file mode 100644 index 0000000..c0bc1c1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.orchestrator.workflows.rst @@ -0,0 +1,51 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.orchestrator.workflows` +================================== + +.. automodule:: aria.orchestrator.workflows + +:mod:`aria.orchestrator.workflows.events_logging` +------------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.events_logging + +:mod:`aria.orchestrator.workflows.exceptions` +--------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.exceptions + +:mod:`aria.orchestrator.workflows.core` +--------------------------------------- + +.. automodule:: aria.orchestrator.workflows.core + +:mod:`aria.orchestrator.workflows.core.graph_compiler` +------------------------------------------------------ + +.. automodule:: aria.orchestrator.workflows.core.graph_compiler + +:mod:`aria.orchestrator.workflows.core.engine` +---------------------------------------------- + +.. automodule:: aria.orchestrator.workflows.core.engine + +:mod:`aria.orchestrator.workflows.core.events_handler` +------------------------------------------------------ + +.. automodule:: aria.orchestrator.workflows.core.events_handler diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.consumption.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.consumption.rst new file mode 100644 index 0000000..3d9fc6e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.consumption.rst @@ -0,0 +1,21 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.parser.consumption` +============================== + +.. automodule:: aria.parser.consumption diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.loading.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.loading.rst new file mode 100644 index 0000000..0ae7565 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.loading.rst @@ -0,0 +1,21 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.parser.loading` +========================== + +.. automodule:: aria.parser.loading diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.modeling.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.modeling.rst new file mode 100644 index 0000000..16c359c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.modeling.rst @@ -0,0 +1,21 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.parser.modeling` +=========================== + +.. automodule:: aria.parser.modeling diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.presentation.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.presentation.rst new file mode 100644 index 0000000..6c63b2e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.presentation.rst @@ -0,0 +1,21 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.parser.presentation` +=============================== + +.. automodule:: aria.parser.presentation diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.reading.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.reading.rst new file mode 100644 index 0000000..b1d4f6c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.reading.rst @@ -0,0 +1,21 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.parser.reading` +========================== + +.. automodule:: aria.parser.reading diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.rst new file mode 100644 index 0000000..700f03d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.rst @@ -0,0 +1,31 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.parser` +================== + +.. automodule:: aria.parser + +:mod:`aria.parser.exceptions` +----------------------------- + +.. automodule:: aria.parser.exceptions + +:mod:`aria.parser.specification` +-------------------------------- + +.. automodule:: aria.parser.specification diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.validation.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.validation.rst new file mode 100644 index 0000000..621898b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.parser.validation.rst @@ -0,0 +1,21 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.parser.validation` +============================= + +.. automodule:: aria.parser.validation diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.rst new file mode 100644 index 0000000..1a0dae5 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.rst @@ -0,0 +1,40 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + +:mod:`aria` +=========== + +.. automodule:: aria + +:mod:`aria.core` +---------------- + +.. automodule:: aria.core + +:mod:`aria.exceptions` +---------------------- + +.. automodule:: aria.exceptions + +:mod:`aria.extension` +--------------------- + +.. automodule:: aria.extension + +:mod:`aria.logger` +------------------ + +.. automodule:: aria.logger diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.storage.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.storage.rst new file mode 100644 index 0000000..7c51c2f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.storage.rst @@ -0,0 +1,51 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.storage` +=================== + +.. automodule:: aria.storage + +:mod:`aria.storage.api` +----------------------- + +.. automodule:: aria.storage.api + +:mod:`aria.storage.collection_instrumentation` +---------------------------------------------- + +.. automodule:: aria.storage.collection_instrumentation + +:mod:`aria.storage.core` +------------------------ + +.. automodule:: aria.storage.core + +:mod:`aria.storage.exceptions` +------------------------------ + +.. automodule:: aria.storage.exceptions + +:mod:`aria.storage.filesystem_rapi` +----------------------------------- + +.. automodule:: aria.storage.filesystem_rapi + +:mod:`aria.storage.sql_mapi` +---------------------------- + +.. automodule:: aria.storage.sql_mapi diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria.utils.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.utils.rst new file mode 100644 index 0000000..220c0cd --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria.utils.rst @@ -0,0 +1,121 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + + +:mod:`aria.utils` +================= + +.. automodule:: aria.utils + +:mod:`aria.utils.archive` +------------------------- + +.. automodule:: aria.utils.archive + +:mod:`aria.utils.argparse` +-------------------------- + +.. automodule:: aria.utils.argparse + +:mod:`aria.utils.caching` +------------------------- + +.. automodule:: aria.utils.caching + +:mod:`aria.utils.collections` +----------------------------- + +.. automodule:: aria.utils.collections + +:mod:`aria.utils.console` +------------------------- + +.. automodule:: aria.utils.console + +:mod:`aria.utils.exceptions` +---------------------------- + +.. automodule:: aria.utils.exceptions + +:mod:`aria.utils.file` +---------------------- + +.. automodule:: aria.utils.file + +:mod:`aria.utils.formatting` +---------------------------- + +.. automodule:: aria.utils.formatting + +:mod:`aria.utils.http` +---------------------- + +.. automodule:: aria.utils.http + +:mod:`aria.utils.imports` +------------------------- + +.. automodule:: aria.utils.imports + +:mod:`aria.utils.openclose` +--------------------------- + +.. automodule:: aria.utils.openclose + +:mod:`aria.utils.plugin` +------------------------ + +.. automodule:: aria.utils.plugin + +:mod:`aria.utils.process` +------------------------- + +.. automodule:: aria.utils.process + +:mod:`aria.utils.specification` +------------------------------- + +.. automodule:: aria.utils.specification + +:mod:`aria.utils.threading` +--------------------------- + +.. automodule:: aria.utils.threading + +:mod:`aria.utils.type` +---------------------- + +.. automodule:: aria.utils.type + +:mod:`aria.utils.uris` +---------------------- + +.. automodule:: aria.utils.uris + +:mod:`aria.utils.uuid` +---------------------- + +.. automodule:: aria.utils.uuid + +:mod:`aria.utils.validation` +---------------------------- + +.. automodule:: aria.utils.validation + +:mod:`aria.utils.versions` +-------------------------- + +.. automodule:: aria.utils.versions diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_nfv_v1_0.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_nfv_v1_0.rst new file mode 100644 index 0000000..6e7b6cd --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_nfv_v1_0.rst @@ -0,0 +1,20 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + +:mod:`aria_extension_tosca.simple_nfv_v1_0` +=========================================== + +.. automodule:: aria_extension_tosca.simple_nfv_v1_0 diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_v1_0.modeling.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_v1_0.modeling.rst new file mode 100644 index 0000000..8bc5499 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_v1_0.modeling.rst @@ -0,0 +1,75 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + +:mod:`aria_extension_tosca.simple_v1_0.modeling` +================================================ + +.. automodule:: aria_extension_tosca.simple_v1_0.modeling + +:mod:`aria_extension_tosca.simple_v1_0.modeling.artifacts` +---------------------------------------------------------- + +.. automodule:: aria_extension_tosca.simple_v1_0.modeling.artifacts + +:mod:`aria_extension_tosca.simple_v1_0.modeling.capabilities` +------------------------------------------------------------- + +.. automodule:: aria_extension_tosca.simple_v1_0.modeling.capabilities + +:mod:`aria_extension_tosca.simple_v1_0.modeling.constraints` +------------------------------------------------------------ + +.. automodule:: aria_extension_tosca.simple_v1_0.modeling.constraints + +:mod:`aria_extension_tosca.simple_v1_0.modeling.copy` +----------------------------------------------------- + +.. automodule:: aria_extension_tosca.simple_v1_0.modeling.copy + +:mod:`aria_extension_tosca.simple_v1_0.modeling.data_types` +----------------------------------------------------------- + +.. automodule:: aria_extension_tosca.simple_v1_0.modeling.data_types + +:mod:`aria_extension_tosca.simple_v1_0.modeling.functions` +---------------------------------------------------------- + +.. automodule:: aria_extension_tosca.simple_v1_0.modeling.functions + +:mod:`aria_extension_tosca.simple_v1_0.modeling.interfaces` +----------------------------------------------------------- + +.. automodule:: aria_extension_tosca.simple_v1_0.modeling.interfaces + +:mod:`aria_extension_tosca.simple_v1_0.modeling.parameters` +----------------------------------------------------------- + +.. automodule:: aria_extension_tosca.simple_v1_0.modeling.parameters + +:mod:`aria_extension_tosca.simple_v1_0.modeling.policies` +--------------------------------------------------------- + +.. automodule:: aria_extension_tosca.simple_v1_0.modeling.policies + +:mod:`aria_extension_tosca.simple_v1_0.modeling.requirements` +------------------------------------------------------------- + +.. automodule:: aria_extension_tosca.simple_v1_0.modeling.requirements + +:mod:`aria_extension_tosca.simple_v1_0.modeling.substitution_mappings` +---------------------------------------------------------------------- + +.. automodule:: aria_extension_tosca.simple_v1_0.modeling.substitution_mappings diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_v1_0.presentation.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_v1_0.presentation.rst new file mode 100644 index 0000000..964c029 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_v1_0.presentation.rst @@ -0,0 +1,40 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + +:mod:`aria_extension_tosca.simple_v1_0.presentation` +==================================================== + +.. automodule:: aria_extension_tosca.simple_v1_0.presentation + +:mod:`aria_extension_tosca.simple_v1_0.presentation.extensible` +--------------------------------------------------------------- + +.. automodule:: aria_extension_tosca.simple_v1_0.presentation.extensible + +:mod:`aria_extension_tosca.simple_v1_0.presentation.field_getters` +------------------------------------------------------------------ + +.. automodule:: aria_extension_tosca.simple_v1_0.presentation.field_getters + +:mod:`aria_extension_tosca.simple_v1_0.presentation.field_validators` +--------------------------------------------------------------------- + +.. automodule:: aria_extension_tosca.simple_v1_0.presentation.field_validators + +:mod:`aria_extension_tosca.simple_v1_0.presentation.types` +---------------------------------------------------------- + +.. automodule:: aria_extension_tosca.simple_v1_0.presentation.types diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_v1_0.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_v1_0.rst new file mode 100644 index 0000000..bdae6ab --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/aria_extension_tosca.simple_v1_0.rst @@ -0,0 +1,20 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + +:mod:`aria_extension_tosca.simple_v1_0` +======================================= + +.. automodule:: aria_extension_tosca.simple_v1_0 diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/cli.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/cli.rst new file mode 100644 index 0000000..ee51545 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/cli.rst @@ -0,0 +1,57 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + +CLI +=== + +.. click:: aria.cli.main:_aria + :prog: aria + +.. click:: aria.cli.commands.reset:reset + :prog: aria reset + :show-nested: + +.. click:: aria.cli.commands.plugins:plugins + :prog: aria plugins + :show-nested: + +.. click:: aria.cli.commands.service_templates:service_templates + :prog: aria service_templates + :show-nested: + +.. click:: aria.cli.commands.node_templates:node_templates + :prog: aria node_templates + :show-nested: + +.. click:: aria.cli.commands.services:services + :prog: aria services + :show-nested: + +.. click:: aria.cli.commands.nodes:nodes + :prog: aria nodes + :show-nested: + +.. click:: aria.cli.commands.workflows:workflows + :prog: aria workflows + :show-nested: + +.. click:: aria.cli.commands.executions:executions + :prog: aria executions + :show-nested: + +.. click:: aria.cli.commands.logs:logs + :prog: aria logs + :show-nested: diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/conf.py b/azure/aria/aria-extension-cloudify/src/aria/docs/conf.py new file mode 100644 index 0000000..fd1a066 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/conf.py @@ -0,0 +1,441 @@ +# -*- coding: utf-8 -*- + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# ARIA TOSCA documentation build configuration file. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys + +sys.path.append(os.path.abspath('../aria')) +sys.path.append(os.path.abspath('../extensions')) + +with open('../VERSION') as f: + version = f.readline() + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.intersphinx', + 'sphinx_click.ext' +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The encoding of source files. +# +# source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'ARIA TOSCA' +copyright = u'2016-2017, Apache Software Foundation' # @ReservedAssignment +author = u'Apache Software Foundation' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +#version = u'0.0' +# The full version, including alpha/beta/rc tags. +release = version # @UndefinedVariable + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# +# today = '' +# +# Else, today_fmt is used as the format for a strftime call. +# +# today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = [] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +# +# default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +# +# add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +# +# add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +# +# show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +# modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +# keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. +# " v documentation" by default. +# +# html_title = u'ARIA TOSCA v0.1.0' + +# A shorter title for the navigation bar. Default is the same as html_title. +# +# html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# +# html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# +# html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +# +# html_extra_path = [] + +# If not None, a 'Last updated on:' timestamp is inserted at every page +# bottom, using the given strftime format. +# The empty string is equivalent to '%b %d, %Y'. +# +# html_last_updated_fmt = None + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +# +# html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# +# html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# +# html_additional_pages = {} + +# If false, no module index is generated. +# +# html_domain_indices = True + +# If false, no index is generated. +# +# html_use_index = True + +# If true, the index is split into individual pages for each letter. +# +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +# +# html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +# +# html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +# +# html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# +# html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' +# +# html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# 'ja' uses this config value. +# 'zh' user can custom change `jieba` dictionary path. +# +# html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +# +# html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'ARIATOSCAdoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'ARIATOSCA.tex', u'ARIA TOSCA', + u'Apache Software Foundation', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# +# latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# +# latex_use_parts = False + +# If true, show page references after internal links. +# +# latex_show_pagerefs = False + +# If true, show URL addresses after external links. +# +# latex_show_urls = False + +# Documents to append as an appendix to all manuals. +# +# latex_appendices = [] + +# If false, no module index is generated. +# +# latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'aria', u'ARIA TOSCA', + [author], 1) +] + +# If true, show URL addresses after external links. +# +# man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'ARIATOSCA', u'ARIA TOSCA', + author, 'ARIA TOSCA', 'an open, light, CLI-driven library of orchestration tools that other ' + 'open projects can consume to easily build TOSCA-based orchestration solutions.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +# +# texinfo_appendices = [] + +# If false, no module index is generated. +# +# texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +# +# texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +# +# texinfo_no_detailmenu = False + + +# -- Options for InterSphinx + +intersphinx_mapping = { + 'python': ('https://docs.python.org/2.7', None) +} + +# -- Options for Python domain + +# Append __init__ docstring into class docstring +autoclass_content = 'both' + +# Default to everything important +autodoc_default_flags = [ + 'members', + 'undoc-members', + 'show-inheritance' +] + +SKIP_MEMBERS = ( + 'FIELDS', + 'ALLOW_UNKNOWN_FIELDS', + 'SHORT_FORM_FIELD', + 'INSTRUMENTATION_FIELDS' +) + +SKIP_MEMBER_SUFFIXES = ( + '_fk', +) + +NEVER_SKIP_MEMBERS = ( + '__evaluate__', +) + +SKIP_DOCUMENTS = () + +from sphinx import addnodes +from sphinx.domains.python import PythonDomain + +try: + import fabric +except: + # Note: "exclude_patterns" is not good enough for us, because we still have a TOC entry. + # Unfortunately, there is no way to conditionally exclude a TOC entry, and TOC entries without + # matching documents emit an error. So, we will have to manipulate the doctree directly! + SKIP_DOCUMENTS = ('aria.orchestrator.execution_plugin.ssh',) + +def on_autodoc_skip_member(app, what, name, obj, skip, options): + if name in NEVER_SKIP_MEMBERS: + return False + if name in SKIP_MEMBERS: + return True + for suffix in SKIP_MEMBER_SUFFIXES: + if name.endswith(suffix): + return True + return skip + +def on_source_read(app, docname, source): + # Empty out source + if docname in SKIP_DOCUMENTS: + source[0] = '' + +def on_doctree_read(app, doctree): + # Remove TOC entry (see: https://gist.github.com/kakawait/9215487) + for toctreenode in doctree.traverse(addnodes.toctree): + for e in toctreenode['entries']: + ref = str(e[1]) + if ref in SKIP_DOCUMENTS: + toctreenode['entries'].remove(e) + +class PatchedPythonDomain(PythonDomain): + # See: https://github.com/sphinx-doc/sphinx/issues/3866 + def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode): + if 'refspecific' in node: + del node['refspecific'] + return super(PatchedPythonDomain, self).resolve_xref( + env, fromdocname, builder, typ, target, node, contnode) + +def setup(app): + app.connect('autodoc-skip-member', on_autodoc_skip_member) + app.connect('source-read', on_source_read) + app.connect('doctree-read', on_doctree_read) + app.override_domain(PatchedPythonDomain) diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/index.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/index.rst new file mode 100644 index 0000000..f68769b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/index.rst @@ -0,0 +1,86 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + +User Manual for ARIA TOSCA +========================== + +`ARIA TOSCA `__ is an open, light, CLI-driven library of +orchestration tools that other open projects can consume to easily build +`TOSCA `__-based orchestration solutions. ARIA is now +an incubation project at the Apache Software Foundation. + +Interfaces +---------- + +.. toctree:: + :maxdepth: 1 + :includehidden: + + cli + rest + +SDK +--- + +Core +#### + +.. toctree:: + :maxdepth: 1 + :includehidden: + + aria + aria.cli + aria.modeling + aria.modeling.models + aria.orchestrator + aria.orchestrator.context + aria.orchestrator.execution_plugin + aria.orchestrator.execution_plugin.ctx_proxy + aria.orchestrator.execution_plugin.ssh + aria.orchestrator.workflows + aria.orchestrator.workflows.api + aria.orchestrator.workflows.builtin + aria.orchestrator.workflows.executor + aria.parser + aria.parser.consumption + aria.parser.loading + aria.parser.modeling + aria.parser.presentation + aria.parser.reading + aria.parser.validation + aria.storage + aria.utils + +Extensions +########## + +.. toctree:: + :maxdepth: 1 + :includehidden: + + aria_extension_tosca.simple_v1_0 + aria_extension_tosca.simple_v1_0.modeling + aria_extension_tosca.simple_v1_0.presentation + aria_extension_tosca.simple_nfv_v1_0 + + +Indices and Tables +------------------ + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/requirements.txt b/azure/aria/aria-extension-cloudify/src/aria/docs/requirements.txt new file mode 100644 index 0000000..a49bb26 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/requirements.txt @@ -0,0 +1,15 @@ +# 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. + +Sphinx>=1.6.2, <2.0.0 +sphinx_rtd_theme>=0.2.4, <2.0.0 +sphinx-click>=1.0.2, <1.1.0 diff --git a/azure/aria/aria-extension-cloudify/src/aria/docs/rest.rst b/azure/aria/aria-extension-cloudify/src/aria/docs/rest.rst new file mode 100644 index 0000000..185837e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/docs/rest.rst @@ -0,0 +1,20 @@ +.. + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. + +REST +==== + +TODO diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/clearwater-live-test-existing.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/clearwater-live-test-existing.yaml new file mode 100644 index 0000000..0e6a11c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/clearwater-live-test-existing.yaml @@ -0,0 +1,54 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + Project Clearwater is an open-source IMS core, developed by Metaswitch Networks and released under + the GNU GPLv3. + +metadata: + template_name: clearwater-live-test-existing + template_author: ARIA + template_version: '1.0' + aria_version: '0.2.0' + +imports: + - types/clearwater.yaml + - aria-1.0 + +topology_template: + + inputs: + hosts.ssh.user: + type: string + hosts.ssh.password: + type: string + existing_host.public_address: + type: string + + node_templates: + live_test: + type: clearwater.LiveTest + + existing_host: + type: clearwater.HostBase + attributes: + public_address: { get_input: existing_host.public_address } + capabilities: + host: + properties: + ssh.user: { get_input: hosts.ssh.user } + ssh.password: { get_input: hosts.ssh.password } diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/clearwater-single-existing.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/clearwater-single-existing.yaml new file mode 100644 index 0000000..72b882a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/clearwater-single-existing.yaml @@ -0,0 +1,147 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + Project Clearwater is an open-source IMS core, developed by Metaswitch Networks and released under + the GNU GPLv3. + +metadata: + template_name: clearwater-single-existing + template_author: ARIA + template_version: '1.0' + aria_version: '0.2.0' + +imports: + - types/clearwater.yaml + - aria-1.0 + +topology_template: + + inputs: + hosts.ssh.user: + description: >- + Existing SSH user. + type: string + hosts.ssh.password: + description: >- + Existing SSH password. + type: string + existing_host.public_address: + description: >- + Existing IP address that can be accessed by ARIA. + type: string + existing_host.private_address: + description: >- + Existing IP address that can be accessed within the service. + type: string + default: { get_input: existing_host.public_address } + existing_host.hostname: + description: >- + The hostname will be changed to this. + type: string + default: aria-clearwater-single + + node_templates: + bono: + type: clearwater.Bono + requirements: + - sip_downstream: clearwater.Sprout + - sip_secure_downstream: clearwater.Sprout + - ralf: clearwater.Ralf + + sprout: + type: clearwater.Sprout + requirements: + - ralf: clearwater.Ralf +# cyclical: see ARIA-327 +# - sip_upstream: clearwater.Bono + + dime: + type: clearwater.Dime + + homestead: + type: clearwater.Homestead + + ralf: + type: clearwater.Ralf + description: >- + Optional, only required if you are using a CCF (Charging Collection Function). + + homer: + type: clearwater.Homer + + vellum: + type: clearwater.Vellum +# requirements: +# cyclical: see ARIA-327 +# - ralf: clearwater.Ralf + + i-cscf: + type: clearwater.I-CSCF + + s-cscf: + type: clearwater.S-CSCF + + ellis: + type: clearwater.Ellis + description: >- + Optional, only required if you want a web frontend. + properties: + provision_numbers_count: 1000 + requirements: + - ralf: clearwater.Ralf + + existing_host: + type: clearwater.Host + attributes: + public_address: { get_input: existing_host.public_address } + private_address: { get_input: existing_host.private_address } + capabilities: + host: + properties: + hostname: { get_input: existing_host.hostname } + ssh.user: { get_input: hosts.ssh.user } + ssh.password: { get_input: hosts.ssh.password } + max_log_directory_size: 50 MiB + reduce_cassandra_mem_usage: true + + smtp: + type: smtp.SMTP + properties: + address: 127.0.0.1 + capabilities: + smtp: + properties: + username: username + password: password + + policies: + configuration: + type: clearwater.Configuration + properties: + zone: example.com + secret: secret + + substitution_mappings: + node_type: ims.nodes.IMS + capabilities: + p-cscf: [ bono, p-cscf ] + i-cscf: [ i-cscf, i-cscf ] + s-cscf: [ s-cscf, s-cscf ] + hss: [ homestead, hss ] + ctf: [ ralf, ctf ] + xdms: [ homer, xdms ] diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/bono/create.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/bono/create.sh new file mode 100644 index 0000000..b2a3a68 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/bono/create.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +yes | aptdcon --hide-terminal --install bono +yes | aptdcon --hide-terminal --install restund diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/bono/delete.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/bono/delete.sh new file mode 100644 index 0000000..73485c3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/bono/delete.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +TODO diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/dime/create.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/dime/create.sh new file mode 100644 index 0000000..9b25876 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/dime/create.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +# Installs Homestead and Ralf +yes | aptdcon --hide-terminal --install dime +yes | aptdcon --hide-terminal --install clearwater-prov-tools diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/dime/delete.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/dime/delete.sh new file mode 100644 index 0000000..73485c3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/dime/delete.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +TODO diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ellis/configure.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ellis/configure.sh new file mode 100644 index 0000000..b52cc08 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ellis/configure.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +PROVISION_NUMBERS_START=$(ctx node properties provision_numbers_start) +PROVISION_NUMBERS_COUNT=$(ctx node properties provision_numbers_count) + +if [ "$PROVISION_NUMBERS_COUNT" != 0 ]; then + cd /usr/share/clearwater/ellis + . env/bin/activate + python src/metaswitch/ellis/tools/create_numbers.py \ + --start "$PROVISION_NUMBERS_START" \ + --count "$PROVISION_NUMBERS_COUNT" + deactivate +fi diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ellis/create.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ellis/create.sh new file mode 100644 index 0000000..bdd9341 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ellis/create.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +yes | aptdcon --hide-terminal --install ellis diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ellis/delete.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ellis/delete.sh new file mode 100644 index 0000000..73485c3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ellis/delete.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +TODO diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homer/create.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homer/create.sh new file mode 100644 index 0000000..5f40960 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homer/create.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +yes | aptdcon --hide-terminal --install homer + +# ARIA fix to avoid warnings by Twisted for missing service_identity library +# (Crest is used by both Homer and Homestead-prov) +cd /usr/share/clearwater/crest +. env/bin/activate +pip install service_identity +deactivate +service homer restart diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homer/delete.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homer/delete.sh new file mode 100644 index 0000000..73485c3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homer/delete.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +TODO diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homestead/create.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homestead/create.sh new file mode 100644 index 0000000..d280033 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homestead/create.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +# ARIA fix to avoid warnings by Twisted for missing service_identity library +# (Crest is used by both Homer and Homestead-prov) +cd /usr/share/clearwater/crest +. env/bin/activate +pip install service_identity +deactivate +service homer restart diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homestead/delete.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homestead/delete.sh new file mode 100644 index 0000000..73485c3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/homestead/delete.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +TODO diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/host-base/configure.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/host-base/configure.sh new file mode 100644 index 0000000..c5b87d9 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/host-base/configure.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +if ! type aptdcon > /dev/null; then + # This will allow us to do concurrent installs + apt update + apt install aptdaemon --yes +fi diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/host/configure.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/host/configure.sh new file mode 100644 index 0000000..61cb835 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/host/configure.sh @@ -0,0 +1,183 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +HOSTNAME=$(ctx node capabilities host properties hostname) + +# Change hostname +OLD_HOSTNAME=$(hostname) +if [ "$OLD_HOSTNAME" != "$HOSTNAME" ]; then + hostname "$HOSTNAME" + echo "$HOSTNAME" > /etc/hostname + sed --in-place --expression "s/127.0.1.1\s\+$OLD_HOSTNAME/127.0.1.1 $HOSTNAME/" /etc/hosts +fi + +ZONE=$(ctx service get_policy_by_type [ clearwater.Configuration ] properties zone) +GEOGRAPHICALLY_REDUNDANT=$(ctx service get_policy_by_type [ clearwater.Configuration ] properties geographically_redundant) +SITE_NAME=$(ctx service get_policy_by_type [ clearwater.Configuration ] properties site_name) +SECRET=$(ctx service get_policy_by_type [ clearwater.Configuration ] properties secret) + +SMTP_HOSTNAME=$(ctx service get_node_by_type [ clearwater.Ellis ] get_outbound_relationship_by_name [ smtp ] target_node properties address) +SMTP_USERNAME=$(ctx service get_node_by_type [ clearwater.Ellis ] get_outbound_relationship_by_name [ smtp ] target_node capabilities smtp properties username) +SMTP_PASSWORD=$(ctx service get_node_by_type [ clearwater.Ellis ] get_outbound_relationship_by_name [ smtp ] target_node capabilities smtp properties password) + +MAX_LOG_DIRECTORY_SIZE=$(ctx node capabilities host properties max_log_directory_size value) +REDUCE_CASSANDRA_MEM_USAGE=$(ctx node capabilities host properties reduce_cassandra_mem_usage) + +PRIVATE_IP=$(ctx node attributes private_address) +PUBLIC_IP=$(ctx node attributes public_address) +PUBLIC_HOSTNAME=$(hostname) +# TODO: comma-separated list of all private IP addresses in group +ETCD_CLUSTER=$PRIVATE_IP + +REPO_FILE=/etc/apt/sources.list.d/clearwater.list +REPO_LINE='deb http://repo.cw-ngv.com/stable binary/' +KEY_URL=http://repo.cw-ngv.com/repo_key + + +# +# Repository +# + +if [ ! -f "$REPO_FILE" ]; then + echo "$REPO_LINE" > "$REPO_FILE" + curl --location "$KEY_URL" | apt-key add - +fi + +apt update + +if ! type aptdcon > /dev/null; then + # This will allow us to do concurrent installs + apt install aptdaemon --yes +fi + +yes | aptdcon --hide-terminal --install clearwater-management + + +# +# DNS +# + +S_CSCF_HOST="$PRIVATE_IP scscf.$PUBLIC_HOSTNAME # ARIA" +grep --quiet --fixed-strings "$S_CSCF_HOST" /etc/hosts || echo "$S_CSCF_HOST" >> /etc/hosts + + +# +# Local configuration +# + +mkdir --parents /etc/clearwater +CONFIG_FILE=/etc/clearwater/local_config +echo "# Created by ARIA on $(date -u)" > "$CONFIG_FILE" + +echo >> "$CONFIG_FILE" +echo "# Local IP configuration" >> "$CONFIG_FILE" +echo "local_ip=$PRIVATE_IP" >> "$CONFIG_FILE" +echo "public_ip=$PUBLIC_IP" >> "$CONFIG_FILE" +echo "public_hostname=$PUBLIC_HOSTNAME" >> "$CONFIG_FILE" +echo "etcd_cluster=$ETCD_CLUSTER" >> "$CONFIG_FILE" + +if [ "$MAX_LOG_DIRECTORY_SIZE" != 0 ]; then + echo >> "$CONFIG_FILE" + echo "max_log_directory_size=$MAX_LOG_DIRECTORY_SIZE" >> "$CONFIG_FILE" +fi + +if [ "$GEOGRAPHICALLY_REDUNDANT" = True ]; then + echo >> "$CONFIG_FILE" + echo "# Geographically redundant" >> "$CONFIG_FILE" + echo "local_site_name=$SITE_NAME" >> "$CONFIG_FILE" + + # On the first Vellum node in the second site, you should set remote_cassandra_seeds to the + # IP address of a Vellum node in the first site. + #echo "remote_cassandra_seeds=" >> "$CONFIG_FILE" +fi + + +# +# Shared configuration +# + +if [ "$GEOGRAPHICALLY_REDUNDANT" = True ]; then + SPROUT_HOSTNAME=sprout.$SITE_NAME.$ZONE + SPROUT_REGISTRATION_STORE=vellum.$SITE_NAME.$ZONE + HS_HOSTNAME=hs.$SITE_NAME.$ZONE:8888 + HS_PROVISIONING_HOSTNAME=hs.$SITE_NAME.$ZONE:8889 + RALF_HOSTNAME=ralf.$SITE_NAME.$ZONE:10888 + RALF_SESSION_STORE=vellum.$ZONE + XDMS_HOSTNAME=homer.$SITE_NAME.$ZONE:7888 + CHRONOS_HOSTNAME=vellum.$SITE_NAME.$ZONE + CASSANDRA_HOSTNAME=vellum.$SITE_NAME.$ZONE +else + VELLUM_IP=$PRIVATE_IP + HOMESTEAD_IP=$PRIVATE_IP + HOMER_IP=$PRIVATE_IP + + SPROUT_HOSTNAME=$PUBLIC_HOSTNAME + SPROUT_REGISTRATION_STORE=$VELLUM_IP + HS_HOSTNAME=$HOMESTEAD_IP:8888 + HS_PROVISIONING_HOSTNAME=$HOMESTEAD_IP:8889 + RALF_HOSTNAME= + RALF_SESSION_STORE= + XDMS_HOSTNAME=$HOMER_IP:7888 + CHRONOS_HOSTNAME= + CASSANDRA_HOSTNAME= +fi + +mkdir --parents /etc/clearwater +CONFIG_FILE=/etc/clearwater/shared_config +echo "# Created by ARIA on $(date -u)" > "$CONFIG_FILE" + +echo >> "$CONFIG_FILE" +echo "# Deployment definitions" >> "$CONFIG_FILE" +echo "home_domain=$ZONE" >> "$CONFIG_FILE" +echo "sprout_hostname=$SPROUT_HOSTNAME" >> "$CONFIG_FILE" +echo "sprout_registration_store=$SPROUT_REGISTRATION_STORE" >> "$CONFIG_FILE" +echo "hs_hostname=$HS_HOSTNAME" >> "$CONFIG_FILE" +echo "hs_provisioning_hostname=$HS_PROVISIONING_HOSTNAME" >> "$CONFIG_FILE" +echo "ralf_hostname=$RALF_HOSTNAME" >> "$CONFIG_FILE" +echo "ralf_session_store=$RALF_SESSION_STORE" >> "$CONFIG_FILE" +echo "xdms_hostname=$XDMS_HOSTNAME" >> "$CONFIG_FILE" +echo "chronos_hostname=$CHRONOS_HOSTNAME" >> "$CONFIG_FILE" +echo "cassandra_hostname=$CASSANDRA_HOSTNAME" >> "$CONFIG_FILE" + +echo >> "$CONFIG_FILE" +echo "# Email server configuration" >> "$CONFIG_FILE" +echo "smtp_smarthost=$SMTP_HOSTNAME" >> "$CONFIG_FILE" +echo "smtp_username=$SMTP_USERNAME" >> "$CONFIG_FILE" +echo "smtp_password=$SMTP_PASSWORD" >> "$CONFIG_FILE" +echo "email_recovery_sender=clearwater@$ZONE" >> "$CONFIG_FILE" + +echo >> "$CONFIG_FILE" +echo "# I-CSCF/S-CSCF configuration (used by Bono to proxy to Sprout)" >> "$CONFIG_FILE" +echo "upstream_hostname=scscf.$HOSTNAME" >> "$CONFIG_FILE" + +echo >> "$CONFIG_FILE" +echo "# Keys" >> "$CONFIG_FILE" +echo "signup_key=$SECRET" >> "$CONFIG_FILE" +echo "turn_workaround=$SECRET" >> "$CONFIG_FILE" +echo "ellis_api_key=$SECRET" >> "$CONFIG_FILE" +echo "ellis_cookie_key=$SECRET" >> "$CONFIG_FILE" + +if [ "$REDUCE_CASSANDRA_MEM_USAGE" = True ]; then + echo >> "$CONFIG_FILE" + echo "# $REDUCE_CASSANDRA_MEM_USAGE" >> "$CONFIG_FILE" + echo "reduce_cassandra_mem_usage=Y" >> "$CONFIG_FILE" +fi + +# Copy to other hosts in etcd group +#yes | aptdcon --hide-terminal --install clearwater-config-manager +#cw-upload_shared_config diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/live-test/create.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/live-test/create.sh new file mode 100644 index 0000000..f28bff3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/live-test/create.sh @@ -0,0 +1,69 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +LIB=/opt/clearwater-live-test +COMMAND=/usr/bin/clearwater-live-test +RUBY_VERSION=1.9.3 +RVM=/usr/local/rvm +QUAFF_OLD_URL=git@github.com:metaswitch/quaff.git +QUAFF_NEW_URL=https://github.com/Metaswitch/quaff.git + +# Build requirements +yes | aptdcon --hide-terminal --install build-essential +yes | aptdcon --hide-terminal --install bundler +yes | aptdcon --hide-terminal --install git + +# Required by nokogiri Ruby gem +yes | aptdcon --hide-terminal --install zlib1g-dev + +# Install Ruby enVironment Manager +if [ ! -d "$RVM" ]; then + # Install + curl --location https://get.rvm.io | bash -s stable +fi + +# Install Ruby using RVM +. "$RVM/scripts/rvm" +rvm autolibs enable +rvm install "$RUBY_VERSION" +rvm use "$RUBY_VERSION@global" + +# Install Clearwater Live Test +if [ ! -d "$LIB" ]; then + mkdir --parents /opt + cd /opt + git clone --depth 1 https://github.com/Metaswitch/clearwater-live-test.git + cd clearwater-live-test + chmod a+rw -R . + + # Note: we must fix the URLs for Quaff + sed --in-place --expression "s,$QUAFF_OLD_URL,$QUAFF_NEW_URL,g" Gemfile Gemfile.lock + + # Install required Ruby gems + bundle install +fi + +# Create command +echo "#!/bin/bash" > "$COMMAND" +echo ". \"$RVM/scripts/rvm\"" >> "$COMMAND" +echo "rvm use \"$RUBY_VERSION@global\"" >> "$COMMAND" +echo "cd \"$LIB\"" >> "$COMMAND" +echo "rake \"\$@\"" >> "$COMMAND" +chmod a+x "$COMMAND" + +# clearwater-live-test test[example.com] SIGNUP_CODE=secret PROXY=192.168.1.171 ELLIS=192.168.1.171 diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/live-test/delete.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/live-test/delete.sh new file mode 100644 index 0000000..079627c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/live-test/delete.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +LIB=/opt/clearwater-live-test +COMMAND=/usr/bin/clearwater-live-test + +rm --recursive --force "$LIB" +rm --force "$COMMAND" diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/memento/create.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/memento/create.sh new file mode 100644 index 0000000..91ffd9f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/memento/create.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +yes | aptdcon --hide-terminal --install memento-as +yes | aptdcon --hide-terminal --install memento-nginx diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/memento/delete.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/memento/delete.sh new file mode 100644 index 0000000..73485c3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/memento/delete.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +TODO diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ralf/create.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ralf/create.sh new file mode 100644 index 0000000..5cae7ef --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ralf/create.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ralf/delete.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ralf/delete.sh new file mode 100644 index 0000000..73485c3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/ralf/delete.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +TODO diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/sprout/create.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/sprout/create.sh new file mode 100644 index 0000000..a9946b9 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/sprout/create.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +yes | aptdcon --hide-terminal --install sprout diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/sprout/delete.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/sprout/delete.sh new file mode 100644 index 0000000..73485c3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/sprout/delete.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +TODO diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/vellum/create.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/vellum/create.sh new file mode 100644 index 0000000..1d7b2db --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/vellum/create.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +yes | aptdcon --hide-terminal --install vellum + +# Memento +# TODO: see if there is a Memento node +#yes | aptdcon --hide-terminal --install memento-cassandra diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/vellum/delete.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/vellum/delete.sh new file mode 100644 index 0000000..73485c3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/scripts/vellum/delete.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +TODO diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/cassandra.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/cassandra.yaml new file mode 100644 index 0000000..cbb3a5d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/cassandra.yaml @@ -0,0 +1,30 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +capability_types: + + cassandra.Endpoint: + derived_from: tosca.capabilities.Endpoint.Database + properties: + port: # override + type: tosca.datatypes.network.PortDef + default: 7000 + + cassandra.Endpoint.Thrift: + derived_from: tosca.capabilities.Endpoint.Database + properties: + port: # override + type: tosca.datatypes.network.PortDef + default: 9160 diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/clearwater.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/clearwater.yaml new file mode 100644 index 0000000..1021262 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/clearwater.yaml @@ -0,0 +1,728 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +imports: + - ims.yaml + - smtp.yaml + - cassandra.yaml + +dsl_definitions: + + clearwater_operation_dependencies: &CLEARWATER_OPERATION_DEPENDENCIES + - "ssh.user > { get_property: [ HOST, host, ssh.user ] }" + - "ssh.password > { get_property: [ HOST, host, ssh.password ] }" + - "ssh.address > { get_attribute: [ HOST, public_address ] }" + - "ssh.use_sudo > true" + +policy_types: + + clearwater.Configuration: + derived_from: tosca.policies.Root + properties: + zone: + description: >- + The domain name for SIP addresses, for example if its "example.com" then a SIP address + could be "6505550243@example.com". + type: string + geographically_redundant: + description: >- + Enable a geographically redundant deployment. + + See: http://clearwater.readthedocs.io/en/stable/Geographic_redundancy.html + type: boolean + default: false + site_name: + description: >- + Used by geographically redundant deployments. + type: string + required: false + secret: + description: >- + Used for registration via Ellis. + type: string + +capability_types: + + clearwater.Container: + description: >- + Clearwater container capability. + derived_from: tosca.capabilities.Container + properties: + hostname: + type: string + ssh.user: + type: string + ssh.password: + type: string + max_log_directory_size: + type: scalar-unit.size + default: 0 B # 0 means no max size + reduce_cassandra_mem_usage: + type: boolean + default: false + + # http://clearwater.readthedocs.io/en/stable/Clearwater_IP_Port_Usage.html + + # SIP endpoints + + clearwater.Endpoint.SIP.Upstream: + derived_from: tosca.capabilities.Endpoint + properties: + protocol: # override + type: string + default: sip + port: # override + type: tosca.datatypes.network.PortDef + default: 5052 + + clearwater.Endpoint.SIP.Upstream.Secure: + derived_from: tosca.capabilities.Endpoint + properties: + protocol: # override + type: string + default: sip + port: # override + type: tosca.datatypes.network.PortDef + default: 5054 + secure: # override + type: boolean + default: true + + clearwater.Endpoint.SIP.Proxy: + derived_from: tosca.capabilities.Endpoint + properties: + protocol: # override + type: string + default: sip + port: # override + type: tosca.datatypes.network.PortDef + default: 5058 + + clearwater.Endpoint.SIP.Public: + derived_from: tosca.capabilities.Endpoint.Public + properties: + protocol: # override + type: string + default: sip + port: # override + type: tosca.datatypes.network.PortDef + default: 5060 + + clearwater.Endpoint.SIP.Public.Secure: + derived_from: tosca.capabilities.Endpoint.Public + properties: + protocol: # override + type: string + default: sip + port: # override + type: tosca.datatypes.network.PortDef + default: 5062 + secure: # override + type: boolean + default: true + + # STUN endpoints + + clearwater.Endpoint.STUN: + derived_from: tosca.capabilities.Endpoint + properties: + protocol: # override + type: string + default: stun + port: # override + type: tosca.datatypes.network.PortDef + default: 3478 + + # Diameter endpoints + + clearwater.Endpoint.Diameter.HSS: + description: >- + In shared_config: hs_listen_port + derived_from: tosca.capabilities.Endpoint + properties: + protocol: # override + type: string + default: diameter + port: # override + type: tosca.datatypes.network.PortDef + default: 3868 + + clearwater.Endpoint.Diameter.CTF: + description: >- + In shared_config: ralf_listen_port + derived_from: tosca.capabilities.Endpoint + properties: + protocol: # override + type: string + default: diameter + port: # override + type: tosca.datatypes.network.PortDef + default: 3869 + + # Management endpoints + + clearwater.Endpoint.Management.Homer: + derived_from: ims.interfaces.HTTP + properties: + port: # override + type: tosca.datatypes.network.PortDef + default: 7888 + + clearwater.Endpoint.Management.Homestead: + derived_from: ims.interfaces.HTTP + properties: + port: # override + type: tosca.datatypes.network.PortDef + default: 8888 + + clearwater.Endpoint.Management.Homestead.Provisioning: + description: >- + In shared_config: homestead_provisioning_port + derived_from: ims.interfaces.HTTP + properties: + port: # override + type: tosca.datatypes.network.PortDef + default: 8889 + + clearwater.Endpoint.Management.Sprout: + derived_from: ims.interfaces.HTTP + properties: + port: # override + type: tosca.datatypes.network.PortDef + default: 9886 + + clearwater.Endpoint.Management.Ralf: + derived_from: ims.interfaces.HTTP + properties: + port: # override + type: tosca.datatypes.network.PortDef + default: 9888 # note: some documentation shows 10888 + + # Web endpoints + + clearwater.Endpoint.Public.Web: + derived_from: tosca.capabilities.Endpoint.Public + properties: + protocol: # override + type: string + default: http + port: # override + type: tosca.datatypes.network.PortDef + default: 80 + url_path: # override + type: string + default: / + + clearwater.Endpoint.Public.Web.Secure: + derived_from: tosca.capabilities.Endpoint.Public + properties: + protocol: # override + type: string + default: https + port: # override + type: tosca.datatypes.network.PortDef + default: 443 + secure: # override + type: boolean + default: true + url_path: # override + type: string + default: / + + # Other endpoints + + clearwater.Endpoint.Chronos: + derived_from: tosca.capabilities.Endpoint + properties: + port: # override + type: tosca.datatypes.network.PortDef + default: 7253 + + clearwater.Endpoint.Memcached: + derived_from: tosca.capabilities.Endpoint + properties: + port: # override + type: tosca.datatypes.network.PortDef + default: 11211 + + clearwater.Endpoint.Astaire: + derived_from: tosca.capabilities.Endpoint + properties: + port: # override + type: tosca.datatypes.network.PortDef + default: 11311 + +data_types: + + clearwater.Number: + derived_from: string + constraints: + - pattern: '^\d{10}$' + +node_types: + + # http://clearwater.readthedocs.io/en/stable/Clearwater_Architecture.html + + clearwater.SoftwareComponent: + description: >- + Clearwater software components must be installed in a Clearwater-capable compute node. + derived_from: tosca.nodes.SoftwareComponent + requirements: + - host: # override + capability: clearwater.Container + relationship: tosca.relationships.HostedOn + + clearwater.Bono: + description: >- + Clearwater edge proxy. + + The Bono nodes form a horizontally scalable SIP edge proxy providing both a SIP IMS Gm + compliant interface and a WebRTC interface to clients. Client connections are load balanced + across the nodes. The Bono node provides the anchor point for the client's connection to the + Clearwater system, including support for various NAT traversal mechanisms. A client is + therefore anchored to a particular Bono node for the duration of its registration, but can + move to another Bono node if the connection or client fails. + + Clients can connect to Bono using SIP/UDP or SIP/TCP. Bono supports any WebRTC client that + performs call setup signaling using SIP over WebSocket. + + Alternatively, Clearwater can be deployed with a third party P-CSCF or Session Border + Controller implementing P-CSCF. In this case Bono nodes are not required. + derived_from: clearwater.SoftwareComponent + capabilities: + p-cscf: ims.functions.P-CSCF + gm: ims.interfaces.Gm + sip_endpoint: clearwater.Endpoint.SIP.Public + sip_secure_endpoint: clearwater.Endpoint.SIP.Public.Secure + sip_proxy: clearwater.Endpoint.SIP.Proxy # open to Sprout + stun_endoint: clearwater.Endpoint.STUN + requirements: + - sip_downstream: + capability: clearwater.Endpoint.SIP.Upstream + occurrences: [ 0, UNBOUNDED ] + - sip_secure_downstream: + capability: clearwater.Endpoint.SIP.Upstream.Secure + occurrences: [ 0, UNBOUNDED ] + - ralf: # for billable events + capability: clearwater.Endpoint.Management.Ralf + occurrences: [ 0, 1 ] + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + create: + implementation: + primary: scripts/bono/create.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + delete: + implementation: + primary: scripts/bono/delete.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + + clearwater.Sprout: + description: >- + Clearwater SIP router. + + The Sprout nodes act as a horizontally scalable, combined SIP registrar and authoritative + routing proxy, and handle client authentication and the ISC interface to application servers. + The Sprout nodes also contain the in-built MMTEL application server. SIP transactions are load + balanced across the Sprout cluster, so there is no long-lived association between a client and + a particular Sprout node. Sprout does not store any long-lived data itself and instead uses + web service interfaces to Homestead and Homer to retrieve HSS configuration such as + authentication data/user profiles and MMTEL service settings APIs to Vellum for storing + subscriber registration data and for running timers. + + Sprout is where the bulk of the I-CSCF and S-CSCF function resides, with the remainder + provided by Dime (and backed by the long-lived data stores on Vellum). + derived_from: clearwater.SoftwareComponent + capabilities: + sip_endpoint: clearwater.Endpoint.SIP.Upstream # open to Bono + sip_secure_endpoint: clearwater.Endpoint.SIP.Upstream.Secure # open to Bono + management_endpoint: clearwater.Endpoint.Management.Sprout + memento: + type: tosca.capabilities.Container + valid_source_types: [ clearwater.Memento ] + requirements: +# cyclical: see ARIA-327 +# - sip_upstream: +# capability: clearwater.Endpoint.SIP.Proxy +# occurrences: [ 0, UNBOUNDED ] + - homer: # for subscriber profiles + capability: clearwater.Endpoint.Management.Homer + - ralf: # for billable events + capability: clearwater.Endpoint.Management.Ralf + occurrences: [ 0, 1 ] + - chronos: + capability: clearwater.Endpoint.Chronos + node: clearwater.Vellum + - astaire: + capability: clearwater.Endpoint.Astaire + node: clearwater.Vellum + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + create: + implementation: + primary: scripts/sprout/create.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + delete: + implementation: + primary: scripts/sprout/delete.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + + clearwater.Memento: + derived_from: tosca.nodes.Root + capabilities: + sip-as: ims.functions.SIP-AS + web_secure_endpoint: clearwater.Endpoint.Public.Web.Secure + requirements: + - host: + capability: tosca.capabilities.Container + node: clearwater.Sprout + - cassandra_thrift: + capability: cassandra.Endpoint.Thrift + node: clearwater.Vellum + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + create: + implementation: + primary: scripts/memento/create.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + delete: + implementation: + primary: scripts/memento/delete.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + + clearwater.Dime: + description: >- + Clearwater Diameter gateway. + + Dime nodes run Clearwater's Homestead and Ralf components. + derived_from: clearwater.SoftwareComponent + capabilities: + host: + type: tosca.capabilities.Container + valid_source_types: [ clearwater.DimeSoftwareComponent ] + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + create: + implementation: + primary: scripts/dime/create.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + delete: + implementation: + primary: scripts/dime/delete.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + + clearwater.DimeSoftwareComponent: + description: >- + Base type for Dime software components. + derived_from: clearwater.SoftwareComponent + requirements: + - host: # override + capability: tosca.capabilities.Container + node: clearwater.Dime + + clearwater.Homestead: + description: >- + Clearwater HSS cache. + + Homestead provides a web services interface to Sprout for retrieving authentication + credentials and user profile information. It can either master the data (in which case it + exposes a web services provisioning interface) or can pull the data from an IMS compliant HSS + over the Cx interface. The Homestead nodes themselves are stateless - the mastered / cached + subscriber data is all stored on Vellum (via Cassandra's Thrift interface). + + In the IMS architecture, the HSS mirror function is considered to be part of the I-CSCF and + S-CSCF components, so in Clearwater I-CSCF and S-CSCF function is implemented with a + combination of Sprout and Dime clusters. + derived_from: clearwater.DimeSoftwareComponent + capabilities: + hss: ims.functions.HSS + cx: ims.interfaces.Cx + diameter_endpoint: clearwater.Endpoint.Diameter.HSS + management_endpoint: clearwater.Endpoint.Management.Homestead # open to Ellis + provisioning_management_endpoint: clearwater.Endpoint.Management.Homestead.Provisioning # open to Ellis + requirements: + - cassandra_thrift: + capability: cassandra.Endpoint.Thrift + node: clearwater.Vellum + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + create: + implementation: + primary: scripts/homestead/create.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + delete: + implementation: + primary: scripts/homestead/delete.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + + clearwater.Ralf: + description: >- + Clearwater CTF. + + Ralf provides an HTTP API that both Bono and Sprout can use to report billable events that + should be passed to the CDF (Charging Data Function) over the Rf billing interface. Ralf is + stateless, using Vellum to maintain the long lived session state and run the timers necessary + to enable it to conform to the Rf protocol. + derived_from: clearwater.DimeSoftwareComponent + capabilities: + ctf: ims.functions.CTF + rf: ims.interfaces.Rf + diameter_endpoint: clearwater.Endpoint.Diameter.CTF + management_endpoint: clearwater.Endpoint.Management.Ralf # open to Sprout, Bono, Vellum + requirements: + - chronos: + capability: clearwater.Endpoint.Chronos + node: clearwater.Vellum + - astaire: + capability: clearwater.Endpoint.Astaire + node: clearwater.Vellum + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + create: + implementation: + primary: scripts/ralf/create.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + delete: + implementation: + primary: scripts/ralf/delete.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + + clearwater.Vellum: + description: >- + Clearwater state store. + + Vellum is used to maintain all long-lived state in the deployment. It does this by running a + number of cloud optimized, distributed storage clusters. + + - Cassandra. Cassandra is used by Homestead to store authentication credentials and profile + information, and is used by Homer to store MMTEL service settings. Vellum exposes Cassandra's + Thrift API. + + - etcd. etcd is used by Vellum itself to share clustering information between Vellum nodes and + by other nodes in the deployment for shared configuration. + + - Chronos. Chronos is a distributed, redundant, reliable timer service developed by + Clearwater. It is used by Sprout and Ralf nodes to enable timers to be run (e.g. for SIP + Registration expiry) without pinning operations to a specific node (one node can set the timer + and another act on it when it pops). Chronos is accessed via an HTTP API. + + - Memcached / Astaire. Vellum also runs a Memcached cluster fronted by Astaire. Astaire is a + service developed by Clearwater that enabled more rapid scale up and scale down of memcached + clusters. This cluster is used by Sprout and Ralf for storing registration and session state. + derived_from: clearwater.SoftwareComponent + capabilities: + cassandra_endpoint: cassandra.Endpoint # open to other Vellum + cassandra_thrift_endpoint: cassandra.Endpoint.Thrift # open to Homer, Dime (Homestead), Sprout (Memento) + chronos_endpoint: clearwater.Endpoint.Chronos # open to other Vellum, Sprout, Dime (Ralf) + memcached_endpoint: clearwater.Endpoint.Memcached # open to other Vellum + astaire_endpoint: clearwater.Endpoint.Astaire # open to Sprout, Dime (Ralf) +# cyclical: see ARIA-327 +# requirements: +# - ralf: +# capability: clearwater.Endpoint.Management.Ralf +# occurrences: [ 0, 1 ] + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + create: + implementation: + primary: scripts/vellum/create.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + delete: + implementation: + primary: scripts/vellum/delete.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + + clearwater.Homer: + description: >- + Clearwater XDMS. + + Homer is a standard XDMS used to store MMTEL service settings documents for each user of the + system. Documents are created, read, updated and deleted using a standard XCAP interface. As + with Homestead, the Homer nodes use Vellum as the data store for all long lived data. + derived_from: clearwater.SoftwareComponent + capabilities: + xdms: ims.functions.XDMS + management_endpoint: clearwater.Endpoint.Management.Homer # open to Sprout, Ellis + requirements: + - cassandra_thrift: + capability: cassandra.Endpoint.Thrift + node: clearwater.Vellum + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + create: + implementation: + primary: scripts/homer/create.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + delete: + implementation: + primary: scripts/homer/delete.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + + clearwater.Ellis: + description: >- + Ellis is a sample provisioning portal providing self sign-up, password management, line + management and control of MMTEL service settings. It is not intended to be a part of + production Clearwater deployments (it is not easy to horizontally scale because of the MySQL + underpinnings for one thing) but to make the system easy to use out of the box. + derived_from: clearwater.SoftwareComponent + properties: + provision_numbers_start: + type: clearwater.Number + default: '6505550000' + provision_numbers_count: + type: integer + default: 0 # 0 means do not provision numbers + constraints: + - greater_or_equal: 0 + capabilities: + web_endpoint: clearwater.Endpoint.Public.Web + web_secure_endpoint: clearwater.Endpoint.Public.Web.Secure + requirements: + - homer: # for subscriber profiles + capability: clearwater.Endpoint.Management.Homer + - homestead: # for subscriber authentication + capability: clearwater.Endpoint.Management.Homestead + - homestead_provisioning: + capability: clearwater.Endpoint.Management.Homestead.Provisioning + - ralf: # TODO: really? + capability: clearwater.Endpoint.Management.Ralf + occurrences: [ 0, 1 ] + - smtp: + capability: smtp.SMTP + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + create: + implementation: + primary: scripts/ellis/create.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + configure: + implementation: + primary: scripts/ellis/configure.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + delete: + implementation: + primary: scripts/ellis/delete.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + + clearwater.I-CSCF: + description: >- + Clearwater I-CSCF. + + Logical node encompassing Sprout and Homestead. Required only if you need to expose the I-CSCF + function. + derived_from: tosca.nodes.Root + capabilities: + i-cscf: ims.functions.I-CSCF + requirements: + - sprout: + capability: tosca.capabilities.Node + node: clearwater.Sprout + - homestead: + capability: tosca.capabilities.Node + node: clearwater.Homestead + + clearwater.S-CSCF: + description: >- + Clearwater S-CSCF. + + Logical node encompassing Sprout and Homestead. Required only if you need to expose the S-CSCF + function. + derived_from: tosca.nodes.Root + capabilities: + s-cscf: ims.functions.S-CSCF + requirements: + - sprout: + capability: tosca.capabilities.Node + node: clearwater.Sprout + - homestead: + capability: tosca.capabilities.Node + node: clearwater.Homestead + + clearwater.LiveTest: + derived_from: tosca.nodes.SoftwareComponent + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + create: + implementation: + primary: scripts/live-test/create.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + delete: + implementation: + primary: scripts/live-test/delete.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + + clearwater.HostBase: + derived_from: tosca.nodes.Compute + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + configure: + implementation: + primary: scripts/host-base/configure.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES + capabilities: + host: # override + type: clearwater.Container + valid_source_types: [ tosca.nodes.SoftwareComponent ] + os: # override + type: tosca.capabilities.OperatingSystem + properties: + architecture: + type: string + default: x86_64 + type: + type: string + default: linux + distribution: + type: string + default: ubuntu + version: + type: version + default: 14.04 + + clearwater.Host: + description: >- + Default Clearwater host. + + Note that any node can function as a Clearwater host as long as it has a clearwater.Container + capability. + derived_from: clearwater.HostBase + capabilities: + host: # override + type: clearwater.Container + valid_source_types: [ tosca.nodes.SoftwareComponent ] + properties: + mem_size: + type: scalar-unit.size + constraints: + - greater_or_equal: 0 MB + default: 4 GB # will run out of memory with less than this + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + configure: + implementation: + primary: scripts/host/configure.sh + dependencies: *CLEARWATER_OPERATION_DEPENDENCIES diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/ims.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/ims.yaml new file mode 100644 index 0000000..687ad58 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/ims.yaml @@ -0,0 +1,446 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +capability_types: + + # https://en.wikipedia.org/wiki/IP_Multimedia_Subsystem#Core_network + + ims.functions.Root: + derived_from: tosca.capabilities.Root + + ims.functions.CTF: # not mentioned in Wikipedia + description: >- + Charging Trigger Function. + derived_from: ims.functions.Root + + ims.functions.XDMS: # not mentioned in Wikipedia + description: >- + XML Document Management Server + derived_from: ims.functions.Root + + ims.functions.HSS: + description: >- + The home subscriber server (HSS), or user profile server function (UPSF), is a master user + database that supports the IMS network entities that actually handle calls. It contains the + subscription-related information (subscriber profiles), performs authentication and + authorization of the user, and can provide information about the subscriber's location and IP + information. It is similar to the GSM home location register (HLR) and Authentication centre + (AuC). + + A subscriber location function (SLF) is needed to map user addresses when multiple HSSs are + used. + derived_from: ims.functions.Root + + ims.functions.CSCF: + description: >- + Several roles of SIP servers or proxies, collectively called Call Session Control Function + (CSCF), are used to process SIP signalling packets in the IMS. + derived_from: ims.functions.Root + + ims.functions.P-CSCF: + description: >- + A Proxy-CSCF (P-CSCF) is a SIP proxy that is the first point of contact for the IMS terminal. + It can be located either in the visited network (in full IMS networks) or in the home network + (when the visited network is not IMS compliant yet). Some networks may use a Session Border + Controller (SBC) for this function. The P-CSCF is at its core a specialized SBC for the + User–network interface which not only protects the network, but also the IMS terminal. The use + of an additional SBC between the IMS terminal and the P-CSCF is unnecessary and infeasible due + to the signaling being encrypted on this leg. The terminal discovers its P-CSCF with either + DHCP, or it may be configured (e.g. during initial provisioning or via a 3GPP IMS Management + Object (MO)) or in the ISIM or assigned in the PDP Context (in General Packet Radio Service + (GPRS)). + derived_from: ims.functions.CSCF + + ims.functions.I-CSCF: + description: >- + An Interrogating-CSCF (I-CSCF) is another SIP function located at the edge of an + administrative domain. Its IP address is published in the Domain Name System (DNS) of the + domain (using NAPTR and SRV type of DNS records), so that remote servers can find it, and use + it as a forwarding point (e.g., registering) for SIP packets to this domain. + derived_from: ims.functions.CSCF + + ims.functions.S-CSCF: + description: >- + A Serving-CSCF (S-CSCF) is the central node of the signalling plane. It is a SIP server, but + performs session control too. It is always located in the home network. It uses Diameter Cx + and Dx interfaces to the HSS to download user profiles and upload user-to-S-CSCF associations + (the user profile is only cached locally for processing reasons only and is not changed). All + necessary subscriber profile information is loaded from the HSS. + derived_from: ims.functions.CSCF + + ims.functions.AS: + description: >- + SIP Application servers (AS) host and execute services, and interface with the S-CSCF using + SIP. An example of an application server that is being developed in 3GPP is the Voice call + continuity Function (VCC Server). Depending on the actual service, the AS can operate in SIP + proxy mode, SIP UA (user agent) mode or SIP B2BUA mode. An AS can be located in the home + network or in an external third-party network. If located in the home network, it can query + the HSS with the Diameter Sh or Si interfaces (for a SIP-AS). + derived_from: ims.functions.Root + + ims.functions.SIP-AS: + description: >- + Host and execute IMS specific services. + derived_from: ims.functions.AS + + ims.functions.IM-SSF: + description: >- + IP Multimedia Service Switching Function. Interfaces SIP to CAP to communicate with CAMEL + Application Servers. + derived_from: ims.functions.AS + + ims.functions.OSA-SCS: + description: >- + OSA service capability server. Interfaces SIP to the OSA framework. + derived_from: ims.functions.AS + + ims.functions.AS-ILCM: + description: >- + The AS-ILCM (Application Server - Incoming Leg Control Model) stores transaction state, and + may optionally store session state depending on the specific service being executed. The + AS-ILCM interfaces to the S-CSCF (ILCM) for an incoming leg. Application Logic provides the + service(s) and interacts between the AS-ILCM and AS-OLCM. + derived_from: ims.functions.AS + + ims.functions.AS-OLCM: + description: >- + The AS-OLCM (Application Server - Outgoing Leg Control Model) stores transaction state, and + may optionally store session state depending on the specific service being executed. The + AS-OLCM interfaces to the S-CSCF (OLCM) for an outgoing leg. Application Logic provides the + service(s) and interacts between the AS-ILCM and AS-OLCM. + derived_from: ims.functions.AS + + ims.functions.MRF: + description: >- + The Media Resource Function (MRF) provides media related functions such as media manipulation + (e.g. voice stream mixing) and playing of tones and announcements. + + Each MRF is further divided into a media resource function controller (MRFC) and a media + resource function processor (MRFP). + derived_from: ims.functions.Root + + ims.functions.MRFC: + description: >- + The MRFC is a signalling plane node that interprets information coming from an AS and S-CSCF + to control the MRFP. + derived_from: ims.functions.Root + + ims.functions.MRFP: + description: >- + The MRFP is a media plane node used to mix, source or process media streams. It can also + manage access right to shared resources. + derived_from: ims.functions.Root + + ims.functions.MRB: + description: >- + The Media Resource Broker (MRB) is a functional entity that is responsible for both collection + of appropriate published MRF information and supplying of appropriate MRF information to + consuming entities such as the AS. MRB can be used in two modes: + * Query mode: AS queries the MRB for media and sets up the call using the response of MRB + * In-Line Mode: AS sends a SIP INVITE to the MRB. The MRB sets up the call + derived_from: ims.functions.Root + + ims.functions.BGCF: + description: >- + A Breakout Gateway Control Function (BGCF) is a SIP proxy which processes requests for routing + from an S-CSCF when the S-CSCF has determined that the session cannot be routed using DNS or + ENUM/DNS. It includes routing functionality based on telephone numbers. + derived_from: ims.functions.Root + + ims.functions.PTSNGateway: + description: >- + A PSTN/CS gateway interfaces with PSTN circuit switched (CS) networks. For signalling, CS + networks use ISDN User Part (ISUP) (or BICC) over Message Transfer Part (MTP), while IMS uses + SIP over IP. For media, CS networks use Pulse-code modulation (PCM), while IMS uses Real-time + Transport Protocol (RTP). + derived_from: ims.functions.Root + + ims.functions.SGW: + description: >- + A signalling gateway (SGW) interfaces with the signalling plane of the CS. It transforms lower + layer protocols as Stream Control Transmission Protocol (SCTP, an IP protocol) into Message + Transfer Part (MTP, an Signalling System 7 (SS7) protocol), to pass ISDN User Part (ISUP) from + the MGCF to the CS network. + derived_from: ims.functions.PTSNGateway + + ims.functions.MGCF: + description: >- + A media gateway controller function (MGCF) is a SIP endpoint that does call control protocol + conversion between SIP and ISUP/BICC and interfaces with the SGW over SCTP. It also controls + the resources in a Media Gateway (MGW) across an H.248 interface. + derived_from: ims.functions.PTSNGateway + + ims.functions.MGW: + description: >- + A media gateway (MGW) interfaces with the media plane of the CS network, by converting between + RTP and PCM. It can also transcode when the codecs don't match (e.g., IMS might use AMR, PSTN + might use G.711). + derived_from: ims.functions.PTSNGateway + + # https://en.wikipedia.org/wiki/IP_Multimedia_Subsystem#Interfaces_description + + ims.interfaces.Diameter: + derived_from: tosca.capabilities.Endpoint + + ims.interfaces.TCP: + derived_from: tosca.capabilities.Endpoint + + ims.interfaces.SIP: + derived_from: tosca.capabilities.Endpoint + properties: + protocol: # override + type: string + default: sip + + ims.interfaces.RTP: + derived_from: tosca.capabilities.Endpoint + properties: + protocol: # override + type: string + default: rtp + + ims.interfaces.H248: + derived_from: tosca.capabilities.Endpoint + properties: + protocol: # override + type: string + default: h248 + + ims.interfaces.HTTP: + derived_from: tosca.capabilities.Endpoint + properties: + protocol: # override + type: string + default: http + + ims.interfaces.MAP: + derived_from: tosca.capabilities.Endpoint + properties: + protocol: # override + type: string + default: map + + ims.interfaces.Cr: + description: >- + Used by MRFC to fetch documents (e.g. scripts, announcement files, and other resources) from + an AS. Also used for media control related commands. + derived_from: ims.interfaces.TCP + + ims.interfaces.Cx: + description: >- + Used to send subscriber data to the S-CSCF; including filter criteria and their priority. Also + used to furnish CDF and/or OCF addresses. + derived_from: ims.interfaces.Diameter + + ims.interfaces.Dh: + description: >- + Used by AS to find the HSS holding the user profile information in a multi-HSS environment. + DH_SLF_QUERY indicates an IMPU and DX_SLF_RESP return the HSS name. + derived_from: ims.interfaces.Diameter + + ims.interfaces.Dx: + description: >- + Used by I-CSCF or S-CSCF to find a correct HSS in a multi-HSS environment. DX_SLF_QUERY + indicates an IMPU and DX_SLF_RESP return the HSS name. + derived_from: ims.interfaces.Diameter + + ims.interfaces.Gm: + description: >- + Used to exchange messages between SIP user equipment (UE) or Voip gateway and P-CSCF. + derived_from: ims.interfaces.SIP + + ims.interfaces.Go: + description: >- + Allows operators to control QoS in a user plane and exchange charging correlation + information between IMS and GPRS network. + derived_from: ims.interfaces.Diameter + + ims.interfaces.Gq: + description: >- + Used to exchange policy decisions-related information between P-CSCF and PDF. + derived_from: ims.interfaces.Diameter + + ims.interfaces.Gx: + description: >- + Used to exchange policy decisions-related information between PCEF and PCRF. + derived_from: ims.interfaces.Diameter + + ims.interfaces.Gy: + description: >- + Used for online flow-based bearer charging. Functionally equivalent to Ro interface. + derived_from: ims.interfaces.Diameter + + ims.interfaces.ISC: + description: >- + Reference point between S-CSCF and AS. Main functions are to: + * Notify the AS of the registered IMPU, registration state and UE capabilities + * Supply the AS with information to allow it to execute multiple services + * Convey charging function addresses + derived_from: ims.interfaces.SIP + + ims.interfaces.Ici: + description: >- + Used to exchange messages between an IBCF and another IBCF belonging to a different IMS + network. + derived_from: ims.interfaces.SIP + + ims.interfaces.Izi: + description: >- + Used to forward media streams from a TrGW to another TrGW belonging to a different IMS + network. + derived_from: ims.interfaces.RTP + + ims.interfaces.Ma: + description: >- + Main functions are to: + * Forward SIP requests which are destined to a public service identity hosted by the AS + * Originate a session on behalf of a user or public service identity, if the AS has no + knowledge of a S-CSCF assigned to that user or public service identity + * Convey charging function addresses + derived_from: ims.interfaces.SIP + + ims.interfaces.Mg: + description: >- + ISUP signalling to SIP signalling and forwards SIP signalling to I-CSCF. + derived_from: ims.interfaces.SIP + + ims.interfaces.Mi: + description: >- + Used to exchange messages between S-CSCF and BGCF. + derived_from: ims.interfaces.SIP + + ims.interfaces.Mj: + description: >- + Used for the interworking with the PSTN/CS domain, when the BGCF has determined that a + breakout should occur in the same IMS network to send SIP message from BGCF to MGCF. + derived_from: ims.interfaces.SIP + + ims.interfaces.Mk: + description: >- + Used for the interworking with the PSTN/CS domain, when the BGCF has determined that a + breakout should occur in another IMS network to send SIP message from BGCF to the BGCF in the + other network. + derived_from: ims.interfaces.SIP + + ims.interfaces.Mm: + description: >- + Used for exchanging messages between IMS and external IP networks. + derived_from: ims.interfaces.SIP + + ims.interfaces.Mn: + description: >- + Allows control of user-plane resources. + derived_from: ims.interfaces.H248 + + ims.interfaces.Mp: + description: >- + Allows an MRFC to control media stream resources provided by an MRFP. + derived_from: ims.interfaces.H248 + + ims.interfaces.Mr: + description: >- + Used to exchange information between S-CSCF and MRFC. + derived_from: ims.interfaces.SIP + + ims.interfaces.Mr2: + description: >- + Used to exchange session controls between AS and MRFC. + derived_from: ims.interfaces.SIP + + ims.interfaces.Mw: + description: >- + Used to exchange messages between CSCFs. AGCF appears as a P-CSCF to the other CSCFs. + derived_from: ims.interfaces.SIP + + ims.interfaces.Mx: + description: >- + Used for the interworking with another IMS network, when the BGCF has determined that a + breakout should occur in the other IMS network to send SIP message from BGCF to the IBCF in + the other network. + derived_from: ims.interfaces.SIP + + ims.interfaces.P1: + description: >- + Used for call control services by AGCF to control H.248 A-MGW and residential gateways. + derived_from: ims.interfaces.H248 + + ims.interfaces.P2: + description: >- + Reference point between AGCF and CSCF. + derived_from: ims.interfaces.SIP + + ims.interfaces.Rc: + description: >- + Used by the AS to request that media resources be assigned to a call when using MRB in-line + mode or in query mode. + derived_from: ims.interfaces.SIP + + ims.interfaces.Rf: + description: >- + Used to exchange offline charging information with CDF. + derived_from: ims.interfaces.Diameter + + ims.interfaces.Ro: + description: >- + Used to exchange online charging information with OCF. + derived_from: ims.interfaces.Diameter + + ims.interfaces.Rx: + description: >- + Used to exchange policy and charging related information between P-CSCF and PCRF. Replacement + for the Gq reference point. + derived_from: ims.interfaces.Diameter + + ims.interfaces.Sh: + description: >- + Used to exchange User Profile information (e.g., user-related data, group lists, + user-service-related information or user location information or charging function addresses + (used when the AS has not received the third-party REGISTER for a user)) between an AS (SIP + AS or OSA SCS) and HSS. Also allow AS to activate/deactivate filter criteria stored in the HSS + on a per-subscriber basis. + derived_from: ims.interfaces.Diameter + + ims.interfaces.Si: + description: >- + Transports CAMEL subscription information, including triggers for use by CAMEL-based + application services information. + derived_from: ims.interfaces.MAP + + ims.interfaces.Sr: + description: >- + Used by MRFC to fetch documents (scripts and other resources) from an AS. + derived_from: ims.interfaces.HTTP + + ims.interfaces.Ut: + description: >- + Facilitates the management of subscriber information related to services and settings. + derived_from: ims.interfaces.HTTP + + ims.interfaces.Z: + description: >- + Conversion of POTS services to SIP messages. + derived_from: tosca.capabilities.Root + +node_types: + + ims.nodes.IMS: + derived_from: tosca.nodes.Root + capabilities: + p-cscf: ims.functions.P-CSCF + i-cscf: ims.functions.I-CSCF + s-cscf: ims.functions.S-CSCF + hss: ims.functions.HSS + ctf: ims.functions.CTF + xdms: ims.functions.XDMS diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/smtp.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/smtp.yaml new file mode 100644 index 0000000..14e0df1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/clearwater/types/smtp.yaml @@ -0,0 +1,35 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +capability_types: + + smtp.SMTP: + derived_from: tosca.capabilities.Root + properties: + username: + type: string + password: + type: string + +node_types: + + smtp.SMTP: + derived_from: tosca.nodes.SoftwareComponent + properties: + address: + type: string + capabilities: + smtp: + type: smtp.SMTP diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/hello-world.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/hello-world.yaml new file mode 100644 index 0000000..86e2ad0 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/hello-world.yaml @@ -0,0 +1,38 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +node_types: + + WebServer: + derived_from: tosca:Root + capabilities: + host: + type: tosca:Container + + WebApp: + derived_from: tosca:WebApplication + properties: + port: + type: integer + +topology_template: + + node_templates: + web_server: + type: WebServer + + web_app: + type: WebApp + properties: + port: 9090 + requirements: + - host: web_server + interfaces: + Standard: + configure: scripts/configure.sh + start: scripts/start.sh + stop: scripts/stop.sh + + outputs: + port: + type: integer + value: { get_property: [ web_app, port ] } diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/images/aria-logo.png b/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/images/aria-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..35058447f016ea4ea8b80ea0e769e4fbb1cc3e2b GIT binary patch literal 23601 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%0A<&?1gbMC-!j_m-K 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 literal 0 HcmV?d00001 diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/index.html b/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/index.html new file mode 100644 index 0000000..8d21c3a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/index.html @@ -0,0 +1,14 @@ + +
+ ARIA Hello World +
+ +

Hello, World!

+

+ blueprint_id = {{ ctx.service_template.name }}
+ deployment_id = {{ ctx.service.name }}
+ node_id = {{ ctx.node.name }} +

+ + + \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/scripts/configure.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/scripts/configure.sh new file mode 100644 index 0000000..dc7c09f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/scripts/configure.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +TEMP_DIR=/tmp +PYTHON_FILE_SERVER_ROOT="$TEMP_DIR/python-simple-http-webserver" +INDEX_PATH=index.html +IMAGE_PATH=images/aria-logo.png + +if [ -d "$PYTHON_FILE_SERVER_ROOT" ]; then + ctx logger info [ "Removing old web server root folder: $PYTHON_FILE_SERVER_ROOT." ] + rm -rf "$PYTHON_FILE_SERVER_ROOT" +fi + +ctx logger info [ "Creating web server root folder: $PYTHON_FILE_SERVER_ROOT." ] + +mkdir -p "$PYTHON_FILE_SERVER_ROOT" +cd "$PYTHON_FILE_SERVER_ROOT" + +ctx logger info [ "Downloading service template resources..." ] +ctx download-resource-and-render [ "$PYTHON_FILE_SERVER_ROOT/index.html" "$INDEX_PATH" ] +ctx download-resource [ "$PYTHON_FILE_SERVER_ROOT/aria-logo.png" "$IMAGE_PATH" ] diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/scripts/start.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/scripts/start.sh new file mode 100644 index 0000000..1525f30 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/scripts/start.sh @@ -0,0 +1,64 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +TEMP_DIR=/tmp +PYTHON_FILE_SERVER_ROOT="$TEMP_DIR/python-simple-http-webserver" +PID_FILE=server.pid +PORT=$(ctx node properties port) +URL="http://localhost:$PORT" + +ctx logger info [ "Starting web server at: $PYTHON_FILE_SERVER_ROOT." ] + +cd "$PYTHON_FILE_SERVER_ROOT" +nohup python -m SimpleHTTPServer "$PORT" > /dev/null 2>&1 & +echo $! > "$PID_FILE" + +server_is_up() { + if which wget >/dev/null; then + if wget "$URL" >/dev/null; then + return 0 + fi + elif which curl >/dev/null; then + if curl "$URL" >/dev/null; then + return 0 + fi + else + ctx logger error [ "Both curl and wget were not found in path." ] + exit 1 + fi + return 1 +} + +ctx logger info [ "Waiting for web server to launch on port $PORT..." ] +STARTED=false +for i in $(seq 1 15) +do + if server_is_up; then + ctx logger info [ "Web server is up." ] + STARTED=true + break + else + ctx logger info [ "Web server not up. waiting 1 second." ] + sleep 1 + fi +done + +if [ "$STARTED" = false ]; then + ctx logger error [ "Web server did not start within 15 seconds." ] + exit 1 +fi diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/scripts/stop.sh b/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/scripts/stop.sh new file mode 100644 index 0000000..be4d68e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/hello-world/scripts/stop.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +set -e + +TEMP_DIR=/tmp +PYTHON_FILE_SERVER_ROOT="${TEMP_DIR}/python-simple-http-webserver" +PID_FILE=server.pid +PID=$(cat "$PYTHON_FILE_SERVER_ROOT/$PID_FILE") + +ctx logger info [ "Shutting down web server, pid = ${PID}." ] +kill -9 "$PID" || exit $? + +ctx logger info [ "Removing web server root folder: $PYTHON_FILE_SERVER_ROOT." ] +rm -rf "$PYTHON_FILE_SERVER_ROOT" diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-1/block-storage-1.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-1/block-storage-1.yaml new file mode 100644 index 0000000..8b3bab3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-1/block-storage-1.yaml @@ -0,0 +1,68 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile with server and attached block storage using the normative AttachesTo + Relationship Type. + +metadata: + template_name: block-storage-1 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +topology_template: + + inputs: + cpus: + type: integer + description: Number of CPUs for the server. + constraints: + - valid_values: [ 1, 2, 4, 8 ] + storage_size: + type: scalar-unit.size + description: Size of the storage to be created. + default: 1 GB + storage_snapshot_id: + type: string + description: >- + Optional identifier for an existing snapshot to use when creating storage. + storage_location: + type: string + description: Block storage mount point (filesystem path). + + node_templates: + + my_server: + type: Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: cpus } + mem_size: 1 GB + os: + properties: + architecture: x86_64 + type: linux + distribution: fedora + version: 18.0 + requirements: + - local_storage: + node: my_storage + relationship: + type: AttachesTo + properties: + location: { get_input: storage_location } + + my_storage: + type: BlockStorage + properties: + size: { get_input: storage_size } + snapshot_id: { get_input: storage_snapshot_id } + + outputs: + private_ip: + description: The private IP address of the newly created compute instance. + value: { get_attribute: [ my_server, private_address ] } + volume_id: + description: The volume id of the block storage instance. + value: { get_property: [ my_storage, volume_id ] } # ARIA NOTE: wrong in spec diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-1/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-1/inputs.yaml new file mode 100644 index 0000000..d0b0854 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-1/inputs.yaml @@ -0,0 +1,3 @@ +storage_snapshot_id: "snapshot-id" +storage_location: /mnt +cpus: 4 \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-2/block-storage-2.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-2/block-storage-2.yaml new file mode 100644 index 0000000..9a2c0b0 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-2/block-storage-2.yaml @@ -0,0 +1,75 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile with server and attached block storage using a custom AttachesTo Relationship + Type. + +metadata: + template_name: block-storage-2 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +relationship_types: + + MyCustomAttachesTo: + derived_from: AttachesTo + +topology_template: + + inputs: + cpus: + type: integer + description: Number of CPUs for the server. + constraints: + - valid_values: [ 1, 2, 4, 8 ] + storage_size: + type: scalar-unit.size + description: Size of the storage to be created. + default: 1 GB + storage_snapshot_id: + type: string + description: >- + Optional identifier for an existing snapshot to use when creating storage. + storage_location: + type: string + description: Block storage mount point (filesystem path). + + node_templates: + + my_server: + type: Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: cpus } + mem_size: 4 GB + os: + properties: + architecture: x86_64 + type: Linux + distribution: Fedora + version: 18.0 + requirements: + - local_storage: + node: my_storage + # Declare custom AttachesTo type using the 'relationship' keyword + relationship: + type: MyCustomAttachesTo + properties: + location: { get_input: storage_location } + + my_storage: + type: BlockStorage + properties: + size: { get_input: storage_size } + snapshot_id: { get_input: storage_snapshot_id } + + outputs: + private_ip: + description: The private IP address of the newly created compute instance. + value: { get_attribute: [ my_server, private_address ] } + + volume_id: + description: The volume id of the block storage instance. + value: { get_property: [ my_storage, volume_id ] } # ARIA NOTE: wrong in spec diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-2/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-2/inputs.yaml new file mode 100644 index 0000000..d0b0854 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-2/inputs.yaml @@ -0,0 +1,3 @@ +storage_snapshot_id: "snapshot-id" +storage_location: /mnt +cpus: 4 \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-3/block-storage-3.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-3/block-storage-3.yaml new file mode 100644 index 0000000..0b09b34 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-3/block-storage-3.yaml @@ -0,0 +1,68 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile with server and attached block storage using a named Relationship Template + for the storage attachment. + +metadata: + template_name: block-storage-3 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +topology_template: + + inputs: + cpus: + type: integer + description: Number of CPUs for the server. + constraints: + - valid_values: [ 1, 2, 4, 8 ] + storage_size: + type: scalar-unit.size + description: Size of the storage to be created. + default: 1 GB + storage_location: + type: string + description: Block storage mount point (filesystem path). + + node_templates: + + my_server: + type: Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: cpus } + mem_size: 4 GB + os: + properties: + architecture: x86_64 + type: Linux + distribution: Fedora + version: 18.0 + requirements: + - local_storage: + node: my_storage + # Declare template to use with 'relationship' keyword + relationship: storage_attachment + + my_storage: + type: BlockStorage + properties: + size: { get_input: storage_size } + + relationship_templates: + + storage_attachment: + type: AttachesTo + properties: + location: { get_input: storage_location } + + outputs: + private_ip: + description: The private IP address of the newly created compute instance. + value: { get_attribute: [ my_server, private_address ] } + volume_id: + description: The volume id of the block storage instance. + value: { get_property: [ my_storage, volume_id ] } # ARIA NOTE: wrong in spec diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-3/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-3/inputs.yaml new file mode 100644 index 0000000..daca041 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-3/inputs.yaml @@ -0,0 +1,2 @@ +storage_location: /mnt +cpus: 4 \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-4/block-storage-4.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-4/block-storage-4.yaml new file mode 100644 index 0000000..d3c2614 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-4/block-storage-4.yaml @@ -0,0 +1,96 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile with a Single Block Storage node shared by 2-Tier Application with custom + AttachesTo Type and implied relationships. + +metadata: + template_name: block-storage-4 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +relationship_types: + + MyAttachesTo: + derived_from: tosca.relationships.AttachesTo + properties: + location: + type: string + default: /default_location + +topology_template: + + inputs: + cpus: + type: integer + description: Number of CPUs for the server. + constraints: + - valid_values: [ 1, 2, 4, 8 ] + storage_size: + type: scalar-unit.size + default: 1 GB + description: Size of the storage to be created. + storage_snapshot_id: + type: string + description: >- + Optional identifier for an existing snapshot to use when creating storage. + + node_templates: + + my_web_app_tier_1: + type: tosca.nodes.Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: cpus } + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: Linux + distribution: Fedora + version: 18.0 + requirements: + - local_storage: + node: my_storage + relationship: MyAttachesTo + + my_web_app_tier_2: + type: tosca.nodes.Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: cpus } + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: Linux + distribution: Fedora + version: 18.0 + requirements: + - local_storage: + node: my_storage + relationship: + type: MyAttachesTo + properties: + location: /some_other_data_location + + my_storage: + type: tosca.nodes.BlockStorage + properties: + size: { get_input: storage_size } + snapshot_id: { get_input: storage_snapshot_id } + + outputs: + private_ip_1: + description: The private IP address of the application's first tier. + value: { get_attribute: [ my_web_app_tier_1, private_address ] } + private_ip_2: + description: The private IP address of the application's second tier. + value: { get_attribute: [ my_web_app_tier_2, private_address ] } + volume_id: + description: The volume id of the block storage instance. + value: { get_property: [ my_storage, volume_id ] } # ARIA NOTE: wrong in spec diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-4/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-4/inputs.yaml new file mode 100644 index 0000000..18e457d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-4/inputs.yaml @@ -0,0 +1,2 @@ +storage_snapshot_id: "snapshot-id" +cpus: 4 \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-5/block-storage-5.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-5/block-storage-5.yaml new file mode 100644 index 0000000..a0c2229 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-5/block-storage-5.yaml @@ -0,0 +1,109 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile with a single Block Storage node shared by 2-Tier Application with custom + AttachesTo Type and explicit Relationship Templates. + +metadata: + template_name: block-storage-5 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +relationship_types: + + MyAttachesTo: + derived_from: tosca.relationships.AttachesTo + properties: + location: + type: string + default: /default_location + +topology_template: + + inputs: + cpus: + type: integer + description: Number of CPUs for the server. + constraints: + - valid_values: [ 1, 2, 4, 8 ] + storage_size: + type: scalar-unit.size + default: 1 GB + description: Size of the storage to be created. + storage_snapshot_id: + type: string + description: >- + Optional identifier for an existing snapshot to use when creating storage. + storage_location: + type: string + description: >- + Block storage mount point (filesystem path). + + node_templates: + + my_web_app_tier_1: + type: tosca.nodes.Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: cpus } + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: Linux + distribution: Fedora + version: 18.0 + requirements: + - local_storage: + node: my_storage + relationship: storage_attachesto_1 + + my_web_app_tier_2: + type: tosca.nodes.Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: cpus } + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: Linux + distribution: Fedora + version: 18.0 + requirements: + - local_storage: + node: my_storage + relationship: storage_attachesto_2 + + my_storage: + type: tosca.nodes.BlockStorage + properties: + size: { get_input: storage_size } + snapshot_id: { get_input: storage_snapshot_id } + + relationship_templates: + + storage_attachesto_1: + type: MyAttachesTo + properties: + location: /my_data_location + + storage_attachesto_2: + type: MyAttachesTo + properties: + location: /some_other_data_location + + outputs: + private_ip_1: + description: The private IP address of the application's first tier. + value: { get_attribute: [ my_web_app_tier_1, private_address ] } + private_ip_2: + description: The private IP address of the application's second tier. + value: { get_attribute: [ my_web_app_tier_2, private_address ] } + volume_id: + description: The volume id of the block storage instance. + value: { get_property: [ my_storage, volume_id ] } # ARIA NOTE: wrong in spec diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-5/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-5/inputs.yaml new file mode 100644 index 0000000..d0b0854 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-5/inputs.yaml @@ -0,0 +1,3 @@ +storage_snapshot_id: "snapshot-id" +storage_location: /mnt +cpus: 4 \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-6/block-storage-6.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-6/block-storage-6.yaml new file mode 100644 index 0000000..534884a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-6/block-storage-6.yaml @@ -0,0 +1,102 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile with 2 servers each with different attached block storage. + +metadata: + template_name: block-storage-6 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +topology_template: + + inputs: + cpus: + type: integer + description: Number of CPUs for the server. + constraints: + - valid_values: [ 1, 2, 4, 8 ] + storage_size: + type: scalar-unit.size + default: 1 GB + description: Size of the storage to be created. + storage_snapshot_id: + type: string + description: >- + Optional identifier for an existing snapshot to use when creating storage. + storage_location: + type: string + description: >- + Block storage mount point (filesystem path). + + node_templates: + + my_server: + type: tosca.nodes.Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: cpus } + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: Linux + distribution: Fedora + version: 18.0 + requirements: + - local_storage: + node: my_storage + relationship: + type: AttachesTo + properties: + location: { get_input: storage_location } + + my_storage: + type: tosca.nodes.BlockStorage + properties: + size: { get_input: storage_size } + snapshot_id: { get_input: storage_snapshot_id } + + my_server2: + type: tosca.nodes.Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: cpus } + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: Linux + distribution: Fedora + version: 18.0 + requirements: + - local_storage: + node: my_storage2 + relationship: + type: AttachesTo + properties: + location: { get_input: storage_location } + + my_storage2: + type: tosca.nodes.BlockStorage + properties: + size: { get_input: storage_size } + snapshot_id: { get_input: storage_snapshot_id } + + outputs: + server_ip_1: + description: The private IP address of the application's first server. + value: { get_attribute: [ my_server, private_address ] } + server_ip_2: + description: The private IP address of the application's second server. + value: { get_attribute: [ my_server2, private_address ] } + volume_id_1: + description: The volume id of the first block storage instance. + value: { get_property: [ my_storage, volume_id ] } # ARIA NOTE: wrong in spec + volume_id_2: + description: The volume id of the second block storage instance. + value: { get_property: [ my_storage2, volume_id ] } # ARIA NOTE: wrong in spec diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-6/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-6/inputs.yaml new file mode 100644 index 0000000..d0b0854 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/block-storage-6/inputs.yaml @@ -0,0 +1,3 @@ +storage_snapshot_id: "snapshot-id" +storage_location: /mnt +cpus: 4 \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/compute-1/compute-1.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/compute-1/compute-1.yaml new file mode 100644 index 0000000..254d2b6 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/compute-1/compute-1.yaml @@ -0,0 +1,42 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile that just defines a single compute instance and selects a (guest) host + Operating System from the Compute node's properties. Note, this example does not include default + values on inputs properties. + +metadata: + template_name: compute-1 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +topology_template: + + inputs: + cpus: + type: integer + description: Number of CPUs for the server. + constraints: + - valid_values: [ 1, 2, 4, 8 ] + + node_templates: + + my_server: + type: Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: cpus } + mem_size: 1 GB + os: + properties: + architecture: x86_64 + type: Linux + distribution: ubuntu + version: 12.04 + + outputs: + private_ip: + description: The private IP address of the deployed server instance. + value: { get_attribute: [ my_server, private_address ] } diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/compute-1/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/compute-1/inputs.yaml new file mode 100644 index 0000000..c1ee88a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/compute-1/inputs.yaml @@ -0,0 +1 @@ +cpus: 4 \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/container-1/container-1.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/container-1/container-1.yaml new file mode 100644 index 0000000..f6f69fc --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/container-1/container-1.yaml @@ -0,0 +1,68 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile with wordpress, web server and mysql on the same server. + +metadata: + template_name: compute-1 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +imports: + - ../non-normative-types.yaml + +# Repositories to retrieve code artifacts from + +repositories: + + docker_hub: https://registry.hub.docker.com/ + +topology_template: + + inputs: + wp_host_port: + type: integer + description: The host port that maps to port 80 of the WordPress container. + db_root_pwd: + type: string + description: Root password for MySQL. + + node_templates: + + # The MYSQL container based on official MySQL image in Docker hub + + mysql_container: + type: tosca.nodes.Container.Application.Docker + # ARIA NOTE: moved to a requirement in the node type + #capabilities: + # # This is a capability that would mimic the Docker –link feature + # database_link: tosca.capabilities.Docker.Link + artifacts: + my_image: + file: mysql + type: tosca.artifacts.Deployment.Image.Container.Docker + repository: docker_hub + interfaces: + Standard: + create: + implementation: my_image + inputs: + db_root_password: { get_input: db_root_pwd } + + # The WordPress container based on official WordPress image in Docker hub + + wordpress_container: + type: tosca.nodes.Container.Application.Docker + requirements: + - database_link: mysql_container + artifacts: + my_image: + file: wordpress + type: tosca.artifacts.Deployment.Image.Container.Docker + repository: docker_hub + interfaces: + Standard: + create: + implementation: my_image + inputs: + host_port: { get_input: wp_host_port } diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/collectd.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/collectd.yaml new file mode 100644 index 0000000..6d28899 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/collectd.yaml @@ -0,0 +1,10 @@ +# ARIA NOTE: missing in spec + +node_types: + + tosca.nodes.SoftwareComponent.Collectd: + derived_from: tosca.nodes.SoftwareComponent + requirements: + - collectd_endpoint: + capability: tosca.capabilities.Endpoint + relationship: tosca.relationships.ConnectsTo diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/elasticsearch.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/elasticsearch.yaml new file mode 100644 index 0000000..72b210a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/elasticsearch.yaml @@ -0,0 +1,8 @@ +# ARIA NOTE: missing in spec + +node_types: + + tosca.nodes.SoftwareComponent.Elasticsearch: + derived_from: tosca.nodes.SoftwareComponent + capabilities: + app: tosca.capabilities.Endpoint diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/kibana.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/kibana.yaml new file mode 100644 index 0000000..4ee8700 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/kibana.yaml @@ -0,0 +1,12 @@ +# ARIA NOTE: missing in spec + +node_types: + + tosca.nodes.SoftwareComponent.Kibana: + derived_from: tosca.nodes.SoftwareComponent + requirements: + - search_endpoint: + capability: tosca.capabilities.Endpoint + relationship: tosca.relationships.ConnectsTo + capabilities: + app: tosca.capabilities.Endpoint diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/logstash.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/logstash.yaml new file mode 100644 index 0000000..ea74c7e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/logstash.yaml @@ -0,0 +1,12 @@ +# ARIA NOTE: missing in spec + +node_types: + + tosca.nodes.SoftwareComponent.Logstash: + derived_from: tosca.nodes.SoftwareComponent + requirements: + - search_endpoint: + capability: tosca.capabilities.Endpoint + relationship: tosca.relationships.ConnectsTo + capabilities: + app: tosca.capabilities.Endpoint diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/rsyslog.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/rsyslog.yaml new file mode 100644 index 0000000..3bd7c2b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/custom_types/rsyslog.yaml @@ -0,0 +1,10 @@ +# ARIA NOTE: missing in spec + +node_types: + + tosca.nodes.SoftwareComponent.Rsyslog: + derived_from: tosca.nodes.SoftwareComponent + requirements: + - rsyslog_endpoint: + capability: tosca.capabilities.Endpoint + relationship: tosca.relationships.ConnectsTo diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/inputs.yaml new file mode 100644 index 0000000..5302bbf --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/inputs.yaml @@ -0,0 +1 @@ +my_cpus: 8 \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/multi-tier-1.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/multi-tier-1.yaml new file mode 100644 index 0000000..50401ec --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/multi-tier-1/multi-tier-1.yaml @@ -0,0 +1,237 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + This TOSCA simple profile deploys nodejs, mongodb, elasticsearch, logstash and kibana each on a + separate server with monitoring enabled for nodejs server where a sample nodejs application is + running. The syslog and collectd are installed on a nodejs server. + +metadata: + template_name: multi-tier-1 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +imports: + - ../webserver-dbms-2/custom_types/paypalpizzastore_nodejs_app.yaml # ARIA NOTE: moved + - custom_types/elasticsearch.yaml + - custom_types/logstash.yaml + - custom_types/kibana.yaml + - custom_types/collectd.yaml + - custom_types/rsyslog.yaml + +dsl_definitions: + + host_capabilities: &host_capabilities + # container properties (flavor) + disk_size: 10 GB + num_cpus: { get_input: my_cpus } + mem_size: 4096 MB + os_capabilities: &os_capabilities + architecture: x86_64 + type: Linux + distribution: Ubuntu + version: 14.04 + +topology_template: + + inputs: + my_cpus: + type: integer + description: Number of CPUs for the server. + constraints: + - valid_values: [ 1, 2, 4, 8 ] + github_url: + type: string + description: The URL to download nodejs. + default: https://github.com/sample.git + + node_templates: + + paypal_pizzastore: + type: tosca.nodes.WebApplication.PayPalPizzaStore + properties: + github_url: { get_input: github_url } + requirements: + - host: nodejs + - database_connection: mongo_db + interfaces: + Standard: + configure: + implementation: scripts/nodejs/configure.sh + inputs: + github_url: { get_property: [ SELF, github_url ] } + mongodb_ip: { get_attribute: [ mongo_server, private_address ] } + start: scripts/nodejs/start.sh + + nodejs: + type: tosca.nodes.WebServer.Nodejs + requirements: + - host: app_server + interfaces: + Standard: + create: scripts/nodejs/create.sh + + mongo_db: + type: tosca.nodes.Database + properties: + name: 'pizzastore' # ARIA NOTE: missing in spec + requirements: + - host: mongo_dbms + interfaces: + Standard: + create: create_database.sh + + mongo_dbms: + type: tosca.nodes.DBMS + requirements: + - host: mongo_server + interfaces: + Standard: # ARIA NOTE: wrong in spec + create: scripts/mongodb/create.sh + configure: + implementation: scripts/mongodb/config.sh + inputs: + mongodb_ip: { get_attribute: [ mongo_server, private_address ] } # ARIA NOTE: wrong in spec + start: scripts/mongodb/start.sh + + elasticsearch: + type: tosca.nodes.SoftwareComponent.Elasticsearch + requirements: + - host: elasticsearch_server + interfaces: + Standard: # ARIA NOTE: wrong in spec + create: scripts/elasticsearch/create.sh + start: scripts/elasticsearch/start.sh + + logstash: + type: tosca.nodes.SoftwareComponent.Logstash + requirements: + - host: logstash_server + # ARIA NOTE: mangled in the spec + - search_endpoint: + node: elasticsearch + relationship: + interfaces: + Configure: + pre_configure_source: + implementation: python/logstash/configure_elasticsearch.py + inputs: + elasticsearch_ip: { get_attribute: [ elasticsearch_server, private_address ] } # ARIA NOTE: wrong in spec + interfaces: + Standard: # ARIA NOTE: wrong in spec + create: scripts/lostash/create.sh + configure: scripts/logstash/config.sh + start: scripts/logstash/start.sh + + kibana: + type: tosca.nodes.SoftwareComponent.Kibana + requirements: + - host: kibana_server + - search_endpoint: elasticsearch + interfaces: + Standard: # ARIA NOTE: wrong in spec + create: scripts/kibana/create.sh + configure: + implementation: scripts/kibana/config.sh + inputs: + elasticsearch_ip: { get_attribute: [ elasticsearch_server, private_address ] } # ARIA NOTE: wrong in spec + kibana_ip: { get_attribute: [ kibana_server, private_address ] } # ARIA NOTE: wrong in spec + start: scripts/kibana/start.sh + + app_collectd: + type: tosca.nodes.SoftwareComponent.Collectd + requirements: + - host: app_server + # ARIA NOTE: mangled in the spec + - collectd_endpoint: + node: logstash + relationship: + interfaces: + Configure: + pre_configure_target: + implementation: python/logstash/configure_collectd.py + interfaces: + Standard: # ARIA NOTE: wrong in spec + create: scripts/collectd/create.sh + configure: + implementation: python/collectd/config.py + inputs: + logstash_ip: { get_attribute: [ logstash_server, private_address ] } # ARIA NOTE: wrong in spec + start: scripts/collectd/start.sh + + app_rsyslog: + type: tosca.nodes.SoftwareComponent.Rsyslog + requirements: + - host: app_server + # ARIA NOTE: mangled in the spec + - rsyslog_endpoint: + node: logstash + relationship: + interfaces: + Configure: + pre_configure_target: + implementation: python/logstash/configure_rsyslog.py + interfaces: + Standard: # ARIA NOTE: wrong in spec + create: scripts/rsyslog/create.sh + configure: + implementation: scripts/rsyslog/config.sh + inputs: + logstash_ip: { get_attribute: [ logstash_server, private_address ] } # ARIA NOTE: wrong in spec + start: scripts/rsyslog/start.sh + + app_server: + type: tosca.nodes.Compute + capabilities: + host: + properties: *host_capabilities + os: + properties: *os_capabilities + + mongo_server: + type: tosca.nodes.Compute + capabilities: + host: + properties: *host_capabilities + os: + properties: *os_capabilities + + elasticsearch_server: + type: tosca.nodes.Compute + capabilities: + host: + properties: *host_capabilities + os: + properties: *os_capabilities + + logstash_server: + type: tosca.nodes.Compute + capabilities: + host: + properties: *host_capabilities + os: + properties: *os_capabilities + + kibana_server: + type: tosca.nodes.Compute + capabilities: + host: + properties: *host_capabilities + os: + properties: *os_capabilities + + outputs: + nodejs_url: + description: URL for the nodejs server. + value: { get_attribute: [ app_server, private_address ] } + mongodb_url: + description: URL for the mongodb server. + value: { get_attribute: [ mongo_server, private_address ] } + elasticsearch_url: + description: URL for the elasticsearch server. + value: { get_attribute: [ elasticsearch_server, private_address ] } + logstash_url: + description: URL for the logstash server. + value: { get_attribute: [ logstash_server, private_address ] } + kibana_url: + description: URL for the kibana server. + value: { get_attribute: [ kibana_server, private_address ] } diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-1/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-1/inputs.yaml new file mode 100644 index 0000000..9687bb0 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-1/inputs.yaml @@ -0,0 +1 @@ +network_name: "network" \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-1/network-1.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-1/network-1.yaml new file mode 100644 index 0000000..c66964f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-1/network-1.yaml @@ -0,0 +1,49 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile with 1 server bound to a new network. + +metadata: + template_name: network-1 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +topology_template: + + inputs: + network_name: + type: string + description: Network name + + node_templates: + + my_server: + type: tosca.nodes.Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: 1 + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: Linux + distribution: CirrOS + version: 0.3.2 + + my_network: + type: tosca.nodes.network.Network + properties: + network_name: { get_input: network_name } + ip_version: 4 + cidr: '192.168.0.0/24' + start_ip: '192.168.0.50' + end_ip: '192.168.0.200' + gateway_ip: '192.168.0.1' + + my_port: + type: tosca.nodes.network.Port + requirements: + - binding: my_server + - link: my_network diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-2/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-2/inputs.yaml new file mode 100644 index 0000000..9687bb0 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-2/inputs.yaml @@ -0,0 +1 @@ +network_name: "network" \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-2/network-2.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-2/network-2.yaml new file mode 100644 index 0000000..017950d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-2/network-2.yaml @@ -0,0 +1,46 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile with 1 server bound to an existing network. + +metadata: + template_name: network-2 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +topology_template: + + inputs: + network_name: + type: string + description: Network name + + node_templates: + + my_server: + type: tosca.nodes.Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: 1 + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: Linux + distribution: CirrOS + version: 0.3.2 + + my_network: + type: tosca.nodes.network.Network + properties: + network_name: { get_input: network_name } + + my_port: + type: tosca.nodes.network.Port + requirements: + - binding: + node: my_server + - link: + node: my_network diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-3/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-3/inputs.yaml new file mode 100644 index 0000000..9687bb0 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-3/inputs.yaml @@ -0,0 +1 @@ +network_name: "network" \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-3/network-3.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-3/network-3.yaml new file mode 100644 index 0000000..5fa40b7 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-3/network-3.yaml @@ -0,0 +1,81 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile with 2 servers bound to the 1 network. + +metadata: + template_name: network-3 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +topology_template: + + inputs: + network_name: + type: string + description: Network name + network_cidr: + type: string + default: 10.0.0.0/24 + description: CIDR for the network + network_start_ip: + type: string + default: 10.0.0.100 + description: Start IP for the allocation pool + network_end_ip: + type: string + default: 10.0.0.150 + description: End IP for the allocation pool + + node_templates: + + my_server: + type: tosca.nodes.Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: 1 + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: Linux + distribution: CirrOS + version: 0.3.2 + + my_server2: + type: tosca.nodes.Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: 1 + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: Linux + distribution: CirrOS + version: 0.3.2 + + my_network: + type: tosca.nodes.network.Network + properties: + ip_version: 4 + cidr: { get_input: network_cidr } + network_name: { get_input: network_name } + start_ip: { get_input: network_start_ip } + end_ip: { get_input: network_end_ip } + + my_port: + type: tosca.nodes.network.Port + requirements: + - binding: my_server + - link: my_network + + my_port2: + type: tosca.nodes.network.Port + requirements: + - binding: my_server2 + - link: my_network diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-4/network-4.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-4/network-4.yaml new file mode 100644 index 0000000..5b51117 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/network-4/network-4.yaml @@ -0,0 +1,70 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile with 1 server bound to 3 networks. + +metadata: + template_name: network-4 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +topology_template: + + node_templates: + + my_server: + type: tosca.nodes.Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: 1 + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: Linux + distribution: CirrOS + version: 0.3.2 + + my_network1: + type: tosca.nodes.network.Network + properties: + cidr: '192.168.1.0/24' + network_name: net1 + + my_network2: + type: tosca.nodes.network.Network + properties: + cidr: '192.168.2.0/24' + network_name: net2 + + my_network3: + type: tosca.nodes.network.Network + properties: + cidr: '192.168.3.0/24' + network_name: net3 + + my_port1: + type: tosca.nodes.network.Port + properties: + order: 0 + requirements: + - binding: my_server + - link: my_network1 + + my_port2: + type: tosca.nodes.network.Port + properties: + order: 1 + requirements: + - binding: my_server + - link: my_network2 + + my_port3: + type: tosca.nodes.network.Port + properties: + order: 2 + requirements: + - binding: my_server + - link: my_network3 diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/non-normative-types.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/non-normative-types.yaml new file mode 100644 index 0000000..da89dcb --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/non-normative-types.yaml @@ -0,0 +1,177 @@ + +artifact_types: + + tosca.artifacts.Deployment.Image.Container.Docker: + _extensions: + specification: tosca-simple-1.0 + specification_section: 8.1.1 + derived_from: tosca.artifacts.Deployment.Image + description: Docker Container Image + + tosca.artifacts.Deployment.Image.VM.ISO: + _extensions: + specification: tosca-simple-1.0 + specification_section: 8.1.2 + derived_from: tosca.artifacts.Deployment.Image.VM + description: Virtual Machine (VM) image in ISO disk format + mime_type: application/octet-stream + file_ext: [ iso ] + + tosca.artifacts.Deployment.Image.VM.QCOW2: + _extensions: + specification: tosca-simple-1.0 + specification_section: 8.1.3 + derived_from: tosca.artifacts.Deployment.Image.VM + description: Virtual Machine (VM) image in QCOW v2 standard disk format + mime_type: application/octet-stream + file_ext: [ qcow2 ] + +capability_types: + + tosca.capabilities.Container.Docker: + _extensions: + specification: tosca-simple-1.0 + specification_section: 8.2.1 + derived_from: tosca.capabilities.Container + description: The type indicates capabilities of a Docker runtime environment (client). + properties: + version: + description: >- + The Docker version capability (i.e., the versions supported by the capability). + type: list + required: false + entry_schema: version + publish_all: + description: >- + Indicates that all ports (ranges) listed in the dockerfile using the EXPOSE keyword be + published. + type: boolean + default: false + required: false + publish_ports: + description: >- + List of ports mappings from source (Docker container) to target (host) ports to publish. + type: list + entry_schema: PortSpec + required: false + expose_ports: + description: >- + List of ports mappings from source (Docker container) to expose to other Docker containers + (not accessible outside host). + type: list + entry_schema: PortSpec + required: false + volumes: + description: >- + The dockerfile VOLUME command which is used to enable access from the Docker container to + a directory on the host machine. + type: list + entry_schema: string + required: false + # ARIA NOTE: these are missing in the spec + host_id: + description: >- + The optional identifier of an existing host resource that should be used to run this + container on. + type: string + required: false + volume_id: + description: >- + The optional identifier of an existing storage volume (resource) that should be used to + create the container's mount point(s) on. + type: string + required: false + + # ARIA NOTE: missing in spec + tosca.capabilities.Docker.Link: + derived_from: tosca.capabilities.Root + description: This is a capability that would mimic the Docker –link feature + +node_types: + + tosca.nodes.Database.MySQL: + _extensions: + specification: tosca-simple-1.0 + specification_section: 8.3.1 + derived_from: tosca.nodes.Database + requirements: + - host: + capability: tosca.capabilities.Container # ARIA NOTE: missing in spec + node: tosca.nodes.DBMS.MySQL + + tosca.nodes.DBMS.MySQL: + _extensions: + specification: tosca-simple-1.0 + specification_section: 8.3.2 + derived_from: tosca.nodes.DBMS + properties: + port: + description: reflect the default MySQL server port + type: integer # AIRA NOTE: missing in spec + default: 3306 + root_password: + # MySQL requires a root_password for configuration + # Override parent DBMS definition to make this property required + type: string # AIRA NOTE: missing in spec + required: true + capabilities: + # Further constrain the 'host' capability to only allow MySQL databases + host: + type: tosca.capabilities.Container # ARIA NOTE: missing in spec + valid_source_types: [ tosca.nodes.Database.MySQL ] + + tosca.nodes.WebServer.Apache: + _extensions: + specification: tosca-simple-1.0 + specification_section: 8.3.3 + derived_from: tosca.nodes.WebServer + + tosca.nodes.WebApplication.WordPress: + _extensions: + specification: tosca-simple-1.0 + specification_section: 8.3.4 + derived_from: tosca.nodes.WebApplication + properties: + admin_user: + type: string + required: false # ARIA NOTE: missing in spec + admin_password: + type: string + required: false # ARIA NOTE: missing in spec + db_host: + type: string + required: false # ARIA NOTE: missing in spec + requirements: + - database_endpoint: + capability: tosca.capabilities.Endpoint.Database + node: tosca.nodes.Database + relationship: tosca.relationships.ConnectsTo + + tosca.nodes.WebServer.Nodejs: + _extensions: + specification: tosca-simple-1.0 + specification_section: 8.3.5 + derived_from: tosca.nodes.WebServer + properties: + # Property to supply the desired implementation in the Github repository + github_url: + required: false + type: string + description: location of the application on the github. + default: https://github.com/mmm/testnode.git + interfaces: + Standard: + inputs: + github_url: + type: string + + tosca.nodes.Container.Application.Docker: + _extensions: + specification: tosca-simple-1.0 + specification_section: 8.3.6 + derived_from: tosca.nodes.Container.Application + requirements: + - host: + capability: tosca.capabilities.Container.Docker + - database_link: # ARIA NOTE: missing in spec + capability: tosca.capabilities.Docker.Link diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/object-storage-1/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/object-storage-1/inputs.yaml new file mode 100644 index 0000000..57f99a3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/object-storage-1/inputs.yaml @@ -0,0 +1 @@ +objectstore_name: "objectstore" \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/object-storage-1/object-storage-1.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/object-storage-1/object-storage-1.yaml new file mode 100644 index 0000000..c55a4db --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/object-storage-1/object-storage-1.yaml @@ -0,0 +1,24 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA template for creating an object storage service. + +metadata: + template_name: object-storage-1 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +topology_template: + + inputs: + objectstore_name: + type: string + + node_templates: + + obj_store_server: + type: tosca.nodes.ObjectStorage + properties: + name: { get_input: objectstore_name } + size: 4096 MB + maxsize: 20 GB diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/software-component-1/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/software-component-1/inputs.yaml new file mode 100644 index 0000000..c1ee88a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/software-component-1/inputs.yaml @@ -0,0 +1 @@ +cpus: 4 \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/software-component-1/software-component-1.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/software-component-1/software-component-1.yaml new file mode 100644 index 0000000..fc1cfd7 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/software-component-1/software-component-1.yaml @@ -0,0 +1,54 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA Simple Profile with a SoftwareComponent node with a declared Virtual machine (VM) deployment + artifact that automatically deploys to its host Compute node. + +metadata: + template_name: software-component-1 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +imports: + - ../non-normative-types.yaml + +topology_template: + + # ARIA NOTE: missing in spec + inputs: + cpus: + type: integer + description: Number of CPUs for the server. + constraints: + - valid_values: [ 1, 2, 4, 8 ] + + node_templates: + + my_virtual_machine: + type: SoftwareComponent + artifacts: + my_vm_image: + file: images/fedora-18-x86_64.qcow2 + type: tosca.artifacts.Deployment.Image.VM.QCOW2 + requirements: + - host: my_server + # Automatically deploy the VM image referenced on the create operation + interfaces: + Standard: + create: my_vm_image + + # Compute instance with no Operating System guest host + my_server: + type: Compute + capabilities: + # Note: no guest OperatingSystem requirements as these are in the image. + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: cpus } + mem_size: 4 GB + + outputs: + private_ip: + description: The private IP address of the deployed server instance. + value: { get_attribute: [ my_server, private_address ] } diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/webserver-dbms-1/webserver-dbms-1.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/webserver-dbms-1/webserver-dbms-1.yaml new file mode 100644 index 0000000..daa24df --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/webserver-dbms-1/webserver-dbms-1.yaml @@ -0,0 +1,122 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile with WordPress, a web server, a MySQL DBMS hosting the application's database + content on the same server. Does not have input defaults or constraints. + +metadata: + template_name: webserver-dbms-1 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +imports: + - ../non-normative-types.yaml + +topology_template: + + inputs: + cpus: + type: integer + description: Number of CPUs for the server. + db_name: + type: string + description: The name of the database. + db_user: + type: string + description: The username of the DB user. + db_pwd: + type: string + description: The WordPress database admin account password. + db_root_pwd: + type: string + description: Root password for MySQL. + db_port: + type: PortDef + description: Port for the MySQL database + # ARIA NOTE: missing in spec + context_root: + type: string + description: Context root for WordPress. + + node_templates: + + wordpress: + type: tosca.nodes.WebApplication.WordPress + properties: + context_root: { get_input: context_root } + requirements: + - host: webserver + - database_endpoint: mysql_database + interfaces: + Standard: + create: wordpress_install.sh + configure: + implementation: wordpress_configure.sh + inputs: + wp_db_name: { get_property: [ mysql_database, name ] } + wp_db_user: { get_property: [ mysql_database, user ] } + wp_db_password: { get_property: [ mysql_database, password ] } + # In my own template, find requirement/capability, find port property + wp_db_port: { get_property: [ SELF, database_endpoint, port ] } + + mysql_database: + type: Database + properties: + name: { get_input: db_name } + user: { get_input: db_user } + password: { get_input: db_pwd } + port: { get_input: db_port } + capabilities: + database_endpoint: + properties: + port: { get_input: db_port } + requirements: + - host: mysql_dbms + interfaces: + Standard: + configure: mysql_database_configure.sh + + mysql_dbms: + type: DBMS + properties: + root_password: { get_input: db_root_pwd } + port: { get_input: db_port } + requirements: + - host: server + interfaces: + Standard: + # ARIA NOTE: not declared in spec + #inputs: + # db_root_password: { get_property: [ mysql_dbms, root_password ] } + create: mysql_dbms_install.sh + start: mysql_dbms_start.sh + configure: mysql_dbms_configure.sh + + webserver: + type: WebServer + requirements: + - host: server + interfaces: + Standard: + create: webserver_install.sh + start: webserver_start.sh + + server: + type: Compute + capabilities: + host: + properties: + disk_size: 10 GB + num_cpus: { get_input: cpus } + mem_size: 4096 MB + os: + properties: + architecture: x86_64 + type: linux + distribution: fedora + version: 17.0 + + outputs: + website_url: + description: URL for Wordpress wiki. + value: { get_attribute: [ server, public_address ] } diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/webserver-dbms-2/custom_types/paypalpizzastore_nodejs_app.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/webserver-dbms-2/custom_types/paypalpizzastore_nodejs_app.yaml new file mode 100644 index 0000000..02bb399 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/webserver-dbms-2/custom_types/paypalpizzastore_nodejs_app.yaml @@ -0,0 +1,15 @@ +# ARIA NOTE: missing in spec + +node_types: + + tosca.nodes.WebApplication.PayPalPizzaStore: + derived_from: tosca.nodes.WebApplication + properties: + github_url: + type: string + requirements: + - database_connection: + capability: tosca.capabilities.Node + + tosca.nodes.WebServer.Nodejs: + derived_from: tosca.nodes.WebServer diff --git a/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/webserver-dbms-2/webserver-dbms-2.yaml b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/webserver-dbms-2/webserver-dbms-2.yaml new file mode 100644 index 0000000..91f0b35 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/examples/tosca-simple-1.0/use-cases/webserver-dbms-2/webserver-dbms-2.yaml @@ -0,0 +1,115 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile with a nodejs web server hosting a PayPal sample application which connects + to a mongodb database. + +metadata: + template_name: webserver-dbms-2 + template_author: TOSCA Simple Profile in YAML + template_version: '1.0' + +imports: + - custom_types/paypalpizzastore_nodejs_app.yaml + +dsl_definitions: + + ubuntu_node: &ubuntu_node + disk_size: 10 GB + num_cpus: { get_input: my_cpus } + mem_size: 4096 MB + os_capabilities: &os_capabilities + architecture: x86_64 + type: Linux + distribution: Ubuntu + version: 14.04 + +topology_template: + + inputs: + my_cpus: + type: integer + description: Number of CPUs for the server. + constraints: + - valid_values: [ 1, 2, 4, 8 ] + default: 1 + github_url: + type: string + description: The URL to download nodejs. + default: https://github.com/sample.git + + node_templates: + + paypal_pizzastore: + type: tosca.nodes.WebApplication.PayPalPizzaStore + properties: + github_url: { get_input: github_url } + requirements: + - host: nodejs + - database_connection: mongo_db + interfaces: + Standard: + configure: + implementation: scripts/nodejs/configure.sh + inputs: + github_url: { get_property: [ SELF, github_url ] } + mongodb_ip: { get_attribute: [ mongo_server, private_address ] } + start: scripts/nodejs/start.sh + + nodejs: + type: tosca.nodes.WebServer.Nodejs + requirements: + - host: app_server + interfaces: + Standard: + create: scripts/nodejs/create.sh + + mongo_db: + type: tosca.nodes.Database + properties: + name: 'pizzastore' # ARIA NOTE: missing in spec + requirements: + - host: mongo_dbms + interfaces: + Standard: + create: create_database.sh + + mongo_dbms: + type: tosca.nodes.DBMS + requirements: + - host: mongo_server + properties: + port: 27017 + interfaces: + Standard: # ARIA NOTE: mistaken in spec + create: mongodb/create.sh + configure: + implementation: mongodb/config.sh + inputs: + mongodb_ip: { get_attribute: [ mongo_server, private_address ] } + start: mongodb/start.sh + + mongo_server: + type: tosca.nodes.Compute + capabilities: + os: + properties: *os_capabilities + host: + properties: *ubuntu_node + + app_server: + type: tosca.nodes.Compute + capabilities: + os: + properties: *os_capabilities + host: + properties: *ubuntu_node + + outputs: + + nodejs_url: + description: URL for the nodejs server, http://:3000 + value: { get_attribute: [ app_server, private_address ] } + mongodb_url: + description: URL for the mongodb server. + value: { get_attribute: [ mongo_server, private_address ] } diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/__init__.py new file mode 100644 index 0000000..ff4fa7d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/__init__.py @@ -0,0 +1,56 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 + +from aria import extension + +from .simple_v1_0 import ToscaSimplePresenter1_0 +from .simple_nfv_v1_0 import ToscaSimpleNfvPresenter1_0 + + +@extension.parser +class ParserExtensions(object): + + @staticmethod + def presenter_class(): + return ToscaSimplePresenter1_0, ToscaSimpleNfvPresenter1_0 + + @staticmethod + def specification_package(): + return 'aria_extension_tosca' + + @staticmethod + def specification_url(): + return { + 'yaml-1.1': 'http://yaml.org', + 'tosca-simple-1.0': 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/' + 'cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html', + 'tosca-simple-nfv-1.0': 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/' + 'tosca-nfv-v1.0.html' + } + + @staticmethod + def uri_loader_prefix(): + the_dir = os.path.dirname(__file__) + return os.path.join(the_dir, 'profiles') + + +MODULES = ( + 'simple_v1_0', + 'simple_nfv_v1_0') + +__all__ = ( + 'MODULES',) diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml new file mode 100644 index 0000000..e421150 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml @@ -0,0 +1,97 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +policy_types: + + aria.Plugin: + _extensions: + shorthand_name: Plugin + type_qualified_name: aria:Plugin + role: plugin + description: >- + Policy used to specify plugins used by services. For an operation to be able to use a plugin + it must have a matching policy. The name of the policy must be the name of the plugin. The + optional properties can be used to further specify plugin selection by the orchestrator. + derived_from: tosca.policies.Root + properties: + version: + description: >- + Minimum plugin version. + type: version + required: false + enabled: + description: >- + If the policy is to disable the plugin then it will be ignored and all operations and + workflows depending on it will also be disabled. + type: boolean + default: true + + aria.Workflow: + _extensions: + shorthand_name: Workflow + type_qualified_name: aria:Workflow + role: workflow + description: >- + Policy used to specify custom workflows. A workflow is usually a workload of interconnected + calls to operations on nodes and relationships in the service topology. The name of the policy + is used as the name of the workflow. Note that it can be the same name as one of the normative + lifecycle workflows ("install", "uninstall", etc.), in which case it would be considered an + override of the default behavior. If the workflow requires parameters then this base type + should be inherited and extended with additional properties. + derived_from: tosca.policies.Root + properties: + implementation: + description: >- + The interpretation of the implementation string depends on the orchestrator. In ARIA it is + the full path to a Python @workflow function that generates a task graph based on the + service topology. + type: string + + aria.Scaling: + _extensions: + type_qualified_name: aria:Scaling + role: scaling + description: >- + Scaling. + derived_from: tosca.policies.Scaling + properties: + min_instances: + description: >- + This property is used to indicate the minimum number of instances that should be created + for the associated TOSCA Node Template by a TOSCA orchestrator. + type: integer + default: 1 + constraints: + - greater_or_equal: 0 + max_instances: + description: >- + This property is used to indicate the maximum number of instances that should be created + for the associated TOSCA Node Template by a TOSCA orchestrator. + type: integer + default: 1 + constraints: + - greater_or_equal: 0 + default_instances: + description: >- + An optional property that indicates the requested default number of instances that should + be the starting number of instances a TOSCA orchestrator should attempt to allocate. Note: + The value for this property MUST be in the range between the values set for + "min_instances" and "max_instances" properties. + type: integer + constraints: + - greater_or_equal: 0 + required: false + targets: + - tosca.nodes.Root diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/azure-plugin/azureplugin.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/azure-plugin/azureplugin.yaml new file mode 100644 index 0000000..77b61b5 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/azure-plugin/azureplugin.yaml @@ -0,0 +1,1981 @@ +# +# Copyright (c) 2017 GigaSpaces Technologies Ltd. All rights reserved. +# +# 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. +# +tosca_definitions_version: tosca_simple_yaml_1_0 + + +topology_template: + policies: + cloudify-azure-plugin: + description: >- + azure plugin executes operations. + type: aria.Plugin + properties: + version: 1.4.2 + + +data_types: + + aria.azure.datatypes.Config: + description: >- + azure configuration + properties: + subscription_id: + description: > + A Microsoft Azure subscription ID. This is a unique + user account in Azure. This can be found in the + Subscriptions tab on your dashboard. + type: string + required: false + tenant_id: + description: > + A Microsoft Azure tenant ID. This can be found in + the Azure Active Directory dashboard by accessing + your directory. Open the Application Endpoints + dialog and your tenant ID will be in the URL for + the OAUTH2.0 TOKEN ENDPOINT. + type: string + required: false + client_id: + description: > + A Microsoft Azure client ID. This can be found in + the Azure Active Directory dashboard by accessing + your directory. View the Applications tab and select + the application used to access Azure APIs. Your + client ID can be found by expanding the ACCESS WEB + APIS IN OTHER APPLICATIONS tab. + type: string + required: false + client_secret: + description: > + A Microsoft Azure client secret key. This can be found + or generated in the same location as your client ID. + type: string + required: false + scale_name_separator: + description: > + When scaling resources, a unique name must be sent to + the Azure API. Since names are left to the user to + manage (the service does not generate unique IDs), + this plugin will attempt to append characters or + numbers to the end of the resource name when resources + are scaled out. This value should be a character, or + characters, that will separate the base name from the + generated unique characters. For instance, if the + base name of a resource is "myvm", the separator is + set to "_", and a scale workflow attempts to create + another resource, the resulting name could be + something like "myvm_1". This field can be left blank. + type: string + required: false + default: "_" + scale_name_suffix_chars: + description: > + A string of characters (ASCII) to be used when + generating unique suffix data when scaling resources. + See "scale_name_separator" for more information. + type: string + required: true + default: "1234567890" + + aria.azure.datatypes.AgentConfig: + properties: + install_method: + type: string + required: false + port: + type: integer + required: false + + + aria.azure.datatypes.StorageAccountConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt163564.aspx + properties: + accountType: + description: > + An storage account type (case sensitive) + type: string + default: Standard_LRS + required: true + + aria.azure.datatypes.DataDiskConfig: + properties: + container_name: + type: string + description: > + Container for the resource. + default: vhds + size: + description: > + Size of the Page Blob (Azure disk) in GiB. Maximum of 1023 GiB allowed. + type: integer + default: 20 + required: true + force_delete: + description: > + If set to true, the resource's "delete" lifecycle will purge the + Azure Data Disk from the Azure Storage Account. If false, the + Data Disk is left as-is in the Storage Account. + type: boolean + default: false + + + aria.azure.datatypes.FileShareConfig: + properties: + metadata: + description: > + Metadata (dict) for the File Share + required: false + type: string + quota: + description: > + Quote, in GiB, for the maximum size of the file share + required: false + type: integer + fail_on_exist: + description: > + If true, causes the operation to raise a NonRecoverableError if + the file share already exists. If false, issues a warning and + continues execution. + default: false + type: boolean + + aria.azure.datatypes.AddressSpace: + description: > + Contains the address prefix,typically network CIDR + properties: + addressPrefixes: + required: true + type: list + entry_schema: string + + aria.azure.datatypes.VirtualNetworkConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt163661.aspx + properties: + addressSpace: + default: + addressPrefixes: + - 172.16.0.0/16 + required: true + type: aria.azure.datatypes.AddressSpace + dhcpOptions: + required: false + type: string + subnets: + required: false + type: string + + aria.azure.datatypes.NetworkSecurityGroupConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt163656.aspx + properties: + securityRules: + required: false + type: list + entry_schema: string + + + + aria.azure.datatypes.NetworkSecurityRuleConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt163645.aspx + properties: + description: + type: string + required: false + protocol: + type: string + required: true + sourcePortRange: + type: string + required: false + destinationPortRange: + type: string + required: false + sourceAddressPrefix: + type: string + required: true + destinationAddressPrefix: + type: string + required: true + access: + type: string + required: true + priority: + type: integer + required: true + direction: + type: string + required: true + + aria.azure.datatypes.SubnetConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt163621.aspx + properties: + addressPrefix: + type: string + required: false + networkSecurityGroup: + type: string + required: false + routeTable: + type: string + required: false + + + + + + + + aria.azure.datatypes.RouteTableConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt502548.aspx + properties: + routes: + type: string + required: false + + + aria.azure.datatypes.RouteConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt459110.aspx + properties: + addressPrefix: + type: string + required: true + nextHopType: + type: string + required: true + nextHopIpAddress: + type: string + required: false + + + aria.azure.datatype.NetworkInterfaceDnsSettings: + description: > + See https://msdn.microsoft.com/en-us/library/mt163668.aspx + properties: + appliedDnsServers: + type: list + entry_schema: string + required: false + dnsServers: + type: list + entry_schema: string + required: false + internalDnsNameLabel: + type: string + required: false + internalDomainNameSuffix: + type: string + required: false + internalFqdn: + type: string + required: false + + + aria.azure.datatypes.NetworkInterfaceCardConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt163668.aspx + properties: + networkSecurityGroups: + required: false + type: string + enableIPForwarding: + required: false + type: boolean + ipConfigurations: + required: false + type: string + dnsSettings: + required: false + type: aria.azure.datatype.NetworkInterfaceDnsSettings + + + aria.azure.datatypes.IPConfigurationConfig: + properties: + privateIPAddress: + type: string + description: > + Static, private IP Address + required: false + privateIPAllocationMethod: + type: string + description: > + Defines how a private IP address is assigned. Options + are Static or Dynamic + required: true + privateIPAddressVersion: + type: string + description: > + Define the version of the IP protocol + required: false + + + aria.azure.datatypes.PublicIPAddressDnsSettings: + description: > + See https://docs.microsoft.com/en-gb/rest/api/virtualnetwork/PublicIPAddresses/CreateOrUpdate#definitions_publicipaddressdnssettings + properties: + domainNameLabel: + type: string + description: > + name refer to the VM + required: false + fqdn: + type: string + required: false + reverseFqdn: + type: string + required: false + + aria.azure.datatypes.PublicIPAddressConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt163590.aspx + properties: + publicIPAllocationMethod: + type: string + description: > + Defines whether the IP address is stable or dynamic. + Options are Static or Dynamic + required: true + publicIPAddressVersion: + type: string + description: + Define the version of the public IP. + required: false + idleTimeoutInMinutes: + type: integer + description: > + Specifies the timeout (in minutes) for the TCP idle connection. + The value can be set between 4 and 30 minutes + required: false + dnsSettings: + type: aria.azure.datatypes.PublicIPAddressDnsSettings + required: false +# domainNameLabel: +# type: string +# description: > +# The concatenation of the domain name label and the regionalized +# DNS zone make up the fully qualified domain name associated +# with the public IP address. +# required: false +# reverseFqdn: +# type: string +# description: > +# A fully qualified domain name that resolves to this +# public IP address. +# required: false + + + + + + + aria.azure.datatypes.AvailabilitySetConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt163607.aspx + properties: + platformUpdateDomainCount: + type: integer + required: false + platformFaultDomainCount: + type: integer + required: false + + + + aria.azure.datatypes.HardwareProfile: + properties: + vmSize: + required: true + type: string + + + aria.azure.datatypes.ImageReference: + properties: + publisher: + required: true + type: string + offer: + required: true + type: string + sku: + required: true + type: string + version: + required: true + type: string + + + aria.azure.datatypes.StorageProfile: + properties: + imageReference: + required: true + type: aria.azure.datatypes.ImageReference + + + + + aria.azure.datatypes.PublicKey: + properties: + keydata: + required: true + type: string + path: + required: true + type: string + + aria.azure.datatypes.SSH: + properties: + publicKeys: + required: false + type: list + entry_schema: aria.azure.datatypes.PublicKey + + + aria.azure.datatypes.LinuxConfiguration: + properties: + ssh: + required: false + type: aria.azure.datatypes.SSH + disablePasswordAuthentication: + required: false + default: true + type: boolean + + + aria.azure.datatypes.OSProfile: + properties: + computerName: + required: true + type: string + adminUserName: + required: true + type: string + adminPassword: + required: true + type: string + linuxConfiguration: + required: false + type: aria.azure.datatypes.LinuxConfiguration + + + + aria.azure.datatypes.VirtualMachineConfig: + description: > + https://msdn.microsoft.com/en-us/library/azure/mt163591.aspx + properties: + hardwareProfile: + required: true + type: aria.azure.datatypes.HardwareProfile + storageProfile: + required: true + type: aria.azure.datatypes.StorageProfile + osProfile: + required: true + type: aria.azure.datatypes.OSProfile + + aria.azure.datatypes.LoadBalancerConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt163574.aspx + properties: + frontendIPConfigurations: + required: false + type: string + backendAddressPools: + required: false + type: string + loadBalancingRules: + required: false + type: string + probes: + required: false + type: string + inboundNatRules: + required: false + type: string + + + + aria.azure.datatypes.LoadBalancerProbeConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt163574.aspx + properties: + protocol: + type: string + default: Tcp + required: true + port: + type: integer + required: true + requestPath: + type: string + required: false + intervalInSeconds: + type: integer + default: 5 + required: true + numberOfProbes: + type: integer + default: 16 + required: true + + aria.azure.datatypes.LoadBalancerIncomingNATRuleConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt163574.aspx + properties: + protocol: + type: string + default: Tcp + required: true + frontendPort: + type: integer + required: true + backendPort: + type: integer + required: true + + + aria.azure.datatypes.LoadBalancerRuleConfig: + description: > + See https://msdn.microsoft.com/en-us/library/mt163574.aspx + properties: + protocol: + type: string + default: Tcp + required: true + frontendPort: + type: integer + required: true + backendPort: + type: integer + required: true + enableFloatingIP: + type: boolean + required: false + default: false + idleTimeoutInMinutes: + type: integer + required: false + default: 5 + loadDistribution: + type: string + required: false + default: Default + + + + + +interface_types: + + aria.azure.interfaces.validation: + derived_from: tosca.interfaces.Root + creation: + description: >- + creation operation for the openstack validation interface + deletion: + description: >- + deletion operation for the openstack validation interface + aria.azure.interfaces.network: + derived_from: tosca.interfaces.Root + preconfigure: + establish: + unlink: + +node_types: + + aria.azure.nodes.ResourceGroup: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. Resource group name must be no longer than + 80 characters long. It can contain only alphanumeric characters, + dash, underscore, opening parenthesis, closing parenthesis, + and period. The name cannot end with a period. + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.resourcegroup.create + delete: cloudify-azure-plugin > cloudify_azure.resources.resourcegroup.delete + + + + + + + + aria.azure.nodes.storage.StorageAccount: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. Storage account name must be between + 3 and 24 characters in length and use numbers and lower-case + letters only. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.StorageAccountConfig + required: true + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.storage.storageaccount.create + delete: cloudify-azure-plugin > cloudify_azure.resources.storage.storageaccount.delete + requirements: + - resource_group: + capability: tosca.capabilities.Node + node: aria.azure.nodes.ResourceGroup + relationship: cloudify.azure.relationships.contained_in_resource_group + occurrences: [ 0, UNBOUNDED ] + + + + aria.azure.nodes.storage.DataDisk: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource (include any extension, such as .vhd). + Can be up to 80 characters in length and + contain lowercase letters, numbers, ".", and "_". Must start + with a number or lowercase letter and cannot end with + either "_" or "." + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.DataDiskConfig + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.storage.disk.create_data_disk + delete: cloudify-azure-plugin > cloudify_azure.resources.storage.disk.delete_data_disk + requirements: + - storage_account: + capability: tosca.capabilities.Node + node: aria.azure.nodes.storage.StorageAccount + relationship: cloudify.azure.relationships.contained_in_storage_account + occurrences: [ 0, UNBOUNDED ] + + aria.azure.nodes.storage.FileShare: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. Can be up to 63 characters in length and + contain lowercase letters, numbers, and dashes. Must start + with a number or lowercase letter and cannot contain + two consecutive dashes. + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.FileShareConfig + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.storage.file.create_file_share + + + + + aria.azure.nodes.network.VirtualNetwork: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.VirtualNetworkConfig + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.network.virtualnetwork.create + delete: cloudify-azure-plugin > cloudify_azure.resources.network.virtualnetwork.delete + requirements: + - resource_group: + capability: tosca.capabilities.Node + node: aria.azure.nodes.ResourceGroup + relationship: cloudify.azure.relationships.contained_in_resource_group + occurrences: [ 0, UNBOUNDED ] + - storage_account: + capability: tosca.capabilities.Node + node: aria.azure.nodes.storage.StorageAccount + relationship: cloudify.azure.relationships.virtual_network_depends_on_storage + occurrences: [ 0, UNBOUNDED ] + + + + aria.azure.nodes.network.NetworkSecurityGroup: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.NetworkSecurityGroupConfig + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.network.networksecuritygroup.create + delete: cloudify-azure-plugin > cloudify_azure.resources.network.networksecuritygroup.delete + requirements: + - resource_group: + capability: tosca.capabilities.Node + node: aria.azure.nodes.ResourceGroup + relationship: cloudify.azure.relationships.contained_in_resource_group + occurrences: [ 0, UNBOUNDED ] + + + + aria.azure.nodes.network.NetworkSecurityRule: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + network_security_group_name: + type: string + description: > + Name of the Network Security Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Network Security Groupnode) + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.NetworkSecurityRuleConfig + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.network.networksecurityrule.create + delete: cloudify-azure-plugin > cloudify_azure.resources.network.networksecurityrule.delete + requirements: + - resource_group: + capability: tosca.capabilities.Node + node: aria.azure.nodes.ResourceGroup + relationship: cloudify.azure.relationships.contained_in_resource_group + occurrences: [ 0, UNBOUNDED ] + - network_security_group: + capability: tosca.capabilities.Node + node: aria.azure.nodes.network.NetworkSecurityGroup + relationship: cloudify.azure.relationships.nic_connected_to_network_security_group + occurrences: [ 0, UNBOUNDED ] + + + + aria.azure.nodes.network.Subnet: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + virtual_network_name: + type: string + description: > + Name of the Virtual Network that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Virtual Network node) + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.SubnetConfig + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.network.subnet.create + delete: cloudify-azure-plugin > cloudify_azure.resources.network.subnet.delete + requirements: + - virtual_network: + capability: tosca.capabilities.Node + node: aria.azure.nodes.network.VirtualNetwork + relationship: cloudify.azure.relationships.contained_in_virtual_network + occurrences: [ 0, UNBOUNDED ] + - subnet_dependency: + capability: tosca.capabilities.Node + node: aria.azure.nodes.network.Subnet + relationship: cloudify.azure.relationships.depends_on_subnet + occurrences: [ 0, UNBOUNDED ] + + + + aria.azure.nodes.network.RouteTable: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.RouteTableConfig + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.network.routetable.create + delete: cloudify-azure-plugin > cloudify_azure.resources.network.routetable.delete + requirements: + - virtual_subnet: + capability: tosca.capabilities.Node + node: aria.azure.nodes.network.Subnet + relationship: cloudify.azure.relationships.route_table_attached_to_subnet + occurrences: [ 0, UNBOUNDED ] + + aria.azure.nodes.network.Route: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + route_table_name: + type: string + description: > + Name of the Network Security Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Virtual Network node) + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.RouteConfig + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.network.route.create + delete: cloudify-azure-plugin > cloudify_azure.resources.network.route.delete + requirements: + - route_table: + capability: tosca.capabilities.Node + node: aria.azure.nodes.network.RouteTable + relationship: cloudify.azure.relationships.depends_on_route_table + occurrences: [ 0, UNBOUNDED ] + + + aria.azure.nodes.network.NetworkInterfaceCard: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + primary: + description: > + When using multiple Network Interfaces, a primary must be set + required: false + default: false + type: boolean + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.NetworkInterfaceCardConfig + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.network.networkinterfacecard.create + configure: cloudify-azure-plugin > cloudify_azure.resources.network.networkinterfacecard.configure + delete: cloudify-azure-plugin > cloudify_azure.resources.network.networkinterfacecard.delete + requirements: + - resource_group: + capability: tosca.capabilities.Node + node: aria.azure.nodes.ResourceGroup + relationship: cloudify.azure.relationships.contained_in_resource_group + occurrences: [ 0, UNBOUNDED ] + - ip_config: + capability: tosca.capabilities.Node + node: aria.azure.nodes.network.IPConfiguration + relationship: cloudify.azure.relationships.nic_connected_to_ip_configuration + occurrences: [ 0, UNBOUNDED ] + - security_group: + capability: tosca.capabilities.Node + node: aria.azure.nodes.network.NetworkSecurityGroup + relationship: cloudify.azure.relationships.nic_connected_to_network_security_group + occurrences: [ 0, UNBOUNDED ] + + + + aria.azure.nodes.network.IPConfiguration: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.IPConfigurationConfig + required: true + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + requirements: + - subnet: + capability: tosca.capabilities.Node + node: aria.azure.nodes.network.Subnet + relationship: cloudify.azure.relationships.ip_configuration_connected_to_subnet + occurrences: [ 0, UNBOUNDED ] + - ipaddress: + capability: tosca.capabilities.Node + node: aria.azure.nodes.network.PublicIPAddress + relationship: cloudify.azure.relationships.ip_configuration_connected_to_public_ip + occurrences: [ 0, UNBOUNDED ] + occurrences: [ 0, UNBOUNDED ] + + aria.azure.nodes.network.PublicIPAddress: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.PublicIPAddressConfig + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.network.publicipaddress.create + delete: cloudify-azure-plugin > cloudify_azure.resources.network.publicipaddress.delete + requirements: + - resource_group: + capability: tosca.capabilities.Node + node: aria.azure.nodes.ResourceGroup + relationship: cloudify.azure.relationships.contained_in_resource_group + occurrences: [ 0, UNBOUNDED ] + + aria.azure.nodes.compute.AvailabilitySet: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.AvailabilitySetConfig + required: true + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.compute.availabilityset.create + delete: cloudify-azure-plugin > cloudify_azure.resources.compute.availabilityset.delete + + + aria.azure.nodes.compute.VirtualMachine: + derived_from: tosca.nodes.Compute + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + use_public_ip: + type: boolean + description: > + Tells the deployment to use the public IP (if available) of the resource + for Cloudify Agent connections + default: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + plan: + description: > + Specifies information about the marketplace image used to create the virtual + machine. This element is only used for marketplace images. + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.VirtualMachineConfig + required: true + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + ip: + description: | + Property specifying the IP address of the resource to + use for the agent installer. + type: string + required: false + os_family: + description: | + Property specifying what type of operating system family + this compute node will run. + default: windows + type: string + agent_config: + type: aria.azure.datatypes.AgentConfig + default: + install_method: remote + port: 5985 + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.compute.virtualmachine.create +# configure: +# implementation: cloudify-azure-plugin > cloudify_azure.resources.compute.virtualmachine.configure +# inputs: +# command_to_execute: +# description: > +# This is the command that the CustomScriptExtension extension will +# execute. The file_uris below will be downloaded and this property +# should specify a command to start the execution of one of them. +# default: powershell -ExecutionPolicy Unrestricted -file ps_enable_winrm_http.ps1 +# file_uris: +# default: +# - https://raw.githubusercontent.com/cloudify-cosmo/cloudify-azure-plugin/1.4/scripts/ps_enable_winrm_http.ps1 + delete: cloudify-azure-plugin > cloudify_azure.resources.compute.virtualmachine.delete + requirements: + - resource_group: + capability: tosca.capabilities.Node + node: aria.azure.nodes.ResourceGroup + relationship: cloudify.azure.relationships.contained_in_resource_group + occurrences: [ 0, UNBOUNDED ] + - nic: + capability: tosca.capabilities.Node + node: aria.azure.nodes.network.NetworkInterfaceCard + relationship: cloudify.azure.relationships.connected_to_nic + occurrences: [ 0, UNBOUNDED ] + - storage_account: + capability: tosca.capabilities.Node + node: aria.azure.nodes.storage.StorageAccount + relationship: cloudify.azure.relationships.connected_to_storage_account + - data_disk: + capability: tosca.capabilities.Node + node: aria.azure.nodes.storage.DataDisk + relationship: cloudify.azure.relationships.vm_connected_to_datadisk + occurrences: [ 0, UNBOUNDED ] + + + + aria.azure.nodes.network.LoadBalancer: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.LoadBalancerConfig + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.create + configure: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.configure + delete: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.delete + + + + + aria.azure.nodes.network.LoadBalancer.BackendAddressPool: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + load_balancer_name: + type: string + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.create_backend_pool + delete: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.delete_backend_pool + + + + aria.azure.nodes.network.LoadBalancer.Probe: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + load_balancer_name: + type: string + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.LoadBalancerProbeConfig + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.create_probe + delete: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.delete_probe + + + aria.azure.nodes.network.LoadBalancer.IncomingNATRule: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + load_balancer_name: + type: string + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.LoadBalancerIncomingNATRuleConfig + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.create_incoming_nat_rule + delete: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.delete_incoming_nat_rule + + + + aria.azure.nodes.network.LoadBalancer.Rule: + derived_from: tosca.nodes.Root + properties: + name: + type: string + description: > + Name for the resource. + required: false + resource_group_name: + type: string + description: > + Name of the Resource Group that the existing resource belongs to + (this is only useful when not using a relationship between a resource + node and a Resource Group node) + required: false + load_balancer_name: + type: string + required: false + location: + type: string + description: > + Specifies the supported Azure location for the resource + required: false + tags: + description: > + Specifies a dictionary of one or more name and value pairs that describe a tag + required: false + type: string + resource_config: + description: > + A dictionary of values to pass as properties when creating the resource + type: aria.azure.datatypes.LoadBalancerRuleConfig + required: false + use_external_resource: + description: > + Indicate whether the resource exists or if Cloudify should create the resource + type: boolean + default: false + required: true + retry_after: + description: > + Overrides the Azure-specified "retry_after" response. This property + will set the number of seconds for each task retry interval (in the + case of iteratively checking the status of an asynchronous operation) + type: integer + required: false + azure_config: + description: > + A dictionary of values to pass to authenticate with the Azure API + type: aria.azure.datatypes.Config + required: false + interfaces: + Standard: + create: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.create_rule + delete: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.delete_rule + + + + + +relationship_types: + cloudify.azure.relationships.contained_in_resource_group: + derived_from: tosca.relationships.HostedOn + + cloudify.azure.relationships.contained_in_storage_account: + derived_from: tosca.relationships.HostedOn + + cloudify.azure.relationships.contained_in_virtual_network: + derived_from: tosca.relationships.HostedOn + + cloudify.azure.relationships.contained_in_network_security_group: + derived_from: tosca.relationships.HostedOn + + cloudify.azure.relationships.contained_in_route_table: + derived_from: tosca.relationships.HostedOn + + cloudify.azure.relationships.contained_in_load_balancer: + derived_from: tosca.relationships.HostedOn + + cloudify.azure.relationships.depends_on_route_table: + derived_from: tosca.relationships.DependsOn + + cloudify.azure.relationships.depends_on_subnet: + derived_from: tosca.relationships.DependsOn + + cloudify.azure.relationships.virtual_network_depends_on_storage: + derived_from: tosca.relationships.DependsOn + + cloudify.azure.relationships.network_security_group_attached_to_subnet: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_source: cloudify-azure-plugin > cloudify_azure.resources.network.subnet.attach_network_security_group + remove_source: cloudify-azure-plugin > cloudify_azure.resources.network.subnet.detach_network_security_group + + cloudify.azure.relationships.route_table_attached_to_subnet: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_source: cloudify-azure-plugin > cloudify_azure.resources.network.subnet.attach_route_table + remove_source: cloudify-azure-plugin > cloudify_azure.resources.network.subnet.detach_route_table + + cloudify.azure.relationships.nic_connected_to_network_security_group: + derived_from: tosca.relationships.ConnectsTo + + cloudify.azure.relationships.nic_connected_to_ip_configuration: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + pre_configure_source: cloudify-azure-plugin > cloudify_azure.resources.network.networkinterfacecard.attach_ip_configuration + + cloudify.azure.relationships.lb_connected_to_ip_configuration: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + preconfigure: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.attach_ip_configuration + + cloudify.azure.relationships.ip_configuration_connected_to_subnet: + derived_from: tosca.relationships.ConnectsTo + + cloudify.azure.relationships.ip_configuration_connected_to_public_ip: + derived_from: tosca.relationships.ConnectsTo + + cloudify.azure.relationships.connected_to_storage_account: + derived_from: tosca.relationships.ConnectsTo + + cloudify.azure.relationships.connected_to_data_disk: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_target: cloudify-azure-plugin > cloudify_azure.resources.compute.virtualmachine.attach_disk + remove_target: cloudify-azure-plugin > cloudify_azure.resources.compute.virtualmachine.detach_disk + + + cloudify.azure.relationships.connected_to_nic: + derived_from: tosca.relationships.ConnectsTo + + + cloudify.azure.relationships.connected_to_availability_set: + derived_from: tosca.relationships.ConnectsTo + + cloudify.azure.relationships.connected_to_ip_configuration: + derived_from: tosca.relationships.ConnectsTo + + cloudify.azure.relationships.connected_to_lb_be_pool: + derived_from: tosca.relationships.ConnectsTo + + cloudify.azure.relationships.connected_to_lb_probe: + derived_from: tosca.relationships.ConnectsTo + + cloudify.azure.relationships.vmx_contained_in_vm: + derived_from: tosca.relationships.HostedOn + + cloudify.azure.relationships.nic_connected_to_lb_be_pool: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_target: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.attach_nic_to_backend_pool + remove_target: cloudify-azure-plugin > cloudify_azure.resources.network.loadbalancer.detach_nic_from_backend_pool + + cloudify.azure.relationships.vm_connected_to_datadisk: + derived_from: tosca.relationships.ConnectsTo + interfaces: + Configure: + add_target: + implementation: cloudify-azure-plugin > cloudify_azure.resources.compute.virtualmachine.attach_data_disk + inputs: + lun: + description: > + Specifies the logical unit number of the data disk in the VM + default: 0 + required: true + type: integer + remove_target: cloudify-azure-plugin > cloudify_azure.resources.compute.virtualmachine.detach_data_disk + + + diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/artifacts.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/artifacts.yaml new file mode 100644 index 0000000..945622f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/artifacts.yaml @@ -0,0 +1,121 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +artifact_types: + + tosca.artifacts.Root: + _extensions: + shorthand_name: Root # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Root + specification: tosca-simple-1.0 + specification_section: 5.3.1 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_ARTIFACTS_ROOT' + description: >- + This is the default (root) TOSCA Artifact Type definition that all other TOSCA base Artifact Types derive from. + + tosca.artifacts.File: + _extensions: + shorthand_name: File + type_qualified_name: tosca:File + specification: tosca-simple-1.0 + specification_section: 5.3.2 + description: >- + This artifact type is used when an artifact definition needs to have its associated file simply treated as a file and no special handling/handlers are invoked (i.e., it is not treated as either an implementation or deployment artifact type). + derived_from: tosca.artifacts.Root + + # + # Deployments + # + + tosca.artifacts.Deployment: + _extensions: + shorthand_name: Deployment # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Deployment + specification: tosca-simple-1.0 + specification_section: 5.3.3.1 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_ARTIFACTS_DEPLOYMENT' + description: >- + This artifact type represents the parent type for all deployment artifacts in TOSCA. This class of artifacts typically + represents a binary packaging of an application or service that is used to install/create or deploy it as part of a node's + lifecycle. + derived_from: tosca.artifacts.Root + + tosca.artifacts.Deployment.Image: + _extensions: + shorthand_name: Deployment.Image + type_qualified_name: tosca:Deployment.Image + specification: tosca-simple-1.0 + specification_section: 5.3.3.3 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_ARTIFACTS_DEPLOYMENT_IMAGE' + description: >- + This artifact type represents a parent type for any "image" which is an opaque packaging of a TOSCA Node's deployment + (whether real or virtual) whose contents are typically already installed and pre-configured (i.e., "stateful") and prepared + to be run on a known target container. + derived_from: tosca.artifacts.Deployment + + tosca.artifacts.Deployment.Image.VM: + _extensions: + shorthand_name: Deployment.VM # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Deployment.VM + specification: tosca-simple-1.0 + specification_section: 5.3.3.4 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_ARTIFACTS_DEPLOY_IMAGE_VM' + description: >- + This artifact represents the parent type for all Virtual Machine (VM) image and container formatted deployment artifacts. + These images contain a stateful capture of a machine (e.g., server) including operating system and installed software along + with any configurations and can be run on another machine using a hypervisor which virtualizes typical server (i.e., + hardware) resources. + derived_from: tosca.artifacts.Deployment + + # + # Implementations + # + + tosca.artifacts.Implementation: + _extensions: + shorthand_name: Implementation # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Implementation + specification: tosca-simple-1.0 + specification_section: 5.3.4.1 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_ARTIFACTS_IMPLEMENTATION' + description: >- + This artifact type represents the parent type for all implementation artifacts in TOSCA. These artifacts are used to + implement operations of TOSCA interfaces either directly (e.g., scripts) or indirectly (e.g., config. files). + derived_from: tosca.artifacts.Root + + tosca.artifacts.Implementation.Bash: + _extensions: + shorthand_name: Implementation.Bash # ARIA NOTE: mistake in spec? shouldn't we have "Implementation." as prefix? + type_qualified_name: tosca:Implementation.Bash + specification: tosca-simple-1.0 + specification_section: 5.3.4.3 + description: >- + This artifact type represents a Bash script type that contains Bash commands that can be executed on the Unix Bash shell. + derived_from: tosca.artifacts.Implementation + mime_type: application/x-sh + file_ext: [ sh ] + + tosca.artifacts.Implementation.Python: + _extensions: + shorthand_name: Implementation.Python # ARIA NOTE: mistake in spec? shouldn't we have "Implementation." as prefix? + type_qualified_name: tosca:Implementation.Python + specification: tosca-simple-1.0 + specification_section: 5.3.4.4 + description: >- + This artifact type represents a Python file that contains Python language constructs that can be executed within a Python + interpreter. + derived_from: tosca.artifacts.Implementation + mime_type: application/x-python + file_ext: [ py ] diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml new file mode 100644 index 0000000..66a4046 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml @@ -0,0 +1,322 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +capability_types: + + tosca.capabilities.Root: + _extensions: + shorthand_name: Root # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Root + specification: tosca-simple-1.0 + specification_section: 5.4.1 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_ROOT' + description: >- + This is the default (root) TOSCA Capability Type definition that all other TOSCA Capability Types derive from. + + tosca.capabilities.Node: + _extensions: + shorthand_name: Node + type_qualified_name: tosca:Node + specification: tosca-simple-1.0 + specification_section: 5.4.2 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_NODE' + role: feature + description: >- + The Node capability indicates the base capabilities of a TOSCA Node Type. + derived_from: tosca.capabilities.Root + + tosca.capabilities.Container: + _extensions: + shorthand_name: Container + type_qualified_name: tosca:Container + specification: tosca-simple-1.0 + specification_section: 5.4.3 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_CONTAINER' + role: host + description: >- + The Container capability, when included on a Node Type or Template definition, indicates that the node can act as a container + for (or a host for) one or more other declared Node Types. + derived_from: tosca.capabilities.Root + properties: + num_cpus: + description: >- + Number of (actual or virtual) CPUs associated with the Compute node. + type: integer + constraints: + - greater_or_equal: 1 + required: false + cpu_frequency: + description: >- + Specifies the operating frequency of CPU's core. This property expresses the expected frequency of one (1) CPU as + provided by the property "num_cpus". + type: scalar-unit.frequency + constraints: + - greater_or_equal: 0.1 GHz + required: false + disk_size: + description: >- + Size of the local disk available to applications running on the Compute node (default unit is MB). + type: scalar-unit.size + constraints: + - greater_or_equal: 0 MB + required: false + mem_size: + description: >- + Size of memory available to applications running on the Compute node (default unit is MB). + type: scalar-unit.size + constraints: + - greater_or_equal: 0 MB + required: false + + tosca.capabilities.Attachment: + _extensions: + shorthand_name: Attachment + type_qualified_name: tosca:Attachment + specification: tosca-simple-1.0 + specification_section: 5.4.8 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_ATTACHMENT' + description: >- + This is the default TOSCA type that should be used or extended to define an attachment capability of a (logical) + infrastructure device node (e.g., BlockStorage node). + derived_from: tosca.capabilities.Root + + tosca.capabilities.OperatingSystem: + _extensions: + shorthand_name: OperatingSystem + type_qualified_name: tosca:OperatingSystem + specification: tosca-simple-1.0 + specification_section: 5.4.9 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_OPSYS' + description: >- + This is the default TOSCA type that should be used to express an Operating System capability for a node. + derived_from: tosca.capabilities.Root + properties: + architecture: + description: >- + The Operating System (OS) architecture. Examples of valid values include: x86_32, x86_64, etc. + type: string + required: false + type: + description: >- + The Operating System (OS) type. Examples of valid values include: linux, aix, mac, windows, etc. + type: string + required: false + distribution: + description: >- + The Operating System (OS) distribution. Examples of valid values for a "type" of "Linux" would include: debian, fedora, + rhel and ubuntu. + type: string + required: false + version: + description: >- + The Operating System version. + type: version + required: false + + tosca.capabilities.Scalable: + _extensions: + shorthand_name: Scalable + type_qualified_name: tosca:Scalable + specification: tosca-simple-1.0 + specification_section: 5.4.10 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_SCALABLE' + role: scaling + description: >- + This is the default TOSCA type that should be used to express a scalability capability for a node. + derived_from: tosca.capabilities.Root + properties: + min_instances: + description: >- + This property is used to indicate the minimum number of instances that should be created for the associated TOSCA Node + Template by a TOSCA orchestrator. + type: integer + default: 1 + max_instances: + description: >- + This property is used to indicate the maximum number of instances that should be created for the associated TOSCA Node + Template by a TOSCA orchestrator. + type: integer + default: 1 + default_instances: + description: >- + An optional property that indicates the requested default number of instances that should be the starting number of + instances a TOSCA orchestrator should attempt to allocate. Note: The value for this property MUST be in the range between + the values set for "min_instances" and "max_instances" properties. + type: integer + required: false + + # + # Endpoints + # + + tosca.capabilities.Endpoint: + _extensions: + shorthand_name: Endpoint + type_qualified_name: tosca:Endpoint + specification: tosca-simple-1.0 + specification_section: 5.4.4 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_ENDPOINT' + description: >- + This is the default TOSCA type that should be used or extended to define a network endpoint capability. This includes the information to express a basic endpoint with a single port or a complex endpoint with multiple ports. By default the Endpoint is assumed to represent an address on a private network unless otherwise specified. + derived_from: tosca.capabilities.Root + properties: + protocol: + description: >- + The name of the protocol (i.e., the protocol prefix) that the endpoint accepts (any OSI Layer 4-7 protocols). Examples: + http, https, ftp, tcp, udp, etc. + type: string + default: tcp + required: true + port: + description: >- + The optional port of the endpoint. + type: tosca.datatypes.network.PortDef + required: false + secure: + description: >- + Requests for the endpoint to be secure and use credentials supplied on the ConnectsTo relationship. + type: boolean + default: false + required: false + url_path: + description: >- + The optional URL path of the endpoint's address if applicable for the protocol. + type: string + required: false + port_name: + description: >- + The optional name (or ID) of the network port this endpoint should be bound to. + type: string + required: false + network_name: + description: >- + The optional name (or ID) of the network this endpoint should be bound to. network_name: PRIVATE | PUBLIC | + | . + type: string + default: PRIVATE + required: false + initiator: + description: >- + The optional indicator of the direction of the connection. + type: string + constraints: + - valid_values: [ source, target, peer ] + default: source + required: false + ports: + description: >- + The optional map of ports the Endpoint supports (if more than one). + type: map + entry_schema: + type: tosca.datatypes.network.PortSpec + constraints: + - min_length: 1 + required: false + attributes: + ip_address: + description: >- + Note: This is the IP address as propagated up by the associated node's host (Compute) container. + type: string + + tosca.capabilities.Endpoint.Public: + _extensions: + shorthand_name: Endpoint.Public + type_qualified_name: tosca:Endpoint.Public + specification: tosca-simple-1.0 + specification_section: 5.4.5 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_ENDPOINT_PUBLIC' + description: >- + This capability represents a public endpoint which is accessible to the general internet (and its public IP address ranges). + + This public endpoint capability also can be used to create a floating (IP) address that the underlying network assigns from a + pool allocated from the application's underlying public network. This floating address is managed by the underlying network + such that can be routed an application's private address and remains reliable to internet clients. + derived_from: tosca.capabilities.Endpoint + properties: + network_name: + type: string + constraints: + - equal: PUBLIC + default: PUBLIC + floating: + description: >- + Indicates that the public address should be allocated from a pool of floating IPs that are associated with the network. + type: boolean + default: false + status: experimental + dns_name: + description: >- + The optional name to register with DNS. + type: string + required: false + status: experimental + + tosca.capabilities.Endpoint.Admin: + _extensions: + shorthand_name: Endpoint.Admin + type_qualified_name: tosca:Endpoint.Admin + specification: tosca-simple-1.0 + specification_section: 5.4.6 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_ENDPOINT_ADMIN' + description: >- + This is the default TOSCA type that should be used or extended to define a specialized administrator endpoint capability. + derived_from: tosca.capabilities.Endpoint + properties: + secure: + description: >- + Requests for the endpoint to be secure and use credentials supplied on the ConnectsTo relationship. + type: boolean + constraints: + - equal: true + default: true + + tosca.capabilities.Endpoint.Database: + _extensions: + shorthand_name: Endpoint.Database + type_qualified_name: tosca:Endpoint.Database + specification: tosca-simple-1.0 + specification_section: 5.4.7 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_ENDPOINT_DATABASE' + description: >- + This is the default TOSCA type that should be used or extended to define a specialized database endpoint capability. + derived_from: tosca.capabilities.Endpoint + + # + # Network + # + + tosca.capabilities.network.Bindable: + _extensions: + shorthand_name: Bindable # ARIA NOTE: mistake in spec? has "network." as a prefix + type_qualified_name: tosca:Bindable + specification: tosca-simple-1.0 + specification_section: 5.4.11 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_NETWORK_BINDABLE' + description: >- + A node type that includes the Bindable capability indicates that it can be bound to a logical network association via a + network port. + derived_from: tosca.capabilities.Node + + tosca.capabilities.network.Linkable: + _extensions: + shorthand_name: Linkable + type_qualified_name: tosca:Linkable + specification: tosca-simple-1.0 + specification_section: 7.5.3 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_NETWORK_LINKABLE' + description: >- + A node type that includes the Linkable capability indicates that it can be pointed by tosca.relationships.network.LinksTo + relationship type. + derived_from: tosca.capabilities.Node diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/data.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/data.yaml new file mode 100644 index 0000000..61d4186 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/data.yaml @@ -0,0 +1,268 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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_types: + + # + # Primitive + # + + timestamp: + _extensions: + coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_timestamp + + version: + _extensions: + coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_version + type_qualified_name: tosca:version + specification: tosca-simple-1.0 + specification_section: 3.2.2 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#TYPE_TOSCA_VERSION' + + range: + _extensions: + coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_range + type_qualified_name: tosca:range + specification: tosca-simple-1.0 + specification_section: 3.2.3 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#TYPE_TOSCA_RANGE' + + # + # With entry schema + # + + list: + _extensions: + use_entry_schema: true + coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_list + type_qualified_name: tosca:list + specification: tosca-simple-1.0 + specification_section: 3.2.4 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#TYPE_TOSCA_LIST' + + map: + _extensions: + use_entry_schema: true + coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_map_value + type_qualified_name: tosca:map + specification: tosca-simple-1.0 + specification_section: 3.2.5 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#TYPE_TOSCA_MAP' + + # + # Scalar + # + + scalar-unit.size: + _extensions: + coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_scalar_unit_size + type_qualified_name: tosca:scalar-unit.size + specification: tosca-simple-1.0 + specification_section: 3.2.6.4 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#TYPE_TOSCA_SCALAR_UNIT_SIZE' + + scalar-unit.time: + _extensions: + coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_scalar_unit_time + type_qualified_name: tosca:scalar-unit.time + specification: tosca-simple-1.0 + specification_section: 3.2.6.5 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#TYPE_TOSCA_SCALAR_UNIT_TIME' + + scalar-unit.frequency: + _extensions: + coerce_value: aria_extension_tosca.simple_v1_0.data_types.coerce_scalar_unit_frequency + type_qualified_name: tosca:scalar-unit.frequency + specification: tosca-simple-1.0 + specification_section: 3.2.6.6 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#TYPE_TOSCA_SCALAR_UNIT_FREQUENCY' + + # + # Complex + # + + tosca.datatypes.Root: + _extensions: + shorthand_name: Root # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Root + specification: tosca-simple-1.0 + specification_section: 5.2.1 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#TYPE_TOSCA_DATA_ROOT' + description: >- + This is the default (root) TOSCA Root Type definition that all complex TOSCA Data Types derive from. + + tosca.datatypes.Credential: + _extensions: + shorthand_name: Credential + type_qualified_name: tosca:Credential + specification: tosca-simple-1.0 + specification_section: 5.2.2 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#TYPE_TOSCA_DATA_CREDENTIAL' + description: >- + The Credential type is a complex TOSCA data Type used when describing authorization credentials used to access network + accessible resources. + derived_from: tosca.datatypes.Root + properties: + protocol: + description: >- + The optional protocol name. + type: string + required: false + token_type: + description: >- + The required token type. + type: string + default: password + token: + description: >- + The required token used as a credential for authorization or access to a networked resource. + type: string + required: false + keys: + description: >- + The optional list of protocol-specific keys or assertions. + type: map + entry_schema: + type: string + required: false + user: + description: >- + The optional user (name or ID) used for non-token based credentials. + type: string + required: false + + tosca.datatypes.network.NetworkInfo: + _extensions: + shorthand_name: NetworkInfo + type_qualified_name: tosca:NetworkInfo + specification: tosca-simple-1.0 + specification_section: 5.2.3 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#TYPE_TOSCA_DATA_NETWORKINFO' + description: >- + The Network type is a complex TOSCA data type used to describe logical network information. + derived_from: tosca.datatypes.Root + properties: + network_name: + description: >- + The name of the logical network. e.g., "public", "private", "admin". etc. + type: string + required: false + network_id: + description: >- + The unique ID of for the network generated by the network provider. + type: string + required: false + addresses: + description: >- + The list of IP addresses assigned from the underlying network. + type: list + entry_schema: + type: string + required: false + + tosca.datatypes.network.PortInfo: + _extensions: + shorthand_name: PortInfo + type_qualified_name: tosca:PortInfo + specification: tosca-simple-1.0 + specification_section: 5.2.4 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#TYPE_TOSCA_DATA_PORTINFO' + description: >- + The PortInfo type is a complex TOSCA data type used to describe network port information. + derived_from: tosca.datatypes.Root + properties: + port_name: + description: >- + The logical network port name. + type: string + required: false + port_id: + description: >- + The unique ID for the network port generated by the network provider. + type: string + required: false + network_id: + description: >- + The unique ID for the network. + type: string + required: false + mac_address: + description: >- + The unique media access control address (MAC address) assigned to the port. + type: string + required: false + addresses: + description: >- + The list of IP address(es) assigned to the port. + type: list + entry_schema: + type: string + required: false + + tosca.datatypes.network.PortDef: + _extensions: + shorthand_name: PortDef + type_qualified_name: tosca:PortDef + specification: tosca-simple-1.0 + specification_section: 5.2.5 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#TYPE_TOSCA_DATA_PORTDEF' + description: >- + The PortDef type is a TOSCA data Type used to define a network port. + derived_from: integer # ARIA NOTE: we allow deriving from primitives + constraints: + - in_range: [ 1, 65535 ] + + tosca.datatypes.network.PortSpec: + _extensions: + shorthand_name: PortSpec + type_qualified_name: tosca:PortSpec + specification: tosca-simple-1.0 + specification_section: 5.2.6 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#TYPE_TOSCA_DATA_PORTSPEC' + description: >- + The PortSpec type is a complex TOSCA data Type used when describing port specifications for a network connection. + derived_from: tosca.datatypes.Root + properties: + protocol: + description: >- + The required protocol used on the port. + type: string + constraints: + - valid_values: [ udp, tcp, igmp ] + default: tcp + source: + description: >- + The optional source port. + type: tosca.datatypes.network.PortDef + required: false + source_range: + description: >- + The optional range for source port. + type: range + constraints: + - in_range: [ 1, 65535 ] + required: false + target: + description: >- + The optional target port. + type: tosca.datatypes.network.PortDef + required: false + target_range: + description: >- + The optional range for target port. + type: range + constraints: + - in_range: [ 1, 65535 ] + required: false diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/groups.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/groups.yaml new file mode 100644 index 0000000..66cc25f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/groups.yaml @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +group_types: + + tosca.groups.Root: + _extensions: + shorthand_name: Root # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Root + specification: tosca-simple-1.0 + specification_section: 5.9.1 + description: >- + This is the default (root) TOSCA Group Type definition that all other TOSCA base Group Types derive from. + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/interfaces.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/interfaces.yaml new file mode 100644 index 0000000..29cc8dd --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/interfaces.yaml @@ -0,0 +1,107 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +interface_types: + + tosca.interfaces.Root: + _extensions: + shorthand_name: Root # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Root + specification: tosca-simple-1.0 + specification_section: 5.7.3 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#_Ref384391055' + description: >- + This is the default (root) TOSCA Interface Type definition that all other TOSCA Interface Types derive from. + + tosca.interfaces.node.lifecycle.Standard: + _extensions: + shorthand_name: Standard + type_qualified_name: tosca:Standard + specification: tosca-simple-1.0 + specification_section: 5.7.4 + description: >- + This lifecycle interface defines the essential, normative operations that TOSCA nodes may support. + derived_from: tosca.interfaces.Root + create: + description: >- + Standard lifecycle create operation. + configure: + description: >- + Standard lifecycle configure operation. + start: + description: >- + Standard lifecycle start operation. + stop: + description: >- + Standard lifecycle stop operation. + delete: + description: >- + Standard lifecycle delete operation. + + tosca.interfaces.relationship.Configure: + _extensions: + shorthand_name: Configure + type_qualified_name: tosca:Configure + specification: tosca-simple-1.0 + specification_section: 5.7.5 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_ITFC_RELATIONSHIP_CONFIGURE' + description: >- + The lifecycle interfaces define the essential, normative operations that each TOSCA Relationship Types may support. + derived_from: tosca.interfaces.Root + pre_configure_source: + description: >- + Operation to pre-configure the source endpoint. + _extensions: + relationship_edge: source + pre_configure_target: + description: >- + Operation to pre-configure the target endpoint. + _extensions: + relationship_edge: target + post_configure_source: + description: >- + Operation to post-configure the source endpoint. + _extensions: + relationship_edge: source + post_configure_target: + description: >- + Operation to post-configure the target endpoint. + _extensions: + relationship_edge: target + add_target: + description: >- + Operation to notify the source node of a target node being added via a relationship. + _extensions: + relationship_edge: source + add_source: + description: >- + Operation to notify the target node of a source node which is now available via a relationship. + _extensions: + relationship_edge: target + target_changed: + description: >- + Operation to notify source some property or attribute of the target changed + _extensions: + relationship_edge: source + remove_target: + description: >- + Operation to remove a target node. + _extensions: + relationship_edge: source + remove_source: + description: >- + Operation to remove the source node. + _extensions: + relationship_edge: target diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/nodes.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/nodes.yaml new file mode 100644 index 0000000..05963b7 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/nodes.yaml @@ -0,0 +1,525 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +node_types: + + tosca.nodes.Root: + _extensions: + shorthand_name: Root + type_qualified_name: tosca:Root + specification: tosca-simple-1.0 + specification_section: 5.8.1 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_NODES_ROOT' + description: >- + The TOSCA Root Node Type is the default type that all other TOSCA base Node Types derive from. This allows for all TOSCA nodes to have a consistent set of features for modeling and management (e.g., consistent definitions for requirements, capabilities and lifecycle interfaces). + attributes: + tosca_id: + description: >- + A unique identifier of the realized instance of a Node Template that derives from any TOSCA normative type. + type: string + tosca_name: + description: >- + This attribute reflects the name of the Node Template as defined in the TOSCA service template. This name is not unique + to the realized instance model of corresponding deployed application as each template in the model can result in one or + more instances (e.g., scaled) when orchestrated to a provider environment. + type: string + state: + description: >- + The state of the node instance. + type: string + default: initial + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + capabilities: + feature: + type: tosca.capabilities.Node + requirements: + - dependency: + capability: tosca.capabilities.Node + node: tosca.nodes.Root + relationship: tosca.relationships.DependsOn + occurrences: [ 0, UNBOUNDED ] + + tosca.nodes.Compute: + _extensions: + shorthand_name: Compute + type_qualified_name: tosca:Compute + specification: tosca-simple-1.0 + specification_section: 5.8.2 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_NODES_COMPUTE' + role: host + description: >- + The TOSCA Compute node represents one or more real or virtual processors of software applications or services along with + other essential local resources. Collectively, the resources the compute node represents can logically be viewed as a (real + or virtual) "server". + derived_from: tosca.nodes.Root + attributes: + private_address: + description: >- + The primary private IP address assigned by the cloud provider that applications may use to access the Compute node. + type: string + public_address: + description: >- + The primary public IP address assigned by the cloud provider that applications may use to access the Compute node. + type: string + networks: + description: >- + The list of logical networks assigned to the compute host instance and information about them. + type: map + entry_schema: + type: tosca.datatypes.network.NetworkInfo + ports: + description: >- + The list of logical ports assigned to the compute host instance and information about them. + type: map + entry_schema: + type: tosca.datatypes.network.PortInfo + capabilities: + host: + type: tosca.capabilities.Container + valid_source_types: [ tosca.nodes.SoftwareComponent ] + binding: + type: tosca.capabilities.network.Bindable + os: + type: tosca.capabilities.OperatingSystem + scalable: + type: tosca.capabilities.Scalable + requirements: + - local_storage: + capability: tosca.capabilities.Attachment + node: tosca.nodes.BlockStorage + relationship: tosca.relationships.AttachesTo + occurrences: [ 0, UNBOUNDED ] + + tosca.nodes.LoadBalancer: + _extensions: + shorthand_name: LoadBalancer + type_qualified_name: tosca:LoadBalancer + specification: tosca-simple-1.0 + specification_section: 5.8.12 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#_Toc379548332' + description: >- + The TOSCA Load Balancer node represents logical function that be used in conjunction with a Floating Address to distribute an + application's traffic (load) across a number of instances of the application (e.g., for a clustered or scaled application). + derived_from: tosca.nodes.Root + properties: + algorithm: + description: >- + No description in spec. + type: string + required: false + status: experimental + capabilities: + client: + description: >- + The Floating (IP) client's on the public network can connect to. + type: tosca.capabilities.Endpoint.Public + occurrences: [ 0, UNBOUNDED ] # ARIA NOTE: it seems unnecessary to specify this, as it is the implied default + requirements: + - application: + capability: tosca.capabilities.Endpoint + relationship: tosca.relationships.RoutesTo + occurrences: [ 0, UNBOUNDED ] + + # + # Software + # + + tosca.nodes.SoftwareComponent: + _extensions: + shorthand_name: SoftwareComponent + type_qualified_name: tosca:SoftwareComponent + specification: tosca-simple-1.0 + specification_section: 5.8.3 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_NODES_SOFTWARE_COMPONENT' + description: >- + The TOSCA SoftwareComponent node represents a generic software component that can be managed and run by a TOSCA Compute Node + Type. + derived_from: tosca.nodes.Root + properties: + component_version: + description: >- + The optional software component's version. + type: version + required: false + admin_credential: + description: >- + The optional credential that can be used to authenticate to the software component. + type: tosca.datatypes.Credential + required: false + requirements: + - host: + capability: tosca.capabilities.Container + node: tosca.nodes.Compute + relationship: tosca.relationships.HostedOn + + tosca.nodes.WebServer: + _extensions: + shorthand_name: WebServer + type_qualified_name: tosca:WebServer + specification: tosca-simple-1.0 + specification_section: 5.8.4 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_NODES_WEBSERVER' + description: >- + This TOSCA WebServer Node Type represents an abstract software component or service that is capable of hosting and providing + management operations for one or more WebApplication nodes. + derived_from: tosca.nodes.SoftwareComponent + capabilities: + data_endpoint: + type: tosca.capabilities.Endpoint + admin_endpoint: + type: tosca.capabilities.Endpoint.Admin + host: + type: tosca.capabilities.Container + valid_source_types: [ tosca.nodes.WebApplication ] + + tosca.nodes.WebApplication: + _extensions: + shorthand_name: WebApplication + type_qualified_name: tosca:WebApplication + specification: tosca-simple-1.0 + specification_section: 5.8.5 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_NODES_WEBAPPLICATION' + description: >- + The TOSCA WebApplication node represents a software application that can be managed and run by a TOSCA WebServer node. + Specific types of web applications such as Java, etc. could be derived from this type. + derived_from: tosca.nodes.SoftwareComponent # ARIA NOTE: the spec says tosca.nodes.Root + properties: + context_root: + description: >- + The web application's context root which designates the application's URL path within the web server it is hosted on. + type: string + required: false + capabilities: + app_endpoint: + type: tosca.capabilities.Endpoint + requirements: + - host: + capability: tosca.capabilities.Container + node: tosca.nodes.WebServer + relationship: tosca.relationships.HostedOn + + tosca.nodes.DBMS: + _extensions: + shorthand_name: DBMS # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:DBMS + specification: tosca-simple-1.0 + specification_section: 5.8.6 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_NODES_DBMS' + description: >- + The TOSCA DBMS node represents a typical relational, SQL Database Management System software component or service. + derived_from: tosca.nodes.SoftwareComponent + properties: + root_password: + description: >- + The optional root password for the DBMS server. + type: string + required: false + port: + description: >- + The DBMS server's port. + type: integer + required: false + capabilities: + host: + type: tosca.capabilities.Container + valid_source_types: [ tosca.nodes.Database ] + + tosca.nodes.Database: + _extensions: + shorthand_name: Database + type_qualified_name: tosca:Database + specification: tosca-simple-1.0 + specification_section: 5.8.7 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_NODES_DATABASE' + description: >- + The TOSCA Database node represents a logical database that can be managed and hosted by a TOSCA DBMS node. + derived_from: tosca.nodes.Root # ARIA NOTE: it's *not* a SoftwareComponent + properties: + name: + description: >- + The logical database Name. + type: string + port: + description: >- + The port the database service will use to listen for incoming data and requests. + type: integer + required: false + user: + description: >- + The special user account used for database administration. + type: string + required: false + password: + description: >- + The password associated with the user account provided in the 'user' property. + type: string + required: false + capabilities: + database_endpoint: + type: tosca.capabilities.Endpoint.Database + requirements: + - host: + capability: tosca.capabilities.Container + node: tosca.nodes.DBMS + relationship: tosca.relationships.HostedOn + + # + # Container + # + + tosca.nodes.Container.Runtime: + _extensions: + shorthand_name: Container.Runtime + type_qualified_name: tosca:Container.Runtime + specification: tosca-simple-1.0 + specification_section: 5.8.10 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_NODES_CONTAINER_RUNTIME' + description: >- + The TOSCA Container Runtime node represents operating system-level virtualization technology used to run multiple application + services on a single Compute host. + derived_from: tosca.nodes.SoftwareComponent + capabilities: + host: + type: tosca.capabilities.Container + scalable: + type: tosca.capabilities.Scalable + + tosca.nodes.Container.Application: + _extensions: + shorthand_name: Container.Application + type_qualified_name: tosca:Container.Application + specification: tosca-simple-1.0 + specification_section: 5.8.11 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_NODES_CONTAINER_APP' + description: >- + The TOSCA Container Application node represents an application that requires Container-level virtualization technology. + derived_from: tosca.nodes.Root + requirements: + - host: + capability: tosca.capabilities.Container + # ARIA NOTE: seems a mistake in the spec + #node: tosca.nodes.Container + relationship: tosca.relationships.HostedOn + + # + # Storage + # + + tosca.nodes.ObjectStorage: + _extensions: + shorthand_name: ObjectStorage + type_qualified_name: tosca:ObjectStorage + specification: tosca-simple-1.0 + specification_section: 5.8.8 + description: >- + The TOSCA ObjectStorage node represents storage that provides the ability to store data as objects (or BLOBs of data) without + consideration for the underlying filesystem or devices. + derived_from: tosca.nodes.Root + properties: + name: + description: >- + The logical name of the object store (or container). + type: string + size: + description: >- + The requested initial storage size (default unit is in Gigabytes). + type: scalar-unit.size + constraints: + - greater_or_equal: 0 GB + required: false + maxsize: + description: >- + The requested maximum storage size (default unit is in Gigabytes). + type: scalar-unit.size + constraints: + - greater_or_equal: 0 GB + required: false + capabilities: + storage_endpoint: + type: tosca.capabilities.Endpoint + + tosca.nodes.BlockStorage: + _extensions: + shorthand_name: BlockStorage + type_qualified_name: tosca:BlockStorage + specification: tosca-simple-1.0 + specification_section: 5.8.9 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_NODES_BLOCK_STORAGE' + description: >- + derived_from: tosca.nodes.Root + properties: + size: + description: >- + The requested storage size (default unit is MB). + type: scalar-unit.size + constraints: + - greater_or_equal: 1 MB + volume_id: + description: >- + ID of an existing volume (that is in the accessible scope of the requesting application). + type: string + required: false + snapshot_id: + description: >- + Some identifier that represents an existing snapshot that should be used when creating the block storage (volume). + type: string + required: false + capabilities: + attachment: + type: tosca.capabilities.Attachment + + # + # Network + # + + tosca.nodes.network.Network: + _extensions: + shorthand_name: Network + type_qualified_name: tosca:Network + specification: tosca-simple-1.0 + specification_section: 7.5.1 + description: >- + The TOSCA Network node represents a simple, logical network service. + derived_from: tosca.nodes.Root + properties: + ip_version: + description: >- + The IP version of the requested network. + type: integer + constraints: + - valid_values: [ 4, 6 ] + default: 4 + required: false + cidr: + description: >- + The cidr block of the requested network. + type: string + required: false + start_ip: + description: >- + The IP address to be used as the 1st one in a pool of addresses derived from the cidr block full IP range. + type: string + required: false + end_ip: + description: >- + The IP address to be used as the last one in a pool of addresses derived from the cidr block full IP range. + type: string + required: false + gateway_ip: + description: >- + The gateway IP address. + type: string + required: false + network_name: + description: >- + An Identifier that represents an existing Network instance in the underlying cloud infrastructure - OR - be used as the + name of the new created network. + type: string + required: false + network_id: + description: >- + An Identifier that represents an existing Network instance in the underlying cloud infrastructure. This property is + mutually exclusive with all other properties except network_name. + type: string + required: false + segmentation_id: + description: >- + A segmentation identifier in the underlying cloud infrastructure (e.g., VLAN id, GRE tunnel id). If the segmentation_id + is specified, the network_type or physical_network properties should be provided as well. + type: string + required: false + network_type: + description: >- + Optionally, specifies the nature of the physical network in the underlying cloud infrastructure. Examples are flat, vlan, + gre or vxlan. For flat and vlan types, physical_network should be provided too. + type: string + required: false + physical_network: + description: >- + Optionally, identifies the physical network on top of which the network is implemented, e.g. physnet1. This property is + required if network_type is flat or vlan. + type: string + required: false + dhcp_enabled: + description: >- + Indicates the TOSCA container to create a virtual network instance with or without a DHCP service. + type: boolean + default: true + required: false + capabilities: + link: + type: tosca.capabilities.network.Linkable + + tosca.nodes.network.Port: + _extensions: + shorthand_name: Port + type_qualified_name: tosca:Port + specification: tosca-simple-1.0 + specification_section: 7.5.2 + description: >- + The TOSCA Port node represents a logical entity that associates between Compute and Network normative types. + + The Port node type effectively represents a single virtual NIC on the Compute node instance. + derived_from: tosca.nodes.Root + properties: + ip_address: + description: >- + Allow the user to set a fixed IP address. Note that this address is a request to the provider which they will attempt to + fulfill but may not be able to dependent on the network the port is associated with. + type: string + required: false + order: + description: >- + The order of the NIC on the compute instance (e.g. eth2). Note: when binding more than one port to a single compute (aka + multi vNICs) and ordering is desired, it is *mandatory* that all ports will be set with an order value and. The order + values must represent a positive, arithmetic progression that starts with 0 (e.g. 0, 1, 2, ..., n). + type: integer + constraints: + - greater_or_equal: 0 + default: 0 + required: false + is_default: + description: >- + Set is_default=true to apply a default gateway route on the running compute instance to the associated network gateway. + Only one port that is associated to single compute node can set as default=true. + type: boolean + default: false + required: false + ip_range_start: + description: >- + Defines the starting IP of a range to be allocated for the compute instances that are associated by this Port. Without + setting this property the IP allocation is done from the entire CIDR block of the network. + type: string + required: false + ip_range_end: + description: >- + Defines the ending IP of a range to be allocated for the compute instances that are associated by this Port. Without + setting this property the IP allocation is done from the entire CIDR block of the network. + type: string + required: false + attributes: + ip_address: + description: >- + The IP address would be assigned to the associated compute instance. + type: string + requirements: + - link: + capability: tosca.capabilities.network.Linkable + relationship: tosca.relationships.network.LinksTo + - binding: + capability: tosca.capabilities.network.Bindable + relationship: tosca.relationships.network.BindsTo diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/policies.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/policies.yaml new file mode 100644 index 0000000..7b35bb9 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/policies.yaml @@ -0,0 +1,71 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +policy_types: + + tosca.policies.Root: + _extensions: + shorthand_name: Root # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Root + specification: tosca-simple-1.0 + specification_section: 5.10.1 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_POLICIES_ROOT' + description: >- + This is the default (root) TOSCA Policy Type definition that all other TOSCA base Policy Types derive from. + + tosca.policies.Placement: + _extensions: + shorthand_name: Placement # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Placement + specification: tosca-simple-1.0 + specification_section: 5.10.2 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_POLICIES_PLACEMENT' + description: >- + This is the default (root) TOSCA Policy Type definition that is used to govern placement of TOSCA nodes or groups of nodes. + derived_from: tosca.policies.Root + + tosca.policies.Scaling: + _extensions: + shorthand_name: Scaling # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Scaling + specification: tosca-simple-1.0 + specification_section: 5.10.3 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_POLICIES_SCALING' + description: >- + This is the default (root) TOSCA Policy Type definition that is used to govern scaling of TOSCA nodes or groups of nodes. + derived_from: tosca.policies.Root + + tosca.policies.Update: + _extensions: + shorthand_name: Update # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Update + specification: tosca-simple-1.0 + specification_section: 5.10.4 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_POLICIES_UPDATE' + description: >- + This is the default (root) TOSCA Policy Type definition that is used to govern update of TOSCA nodes or groups of nodes. + derived_from: tosca.policies.Root + + tosca.policies.Performance: + _extensions: + shorthand_name: Performance # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Performance + specification: tosca-simple-1.0 + specification_section: 5.10.5 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_POLICIES_PERFORMANCE' + description: >- + This is the default (root) TOSCA Policy Type definition that is used to declare performance requirements for TOSCA nodes or + groups of nodes. + derived_from: tosca.policies.Root diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/relationships.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/relationships.yaml new file mode 100644 index 0000000..9f2c32c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/relationships.yaml @@ -0,0 +1,158 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +relationship_types: + + tosca.relationships.Root: + _extensions: + shorthand_name: Root # ARIA NOTE: omitted in the spec + type_qualified_name: tosca:Root + specification: tosca-simple-1.0 + specification_section: 5.6.1 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_RELATIONSHIPS_ROOT' + description: >- + This is the default (root) TOSCA Relationship Type definition that all other TOSCA Relationship Types derive from. + attributes: + tosca_id: + description: >- + A unique identifier of the realized instance of a Relationship Template that derives from any TOSCA normative type. + type: string + tosca_name: + description: >- + This attribute reflects the name of the Relationship Template as defined in the TOSCA service template. This name is not + unique to the realized instance model of corresponding deployed application as each template in the model can result in + one or more instances (e.g., scaled) when orchestrated to a provider environment. + type: string + state: + description: >- + The state of the relationship instance. + type: string + default: initial + interfaces: + Configure: + type: tosca.interfaces.relationship.Configure + + tosca.relationships.DependsOn: + _extensions: + shorthand_name: DependsOn + type_qualified_name: tosca:DependsOn + specification: tosca-simple-1.0 + specification_section: 5.6.2 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_RELATIONSHIPS_DEPENDSON' + description: >- + This type represents a general dependency relationship between two nodes. + derived_from: tosca.relationships.Root + valid_target_types: [ tosca.capabilities.Node ] + + tosca.relationships.HostedOn: + _extensions: + shorthand_name: HostedOn + type_qualified_name: tosca:HostedOn + specification: tosca-simple-1.0 + specification_section: 5.6.3 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_RELATIONSHIPS_HOSTEDON' + description: >- + This type represents a hosting relationship between two nodes. + derived_from: tosca.relationships.Root + valid_target_types: [ tosca.capabilities.Container ] + + tosca.relationships.ConnectsTo: + _extensions: + shorthand_name: ConnectsTo + type_qualified_name: tosca:ConnectsTo + specification: tosca-simple-1.0 + specification_section: 5.6.4 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_RELATIONSHIPS_CONNECTSTO' + description: >- + This type represents a network connection relationship between two nodes. + derived_from: tosca.relationships.Root + valid_target_types: [ tosca.capabilities.Endpoint ] + properties: + credential: + type: tosca.datatypes.Credential + required: false + + tosca.relationships.AttachesTo: + _extensions: + shorthand_name: AttachesTo + type_qualified_name: tosca:AttachesTo + specification: tosca-simple-1.0 + specification_section: 5.6.5 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_RELATIONSHIPS_ATTACHTO' + description: >- + This type represents an attachment relationship between two nodes. For example, an AttachesTo relationship type would be used + for attaching a storage node to a Compute node. + derived_from: tosca.relationships.Root + valid_target_types: [ tosca.capabilities.Attachment ] + properties: + location: + description: >- + The relative location (e.g., path on the file system), which provides the root location to address an attached node. + e.g., a mount point / path such as '/usr/data'. Note: The user must provide it and it cannot be "root". + type: string + constraints: + - min_length: 1 + device: + description: >- + The logical device name which for the attached device (which is represented by the target node in the model). e.g., + '/dev/hda1'. + type: string + required: false + attributes: + device: + description: >- + The logical name of the device as exposed to the instance. + Note: A runtime property that gets set when the model gets instantiated by the orchestrator. + type: string + + tosca.relationships.RoutesTo: + _extensions: + shorthand_name: RoutesTo + type_qualified_name: tosca:RoutesTo + specification: tosca-simple-1.0 + specification_section: 5.6.6 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#_Toc397688815' + description: >- + This type represents an intentional network routing between two Endpoints in different networks. + derived_from: tosca.relationships.ConnectsTo + valid_target_types: [ tosca.capabilities.Endpoint ] + + # + # Network + # + + tosca.relationships.network.LinksTo: + _extensions: + shorthand_name: LinksTo + type_qualified_name: tosca:LinksTo + specification: tosca-simple-1.0 + specification_section: 7.5.4 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_RELATIONSHIPS_NETWORK_LINKSTO' + description: >- + This relationship type represents an association relationship between Port and Network node types. + derived_from: tosca.relationships.DependsOn + valid_target_types: [ tosca.capabilities.network.Linkable ] + + tosca.relationships.network.BindsTo: + _extensions: + shorthand_name: BindsTo # ARIA NOTE: the spec says "network.BindsTo" which seems wrong + type_qualified_name: tosca:BindsTo + specification: tosca-simple-1.0 + specification_section: 7.5.5 + specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_RELATIONSHIPS_NETWORK_BINDTO' + description: >- + This type represents a network association relationship between Port and Compute node types. + derived_from: tosca.relationships.DependsOn + valid_target_types: [ tosca.capabilities.network.Bindable ] diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/tosca-simple-1.0.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/tosca-simple-1.0.yaml new file mode 100644 index 0000000..f8cc520 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/tosca-simple-1.0.yaml @@ -0,0 +1,24 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +imports: + - artifacts.yaml + - capabilities.yaml + - data.yaml + - groups.yaml + - interfaces.yaml + - nodes.yaml + - policies.yaml + - relationships.yaml diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/artifacts.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/artifacts.yaml new file mode 100644 index 0000000..2427d9f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/artifacts.yaml @@ -0,0 +1,84 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +artifact_types: + + tosca.artifacts.nfv.SwImage: + _extensions: + shorthand_name: SwImage + type_qualified_name: tosca:SwImage + specification: tosca-simple-nfv-1.0 + specification_section: 5.4.1 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896067' + derived_from: tosca.artifacts.Deployment.Image + properties: + name: + description: >- + Name of this software image. + type: string + required: true + version: + description: >- + Version of this software image. + type: string + required: true + checksum: + description: >- + Checksum of the software image file. + type: string + container_format: + description: >- + The container format describes the container file format in which software image is + provided. + type: string + required: true + disk_format: + description: >- + The disk format of a software image is the format of the underlying disk image. + type: string + required: true + min_disk: + description: >- + The minimal disk size requirement for this software image. + type: scalar-unit.size + required: true + min_ram: + description: >- + The minimal disk size requirement for this software image. + type: scalar-unit.size + required: false + size: # ARIA NOTE: section [5.4.1.1 Properties] calls this field 'Size' + description: >- + The size of this software image + type: scalar-unit.size + required: true + sw_image: + description: >- + A reference to the actual software image within VNF Package, or url. + type: string + required: true + operating_system: + description: >- + Identifies the operating system used in the software image. + type: string + required: false + supported _virtualization_enviroment: + description: >- + Identifies the virtualization environments (e.g. hypervisor) compatible with this software + image. + type: list + entry_schema: + type: string + required: false diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/capabilities.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/capabilities.yaml new file mode 100644 index 0000000..7b6363f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/capabilities.yaml @@ -0,0 +1,70 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +capability_types: + + tosca.capabilities.nfv.VirtualBindable: + _extensions: + shorthand_name: VirtualBindable + type_qualified_name: tosca:VirtualBindable + specification: tosca-simple-nfv-1.0 + specification_section: 5.5.1 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896069' + description: >- + A node type that includes the VirtualBindable capability indicates that it can be pointed by + tosca.relationships.nfv.VirtualBindsTo relationship type. + derived_from: tosca.capabilities.Node + + tosca.capabilities.nfv.Metric: + _extensions: + shorthand_name: Metric + type_qualified_name: tosca:Metric + specification: tosca-simple-nfv-1.0 + specification_section: 5.5.2 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896070' + description: >- + A node type that includes the Metric capability indicates that it can be monitored using an nfv.relationships.Monitor + relationship type. + derived_from: tosca.capabilities.Endpoint + + tosca.capabilities.nfv.VirtualCompute: + _extensions: + shorthand_name: VirtualCompute + type_qualified_name: tosca:VirtualCompute + specification: tosca-simple-nfv-1.0 + specification_section: 5.5.3 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896071' + derived_from: tosca.capabilities.Root + properties: + requested_additional_capabilities: + # ARIA NOTE: in section [5.5.3.1 Properties] the name of this property is + # "request_additional_capabilities", and its type is not a map, but + # tosca.datatypes.nfv.RequestedAdditionalCapability + description: >- + Describes additional capability for a particular VDU. + type: map + entry_schema: + type: tosca.datatypes.nfv.RequestedAdditionalCapability + required: false + virtual_memory: + description: >- + Describes virtual memory of the virtualized compute. + type: tosca.datatypes.nfv.VirtualMemory + required: true + virtual_cpu: + description: >- + Describes virtual CPU(s) of the virtualized compute. + type: tosca.datatypes.nfv.VirtualCpu + required: true diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/data.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/data.yaml new file mode 100644 index 0000000..889dcf7 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/data.yaml @@ -0,0 +1,318 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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_types: + + tosca.datatypes.nfv.L2AddressData: + # TBD + _extensions: + shorthand_name: L2AddressData + type_qualified_name: tosca:L2AddressData + specification: tosca-simple-nfv-1.0 + specification_section: 5.3.1 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896055' + + tosca.datatypes.nfv.L3AddressData: + _extensions: + shorthand_name: L3AddressData + type_qualified_name: tosca:L3AddressData + specification: tosca-simple-nfv-1.0 + specification_section: 5.3.2 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896056' + description: >- + The L3AddressData type is a complex TOSCA data type used to describe L3AddressData information + element as defined in [ETSI GS NFV-IFA 011], it provides the information on the IP addresses + to be assigned to the connection point instantiated from the parent Connection Point + Descriptor. + derived_from: tosca.datatypes.Root + properties: + ip_address_assignment: + description: >- + Specify if the address assignment is the responsibility of management and orchestration + function or not. If it is set to True, it is the management and orchestration function + responsibility. + type: boolean + required: true + floating_ip_activated: + description: Specify if the floating IP scheme is activated on the Connection Point or not. + type: boolean + required: true + ip_address_type: + description: >- + Define address type. The address type should be aligned with the address type supported by + the layer_protocol properties of the parent VnfExtCpd. + type: string + required: false + constraints: + - valid_values: [ ipv4, ipv6 ] + number_of_ip_address: + description: >- + Minimum number of IP addresses to be assigned. + type: integer + required: false + + tosca.datatypes.nfv.AddressData: + _extensions: + shorthand_name: AddressData + type_qualified_name: tosca:AddressData + specification: tosca-simple-nfv-1.0 + specification_section: 5.3.3 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896057' + description: >- + The AddressData type is a complex TOSCA data type used to describe AddressData information + element as defined in [ETSI GS NFV-IFA 011], it provides information on the addresses to be + assigned to the connection point(s) instantiated from a Connection Point Descriptor. + derived_from: tosca.datatypes.Root + properties: + address_type: + description: >- + Describes the type of the address to be assigned to the connection point instantiated from + the parent Connection Point Descriptor. The content type shall be aligned with the address + type supported by the layerProtocol property of the parent Connection Point Descriptor. + type: string + required: true + constraints: + - valid_values: [ mac_address, ip_address ] + l2_address_data: + # Shall be present when the addressType is mac_address. + description: >- + Provides the information on the MAC addresses to be assigned to the connection point(s) + instantiated from the parent Connection Point Descriptor. + type: tosca.datatypes.nfv.L2AddressData # Empty in "GS NFV IFA011 V0.7.3" + required: false + l3_address_data: + # Shall be present when the addressType is ip_address. + description: >- + Provides the information on the IP addresses to be assigned to the connection point + instantiated from the parent Connection Point Descriptor. + type: tosca.datatypes.nfv.L3AddressData + required: false + + tosca.datatypes.nfv.VirtualNetworkInterfaceRequirements: + _extensions: + shorthand_name: VirtualNetworkInterfaceRequirements + type_qualified_name: tosca:VirtualNetworkInterfaceRequirements + specification: tosca-simple-nfv-1.0 + specification_section: 5.3.4 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896058' + description: >- + The VirtualNetworkInterfaceRequirements type is a complex TOSCA data type used to describe + VirtualNetworkInterfaceRequirements information element as defined in [ETSI GS NFV-IFA 011], + it provides the information to specify requirements on a virtual network interface realising the + CPs instantiated from this CPD. + derived_from: tosca.datatypes.Root + properties: + name: + description: >- + Provides a human readable name for the requirement. + type: string + required: false + description: + description: >- + Provides a human readable description for the requirement. + type: string + required: false + support_mandatory: + description: >- + Indicates whether fulfilling the constraint is mandatory (TRUE) for successful operation + or desirable (FALSE). + type: boolean + required: false + requirement: + description: >- + Specifies a requirement such as the support of SR-IOV, a particular data plane + acceleration library, an API to be exposed by a NIC, etc. + type: string # ARIA NOTE: the spec says "not specified", but TOSCA requires a type + required: true + + tosca.datatypes.nfv.ConnectivityType: + _extensions: + shorthand_name: ConnectivityType + type_qualified_name: tosca:ConnectivityType + specification: tosca-simple-nfv-1.0 + specification_section: 5.3.5 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896059' + description: >- + The TOSCA ConnectivityType type is a complex TOSCA data type used to describe ConnectivityType + information element as defined in [ETSI GS NFV-IFA 011]. + derived_from: tosca.datatypes.Root + properties: + layer_protocol: + description: >- + Identifies the protocol this VL gives access to (ethernet, mpls, odu2, ipv4, ipv6, + pseudo_wire). + type: string + required: true + constraints: + - valid_values: [ ethernet, mpls, odu2, ipv4, ipv6, pseudo_wire ] + flow_pattern: + description: >- + Identifies the flow pattern of the connectivity (Line, Tree, Mesh). + type: string + required: false + + tosca.datatypes.nfv.RequestedAdditionalCapability: + _extensions: + shorthand_name: RequestedAdditionalCapability + type_qualified_name: tosca:RequestedAdditionalCapability + specification: tosca-simple-nfv-1.0 + specification_section: 5.3.6 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896060' + description: >- + RequestAdditionalCapability describes additional capability for a particular VDU. + derived_from: tosca.datatypes.Root + properties: + request_additional_capability_name: + description: >- + Identifies a requested additional capability for the VDU. + type: string + required: true + support_mandatory: + description: >- + Indicates whether the requested additional capability is mandatory for successful + operation. + type: string + required: true + min_requested_additional_capability_version: + description: >- + Identifies the minimum version of the requested additional capability. + type: string + required: false + preferred_requested_additional_capability_version: + description: >- + Identifies the preferred version of the requested additional capability. + type: string + required: false + target_performance_parameters: + description: >- + Identifies specific attributes, dependent on the requested additional capability type. + type: map + entry_schema: + type: string + required: true + + tosca.datatypes.nfv.VirtualMemory: + _extensions: + shorthand_name: VirtualMemory + type_qualified_name: tosca:VirtualMemory + specification: tosca-simple-nfv-1.0 + specification_section: 5.3.7 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896061' + description: >- + VirtualMemory describes virtual memory for a particular VDU. + derived_from: tosca.datatypes.Root + properties: + virtual_mem_size: + description: Amount of virtual memory. + type: scalar-unit.size + required: true + virtual_mem_oversubscription_policy: + description: >- + The memory core oversubscription policy in terms of virtual memory to physical memory on + the platform. The cardinality can be 0 during the allocation request, if no particular + value is requested. + type: string + required: false + numa_enabled: + description: >- + It specifies the memory allocation to be cognisant of the relevant process/core + allocation. The cardinality can be 0 during the allocation request, if no particular value + is requested. + type: boolean + required: false + + tosca.datatypes.nfv.VirtualCpu: + _extensions: + shorthand_name: VirtualCpu + type_qualified_name: tosca:VirtualCpu + specification: tosca-simple-nfv-1.0 + specification_section: 5.3.8 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896062' + description: >- + VirtualMemory describes virtual memory for a particular VDU. + derived_from: tosca.datatypes.Root + properties: + cpu_architecture: + description: >- + CPU architecture type. Examples are x86, ARM. + type: string + required: false + num_virtual_cpu: + description: >- + Number of virtual CPUs. + type: integer + required: true + virtual_cpu_clock: + description: >- + Minimum virtual CPU clock rate. + type: scalar-unit.frequency + required: false + virtual_cpu_oversubscription_policy: + description: >- + CPU core oversubscription policy. + type: string + required: false + virtual_cpu_pinning: + description: >- + The virtual CPU pinning configuration for the virtualized compute resource. + type: tosca.datatypes.nfv.VirtualCpuPinning + required: false + + tosca.datatypes.nfv.VirtualCpuPinning: + _extensions: + shorthand_name: VirtualCpuPinning + type_qualified_name: tosca:VirtualCpuPinning + specification: tosca-simple-nfv-1.0 + specification_section: 5.3.9 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896064' + description: >- + VirtualCpuPinning describes CPU pinning configuration for a particular CPU. + derived_from: tosca.datatypes.Root + properties: + cpu_pinning_policy: + description: >- + Indicates the policy for CPU pinning. + type: string + constraints: + - valid_values: [ static, dynamic ] + required: false + cpu_pinning_map: + description: >- + If cpuPinningPolicy is defined as "static", the cpuPinningMap provides the map of pinning + virtual CPU cores to physical CPU cores/threads. + type: map + entry_schema: + type: string + required: false + + tosca.datatypes.nfv.VnfcConfigurableProperties: + _extensions: + shorthand_name: VnfcconfigurableProperties + type_qualified_name: tosca:VnfcconfigurableProperties + specification: tosca-simple-nfv-1.0 + specification_section: 5.3.10 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896065' + # ARIA NOTE: description is mangled in spec + description: >- + VnfcConfigurableProperties describes additional configurable properties of a VNFC. + derived_from: tosca.datatypes.Root + properties: + additional_vnfc_configurable_properties: + description: >- + Describes additional configuration for VNFC. + type: map + entry_schema: + type: string + required: false diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/nodes.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/nodes.yaml new file mode 100644 index 0000000..8d1f0a2 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/nodes.yaml @@ -0,0 +1,260 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +node_types: + + tosca.nodes.nfv.VDU.Compute: + _extensions: + shorthand_name: VDU.Compute + type_qualified_name: tosca:VDU.Compute + specification: tosca-simple-nfv-1.0 + specification_section: 5.9.2 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896079' + description: >- + The TOSCA nfv.VDU.Compute node type represents the virtual compute part of a VDU entity which + it mainly describes the deployment and operational behavior of a VNF component (VNFC), as + defined by [ETSI NFV IFA011]. + derived_from: tosca.nodes.Compute + properties: + name: + description: >- + Human readable name of the VDU. + type: string + required: true + description: + description: >- + Human readable description of the VDU. + type: string + required: true + boot_order: + description: >- + The key indicates the boot index (lowest index defines highest boot priority). + The Value references a descriptor from which a valid boot device is created e.g. + VirtualStorageDescriptor from which a VirtualStorage instance is created. If no boot order + is defined the default boot order defined in the VIM or NFVI shall be used. + type: list # ARIA NOTE: an explicit index (boot index) is unnecessary, contrary to IFA011 + entry_schema: + type: string + required: false + nfvi_constraints: + description: >- + Describes constraints on the NFVI for the VNFC instance(s) created from this VDU. + For example, aspects of a secure hosting environment for the VNFC instance that involve + additional entities or processes. More software images can be attached to the + virtualization container using virtual_storage. + type: list + entry_schema: + type: string + required: false + configurable_properties: + description: >- + Describes the configurable properties of all VNFC instances based on this VDU. + type: map + entry_schema: + type: tosca.datatypes.nfv.VnfcConfigurableProperties + required: true + attributes: + # ARIA NOTE: The attributes are only described in section [5.9.2.5 Definition], but are not + # mentioned in section [5.9.2.2 Attributes]. Additionally, it does not seem to make sense to + # deprecate inherited attributes, as it breaks the inheritence contract. + private_address: + type: string + status: deprecated + public_address: + type: string + status: deprecated + networks: + type: map + entry_schema: + type: tosca.datatypes.network.NetworkInfo + status: deprecated + ports: + type: map + entry_schema: + type: tosca.datatypes.network.PortInfo + status: deprecated + capabilities: + virtual_compute: + description: >- + Describes virtual compute resources capabilities. + type: tosca.capabilities.nfv.VirtualCompute + virtual_binding: + description: >- + Defines ability of VirtualBindable. + type: tosca.capabilities.nfv.VirtualBindable + monitoring_parameter: + # ARIA NOTE: commented out in 5.9.2.5 + description: >- + Monitoring parameter, which can be tracked for a VNFC based on this VDU. Examples include: + memory-consumption, CPU-utilisation, bandwidth-consumption, VNFC downtime, etc. + type: tosca.capabilities.nfv.Metric + #requirements: + # ARIA NOTE: virtual_storage is TBD + + # ARIA NOTE: csd04 attempts to deprecate the inherited local_storage requirement, but this + # is not possible in TOSCA + artifacts: + sw_image: + description: >- + Describes the software image which is directly loaded on the virtualization container + realizing this virtual storage. + file: '' # ARIA NOTE: missing value even though it is required in TOSCA + type: tosca.artifacts.nfv.SwImage + + tosca.nodes.nfv.VDU.VirtualStorage: + _extensions: + shorthand_name: VirtualStorage # ARIA NOTE: seems wrong in spec + type_qualified_name: tosca:VirtualStorage # ARIA NOTE: seems wrong in spec + specification: tosca-simple-nfv-1.0 + specification_section: 5.9.3 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896080' + description: >- + The NFV VirtualStorage node type represents a virtual storage entity which it describes the + deployment and operational behavior of a virtual storage resources, as defined by + [ETSI NFV IFA011]. + derived_from: tosca.nodes.Root + properties: + type_of_storage: + description: >- + Type of virtualized storage resource. + type: string + required: true + size_of_storage: + description: >- + Size of virtualized storage resource (in GB). + type: scalar-unit.size + required: true + rdma_enabled: + description: >- + Indicate if the storage support RDMA. + type: boolean + required: false + artifacts: + sw_image: + description: >- + Describes the software image which is directly loaded on the virtualization container + realizing this virtual storage. + file: '' # ARIA NOTE: missing in spec + type: tosca.artifacts.nfv.SwImage + + tosca.nodes.nfv.Cpd: + _extensions: + shorthand_name: Cpd + type_qualified_name: tosca:Cpd + specification: tosca-simple-nfv-1.0 + specification_section: 5.9.4 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896081' + description: >- + The TOSCA nfv.Cpd node represents network connectivity to a compute resource or a VL as defined + by [ETSI GS NFV-IFA 011]. This is an abstract type used as parent for the various Cpd types. + derived_from: tosca.nodes.Root + properties: + layer_protocol: + description: >- + Identifies which protocol the connection point uses for connectivity purposes. + type: string + constraints: + - valid_values: [ ethernet, mpls, odu2, ipv4, ipv6, pseudo_wire ] + required: false + role: # Name in ETSI NFV IFA011 v0.7.3 cpRole + description: >- + Identifies the role of the port in the context of the traffic flow patterns in the VNF or + parent NS. For example a VNF with a tree flow pattern within the VNF will have legal + cpRoles of ROOT and LEAF. + type: string + constraints: + - valid_values: [ root, leaf ] + required: false + description: + description: >- + Provides human-readable information on the purpose of the connection point + (e.g. connection point for control plane traffic). + type: string + required: false + address_data: + description: >- + Provides information on the addresses to be assigned to the connection point(s) instantiated + from this Connection Point Descriptor. + type: list + entry_schema: + type: tosca.datatypes.nfv.AddressData + required: false + + tosca.nodes.nfv.VduCpd: + _extensions: + shorthand_name: VduCpd + type_qualified_name: tosca:VduCpd + specification: tosca-simple-nfv-1.0 + specification_section: 5.9.5 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896082' + description: >- + The TOSCA nfv.VduCpd node type represents a type of TOSCA Cpd node and describes network + connectivity between a VNFC instance (based on this VDU) and an internal VL as defined by + [ETSI GS NFV-IFA 011]. + derived_from: tosca.nodes.nfv.Cpd + properties: + bitrate_requirement: + description: >- + Bitrate requirement on this connection point. + type: integer + required: false + virtual_network_interface_requirements: + description: >- + Specifies requirements on a virtual network interface realising the CPs instantiated from + this CPD. + type: list + entry_schema: + type: VirtualNetworkInterfaceRequirements + required: false + requirements: + # ARIA NOTE: seems to be a leftover from csd03 + # - virtual_link: + # description: Describes the requirements for linking to virtual link + # capability: tosca.capabilities.nfv.VirtualLinkable + # relationship: tosca.relationships.nfv.VirtualLinksTo + # node: tosca.nodes.nfv.VnfVirtualLinkDesc + - virtual_binding: + capability: tosca.capabilities.nfv.VirtualBindable + relationship: tosca.relationships.nfv.VirtualBindsTo + node: tosca.nodes.nfv.VDU.Compute # ARIA NOTE: seems wrong in spec + + tosca.nodes.nfv.VnfVirtualLinkDesc: + _extensions: + shorthand_name: VnfVirtualLinkDesc + type_qualified_name: tosca:VnfVirtualLinkDesc + specification: tosca-simple-nfv-1.0 + specification_section: 5.9.6 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896083' + description: >- + The TOSCA nfv.VnfVirtualLinkDesc node type represents a logical internal virtual link as + defined by [ETSI GS NFV-IFA 011]. + derived_from: tosca.nodes.Root + properties: + connectivity_type: + description: >- + specifies the protocol exposed by the VL and the flow pattern supported by the VL. + type: tosca.datatypes.nfv.ConnectivityType + required: true + description: + description: >- + Provides human-readable information on the purpose of the VL (e.g. control plane traffic). + type: string + required: false + test_access: + description: >- + Test access facilities available on the VL (e.g. none, passive, monitoring, or active + (intrusive) loopbacks at endpoints. + type: string + required: false diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/relationships.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/relationships.yaml new file mode 100644 index 0000000..4cf99a2 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/relationships.yaml @@ -0,0 +1,43 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +relationship_types: + + tosca.relationships.nfv.VirtualBindsTo: + _extensions: + shorthand_name: VirtualBindsTo + type_qualified_name: tosca:VirtualBindsTo + specification: tosca-simple-nfv-1.0 + specification_section: 5.7.1 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896074' + description: >- + This relationship type represents an association relationship between VDU and CP node types. + derived_from: tosca.relationships.DependsOn + valid_target_types: [ tosca.capabilities.nfv.VirtualBindable ] + + # ARIA NOTE: csd04 lacks the definition of tosca.relationships.nfv.Monitor (the derived_from and + # valid_target_types), so we are using the definition in csd03 section 8.4.2. + tosca.relationships.nfv.Monitor: + _extensions: + shorthand_name: Monitor + type_qualified_name: tosca:Monitor + specification: tosca-simple-nfv-1.0 + specification_section: 5.7.2 + specification_url: 'http://docs.oasis-open.org/tosca/tosca-nfv/v1.0/csd04/tosca-nfv-v1.0-csd04.html#_Toc482896075' + description: >- + This relationship type represents an association relationship to the Metric capability of VDU + node types. + derived_from: tosca.relationships.ConnectsTo + valid_target_types: [ tosca.capabilities.nfv.Metric ] diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/tosca-simple-nfv-1.0.yaml b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/tosca-simple-nfv-1.0.yaml new file mode 100644 index 0000000..764c739 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/profiles/tosca-simple-nfv-1.0/tosca-simple-nfv-1.0.yaml @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +imports: + - artifacts.yaml + - capabilities.yaml + - data.yaml + - nodes.yaml + - relationships.yaml diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_nfv_v1_0/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_nfv_v1_0/__init__.py new file mode 100644 index 0000000..313e3ef --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_nfv_v1_0/__init__.py @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 .presenter import ToscaSimpleNfvPresenter1_0 + +__all__ = ( + 'ToscaSimpleNfvPresenter1_0',) diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_nfv_v1_0/presenter.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_nfv_v1_0/presenter.py new file mode 100644 index 0000000..64178aa --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_nfv_v1_0/presenter.py @@ -0,0 +1,43 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.collections import FrozenList +from aria.utils.caching import cachedmethod + +from ..simple_v1_0 import ToscaSimplePresenter1_0 + + +class ToscaSimpleNfvPresenter1_0(ToscaSimplePresenter1_0): # pylint: disable=invalid-name,abstract-method + """ + ARIA presenter for the `TOSCA Simple Profile for NFV v1.0 csd04 `__. + + Supported ``tosca_definitions_version`` values: + + * ``tosca_simple_profile_for_nfv_1_0`` + """ + + DSL_VERSIONS = ('tosca_simple_profile_for_nfv_1_0',) + ALLOWED_IMPORTED_DSL_VERSIONS = ('tosca_simple_yaml_1_0', 'tosca_simple_profile_for_nfv_1_0') + SIMPLE_PROFILE_FOR_NFV_LOCATION = 'tosca-simple-nfv-1.0/tosca-simple-nfv-1.0.yaml' + + # Presenter + + @cachedmethod + def _get_import_locations(self, context): + import_locations = super(ToscaSimpleNfvPresenter1_0, self)._get_import_locations(context) + if context.presentation.import_profile: + return FrozenList([self.SIMPLE_PROFILE_FOR_NFV_LOCATION] + import_locations) + return import_locations diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/__init__.py new file mode 100644 index 0000000..61995db --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/__init__.py @@ -0,0 +1,199 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Parser implementation of `TOSCA Simple Profile v1.0 cos01 `__. + +.. autosummary:: + :nosignatures: + + aria_extension_tosca.simple_v1_0.ToscaSimplePresenter1_0 + +Assignments +----------- + +.. autosummary:: + :nosignatures: + + aria_extension_tosca.simple_v1_0.PropertyAssignment + aria_extension_tosca.simple_v1_0.OperationAssignment + aria_extension_tosca.simple_v1_0.InterfaceAssignment + aria_extension_tosca.simple_v1_0.RelationshipAssignment + aria_extension_tosca.simple_v1_0.RequirementAssignment + aria_extension_tosca.simple_v1_0.AttributeAssignment + aria_extension_tosca.simple_v1_0.CapabilityAssignment + aria_extension_tosca.simple_v1_0.ArtifactAssignment + +Definitions +----------- + +.. autosummary:: + :nosignatures: + + aria_extension_tosca.simple_v1_0.PropertyDefinition + aria_extension_tosca.simple_v1_0.AttributeDefinition + aria_extension_tosca.simple_v1_0.ParameterDefinition + aria_extension_tosca.simple_v1_0.OperationDefinition + aria_extension_tosca.simple_v1_0.InterfaceDefinition + aria_extension_tosca.simple_v1_0.RelationshipDefinition + aria_extension_tosca.simple_v1_0.RequirementDefinition + aria_extension_tosca.simple_v1_0.CapabilityDefinition + +Filters +------- + +.. autosummary:: + :nosignatures: + + aria_extension_tosca.simple_v1_0.CapabilityFilter + aria_extension_tosca.simple_v1_0.NodeFilter + +Miscellaneous +------------- + +.. autosummary:: + :nosignatures: + + aria_extension_tosca.simple_v1_0.Description + aria_extension_tosca.simple_v1_0.MetaData + aria_extension_tosca.simple_v1_0.Repository + aria_extension_tosca.simple_v1_0.Import + aria_extension_tosca.simple_v1_0.ConstraintClause + aria_extension_tosca.simple_v1_0.EntrySchema + aria_extension_tosca.simple_v1_0.OperationImplementation + aria_extension_tosca.simple_v1_0.SubstitutionMappingsRequirement + aria_extension_tosca.simple_v1_0.SubstitutionMappingsCapability + aria_extension_tosca.simple_v1_0.SubstitutionMappings + +Templates +--------- + +.. autosummary:: + :nosignatures: + + aria_extension_tosca.simple_v1_0.NodeTemplate + aria_extension_tosca.simple_v1_0.RelationshipTemplate + aria_extension_tosca.simple_v1_0.GroupTemplate + aria_extension_tosca.simple_v1_0.PolicyTemplate + aria_extension_tosca.simple_v1_0.TopologyTemplate + aria_extension_tosca.simple_v1_0.ServiceTemplate + +Types +----- + +.. autosummary:: + :nosignatures: + + aria_extension_tosca.simple_v1_0.ArtifactType + aria_extension_tosca.simple_v1_0.DataType + aria_extension_tosca.simple_v1_0.CapabilityType + aria_extension_tosca.simple_v1_0.InterfaceType + aria_extension_tosca.simple_v1_0.RelationshipType + aria_extension_tosca.simple_v1_0.NodeType + aria_extension_tosca.simple_v1_0.GroupType + aria_extension_tosca.simple_v1_0.PolicyType + +Data types +---------- + +.. autosummary:: + :nosignatures: + + aria_extension_tosca.simple_v1_0.Timestamp + aria_extension_tosca.simple_v1_0.Version + aria_extension_tosca.simple_v1_0.Range + aria_extension_tosca.simple_v1_0.List + aria_extension_tosca.simple_v1_0.Map + aria_extension_tosca.simple_v1_0.ScalarSize + aria_extension_tosca.simple_v1_0.ScalarTime + aria_extension_tosca.simple_v1_0.ScalarFrequency +""" + +from .presenter import ToscaSimplePresenter1_0 +from .assignments import (PropertyAssignment, OperationAssignment, InterfaceAssignment, + RelationshipAssignment, RequirementAssignment, AttributeAssignment, + CapabilityAssignment, ArtifactAssignment) +from .definitions import (PropertyDefinition, AttributeDefinition, ParameterDefinition, + OperationDefinition, InterfaceDefinition, RelationshipDefinition, + RequirementDefinition, CapabilityDefinition) +from .filters import CapabilityFilter, NodeFilter +from .misc import (Description, MetaData, Repository, Import, ConstraintClause, EntrySchema, + OperationImplementation, SubstitutionMappingsRequirement, + SubstitutionMappingsCapability, SubstitutionMappings) +from .templates import (NodeTemplate, RelationshipTemplate, GroupTemplate, PolicyTemplate, + TopologyTemplate, ServiceTemplate) +from .types import (ArtifactType, DataType, CapabilityType, InterfaceType, RelationshipType, + NodeType, GroupType, PolicyType) +from .data_types import (Timestamp, Version, Range, List, Map, ScalarSize, ScalarTime, + ScalarFrequency) + +MODULES = ( + 'modeling', + 'presentation') + +__all__ = ( + 'MODULES', + 'ToscaSimplePresenter1_0', + 'PropertyAssignment', + 'OperationAssignment', + 'InterfaceAssignment', + 'RelationshipAssignment', + 'RequirementAssignment', + 'AttributeAssignment', + 'CapabilityAssignment', + 'ArtifactAssignment', + 'PropertyDefinition', + 'AttributeDefinition', + 'ParameterDefinition', + 'OperationDefinition', + 'InterfaceDefinition', + 'RelationshipDefinition', + 'RequirementDefinition', + 'CapabilityDefinition', + 'CapabilityFilter', + 'NodeFilter', + 'Description', + 'MetaData', + 'Repository', + 'Import', + 'ConstraintClause', + 'EntrySchema', + 'OperationImplementation', + 'SubstitutionMappingsRequirement', + 'SubstitutionMappingsCapability', + 'SubstitutionMappings', + 'NodeTemplate', + 'RelationshipTemplate', + 'GroupTemplate', + 'PolicyTemplate', + 'TopologyTemplate', + 'ServiceTemplate', + 'ArtifactType', + 'DataType', + 'CapabilityType', + 'InterfaceType', + 'RelationshipType', + 'NodeType', + 'GroupType', + 'PolicyType', + 'Timestamp', + 'Version', + 'Range', + 'List', + 'Map', + 'ScalarSize', + 'ScalarTime', + 'ScalarFrequency') diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/assignments.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/assignments.py new file mode 100644 index 0000000..7b48ed0 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/assignments.py @@ -0,0 +1,453 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.collections import FrozenDict +from aria.utils.caching import cachedmethod +from aria.parser import implements_specification +from aria.parser.presentation import (AsIsPresentation, has_fields, allow_unknown_fields, + short_form_field, primitive_field, object_field, + object_dict_field, object_dict_unknown_fields, + field_validator, type_validator) + +from .filters import NodeFilter +from .misc import Description, OperationImplementation +from .modeling.parameters import get_assigned_and_defined_parameter_values +from .presentation.extensible import ExtensiblePresentation +from .presentation.field_validators import (node_template_or_type_validator, + relationship_template_or_type_validator, + capability_definition_or_type_validator, + node_filter_validator) +from .presentation.types import (convert_name_to_full_type_name, get_type_by_name) + + + +@implements_specification('3.5.9', 'tosca-simple-1.0') +class PropertyAssignment(AsIsPresentation): + """ + This section defines the grammar for assigning values to named properties within TOSCA Node and + Relationship templates that are defined in their corresponding named types. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + +@short_form_field('implementation') +@has_fields +@implements_specification('3.5.13-2', 'tosca-simple-1.0') +class OperationAssignment(ExtensiblePresentation): + """ + An operation definition defines a named function or procedure that can be bound to an + implementation artifact (e.g., a script). + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @object_field(Description) + def description(self): + """ + The optional description string for the associated named operation. + + :type: :class:`Description` + """ + + @object_field(OperationImplementation) + def implementation(self): + """ + The optional implementation artifact name (e.g., a script file name within a TOSCA CSAR + file). + + :type: :class:`OperationImplementation` + """ + + @object_dict_field(PropertyAssignment) + def inputs(self): + """ + The optional list of input property assignments (i.e., parameters assignments) for operation + definitions that are within TOSCA Node or Relationship Template definitions. This includes + when operation definitions are included as part of a Requirement assignment in a Node + Template. + + :type: {:obj:`basestring`: :class:`PropertyAssignment`} + """ + + @cachedmethod + def _get_extensions(self, context): + def update_inherited_extensions(extensions, interface_type): + parent = interface_type._get_parent(context) + if parent is not None: + update_inherited_extensions(extensions, parent) + operation_definition = interface_type.operations.get(self._name) + if operation_definition is not None: + if operation_definition._extensions: + extensions.update(operation_definition._extensions) + + extensions = {} + update_inherited_extensions(extensions, self._container._get_type(context)) + if self._container._extensions: + extensions.update(self._container._extensions) + if self._extensions: + extensions.update(self._extensions) + return extensions + + +@allow_unknown_fields +@has_fields +@implements_specification('3.5.14-2', 'tosca-simple-1.0') +class InterfaceAssignment(ExtensiblePresentation): + """ + An interface definition defines a named interface that can be associated with a Node or + Relationship Type. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @object_dict_field(PropertyAssignment) + def inputs(self): + """ + The optional list of input property assignments (i.e., parameters assignments) for interface + definitions that are within TOSCA Node or Relationship Template definitions. This includes + when interface definitions are referenced as part of a Requirement assignment in a Node + Template. + + :type: {:obj:`basestring`: :class:`PropertyAssignment`} + """ + + @object_dict_unknown_fields(OperationAssignment) + def operations(self): + """ + :type: {:obj:`basestring`: :class:`OperationAssignment`} + """ + + @cachedmethod + def _get_type(self, context): + the_type = self._container._get_type(context) + + if isinstance(the_type, tuple): + # In RelationshipAssignment + the_type = the_type[0] # This could be a RelationshipTemplate + + interface_definitions = the_type._get_interfaces(context) \ + if the_type is not None else None + interface_definition = interface_definitions.get(self._name) \ + if interface_definitions is not None else None + return interface_definition._get_type(context) \ + if interface_definition is not None else None + + def _validate(self, context): + super(InterfaceAssignment, self)._validate(context) + if self.operations: + for operation in self.operations.itervalues(): # pylint: disable=no-member + operation._validate(context) + + +@short_form_field('type') +@has_fields +class RelationshipAssignment(ExtensiblePresentation): + """ + Relationship assignment. + """ + + @field_validator(relationship_template_or_type_validator) + @primitive_field(str) + def type(self): + """ + The optional reserved keyname used to provide the name of the Relationship Type for the + requirement assignment's relationship keyname. + + :type: :obj:`basestring` + """ + + @object_dict_field(PropertyAssignment) + def properties(self): + """ + ARIA NOTE: This field is not mentioned in the spec, but is implied. + + :type: {:obj:`basestring`: :class:`PropertyAssignment`} + """ + + @object_dict_field(InterfaceAssignment) + def interfaces(self): + """ + The optional reserved keyname used to reference declared (named) interface definitions of + the corresponding Relationship Type in order to provide Property assignments for these + interfaces or operations of these interfaces. + + :type: {:obj:`basestring`: :class:`InterfaceAssignment`} + """ + + @cachedmethod + def _get_type(self, context): + type_name = self.type + if type_name is not None: + the_type = context.presentation.get_from_dict('service_template', 'topology_template', + 'relationship_templates', type_name) + if the_type is not None: + return the_type, 'relationship_template' + the_type = get_type_by_name(context, type_name, 'relationship_types') + if the_type is not None: + return the_type, 'relationship_type' + return None, None + + +@short_form_field('node') +@has_fields +@implements_specification('3.7.2', 'tosca-simple-1.0') +class RequirementAssignment(ExtensiblePresentation): + """ + A Requirement assignment allows template authors to provide either concrete names of TOSCA + templates or provide abstract selection criteria for providers to use to find matching TOSCA + templates that are used to fulfill a named requirement's declared TOSCA Node Type. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + # The example in 3.7.2.2.2 shows unknown fields in addition to these, but is this a mistake? + + @field_validator(capability_definition_or_type_validator) + @primitive_field(str) + def capability(self): + """ + The optional reserved keyname used to provide the name of either a: + + * Capability definition within a target node template that can fulfill the requirement. + * Capability Type that the provider will use to select a type-compatible target node + template to fulfill the requirement at runtime. + + :type: :obj:`basestring` + """ + + @field_validator(node_template_or_type_validator) + @primitive_field(str) + def node(self): + """ + The optional reserved keyname used to identify the target node of a relationship. + Specifically, it is used to provide either a: + + * Node Template name that can fulfill the target node requirement. + * Node Type name that the provider will use to select a type-compatible node template to + fulfill the requirement at runtime. + + :type: :obj:`basestring` + """ + + @object_field(RelationshipAssignment) + def relationship(self): + """ + The optional reserved keyname used to provide the name of either a: + + * Relationship Template to use to relate the source node to the (capability in the) target + node when fulfilling the requirement. + * Relationship Type that the provider will use to select a type-compatible relationship + template to relate the source node to the target node at runtime. + + :type: :class:`RelationshipAssignment` + """ + + @field_validator(node_filter_validator) + @object_field(NodeFilter) + def node_filter(self): + """ + The optional filter definition that TOSCA orchestrators or providers would use to select a + type-compatible target node that can fulfill the associated abstract requirement at runtime. + + :type: :class:`NodeFilter` + """ + + @cachedmethod + def _get_node(self, context): + node = self.node + + if node is not None: + node_template = context.presentation.get_from_dict('service_template', + 'topology_template', + 'node_templates', node) + if node_template is not None: + return node_template, 'node_template' + node_type = get_type_by_name(context, node, 'node_types') + if node_type is not None: + return node_type, 'node_type' + + return None, None + + @cachedmethod + def _get_capability(self, context): + capability = self.capability + + if capability is not None: + node, node_variant = self._get_node(context) + if node_variant == 'node_template': + capabilities = node._get_capabilities(context) + if capability in capabilities: + return capabilities[capability], 'capability_assignment' + capability_type = get_type_by_name(context, capability, 'capability_types') + if capability_type is not None: + return capability_type, 'capability_type' + + return None, None + + +@implements_specification('3.5.11', 'tosca-simple-1.0') +class AttributeAssignment(AsIsPresentation): + """ + This section defines the grammar for assigning values to named attributes within TOSCA Node and + Relationship templates which are defined in their corresponding named types. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + +@has_fields +@implements_specification('3.7.1', 'tosca-simple-1.0') +class CapabilityAssignment(ExtensiblePresentation): + """ + A capability assignment allows node template authors to assign values to properties and + attributes for a named capability definition that is part of a Node Template's type definition. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @object_dict_field(PropertyAssignment) + def properties(self): + """ + An optional list of property definitions for the Capability definition. + + :type: {:obj:`basestring`: :class:`PropertyAssignment`} + """ + + @object_dict_field(AttributeAssignment) + def attributes(self): + """ + An optional list of attribute definitions for the Capability definition. + + :type: {:obj:`basestring`: :class:`AttributeAssignment`} + """ + + @cachedmethod + def _get_definition(self, context): + node_type = self._container._get_type(context) + capability_definitions = node_type._get_capabilities(context) \ + if node_type is not None else None + return capability_definitions.get(self._name) \ + if capability_definitions is not None else None + + @cachedmethod + def _get_type(self, context): + capability_definition = self._get_definition(context) + return capability_definition._get_type(context) \ + if capability_definition is not None else None + + +@has_fields +@implements_specification('3.5.6', 'tosca-simple-1.0') +class ArtifactAssignmentForType(ExtensiblePresentation): + """ + An artifact definition defines a named, typed file that can be associated with Node Type or Node + Template and used by orchestration engine to facilitate deployment and implementation of + interface operations. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(type_validator('artifact type', convert_name_to_full_type_name, + 'artifact_types')) + @primitive_field(str, required=True) + def type(self): + """ + The required artifact type for the artifact definition. + + :type: :obj:`basestring` + """ + + @primitive_field(str, required=True) + def file(self): + """ + The required URI string (relative or absolute) which can be used to locate the artifact's + file. + + :type: :obj:`basestring` + """ + + @field_validator(type_validator('repository', 'repositories')) + @primitive_field(str) + def repository(self): + """ + The optional name of the repository definition which contains the location of the external + repository that contains the artifact. The artifact is expected to be referenceable by its + file URI within the repository. + + :type: :obj:`basestring` + """ + + @object_field(Description) + def description(self): + """ + The optional description for the artifact definition. + + :type: :class:`Description` + """ + + @primitive_field(str) + def deploy_path(self): + """ + The file path the associated file would be deployed into within the target node's container. + + :type: :obj:`basestring` + """ + + @object_dict_field(PropertyAssignment) + def properties(self): + """ + ARIA NOTE: This field is not mentioned in the spec, but is implied. + + :type: {:obj:`basestring`: :class:`PropertyAssignment`} + """ + + @cachedmethod + def _get_type(self, context): + return get_type_by_name(context, self.type, 'artifact_types') + + @cachedmethod + def _get_repository(self, context): + return context.presentation.get_from_dict('service_template', 'repositories', + self.repository) + + @cachedmethod + def _get_property_values(self, context): + return FrozenDict(get_assigned_and_defined_parameter_values(context, self, 'property')) + + @cachedmethod + def _validate(self, context): + super(ArtifactAssignmentForType, self)._validate(context) + + +class ArtifactAssignment(ArtifactAssignmentForType): + @cachedmethod + def _validate(self, context): + super(ArtifactAssignment, self)._validate(context) + self._get_property_values(context) diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/data_types.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/data_types.py new file mode 100644 index 0000000..216f1e4 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/data_types.py @@ -0,0 +1,561 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 re +from datetime import (datetime, tzinfo, timedelta) +try: + from functools import total_ordering +except ImportError: + from total_ordering import total_ordering + +from aria.parser import implements_specification +from aria.utils.collections import (StrictDict, OrderedDict) +from aria.utils.formatting import safe_repr + +from .modeling.data_types import (coerce_to_data_type_class, report_issue_for_bad_format, + coerce_value) + + +class Timezone(tzinfo): + """ + Timezone as fixed offset in hours and minutes east of UTC. + """ + + def __init__(self, hours=0, minutes=0): + super(Timezone, self).__init__() + self._offset = timedelta(hours=hours, minutes=minutes) + + def utcoffset(self, dt): # pylint: disable=unused-argument + return self._offset + + def tzname(self, dt): # pylint: disable=unused-argument + return str(self._offset) + + def dst(self, dt): # pylint: disable=unused-argument + return Timezone._ZERO + + _ZERO = timedelta(0) + + +UTC = Timezone() + + +@total_ordering +@implements_specification('timestamp', 'yaml-1.1') +class Timestamp(object): + ''' + TOSCA timestamps follow the YAML specification, which in turn is a variant of ISO8601. + + Long forms and short forms (without time of day and assuming UTC timezone) are supported for + parsing. The canonical form (for rendering) matches the long form at the UTC timezone. + + See the `Timestamp Language-Independent Type for YAML Version 1.1 (Working Draft 2005-01-18) + `__ + ''' + + REGULAR_SHORT = r'^(?P[0-9][0-9][0-9][0-9])-(?P[0-9][0-9])-(?P[0-9][0-9])$' + REGULAR_LONG = \ + r'^(?P[0-9][0-9][0-9][0-9])-(?P[0-9][0-9]?)-(?P[0-9][0-9]?)' + \ + r'([Tt]|[ \t]+)' \ + r'(?P[0-9][0-9]?):(?P[0-9][0-9]):(?P[0-9][0-9])' + \ + r'(?P\.[0-9]*)?' + \ + r'(([ \t]*)Z|(?P[-+][0-9][0-9])?(:(?P[0-9][0-9])?)?)?$' + CANONICAL = '%Y-%m-%dT%H:%M:%S' + + def __init__(self, entry_schema, constraints, value, aspect): # pylint: disable=unused-argument + value = str(value) + match = re.match(Timestamp.REGULAR_SHORT, value) + if match is not None: + # Parse short form + year = int(match.group('year')) + month = int(match.group('month')) + day = int(match.group('day')) + self.value = datetime(year, month, day, tzinfo=UTC) + else: + match = re.match(Timestamp.REGULAR_LONG, value) + if match is not None: + # Parse long form + year = int(match.group('year')) + month = int(match.group('month')) + day = int(match.group('day')) + hour = match.group('hour') + if hour is not None: + hour = int(hour) + minute = match.group('minute') + if minute is not None: + minute = int(minute) + second = match.group('second') + if second is not None: + second = int(second) + fraction = match.group('fraction') + if fraction is not None: + fraction = int(float(fraction) * 1000000.0) # convert to microseconds + tzhour = match.group('tzhour') + if tzhour is not None: + tzhour = int(tzhour) + else: + tzhour = 0 + tzminute = match.group('tzminute') + if tzminute is not None: + tzminute = int(tzminute) + else: + tzminute = 0 + self.value = datetime(year, month, day, hour, minute, second, fraction, + Timezone(tzhour, tzminute)) + else: + raise ValueError( + 'timestamp must be formatted as YAML ISO8601 variant or "YYYY-MM-DD": %s' + % safe_repr(value)) + + @property + def as_datetime_utc(self): + return self.value.astimezone(UTC) + + @property + def as_raw(self): + return self.__str__() + + def __str__(self): + the_datetime = self.as_datetime_utc + return '%s%sZ' \ + % (the_datetime.strftime(Timestamp.CANONICAL), Timestamp._fraction_as_str(the_datetime)) + + def __repr__(self): + return repr(self.__str__()) + + def __eq__(self, timestamp): + if not isinstance(timestamp, Timestamp): + return False + return self.value == timestamp.value + + def __lt__(self, timestamp): + return self.value < timestamp.value + + @staticmethod + def _fraction_as_str(the_datetime): + return '{0:g}'.format(the_datetime.microsecond / 1000000.0).lstrip('0') + + +@total_ordering +@implements_specification('3.2.2', 'tosca-simple-1.0') +class Version(object): + """ + TOSCA supports the concept of "reuse" of type definitions, as well as template definitions which + could be version and change over time. It is important to provide a reliable, normative means to + represent a version string which enables the comparison and management of types and templates + over time. Therefore, the TOSCA TC intends to provide a normative version type (string) for this + purpose in future Working Drafts of this specification. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + REGEX = \ + r'^(?P\d+)\.(?P\d+)(\.(?P\d+)' + \ + r'((\.(?P\d+))(\-(?P\d+))?)?)?$' + + @staticmethod + def key(version): + """ + Key method for fast sorting. + """ + return (version.major, version.minor, version.fix, version.qualifier, version.build) + + def __init__(self, entry_schema, constraints, value, aspect): # pylint: disable=unused-argument + str_value = str(value) + match = re.match(Version.REGEX, str_value) + if match is None: + raise ValueError( + 'version must be formatted as .' + '[.[.[-`__ + """ + + def __init__(self, entry_schema, constraints, value, aspect): # pylint: disable=unused-argument + if not isinstance(value, list): + raise ValueError('range value is not a list: %s' % safe_repr(value)) + if len(value) != 2: + raise ValueError('range value does not have exactly 2 elements: %s' % safe_repr(value)) + + def is_int(v): + return isinstance(v, int) and (not isinstance(v, bool)) # In Python bool is an int + + if not is_int(value[0]): + raise ValueError('lower bound of range is not a valid integer: %s' + % safe_repr(value[0])) + + if value[1] != 'UNBOUNDED': + if not is_int(value[1]): + raise ValueError('upper bound of range is not a valid integer or "UNBOUNDED": %s' + % safe_repr(value[0])) + + if value[0] >= value[1]: + raise ValueError( + 'upper bound of range is not greater than the lower bound: %s >= %s' + % (safe_repr(value[0]), safe_repr(value[1]))) + + self.value = value + + def is_in(self, value): + if value < self.value[0]: + return False + if (self.value[1] != 'UNBOUNDED') and (value > self.value[1]): + return False + return True + + @property + def as_raw(self): + return list(self.value) + + +@implements_specification('3.2.4', 'tosca-simple-1.0') +class List(list): + """ + The list type allows for specifying multiple values for a parameter of property. For example, if + an application allows for being configured to listen on multiple ports, a list of ports could be + configured using the list data type. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @staticmethod + def _create(context, presentation, entry_schema, constraints, value, aspect): # pylint: disable=unused-argument + if not isinstance(value, list): + raise ValueError('"list" data type value is not a list: %s' % safe_repr(value)) + + entry_schema_type = entry_schema._get_type(context) + entry_schema_constraints = entry_schema.constraints + + the_list = List() + for v in value: + v = coerce_value(context, presentation, entry_schema_type, None, + entry_schema_constraints, v, aspect) + if v is not None: + the_list.append(v) + + return the_list + + # Can't define as property because it's old-style Python class + def as_raw(self): + return list(self) + + +@implements_specification('3.2.5', 'tosca-simple-1.0') +class Map(StrictDict): + """ + The map type allows for specifying multiple values for a parameter of property as a map. In + contrast to the list type, where each entry can only be addressed by its index in the list, + entries in a map are named elements that can be addressed by their keys. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @staticmethod + def _create(context, presentation, entry_schema, constraints, value, aspect): # pylint: disable=unused-argument + if not isinstance(value, dict): + raise ValueError('"map" data type value is not a dict: %s' % safe_repr(value)) + + if entry_schema is None: + raise ValueError('"map" data type does not define "entry_schema"') + + entry_schema_type = entry_schema._get_type(context) + entry_schema_constraints = entry_schema.constraints + + the_map = Map() + for k, v in value.iteritems(): + v = coerce_value(context, presentation, entry_schema_type, None, + entry_schema_constraints, v, aspect) + if v is not None: + the_map[k] = v + + return the_map + + def __init__(self, items=None): + super(Map, self).__init__(items, key_class=str) + + # Can't define as property because it's old-style Python class + def as_raw(self): + return OrderedDict(self) + + +@total_ordering +@implements_specification('3.2.6', 'tosca-simple-1.0') +class Scalar(object): + """ + The scalar-unit type can be used to define scalar values along with a unit from the list of + recognized units. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @staticmethod + def key(scalar): + """ + Key method for fast sorting. + """ + return scalar.value + + def __init__(self, entry_schema, constraints, value, aspect): # pylint: disable=unused-argument + str_value = str(value) + match = re.match(self.REGEX, str_value) # pylint: disable=no-member + if match is None: + raise ValueError('scalar must be formatted as : %s' % safe_repr(value)) + + self.factor = float(match.group('scalar')) + if self.factor < 0: + raise ValueError('scalar is negative: %s' % safe_repr(self.factor)) + + self.unit = match.group('unit') + + unit_lower = self.unit.lower() + unit_size = None + for k, v in self.UNITS.iteritems(): # pylint: disable=no-member + if k.lower() == unit_lower: + self.unit = k + unit_size = v + break + if unit_size is None: + raise ValueError('scalar specified with unsupported unit: %s' % safe_repr(self.unit)) + + self.value = self.TYPE(self.factor * unit_size) # pylint: disable=no-member + + @property + def as_raw(self): + return OrderedDict(( + ('value', self.value), + ('factor', self.factor), + ('unit', self.unit), + ('unit_size', self.UNITS[self.unit]))) # pylint: disable=no-member + + def __str__(self): + return '%s %s' % (self.value, self.UNIT) # pylint: disable=no-member + + def __repr__(self): + return repr(self.__str__()) + + def __eq__(self, scalar): + if isinstance(scalar, Scalar): + value = scalar.value + else: + value = self.TYPE(scalar) # pylint: disable=no-member + return self.value == value + + def __lt__(self, scalar): + if isinstance(scalar, Scalar): + value = scalar.value + else: + value = self.TYPE(scalar) # pylint: disable=no-member + return self.value < value + + +@implements_specification('3.2.6.4', 'tosca-simple-1.0') +class ScalarSize(Scalar): + """ + Integer scalar for counting bytes. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + # See: http://www.regular-expressions.info/floatingpoint.html + REGEX = \ + r'^(?P[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?PB|kB|KiB|MB|MiB|GB|GiB|TB|TiB)$' + + UNITS = { + 'B': 1, + 'kB': 1000, + 'KiB': 1024, + 'MB': 1000000, + 'MiB': 1048576, + 'GB': 1000000000, + 'GiB': 1073741824, + 'TB': 1000000000000, + 'TiB': 1099511627776} + + TYPE = int + UNIT = 'bytes' + + +@implements_specification('3.2.6.5', 'tosca-simple-1.0') +class ScalarTime(Scalar): + """ + Floating point scalar for counting seconds. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + # See: http://www.regular-expressions.info/floatingpoint.html + REGEX = r'^(?P[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?Pns|us|ms|s|m|h|d)$' + + UNITS = { + 'ns': 0.000000001, + 'us': 0.000001, + 'ms': 0.001, + 's': 1.0, + 'm': 60.0, + 'h': 3600.0, + 'd': 86400.0} + + TYPE = float + UNIT = 'seconds' + + +@implements_specification('3.2.6.6', 'tosca-simple-1.0') +class ScalarFrequency(Scalar): + """ + Floating point scalar for counting cycles per second (Hz). + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + # See: http://www.regular-expressions.info/floatingpoint.html + REGEX = r'^(?P[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?PHz|kHz|MHz|GHz)$' + + UNITS = { + 'Hz': 1.0, + 'kHz': 1000.0, + 'MHz': 1000000.0, + 'GHz': 1000000000.0} + + TYPE = float + UNIT = 'Hz' + + +# +# The following are hooked in the YAML as 'coerce_value' extensions +# + +def coerce_timestamp(context, presentation, the_type, entry_schema, constraints, value, aspect): # pylint: disable=unused-argument + return coerce_to_data_type_class(context, presentation, Timestamp, entry_schema, constraints, + value, aspect) + + +def coerce_version(context, presentation, the_type, entry_schema, constraints, value, aspect): # pylint: disable=unused-argument + return coerce_to_data_type_class(context, presentation, Version, entry_schema, constraints, + value, aspect) + + +def coerce_range(context, presentation, the_type, entry_schema, constraints, value, aspect): + if aspect == 'in_range': + # When we're in a "in_range" constraint, the values are *not* themselves ranges, but numbers + try: + return float(value) + except ValueError as e: + report_issue_for_bad_format(context, presentation, the_type, value, aspect, e) + except TypeError as e: + report_issue_for_bad_format(context, presentation, the_type, value, aspect, e) + else: + return coerce_to_data_type_class(context, presentation, Range, entry_schema, constraints, + value, aspect) + + +def coerce_list(context, presentation, the_type, entry_schema, constraints, value, aspect): # pylint: disable=unused-argument + return coerce_to_data_type_class(context, presentation, List, entry_schema, constraints, + value, aspect) + + +def coerce_map_value(context, presentation, the_type, entry_schema, constraints, value, aspect): # pylint: disable=unused-argument + return coerce_to_data_type_class(context, presentation, Map, entry_schema, constraints, value, + aspect) + + +def coerce_scalar_unit_size(context, presentation, the_type, entry_schema, constraints, value, # pylint: disable=unused-argument + aspect): + return coerce_to_data_type_class(context, presentation, ScalarSize, entry_schema, constraints, + value, aspect) + + +def coerce_scalar_unit_time(context, presentation, the_type, entry_schema, constraints, value, # pylint: disable=unused-argument + aspect): + return coerce_to_data_type_class(context, presentation, ScalarTime, entry_schema, constraints, + value, aspect) + + +def coerce_scalar_unit_frequency(context, presentation, the_type, entry_schema, constraints, value, # pylint: disable=unused-argument + aspect): + return coerce_to_data_type_class(context, presentation, ScalarFrequency, entry_schema, + constraints, value, aspect) diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/definitions.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/definitions.py new file mode 100644 index 0000000..9158776 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/definitions.py @@ -0,0 +1,518 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.collections import FrozenDict +from aria.utils.caching import cachedmethod +from aria.parser import implements_specification +from aria.parser.presentation import (has_fields, short_form_field, allow_unknown_fields, + primitive_field, primitive_list_field, object_field, + object_list_field, object_dict_field, + object_dict_unknown_fields, field_validator, + field_getter, type_validator, list_type_validator) + +from .data_types import Range +from .misc import (Description, ConstraintClause, OperationImplementation, EntrySchema) +from .presentation.extensible import ExtensiblePresentation +from .presentation.field_getters import data_type_class_getter +from .presentation.field_validators import (data_type_validator, data_value_validator, + entry_schema_validator) +from .presentation.types import (convert_name_to_full_type_name, get_type_by_name) +from .modeling.data_types import get_data_type, get_property_constraints +from .modeling.interfaces import (get_and_override_input_definitions_from_type, + get_and_override_operation_definitions_from_type) + + +@has_fields +@implements_specification('3.5.8', 'tosca-simple-1.0') +class PropertyDefinition(ExtensiblePresentation): + """ + A property definition defines a named, typed value and related data that can be associated with + an entity defined in this specification (e.g., Node Types, Relationship Types, Capability Types, + etc.). Properties are used by template authors to provide input values to TOSCA entities which + indicate their "desired state" when they are instantiated. The value of a property can be + retrieved using the ``get_property`` function within TOSCA Service Templates. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(data_type_validator()) + @primitive_field(str, required=True) + def type(self): + """ + The required data type for the property. + + :type: :obj:`basestring` + """ + + @object_field(Description) + def description(self): + """ + The optional description for the property. + + :type: :class:`Description` + """ + + @primitive_field(bool, default=True) + def required(self): + """ + An optional key that declares a property as required (true) or not (false). + + :type: bool + """ + + @field_validator(data_value_validator) + @primitive_field() + def default(self): + """ + An optional key that may provide a value to be used as a default if not provided by another + means. + + :type: :obj:`basestring` + """ + + @primitive_field(str, default='supported', allowed=('supported', 'unsupported', 'experimental', + 'deprecated')) + @implements_specification(section='3.5.8.3', spec='tosca-simple-1.0') + def status(self): + """ + The optional status of the property relative to the specification or implementation. + + :type: :obj:`basestring` + """ + + @object_list_field(ConstraintClause) + def constraints(self): + """ + The optional list of sequenced constraint clauses for the property. + + :type: list of (str, :class:`ConstraintClause`) + """ + + @field_validator(entry_schema_validator) + @object_field(EntrySchema) + def entry_schema(self): + """ + The optional key that is used to declare the name of the Datatype definition for entries of + set types such as the TOSCA list or map. + + :type: :obj:`basestring` + """ + + @cachedmethod + def _get_type(self, context): + return get_data_type(context, self, 'type') + + @cachedmethod + def _get_constraints(self, context): + return get_property_constraints(context, self) + + +@has_fields +@implements_specification('3.5.10', 'tosca-simple-1.0') +class AttributeDefinition(ExtensiblePresentation): + """ + An attribute definition defines a named, typed value that can be associated with an entity + defined in this specification (e.g., a Node, Relationship or Capability Type). Specifically, it + is used to expose the "actual state" of some property of a TOSCA entity after it has been + deployed and instantiated (as set by the TOSCA orchestrator). Attribute values can be retrieved + via the ``get_attribute`` function from the instance model and used as values to other + entities within TOSCA Service Templates. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(data_type_validator()) + @primitive_field(str, required=True) + def type(self): + """ + The required data type for the attribute. + + :type: :obj:`basestring` + """ + + @object_field(Description) + def description(self): + """ + The optional description for the attribute. + + :type: :class:`Description` + """ + + @field_validator(data_value_validator) + @primitive_field() + def default(self): + """ + An optional key that may provide a value to be used as a default if not provided by another + means. + + This value SHALL be type compatible with the type declared by the property definition's type + keyname. + + :type: :obj:`basestring` + """ + + @primitive_field(str, default='supported', allowed=('supported', 'unsupported', 'experimental', + 'deprecated')) + def status(self): + """ + The optional status of the attribute relative to the specification or implementation. + + :type: :obj:`basestring` + """ + + @field_validator(entry_schema_validator) + @object_field(EntrySchema) + def entry_schema(self): + """ + The optional key that is used to declare the name of the Datatype definition for entries of + set types such as the TOSCA list or map. + + :type: :obj:`basestring` + """ + + @cachedmethod + def _get_type(self, context): + return get_data_type(context, self, 'type') + + +@has_fields +@implements_specification('3.5.12', 'tosca-simple-1.0') +class ParameterDefinition(PropertyDefinition): + """ + A parameter definition is essentially a TOSCA property definition; however, it also allows a + value to be assigned to it (as for a TOSCA property assignment). In addition, in the case of + output parameters, it can optionally inherit the data type of the value assigned to it rather + than have an explicit data type defined for it. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(data_type_validator()) + @primitive_field(str) + def type(self): + """ + The required data type for the parameter. + + Note: This keyname is required for a TOSCA Property definition, but is not for a TOSCA + Parameter definition. + + :type: :obj:`basestring` + """ + + @field_validator(data_value_validator) + @primitive_field() + def value(self): + """ + The type-compatible value to assign to the named parameter. Parameter values may be provided + as the result from the evaluation of an expression or a function. + """ + + +@short_form_field('implementation') +@has_fields +@implements_specification('3.5.13-1', 'tosca-simple-1.0') +class OperationDefinition(ExtensiblePresentation): + """ + An operation definition defines a named function or procedure that can be bound to an + implementation artifact (e.g., a script). + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @object_field(Description) + def description(self): + """ + The optional description string for the associated named operation. + + :type: :class:`Description` + """ + + @object_field(OperationImplementation) + def implementation(self): + """ + The optional implementation artifact name (e.g., a script file name within a TOSCA CSAR + file). + + :type: :class:`OperationImplementation` + """ + + @object_dict_field(PropertyDefinition) + def inputs(self): + """ + The optional list of input property definitions available to all defined operations for + interface definitions that are within TOSCA Node or Relationship Type definitions. This + includes when interface definitions are included as part of a Requirement definition in a + Node Type. + + :type: {:obj:`basestring`: :class:`PropertyDefinition`} + """ + + +@allow_unknown_fields +@has_fields +@implements_specification('3.5.14-1', 'tosca-simple-1.0') +class InterfaceDefinition(ExtensiblePresentation): + """ + An interface definition defines a named interface that can be associated with a Node or + Relationship Type. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(type_validator('interface type', convert_name_to_full_type_name, + 'interface_types')) + @primitive_field(str) + def type(self): + """ + ARIA NOTE: This field is not mentioned in the spec, but is implied. + + :type: :obj:`basestring` + """ + + @object_dict_field(PropertyDefinition) + def inputs(self): + """ + The optional list of input property definitions available to all defined operations for + interface definitions that are within TOSCA Node or Relationship Type definitions. This + includes when interface definitions are included as part of a Requirement definition in a + Node Type. + + :type: {:obj:`basestring`: :class:`PropertyDefinition`} + """ + + @object_dict_unknown_fields(OperationDefinition) + def operations(self): + """ + :type: {:obj:`basestring`: :class:`OperationDefinition`} + """ + + @cachedmethod + def _get_type(self, context): + return get_type_by_name(context, self.type, 'interface_types') + + @cachedmethod + def _get_inputs(self, context): + return FrozenDict(get_and_override_input_definitions_from_type(context, self)) + + @cachedmethod + def _get_operations(self, context): + return FrozenDict(get_and_override_operation_definitions_from_type(context, self)) + + def _validate(self, context): + super(InterfaceDefinition, self)._validate(context) + if self.operations: + for operation in self.operations.itervalues(): # pylint: disable=no-member + operation._validate(context) + + +@short_form_field('type') +@has_fields +class RelationshipDefinition(ExtensiblePresentation): + """ + Relationship definition. + """ + + @field_validator(type_validator('relationship type', convert_name_to_full_type_name, + 'relationship_types')) + @primitive_field(str, required=True) + def type(self): + """ + The optional reserved keyname used to provide the name of the Relationship Type for the + requirement definition's relationship keyname. + + :type: :obj:`basestring` + """ + + @object_dict_field(InterfaceDefinition) + def interfaces(self): + """ + The optional reserved keyname used to reference declared (named) interface definitions of + the corresponding Relationship Type in order to declare additional Property definitions for + these interfaces or operations of these interfaces. + + :type: list of :class:`InterfaceDefinition` + """ + + @cachedmethod + def _get_type(self, context): + return get_type_by_name(context, self.type, 'relationship_types') + + + +@short_form_field('capability') +@has_fields +@implements_specification('3.6.2', 'tosca-simple-1.0') +class RequirementDefinition(ExtensiblePresentation): + """ + The Requirement definition describes a named requirement (dependencies) of a TOSCA Node Type or + Node template which needs to be fulfilled by a matching Capability definition declared by + another TOSCA modelable entity. The requirement definition may itself include the specific name + of the fulfilling entity (explicitly) or provide an abstract type, along with additional + filtering characteristics, that a TOSCA orchestrator can use to fulfill the capability at + runtime (implicitly). + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(type_validator('capability type', convert_name_to_full_type_name, + 'capability_types')) + @primitive_field(str, required=True) + def capability(self): + """ + The required reserved keyname used that can be used to provide the name of a valid + Capability Type that can fulfill the requirement. + + :type: :obj:`basestring` + """ + + @field_validator(type_validator('node type', convert_name_to_full_type_name, + 'node_types')) + @primitive_field(str) + def node(self): + """ + The optional reserved keyname used to provide the name of a valid Node Type that contains + the capability definition that can be used to fulfill the requirement. + + :type: :obj:`basestring` + """ + + @object_field(RelationshipDefinition) + def relationship(self): + """ + The optional reserved keyname used to provide the name of a valid Relationship Type to + construct when fulfilling the requirement. + + :type: :class:`RelationshipDefinition` + """ + + @field_getter(data_type_class_getter(Range)) + @primitive_field() + def occurrences(self): + """ + The optional minimum and maximum occurrences for the requirement. + + Note: the keyword UNBOUNDED is also supported to represent any positive integer. + + :type: :class:`Range` + """ + + @cachedmethod + def _get_capability_type(self, context): + return get_type_by_name(context, self.capability, 'capability_types') + + @cachedmethod + def _get_node_type(self, context): + return context.presentation.get_from_dict('service_template', 'node_types', self.node) + + +@short_form_field('type') +@has_fields +@implements_specification('3.6.1', 'tosca-simple-1.0') +class CapabilityDefinition(ExtensiblePresentation): + """ + A capability definition defines a named, typed set of data that can be associated with Node Type + or Node Template to describe a transparent capability or feature of the software component the + node describes. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(type_validator('capability type', convert_name_to_full_type_name, + 'capability_types')) + @primitive_field(str, required=True) + def type(self): + """ + The required name of the Capability Type the capability definition is based upon. + + :type: :obj:`basestring` + """ + + @object_field(Description) + def description(self): + """ + The optional description of the Capability definition. + + :type: :class:`Description` + """ + + @object_dict_field(PropertyDefinition) + def properties(self): + """ + An optional list of property definitions for the Capability definition. + + :type: {:obj:`basestring`: :class:`PropertyDefinition`} + """ + + @object_dict_field(AttributeDefinition) + def attributes(self): + """ + An optional list of attribute definitions for the Capability definition. + + :type: {:obj:`basestring`: :class:`AttributeDefinition`} + """ + + @field_validator(list_type_validator('node type', convert_name_to_full_type_name, + 'node_types')) + @primitive_list_field(str) + def valid_source_types(self): + """ + An optional list of one or more valid names of Node Types that are supported as valid + sources of any relationship established to the declared Capability Type. + + :type: [:obj:`basestring`] + """ + + @field_getter(data_type_class_getter(Range)) + @primitive_field() + def occurrences(self): + """ + The optional minimum and maximum occurrences for the capability. By default, an exported + Capability should allow at least one relationship to be formed with it with a maximum of + ``UNBOUNDED`` relationships. + + Note: the keyword ``UNBOUNDED`` is also supported to represent any positive integer. + + ARIA NOTE: The spec seems wrong here: the implied default should be ``[0,UNBOUNDED]``, not + ``[1,UNBOUNDED]``, otherwise it would imply that at 1 least one relationship *must* be + formed. + + :type: :class:`Range` + """ + + @cachedmethod + def _get_type(self, context): + return get_type_by_name(context, self.type, 'capability_types') + + @cachedmethod + def _get_parent(self, context): + container_parent = self._container._get_parent(context) + container_parent_capabilities = container_parent._get_capabilities(context) \ + if container_parent is not None else None + return container_parent_capabilities.get(self._name) \ + if container_parent_capabilities is not None else None diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/filters.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/filters.py new file mode 100644 index 0000000..95d84b2 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/filters.py @@ -0,0 +1,107 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.caching import cachedmethod +from aria.parser import implements_specification +from aria.parser.presentation import (has_fields, object_sequenced_list_field, field_validator) + +from .misc import ConstraintClause +from .presentation.extensible import ExtensiblePresentation +from .presentation.field_validators import (node_filter_properties_validator, + node_filter_capabilities_validator) + + +@has_fields +class CapabilityFilter(ExtensiblePresentation): + """ + Capability filter. + """ + + @object_sequenced_list_field(ConstraintClause) + def properties(self): + pass + + @cachedmethod + def _get_node_type(self, context): + return self._container._get_node_type(context) + + @cachedmethod + def _get_type_for_name(self, context, name): + node_type = self._get_node_type(context) + if node_type is not None: + capabilities = node_type._get_capabilities(context) + capability = capabilities.get(self._name) + properties = capability.properties if capability is not None else None + prop = properties.get(name) if properties is not None else None + return prop._get_type(context) if prop is not None else None + + return None + + +@has_fields +@implements_specification('3.5.4', 'tosca-simple-1.0') +class NodeFilter(ExtensiblePresentation): + """ + A node filter definition defines criteria for selection of a TOSCA Node Template based upon the + template's property values, capabilities and capability properties. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(node_filter_properties_validator) + @object_sequenced_list_field(ConstraintClause) + @implements_specification('3.5.3', 'tosca-simple-1.0') + def properties(self): + """ + An optional sequenced list of property filters that would be used to select (filter) + matching TOSCA entities (e.g., Node Template, Node Type, Capability Types, etc.) based upon + their property definitions' values. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + + :type: list of (str, :class:`ConstraintClause`) + """ + + @field_validator(node_filter_capabilities_validator) + @object_sequenced_list_field(CapabilityFilter) + def capabilities(self): + """ + An optional sequenced list of property filters that would be used to select (filter) + matching TOSCA entities (e.g., Node Template, Node Type, Capability Types, etc.) based upon + their capabilities' property definitions' values. + + :type: list of (str, :class:`CapabilityDefinition`) + """ + + @cachedmethod + def _get_node_type(self, context): + if hasattr(self._container, '_get_node'): + node_type, node_type_variant = self._container._get_node(context) + return node_type if node_type_variant == 'node_type' else None + return None + + @cachedmethod + def _get_type_for_name(self, context, name): + node_type = self._get_node_type(context) + if node_type is not None: + properties = node_type._get_properties(context) + prop = properties.get(name) + return prop._get_type(context) if prop is not None else None + + return None diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/misc.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/misc.py new file mode 100644 index 0000000..221163c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/misc.py @@ -0,0 +1,444 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.caching import cachedmethod +from aria.utils.console import puts +from aria.utils.formatting import as_raw +from aria.parser import implements_specification +from aria.parser.presentation import (AsIsPresentation, has_fields, allow_unknown_fields, + short_form_field, primitive_field, primitive_list_field, + primitive_dict_unknown_fields, object_field, + object_list_field, object_dict_field, field_validator, + type_validator) + +from .modeling.data_types import (get_data_type, get_data_type_value, get_property_constraints, + apply_constraint_to_value) +from .modeling.substitution_mappings import (validate_substitution_mappings_requirement, + validate_substitution_mappings_capability) +from .presentation.extensible import ExtensiblePresentation +from .presentation.field_validators import (constraint_clause_field_validator, + constraint_clause_in_range_validator, + constraint_clause_valid_values_validator, + constraint_clause_pattern_validator, + data_type_validator) +from .presentation.types import (convert_name_to_full_type_name, get_type_by_name) + + + +@implements_specification('3.5.1', 'tosca-simple-1.0') +class Description(AsIsPresentation): + """ + Human-readable description. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + def __init__(self, name=None, raw=None, container=None, cls=None): # pylint: disable=unused-argument + super(Description, self).__init__(name, raw, container, cls=unicode) + + def _dump(self, context): + value = as_raw(self.value) + puts(context.style.meta_style(value)) + + +@allow_unknown_fields +@has_fields +@implements_specification('3.9.3.2', 'tosca-simple-1.0') +class MetaData(ExtensiblePresentation): + """ + Meta data. + """ + + @primitive_field(str) + @implements_specification('3.9.3.3', 'tosca-simple-1.0') + def template_name(self): + """ + This optional metadata keyname can be used to declare the name of service template as a + single-line string value. + """ + + @primitive_field(str) + @implements_specification('3.9.3.4', 'tosca-simple-1.0') + def template_author(self): + """ + This optional metadata keyname can be used to declare the author(s) of the service template + as a single-line string value. + """ + + @primitive_field(str) + @implements_specification('3.9.3.5', 'tosca-simple-1.0') + def template_version(self): + """ + This optional metadata keyname can be used to declare a domain specific version of the + service template as a single-line string value. + """ + + @primitive_dict_unknown_fields() + def custom(self): + """ + :type: dict + """ + + +@short_form_field('url') +@has_fields +@implements_specification('3.5.5', 'tosca-simple-1.0') +class Repository(ExtensiblePresentation): + """ + A repository definition defines a named external repository which contains deployment and + implementation artifacts that are referenced within the TOSCA Service Template. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @object_field(Description) + def description(self): + """ + The optional description for the repository. + + :type: :class:`Description` + """ + + @primitive_field(str, required=True) + def url(self): + """ + The required URL or network address used to access the repository. + + :type: :obj:`basestring` + """ + + @primitive_field() + def credential(self): + """ + The optional Credential used to authorize access to the repository. + + :type: tosca.datatypes.Credential + """ + + @cachedmethod + def _get_credential(self, context): + return get_data_type_value(context, self, 'credential', 'tosca.datatypes.Credential') + + +@short_form_field('file') +@has_fields +@implements_specification('3.5.7', 'tosca-simple-1.0') +class Import(ExtensiblePresentation): + """ + An import definition is used within a TOSCA Service Template to locate and uniquely name another + TOSCA Service Template file which has type and template definitions to be imported (included) + and referenced within another Service Template. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @primitive_field(str, required=True) + def file(self): + """ + The required symbolic name for the imported file. + + :type: :obj:`basestring` + """ + + @primitive_field(str) + def repository(self): + """ + The optional symbolic name of the repository definition where the imported file can be found + as a string. + + :type: :obj:`basestring` + """ + + @primitive_field(str) + def namespace_uri(self): + """ + The optional namespace URI to that will be applied to type definitions found within the + imported file as a string. + + :type: :obj:`basestring` + """ + + @primitive_field(str) + def namespace_prefix(self): + """ + The optional namespace prefix (alias) that will be used to indicate the namespace_uri when + forming a qualified name (i.e., qname) when referencing type definitions from the imported + file. + + :type: :obj:`basestring` + """ + + +@has_fields +@implements_specification('3.5.2-1', 'tosca-simple-1.0') +class ConstraintClause(ExtensiblePresentation): + """ + A constraint clause defines an operation along with one or more compatible values that can be + used to define a constraint on a property or parameter's allowed values when it is defined in a + TOSCA Service Template or one of its entities. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(constraint_clause_field_validator) + @primitive_field() + def equal(self): + """ + Constrains a property or parameter to a value equal to ('=') the value declared. + """ + + @field_validator(constraint_clause_field_validator) + @primitive_field() + def greater_than(self): + """ + Constrains a property or parameter to a value greater than ('>') the value declared. + """ + + @field_validator(constraint_clause_field_validator) + @primitive_field() + def greater_or_equal(self): + """ + Constrains a property or parameter to a value greater than or equal to ('>=') the value + declared. + """ + + @field_validator(constraint_clause_field_validator) + @primitive_field() + def less_than(self): + """ + Constrains a property or parameter to a value less than ('<') the value declared. + """ + + @field_validator(constraint_clause_field_validator) + @primitive_field() + def less_or_equal(self): + """ + Constrains a property or parameter to a value less than or equal to ('<=') the value + declared. + """ + + @field_validator(constraint_clause_in_range_validator) + @primitive_list_field() + def in_range(self): + """ + Constrains a property or parameter to a value in range of (inclusive) the two values + declared. + + Note: subclasses or templates of types that declare a property with the ``in_range`` + constraint MAY only further restrict the range specified by the parent type. + """ + + @field_validator(constraint_clause_valid_values_validator) + @primitive_list_field() + def valid_values(self): + """ + Constrains a property or parameter to a value that is in the list of declared values. + """ + + @primitive_field(int) + def length(self): + """ + Constrains the property or parameter to a value of a given length. + """ + + @primitive_field(int) + def min_length(self): + """ + Constrains the property or parameter to a value to a minimum length. + """ + + @primitive_field(int) + def max_length(self): + """ + Constrains the property or parameter to a value to a maximum length. + """ + + @field_validator(constraint_clause_pattern_validator) + @primitive_field(str) + def pattern(self): + """ + Constrains the property or parameter to a value that is allowed by the provided regular + expression. + + Note: Future drafts of this specification will detail the use of regular expressions and + reference an appropriate standardized grammar. + """ + + @cachedmethod + def _get_type(self, context): + if hasattr(self._container, '_get_type_for_name'): + # NodeFilter or CapabilityFilter + return self._container._get_type_for_name(context, self._name) + elif hasattr(self._container, '_get_type'): + # Properties + return self._container._get_type(context) + else: + # DataType (the DataType itself is our type) + return self._container + + def _apply_to_value(self, context, presentation, value): + return apply_constraint_to_value(context, presentation, self, value) + + +@short_form_field('type') +@has_fields +class EntrySchema(ExtensiblePresentation): + """ + ARIA NOTE: The specification does not properly explain this type, however it is implied by + examples. + """ + + @field_validator(data_type_validator('entry schema data type')) + @primitive_field(str, required=True) + def type(self): + """ + :type: :obj:`basestring` + """ + + @object_field(Description) + def description(self): + """ + :type: :class:`Description` + """ + + @object_list_field(ConstraintClause) + def constraints(self): + """ + :type: list of (str, :class:`ConstraintClause`) + """ + + @cachedmethod + def _get_type(self, context): + return get_data_type(context, self, 'type') + + @cachedmethod + def _get_constraints(self, context): + return get_property_constraints(context, self) + + +@short_form_field('primary') +@has_fields +class OperationImplementation(ExtensiblePresentation): + """ + Operation implementation. + """ + + @primitive_field(str) + def primary(self): + """ + The optional implementation artifact name (i.e., the primary script file name within a + TOSCA CSAR file). + + :type: :obj:`basestring` + """ + + @primitive_list_field(str) + def dependencies(self): + """ + The optional ordered list of one or more dependent or secondary implementation artifact name + which are referenced by the primary implementation artifact (e.g., a library the script + installs or a secondary script). + + :type: [:obj:`basestring`] + """ + + +class SubstitutionMappingsRequirement(AsIsPresentation): + """ + Substitution mapping for requirement. + """ + + @property + @cachedmethod + def node_template(self): + return str(self._raw[0]) + + @property + @cachedmethod + def requirement(self): + return str(self._raw[1]) + + def _validate(self, context): + super(SubstitutionMappingsRequirement, self)._validate(context) + validate_substitution_mappings_requirement(context, self) + + +class SubstitutionMappingsCapability(AsIsPresentation): + """ + Substitution mapping for capability. + """ + + @property + @cachedmethod + def node_template(self): + return str(self._raw[0]) + + @property + @cachedmethod + def capability(self): + return str(self._raw[1]) + + def _validate(self, context): + super(SubstitutionMappingsCapability, self)._validate(context) + validate_substitution_mappings_capability(context, self) + + +@has_fields +@implements_specification('2.10', 'tosca-simple-1.0') +class SubstitutionMappings(ExtensiblePresentation): + """ + Substitution mappings. + """ + + @field_validator(type_validator('node type', convert_name_to_full_type_name, 'node_types')) + @primitive_field(str, required=True) + def node_type(self): + """ + :type: :obj:`basestring` + """ + + @object_dict_field(SubstitutionMappingsRequirement) + def requirements(self): + """ + :type: {:obj:`basestring`: :class:`SubstitutionMappingsRequirement`} + """ + + @object_dict_field(SubstitutionMappingsCapability) + def capabilities(self): + """ + :type: {:obj:`basestring`: :class:`SubstitutionMappingsCapability`} + """ + + @cachedmethod + def _get_type(self, context): + return get_type_by_name(context, self.node_type, 'node_types') + + def _validate(self, context): + super(SubstitutionMappings, self)._validate(context) + self._get_type(context) + + def _dump(self, context): + self._dump_content(context, ( + 'node_type', + 'requirements', + 'capabilities')) diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py new file mode 100644 index 0000000..d960e05 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py @@ -0,0 +1,750 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +""" +Creates ARIA service template models based on the TOSCA presentation. + +Relies on many helper methods in the presentation classes. +""" + +#pylint: disable=unsubscriptable-object + +import os +import re +from types import FunctionType +from datetime import datetime + +from ruamel import yaml + +from aria.parser.validation import Issue +from aria.utils.formatting import string_list_as_string +from aria.utils.collections import (StrictDict, OrderedDict) +from aria.orchestrator import WORKFLOW_DECORATOR_RESERVED_ARGUMENTS +from aria.modeling.models import (Type, ServiceTemplate, NodeTemplate, + RequirementTemplate, RelationshipTemplate, CapabilityTemplate, + GroupTemplate, PolicyTemplate, SubstitutionTemplate, + SubstitutionTemplateMapping, InterfaceTemplate, OperationTemplate, + ArtifactTemplate, Metadata, Input, Output, Property, + Attribute, Configuration, PluginSpecification) + +from .parameters import coerce_parameter_value +from .constraints import (Equal, GreaterThan, GreaterOrEqual, LessThan, LessOrEqual, InRange, + ValidValues, Length, MinLength, MaxLength, Pattern) +from ..data_types import coerce_value + + +# These match the first un-escaped ">" +# See: http://stackoverflow.com/a/11819111/849021 +IMPLEMENTATION_PREFIX_REGEX = re.compile(r'(?') + + +def create_service_template_model(context): # pylint: disable=too-many-locals,too-many-branches + model = ServiceTemplate(created_at=datetime.now(), + main_file_name=os.path.basename(str(context.presentation.location))) + + model.description = context.presentation.get('service_template', 'description', 'value') + + # Metadata + metadata = context.presentation.get('service_template', 'metadata') + if metadata is not None: + create_metadata_models(context, model, metadata) + + # Types + model.node_types = Type(variant='node') + create_types(context, + model.node_types, + context.presentation.get('service_template', 'node_types')) + model.group_types = Type(variant='group') + create_types(context, + model.group_types, + context.presentation.get('service_template', 'group_types')) + model.policy_types = Type(variant='policy') + create_types(context, + model.policy_types, + context.presentation.get('service_template', 'policy_types')) + model.relationship_types = Type(variant='relationship') + create_types(context, + model.relationship_types, + context.presentation.get('service_template', 'relationship_types')) + model.capability_types = Type(variant='capability') + create_types(context, + model.capability_types, + context.presentation.get('service_template', 'capability_types')) + model.interface_types = Type(variant='interface') + create_types(context, + model.interface_types, + context.presentation.get('service_template', 'interface_types')) + model.artifact_types = Type(variant='artifact') + create_types(context, + model.artifact_types, + context.presentation.get('service_template', 'artifact_types')) + + # Topology template + topology_template = context.presentation.get('service_template', 'topology_template') + if topology_template is not None: + model.inputs.update( + create_input_models_from_values(topology_template._get_input_values(context))) + model.outputs.update( + create_output_models_from_values(topology_template._get_output_values(context))) + + # Plugin specifications + policies = context.presentation.get('service_template', 'topology_template', 'policies') + if policies: + for policy in policies.itervalues(): + role = model.policy_types.get_descendant(policy.type).role + if role == 'plugin': + plugin_specification = create_plugin_specification_model(context, policy) + model.plugin_specifications[plugin_specification.name] = plugin_specification + elif role == 'workflow': + operation_template = create_workflow_operation_template_model(context, + model, policy) + model.workflow_templates[operation_template.name] = operation_template + + # Node templates + node_templates = context.presentation.get('service_template', 'topology_template', + 'node_templates') + if node_templates: + for node_template in node_templates.itervalues(): + node_template_model = create_node_template_model(context, model, node_template) + model.node_templates[node_template_model.name] = node_template_model + for node_template in node_templates.itervalues(): + fix_node_template_model(context, model, node_template) + + # Group templates + groups = context.presentation.get('service_template', 'topology_template', 'groups') + if groups: + for group in groups.itervalues(): + group_template_model = create_group_template_model(context, model, group) + model.group_templates[group_template_model.name] = group_template_model + + # Policy templates + policies = context.presentation.get('service_template', 'topology_template', 'policies') + if policies: + for policy in policies.itervalues(): + policy_template_model = create_policy_template_model(context, model, policy) + model.policy_templates[policy_template_model.name] = policy_template_model + + # Substitution template + substitution_mappings = context.presentation.get('service_template', 'topology_template', + 'substitution_mappings') + if substitution_mappings: + model.substitution_template = create_substitution_template_model(context, model, + substitution_mappings) + + return model + + +def create_metadata_models(context, service_template, metadata): + service_template.meta_data['template_name'] = Metadata(name='template_name', + value=metadata.template_name) + service_template.meta_data['template_author'] = Metadata(name='template_author', + value=metadata.template_author) + service_template.meta_data['template_version'] = Metadata(name='template_version', + value=metadata.template_version) + custom = metadata.custom + if custom: + for name, value in custom.iteritems(): + service_template.meta_data[name] = Metadata(name=name, + value=value) + + +def create_node_template_model(context, service_template, node_template): + node_type = node_template._get_type(context) + node_type = service_template.node_types.get_descendant(node_type._name) + model = NodeTemplate(name=node_template._name, type=node_type) + + if node_template.description: + model.description = node_template.description.value + + if node_template.directives: + model.directives = node_template.directives + + model.properties.update(create_property_models_from_values( + template_properties=node_template._get_property_values(context))) + model.attributes.update(create_attribute_models_from_values( + template_attributes=node_template._get_attribute_default_values(context))) + + create_interface_template_models(context, service_template, model.interface_templates, + node_template._get_interfaces(context)) + + artifacts = node_template._get_artifacts(context) + if artifacts: + for artifact_name, artifact in artifacts.iteritems(): + model.artifact_templates[artifact_name] = \ + create_artifact_template_model(context, service_template, artifact) + + capabilities = node_template._get_capabilities(context) + if capabilities: + for capability_name, capability in capabilities.iteritems(): + model.capability_templates[capability_name] = \ + create_capability_template_model(context, service_template, capability) + + if node_template.node_filter: + model.target_node_template_constraints = [] + create_node_filter_constraints(context, node_template.node_filter, + model.target_node_template_constraints) + + return model + + +def fix_node_template_model(context, service_template, node_template): + # Requirements have to be created after all node templates have been created, because + # requirements might reference another node template + model = service_template.node_templates[node_template._name] + requirements = node_template._get_requirements(context) + if requirements: + for _, requirement in requirements: + model.requirement_templates.append(create_requirement_template_model(context, + service_template, + requirement)) + + +def create_group_template_model(context, service_template, group): + group_type = group._get_type(context) + group_type = service_template.group_types.get_descendant(group_type._name) + model = GroupTemplate(name=group._name, + type=group_type) + + if group.description: + model.description = group.description.value + + model.properties.update(create_property_models_from_values(group._get_property_values(context))) + + create_interface_template_models(context, service_template, model.interface_templates, + group._get_interfaces(context)) + members = group.members + if members: + for member in members: + node_template = service_template.node_templates[member] + assert node_template + model.node_templates.append(node_template) + + return model + + +def create_policy_template_model(context, service_template, policy): + policy_type = policy._get_type(context) + policy_type = service_template.policy_types.get_descendant(policy_type._name) + model = PolicyTemplate(name=policy._name, + type=policy_type) + + if policy.description: + model.description = policy.description.value + + model.properties.update( + create_property_models_from_values(policy._get_property_values(context))) + + node_templates, groups = policy._get_targets(context) + if node_templates: + for target in node_templates: + node_template = service_template.node_templates[target._name] + assert node_template + model.node_templates.append(node_template) + if groups: + for target in groups: + group_template = service_template.group_templates[target._name] + assert group_template + model.group_templates.append(group_template) + + return model + + +def create_requirement_template_model(context, service_template, requirement): + model = {'name': requirement._name} + + node, node_variant = requirement._get_node(context) + if node is not None: + if node_variant == 'node_type': + node_type = service_template.node_types.get_descendant(node._name) + model['target_node_type'] = node_type + else: + node_template = service_template.node_templates[node._name] + model['target_node_template'] = node_template + + capability, capability_variant = requirement._get_capability(context) + if capability is not None: + if capability_variant == 'capability_type': + capability_type = \ + service_template.capability_types.get_descendant(capability._name) + model['target_capability_type'] = capability_type + else: + model['target_capability_name'] = capability._name + + model = RequirementTemplate(**model) + + if requirement.node_filter: + model.target_node_template_constraints = [] + create_node_filter_constraints(context, requirement.node_filter, + model.target_node_template_constraints) + + relationship = requirement.relationship + if relationship is not None: + model.relationship_template = \ + create_relationship_template_model(context, service_template, relationship) + model.relationship_template.name = requirement._name + + return model + + +def create_relationship_template_model(context, service_template, relationship): + relationship_type, relationship_type_variant = relationship._get_type(context) + if relationship_type_variant == 'relationship_type': + relationship_type = service_template.relationship_types.get_descendant( + relationship_type._name) + model = RelationshipTemplate(type=relationship_type) + else: + relationship_template = relationship_type + relationship_type = relationship_template._get_type(context) + relationship_type = service_template.relationship_types.get_descendant( + relationship_type._name) + model = RelationshipTemplate(type=relationship_type) + if relationship_template.description: + model.description = relationship_template.description.value + + create_parameter_models_from_assignments(model.properties, + relationship.properties, + model_cls=Property) + create_interface_template_models(context, service_template, model.interface_templates, + relationship.interfaces) + + return model + + +def create_capability_template_model(context, service_template, capability): + capability_type = capability._get_type(context) + capability_type = service_template.capability_types.get_descendant(capability_type._name) + model = CapabilityTemplate(name=capability._name, + type=capability_type) + + capability_definition = capability._get_definition(context) + if capability_definition.description: + model.description = capability_definition.description.value + occurrences = capability_definition.occurrences + if occurrences is not None: + model.min_occurrences = occurrences.value[0] + if occurrences.value[1] != 'UNBOUNDED': + model.max_occurrences = occurrences.value[1] + + valid_source_types = capability_definition.valid_source_types + if valid_source_types: + for valid_source_type in valid_source_types: + # TODO: handle shortcut type names + node_type = service_template.node_types.get_descendant(valid_source_type) + model.valid_source_node_types.append(node_type) + + create_parameter_models_from_assignments(model.properties, + capability.properties, + model_cls=Property) + + return model + + +def create_interface_template_model(context, service_template, interface): + interface_type = interface._get_type(context) + interface_type = service_template.interface_types.get_descendant(interface_type._name) + model = InterfaceTemplate(name=interface._name, type=interface_type) + + if interface_type.description: + model.description = interface_type.description + + create_parameter_models_from_assignments(model.inputs, interface.inputs, model_cls=Input) + + operations = interface.operations + if operations: + for operation_name, operation in operations.iteritems(): + model.operation_templates[operation_name] = \ + create_operation_template_model(context, service_template, operation) + + return model if model.operation_templates else None + + +def create_operation_template_model(context, service_template, operation): + model = OperationTemplate(name=operation._name) + + if operation.description: + model.description = operation.description.value + + implementation = operation.implementation + if implementation is not None: + primary = implementation.primary + extract_implementation_primary(context, service_template, operation, model, primary) + relationship_edge = operation._get_extensions(context).get('relationship_edge') + if relationship_edge is not None: + if relationship_edge == 'source': + model.relationship_edge = False + elif relationship_edge == 'target': + model.relationship_edge = True + + dependencies = implementation.dependencies + configuration = OrderedDict() + if dependencies: + for dependency in dependencies: + key, value = split_prefix(dependency) + if key is not None: + # Special ARIA prefix: signifies configuration parameters + + # Parse as YAML + try: + value = yaml.load(value) + except yaml.parser.MarkedYAMLError as e: + context.validation.report( + 'YAML parser {0} in operation configuration: {1}' + .format(e.problem, value), + locator=implementation._locator, + level=Issue.FIELD) + continue + + # Coerce to intrinsic functions, if there are any + value = coerce_parameter_value(context, implementation, None, value).value + + # Support dot-notation nesting + set_nested(configuration, key.split('.'), value) + else: + if model.dependencies is None: + model.dependencies = [] + model.dependencies.append(dependency) + + # Convert configuration to Configuration models + for key, value in configuration.iteritems(): + model.configurations[key] = Configuration.wrap(key, value, + description='Operation configuration.') + + create_parameter_models_from_assignments(model.inputs, operation.inputs, model_cls=Input) + return model + + +def create_artifact_template_model(context, service_template, artifact): + artifact_type = artifact._get_type(context) + artifact_type = service_template.artifact_types.get_descendant(artifact_type._name) + model = ArtifactTemplate(name=artifact._name, + type=artifact_type, + source_path=artifact.file) + + if artifact.description: + model.description = artifact.description.value + + model.target_path = artifact.deploy_path + + repository = artifact._get_repository(context) + if repository is not None: + model.repository_url = repository.url + credential = repository._get_credential(context) + if credential: + model.repository_credential = {} + for k, v in credential.iteritems(): + model.repository_credential[k] = v + + model.properties.update( + create_property_models_from_values(artifact._get_property_values(context))) + + return model + + +def create_substitution_template_model(context, service_template, substitution_mappings): + node_type = service_template.node_types.get_descendant(substitution_mappings.node_type) + model = SubstitutionTemplate(node_type=node_type) + + capabilities = substitution_mappings.capabilities + if capabilities: + for mapped_capability_name, capability in capabilities.iteritems(): + name = 'capability.' + mapped_capability_name + node_template_model = service_template.node_templates[capability.node_template] + capability_template_model = \ + node_template_model.capability_templates[capability.capability] + model.mappings[name] = \ + SubstitutionTemplateMapping(name=name, + capability_template=capability_template_model) + + requirements = substitution_mappings.requirements + if requirements: + for mapped_requirement_name, requirement in requirements.iteritems(): + name = 'requirement.' + mapped_requirement_name + node_template_model = service_template.node_templates[requirement.node_template] + requirement_template_model = None + for a_model in node_template_model.requirement_templates: + if a_model.name == requirement.requirement: + requirement_template_model = a_model + break + model.mappings[name] = \ + SubstitutionTemplateMapping(name=name, + requirement_template=requirement_template_model) + + return model + + +def create_plugin_specification_model(context, policy): + properties = policy.properties + + def get(name, default=None): + prop = properties.get(name) + return prop.value if prop is not None else default + + model = PluginSpecification(name=policy._name, + version=get('version'), + enabled=get('enabled', True)) + + return model + + +def create_workflow_operation_template_model(context, service_template, policy): + model = OperationTemplate(name=policy._name) + # since we use backpopulates, these fields are populated upon commit, we get a weird(temporary) + # behavior where in previous code service_template.workflow_templates is a dict which has None + # as key for the value of model. + service_template.workflow_templates[model.name] = model + + if policy.description: + model.description = policy.description.value + + properties = policy._get_property_values(context) + for prop_name, prop in properties.iteritems(): + if prop_name == 'implementation': + model.function = prop.value + else: + input_model = create_parameter_model_from_value(prop, prop_name, model_cls=Input) + input_model.required = prop.required + model.inputs[prop_name] = input_model + + used_reserved_names = WORKFLOW_DECORATOR_RESERVED_ARGUMENTS.intersection(model.inputs.keys()) + if used_reserved_names: + context.validation.report('using reserved arguments in workflow policy "{0}": {1}' + .format( + policy._name, + string_list_as_string(used_reserved_names)), + locator=policy._locator, + level=Issue.EXTERNAL) + return model + + +# +# Utils +# + +def create_types(context, root, types): + if types is None: + return + + def added_all(): + for name in types: + if root.get_descendant(name) is None: + return False + return True + + while not added_all(): + for name, the_type in types.iteritems(): + if root.get_descendant(name) is None: + parent_type = the_type._get_parent(context) + model = Type(name=the_type._name, + role=the_type._get_extension('role')) + if the_type.description: + model.description = the_type.description.value + if parent_type is None: + model.parent = root + model.variant = root.variant + root.children.append(model) + else: + container = root.get_descendant(parent_type._name) + if container is not None: + model.parent = container + model.variant = container.variant + container.children.append(model) + + +def create_input_models_from_values(template_inputs): + model_inputs = {} + if template_inputs: + for template_input_name, template_input in template_inputs.iteritems(): + model_input = create_parameter_model_from_value(template_input, template_input_name, + model_cls=Input) + model_input.required = template_input.required + model_inputs[model_input.name] = model_input + return model_inputs + +def create_output_models_from_values(template_outputs): + model_outputs = {} + for template_output_name, template_output in template_outputs.iteritems(): + model_outputs[template_output_name] = \ + create_parameter_model_from_value(template_output, + template_output_name, + model_cls=Output) + return model_outputs + + +def create_property_models_from_values(template_properties): + model_properties = {} + for template_property_name, template_property in template_properties.iteritems(): + model_properties[template_property_name] = \ + create_parameter_model_from_value(template_property, + template_property_name, + model_cls=Property) + return model_properties + +def create_attribute_models_from_values(template_attributes): + model_attributes = {} + for template_attribute_name, template_attribute in template_attributes.iteritems(): + model_attributes[template_attribute_name] = \ + create_parameter_model_from_value(template_attribute, + template_attribute_name, + model_cls=Attribute) + return model_attributes + + +def create_parameter_model_from_value(template_parameter, template_parameter_name, model_cls): + return model_cls(name=template_parameter_name, + type_name=template_parameter.type, + value=template_parameter.value, + description=template_parameter.description) + + +def create_parameter_models_from_assignments(properties, source_properties, model_cls): + if source_properties: + for property_name, prop in source_properties.iteritems(): + properties[property_name] = model_cls(name=property_name, # pylint: disable=unexpected-keyword-arg + type_name=prop.value.type, + value=prop.value.value, + description=prop.value.description) + + +def create_interface_template_models(context, service_template, interfaces, source_interfaces): + if source_interfaces: + for interface_name, interface in source_interfaces.iteritems(): + interface = create_interface_template_model(context, service_template, interface) + if interface is not None: + interfaces[interface_name] = interface + + +def create_node_filter_constraints(context, node_filter, target_node_template_constraints): + properties = node_filter.properties + if properties is not None: + for property_name, constraint_clause in properties: + constraint = create_constraint(context, node_filter, constraint_clause, property_name, + None) + target_node_template_constraints.append(constraint) + + capabilities = node_filter.capabilities + if capabilities is not None: + for capability_name, capability in capabilities: + properties = capability.properties + if properties is not None: + for property_name, constraint_clause in properties: + constraint = create_constraint(context, node_filter, constraint_clause, + property_name, capability_name) + target_node_template_constraints.append(constraint) + + +def create_constraint(context, node_filter, constraint_clause, property_name, capability_name): # pylint: disable=too-many-return-statements + constraint_key = constraint_clause._raw.keys()[0] + + the_type = constraint_clause._get_type(context) + + def coerce_constraint(constraint): + if the_type is not None: + return coerce_value(context, node_filter, the_type, None, None, constraint, + constraint_key) + else: + return constraint + + def coerce_constraints(constraints): + if the_type is not None: + return tuple(coerce_constraint(constraint) for constraint in constraints) + else: + return constraints + + if constraint_key == 'equal': + return Equal(property_name, capability_name, + coerce_constraint(constraint_clause.equal)) + elif constraint_key == 'greater_than': + return GreaterThan(property_name, capability_name, + coerce_constraint(constraint_clause.greater_than)) + elif constraint_key == 'greater_or_equal': + return GreaterOrEqual(property_name, capability_name, + coerce_constraint(constraint_clause.greater_or_equal)) + elif constraint_key == 'less_than': + return LessThan(property_name, capability_name, + coerce_constraint(constraint_clause.less_than)) + elif constraint_key == 'less_or_equal': + return LessOrEqual(property_name, capability_name, + coerce_constraint(constraint_clause.less_or_equal)) + elif constraint_key == 'in_range': + return InRange(property_name, capability_name, + coerce_constraints(constraint_clause.in_range)) + elif constraint_key == 'valid_values': + return ValidValues(property_name, capability_name, + coerce_constraints(constraint_clause.valid_values)) + elif constraint_key == 'length': + return Length(property_name, capability_name, + coerce_constraint(constraint_clause.length)) + elif constraint_key == 'min_length': + return MinLength(property_name, capability_name, + coerce_constraint(constraint_clause.min_length)) + elif constraint_key == 'max_length': + return MaxLength(property_name, capability_name, + coerce_constraint(constraint_clause.max_length)) + elif constraint_key == 'pattern': + return Pattern(property_name, capability_name, + coerce_constraint(constraint_clause.pattern)) + else: + raise ValueError('malformed node_filter: {0}'.format(constraint_key)) + + +def split_prefix(string): + """ + Splits the prefix on the first non-escaped ">". + """ + + split = IMPLEMENTATION_PREFIX_REGEX.split(string, 1) + if len(split) < 2: + return None, None + return split[0].strip(), split[1].strip() + + +def set_nested(the_dict, keys, value): + """ + If the ``keys`` list has just one item, puts the value in the the dict. If there are more items, + puts the value in a sub-dict, creating sub-dicts as necessary for each key. + + For example, if ``the_dict`` is an empty dict, keys is ``['first', 'second', 'third']`` and + value is ``'value'``, then the_dict will be: ``{'first':{'second':{'third':'value'}}}``. + + :param the_dict: Dict to change + :type the_dict: {} + :param keys: Keys + :type keys: [basestring] + :param value: Value + """ + key = keys.pop(0) + if len(keys) == 0: + the_dict[key] = value + else: + if key not in the_dict: + the_dict[key] = StrictDict(key_class=basestring) + set_nested(the_dict[key], keys, value) + + +def extract_implementation_primary(context, service_template, presentation, model, primary): + prefix, postfix = split_prefix(primary) + if prefix: + # Special ARIA prefix + model.plugin_specification = service_template.plugin_specifications.get(prefix) + model.function = postfix + if model.plugin_specification is None: + context.validation.report( + 'no policy for plugin "{0}" specified in operation implementation: {1}' + .format(prefix, primary), + locator=presentation._get_child_locator('properties', 'implementation'), + level=Issue.BETWEEN_TYPES) + else: + # Standard TOSCA artifact with default plugin + model.implementation = primary diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/artifacts.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/artifacts.py new file mode 100644 index 0000000..b45615a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/artifacts.py @@ -0,0 +1,44 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.collections import OrderedDict + + +# +# NodeType, NodeTemplate +# + +def get_inherited_artifact_definitions(context, presentation, for_presentation=None): + if for_presentation is None: + for_presentation = presentation + + if hasattr(presentation, '_get_type'): + # In NodeTemplate + parent = presentation._get_type(context) + else: + # In NodeType + parent = presentation._get_parent(context) + + # Get artifact definitions from parent + artifacts = get_inherited_artifact_definitions(context, parent, for_presentation) \ + if parent is not None else OrderedDict() + + # Add/override our artifact definitions + our_artifacts = presentation.artifacts + if our_artifacts: + for artifact_name, artifact in our_artifacts.iteritems(): + artifacts[artifact_name] = artifact._clone(for_presentation) + + return artifacts diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py new file mode 100644 index 0000000..1b95bec --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py @@ -0,0 +1,220 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.collections import deepcopy_with_locators, OrderedDict +from aria.parser.validation import Issue + +from .parameters import (convert_parameter_definitions_to_values, merge_raw_parameter_definitions, + get_assigned_and_defined_parameter_values) + + +# +# CapabilityType +# + +def get_inherited_valid_source_types(context, presentation): + """ + If we haven't set the ``valid_source_types`` fields, uses that value from our parent, if we have + one (recursively). + """ + + valid_source_types = presentation.valid_source_types + + if valid_source_types is None: + parent = presentation._get_parent(context) + valid_source_types = get_inherited_valid_source_types(context, parent) \ + if parent is not None else None + + return valid_source_types + + +# +# NodeType +# + +def get_inherited_capability_definitions(context, presentation, for_presentation=None): + """ + Returns our capability capability definitions added on top of those of our parent, if we have + one (recursively). + + Allows overriding all aspects of parent capability properties except data type. + """ + + if for_presentation is None: + for_presentation = presentation + + # Get capability definitions from parent + parent = presentation._get_parent(context) + capability_definitions = get_inherited_capability_definitions( + context, parent, for_presentation) if parent is not None else OrderedDict() + + # Add/merge our capability definitions + our_capability_definitions = presentation.capabilities + if our_capability_definitions: + for capability_name, our_capability_definition in our_capability_definitions.iteritems(): + if capability_name in capability_definitions: + capability_definition = capability_definitions[capability_name] + + # Check if we changed the type + type1 = capability_definition._get_type(context) + type2 = our_capability_definition._get_type(context) + + if not type1._is_descendant(context, type2): + context.validation.report( + 'capability definition type "{0}" is not a descendant of overridden ' + 'capability definition type "{1}"' \ + .format(type1._name, type2._name), + locator=our_capability_definition._locator, level=Issue.BETWEEN_TYPES) + + merge_capability_definition(context, presentation, capability_definition, + our_capability_definition) + else: + capability_definition = our_capability_definition._clone(for_presentation) + if isinstance(capability_definition._raw, basestring): + # Make sure we have a dict + the_type = capability_definition._raw + capability_definition._raw = OrderedDict() + capability_definition._raw['type'] = the_type + capability_definitions[capability_name] = capability_definition + + merge_capability_definition_from_type(context, presentation, capability_definition) + + for capability_definition in capability_definitions.itervalues(): + capability_definition._reset_method_cache() + + return capability_definitions + + +# +# NodeTemplate +# + +def get_template_capabilities(context, presentation): + """ + Returns the node type's capabilities with our assignments to properties and attributes merged + in. + + Capability properties' default values, if available, will be used if we did not assign them. + + Makes sure that required properties indeed end up with a value. + """ + + capability_assignments = OrderedDict() + + the_type = presentation._get_type(context) # NodeType + capability_definitions = the_type._get_capabilities(context) if the_type is not None else None + + # Copy over capability definitions from the type (will initialize properties with default + # values) + if capability_definitions: + for capability_name, capability_definition in capability_definitions.iteritems(): + capability_assignments[capability_name] = \ + convert_capability_from_definition_to_assignment(context, capability_definition, + presentation) + + # Fill in our capability assignments + our_capability_assignments = presentation.capabilities + if our_capability_assignments: + for capability_name, our_capability_assignment in our_capability_assignments.iteritems(): + if capability_name in capability_assignments: + capability_assignment = capability_assignments[capability_name] + + # Assign properties + values = get_assigned_and_defined_parameter_values(context, + our_capability_assignment, + 'property') + + if values: + capability_assignment._raw['properties'] = values + capability_assignment._reset_method_cache() + else: + context.validation.report( + 'capability "{0}" not declared at node type "{1}" in "{2}"' + .format(capability_name, presentation.type, presentation._fullname), + locator=our_capability_assignment._locator, level=Issue.BETWEEN_TYPES) + + return capability_assignments + + +# +# Utils +# + +def convert_capability_from_definition_to_assignment(context, presentation, container): + from ..assignments import CapabilityAssignment + + raw = OrderedDict() + + properties = presentation.properties + if properties is not None: + raw['properties'] = convert_parameter_definitions_to_values(context, properties) + + # TODO attributes + + return CapabilityAssignment(name=presentation._name, raw=raw, container=container) + + +def merge_capability_definition(context, presentation, capability_definition, + from_capability_definition): + raw_properties = OrderedDict() + + capability_definition._raw['type'] = from_capability_definition.type + + # Merge properties from type + from_property_defintions = from_capability_definition.properties + merge_raw_parameter_definitions(context, presentation, raw_properties, from_property_defintions, + 'properties') + + # Merge our properties + merge_raw_parameter_definitions(context, presentation, raw_properties, + capability_definition.properties, 'properties') + + if raw_properties: + capability_definition._raw['properties'] = raw_properties + capability_definition._reset_method_cache() + + # Merge occurrences + occurrences = from_capability_definition._raw.get('occurrences') + if (occurrences is not None) and (capability_definition._raw.get('occurrences') is None): + capability_definition._raw['occurrences'] = \ + deepcopy_with_locators(occurrences) + + +def merge_capability_definition_from_type(context, presentation, capability_definition): + """ + Merge ``properties`` and ``valid_source_types`` from the node type's capability definition + over those taken from the parent node type. + """ + raw_properties = OrderedDict() + + # Merge properties from parent + the_type = capability_definition._get_type(context) + type_property_defintions = the_type._get_properties(context) + merge_raw_parameter_definitions(context, presentation, raw_properties, type_property_defintions, + 'properties') + + # Merge our properties (might override definitions in parent) + merge_raw_parameter_definitions(context, presentation, raw_properties, + capability_definition.properties, 'properties') + + if raw_properties: + capability_definition._raw['properties'] = raw_properties + + # Override valid_source_types + if capability_definition._raw.get('valid_source_types') is None: + valid_source_types = the_type._get_valid_source_types(context) + if valid_source_types is not None: + capability_definition._raw['valid_source_types'] = \ + deepcopy_with_locators(valid_source_types) diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/constraints.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/constraints.py new file mode 100644 index 0000000..9a30cc1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/constraints.py @@ -0,0 +1,144 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 re + +from aria.modeling.constraints import NodeTemplateConstraint +from aria.modeling.utils import NodeTemplateContainerHolder +from aria.modeling.functions import evaluate +from aria.parser import implements_specification + + +@implements_specification('3.5.2-2', 'tosca-simple-1.0') +class EvaluatingNodeTemplateConstraint(NodeTemplateConstraint): + """ + A version of :class:`NodeTemplateConstraint` with boilerplate initialization for TOSCA + constraints. + """ + + def __init__(self, property_name, capability_name, constraint, as_list=False): + self.property_name = property_name + self.capability_name = capability_name + self.constraint = constraint + self.as_list = as_list + + def matches(self, source_node_template, target_node_template): + # TOSCA node template constraints can refer to either capability properties or node + # template properties + if self.capability_name is not None: + # Capability property + capability = target_node_template.capability_templates.get(self.capability_name) + value = capability.properties.get(self.property_name) \ + if capability is not None else None # Parameter + else: + # Node template property + value = target_node_template.properties.get(self.property_name) # Parameter + + value = value.value if value is not None else None + + container_holder = NodeTemplateContainerHolder(source_node_template) + + if self.as_list: + constraints = [] + for constraint in self.constraint: + evaluation = evaluate(constraint, container_holder) + if evaluation is not None: + constraints.append(evaluation.value) + else: + constraints.append(constraint) + constraint = constraints + else: + evaluation = evaluate(self.constraint, container_holder) + if evaluation is not None: + constraint = evaluation.value + else: + constraint = self.constraint + + return self.matches_evaluated(value, constraint) + + def matches_evaluated(self, value, constraint): + raise NotImplementedError + + +class Equal(EvaluatingNodeTemplateConstraint): + def matches_evaluated(self, value, constraint): + return value == constraint + + +class GreaterThan(EvaluatingNodeTemplateConstraint): + def matches_evaluated(self, value, constraint): + return value > constraint + + +class GreaterOrEqual(EvaluatingNodeTemplateConstraint): + def matches_evaluated(self, value, constraint): + return value >= constraint + + +class LessThan(EvaluatingNodeTemplateConstraint): + def matches_evaluated(self, value, constraint): + return value < constraint + + +class LessOrEqual(EvaluatingNodeTemplateConstraint): + def matches_evaluated(self, value, constraint): + return value <= constraint + + +class InRange(EvaluatingNodeTemplateConstraint): + def __init__(self, property_name, capability_name, constraint): + super(InRange, self).__init__(property_name, capability_name, constraint, as_list=True) + + def matches_evaluated(self, value, constraints): + lower, upper = constraints + if value < lower: + return False + if (upper != 'UNBOUNDED') and (value > upper): + return False + return True + + +class ValidValues(EvaluatingNodeTemplateConstraint): + def __init__(self, property_name, capability_name, constraint): + super(ValidValues, self).__init__(property_name, capability_name, constraint, as_list=True) + + def matches_evaluated(self, value, constraints): + return value in constraints + + +class Length(EvaluatingNodeTemplateConstraint): + def matches_evaluated(self, value, constraint): + return len(value) == constraint + + +class MinLength(EvaluatingNodeTemplateConstraint): + def matches_evaluated(self, value, constraint): + return len(value) >= constraint + + +class MaxLength(EvaluatingNodeTemplateConstraint): + def matches_evaluated(self, value, constraint): + return len(value) <= constraint + + +class Pattern(EvaluatingNodeTemplateConstraint): + def matches_evaluated(self, value, constraint): + # From TOSCA 1.0 3.5.2.1: + # + # "Note: Future drafts of this specification will detail the use of regular expressions and + # reference an appropriate standardized grammar." + # + # So we will just use Python's. + return re.match(constraint, unicode(value)) is not None diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/copy.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/copy.py new file mode 100644 index 0000000..bd9037f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/copy.py @@ -0,0 +1,32 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# +# NodeTemplate, RelationshipTemplate +# + +def get_default_raw_from_copy(presentation, field_name): + """ + Used for the ``_get_default_raw`` field hook. + """ + + copy = presentation._raw.get('copy') + if copy is not None: + templates = getattr(presentation._container, field_name) + if templates is not None: + template = templates.get(copy) + if template is not None: + return template._raw + return None diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py new file mode 100644 index 0000000..13ce9a3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py @@ -0,0 +1,514 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 re + +from aria.utils.collections import OrderedDict +from aria.utils.formatting import safe_repr +from aria.utils.type import full_type_name +from aria.utils.imports import import_fullname +from aria.parser import implements_specification +from aria.parser.presentation import (get_locator, validate_primitive) +from aria.parser.validation import Issue + +from .functions import get_function +from ..presentation.types import get_type_by_name + + +# +# DataType +# + +def get_inherited_constraints(context, presentation): + """ + If we don't have constraints, will return our parent's constraints (if we have one), + recursively. + + Implication: if we define even one constraint, the parent's constraints will not be inherited. + """ + + constraints = presentation.constraints + + if constraints is None: + # If we don't have any, use our parent's + parent = presentation._get_parent(context) + parent_constraints = get_inherited_constraints(context, parent) \ + if parent is not None else None + if parent_constraints is not None: + constraints = parent_constraints + + return constraints + + +def coerce_data_type_value(context, presentation, data_type, entry_schema, constraints, value, # pylint: disable=unused-argument + aspect): + """ + Handles the ``_coerce_data()`` hook for complex data types. + + There are two kinds of handling: + + 1. If we have a primitive type as our great ancestor, then we do primitive type coersion, and + just check for constraints. + + 2. Otherwise, for normal complex data types we return the assigned property values while making + sure they are defined in our type. The property definition's default value, if available, + will be used if we did not assign it. We also make sure that required definitions indeed end + up with a value. + """ + + primitive_type = data_type._get_primitive_ancestor(context) + if primitive_type is not None: + # Must be coercible to primitive ancestor + value = coerce_to_primitive(context, presentation, primitive_type, constraints, value, + aspect) + else: + definitions = data_type._get_properties(context) + if isinstance(value, dict): + temp = OrderedDict() + + # Fill in our values, but make sure they are defined + for name, v in value.iteritems(): + if name in definitions: + definition = definitions[name] + definition_type = definition._get_type(context) + definition_entry_schema = definition.entry_schema + definition_constraints = definition._get_constraints(context) + temp[name] = coerce_value(context, presentation, definition_type, + definition_entry_schema, definition_constraints, v, + aspect) + else: + context.validation.report( + 'assignment to undefined property "%s" in type "%s" in "%s"' + % (name, data_type._fullname, presentation._fullname), + locator=get_locator(v, value, presentation), level=Issue.BETWEEN_TYPES) + + # Fill in defaults from the definitions, and check if required definitions have not been + # assigned + for name, definition in definitions.iteritems(): + if (temp.get(name) is None) and hasattr(definition, 'default') \ + and (definition.default is not None): + definition_type = definition._get_type(context) + definition_entry_schema = definition.entry_schema + definition_constraints = definition._get_constraints(context) + temp[name] = coerce_value(context, presentation, definition_type, + definition_entry_schema, definition_constraints, + definition.default, 'default') + + if getattr(definition, 'required', False) and (temp.get(name) is None): + context.validation.report( + 'required property "%s" in type "%s" is not assigned a value in "%s"' + % (name, data_type._fullname, presentation._fullname), + locator=presentation._get_child_locator('definitions'), + level=Issue.BETWEEN_TYPES) + + value = temp + elif value is not None: + context.validation.report('value of type "%s" is not a dict in "%s"' + % (data_type._fullname, presentation._fullname), + locator=get_locator(value, presentation), + level=Issue.BETWEEN_TYPES) + value = None + + return value + + +def validate_data_type_name(context, presentation): + """ + Makes sure the complex data type's name is not that of a built-in type. + """ + + name = presentation._name + if get_primitive_data_type(name) is not None: + context.validation.report('data type name is that of a built-in type: %s' + % safe_repr(name), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + + +# +# PropertyDefinition, AttributeDefinition, EntrySchema, DataType +# + +def get_data_type(context, presentation, field_name, allow_none=False): + """ + Returns the type, whether it's a complex data type (a DataType instance) or a primitive (a + Python primitive type class). + + If the type is not specified, defaults to :class:`str`, per note in section 3.2.1.1 of the + `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + type_name = getattr(presentation, field_name) + + if type_name is None: + if allow_none: + return None + else: + return str + + # Avoid circular definitions + container_data_type = get_container_data_type(presentation) + if (container_data_type is not None) and (container_data_type._name == type_name): + return None + + # Try complex data type + data_type = get_type_by_name(context, type_name, 'data_types') + if data_type is not None: + return data_type + + # Try primitive data type + return get_primitive_data_type(type_name) + + +# +# PropertyDefinition, EntrySchema +# + +def get_property_constraints(context, presentation): + """ + If we don't have constraints, will return our type's constraints (if we have one), recursively. + + Implication: if we define even one constraint, the type's constraints will not be inherited. + """ + + constraints = presentation.constraints + + if constraints is None: + # If we don't have any, use our type's + the_type = presentation._get_type(context) + type_constraints = the_type._get_constraints(context) \ + if hasattr(the_type, '_get_constraints') else None + if type_constraints is not None: + constraints = type_constraints + + return constraints + + +# +# ConstraintClause +# + +def apply_constraint_to_value(context, presentation, constraint_clause, value): # pylint: disable=too-many-statements,too-many-return-statements,too-many-branches + """ + Returns false if the value does not conform to the constraint. + """ + + constraint_key = constraint_clause._raw.keys()[0] + the_type = constraint_clause._get_type(context) + # PropertyAssignment does not have this: + entry_schema = getattr(presentation, 'entry_schema', None) + + def coerce_constraint(constraint): + return coerce_value(context, presentation, the_type, entry_schema, None, constraint, + constraint_key) + + def report(message, constraint): + context.validation.report('value %s %s per constraint in "%s": %s' + % (message, safe_repr(constraint), + presentation._name or presentation._container._name, + safe_repr(value)), + locator=presentation._locator, level=Issue.BETWEEN_FIELDS) + + if constraint_key == 'equal': + constraint = coerce_constraint(constraint_clause.equal) + if value != constraint: + report('is not equal to', constraint) + return False + + elif constraint_key == 'greater_than': + constraint = coerce_constraint(constraint_clause.greater_than) + if value <= constraint: + report('is not greater than', constraint) + return False + + elif constraint_key == 'greater_or_equal': + constraint = coerce_constraint(constraint_clause.greater_or_equal) + if value < constraint: + report('is not greater than or equal to', constraint) + return False + + elif constraint_key == 'less_than': + constraint = coerce_constraint(constraint_clause.less_than) + if value >= constraint: + report('is not less than', constraint) + return False + + elif constraint_key == 'less_or_equal': + constraint = coerce_constraint(constraint_clause.less_or_equal) + if value > constraint: + report('is not less than or equal to', constraint) + return False + + elif constraint_key == 'in_range': + lower, upper = constraint_clause.in_range + lower, upper = coerce_constraint(lower), coerce_constraint(upper) + if value < lower: + report('is not greater than or equal to lower bound', lower) + return False + if (upper != 'UNBOUNDED') and (value > upper): + report('is not lesser than or equal to upper bound', upper) + return False + + elif constraint_key == 'valid_values': + constraint = tuple(coerce_constraint(v) for v in constraint_clause.valid_values) + if value not in constraint: + report('is not one of', constraint) + return False + + elif constraint_key == 'length': + constraint = constraint_clause.length + try: + if len(value) != constraint: + report('is not of length', constraint) + return False + except TypeError: + pass # should be validated elsewhere + + elif constraint_key == 'min_length': + constraint = constraint_clause.min_length + try: + if len(value) < constraint: + report('has a length lesser than', constraint) + return False + except TypeError: + pass # should be validated elsewhere + + elif constraint_key == 'max_length': + constraint = constraint_clause.max_length + try: + if len(value) > constraint: + report('has a length greater than', constraint) + return False + except TypeError: + pass # should be validated elsewhere + + elif constraint_key == 'pattern': + constraint = constraint_clause.pattern + try: + # From TOSCA 1.0 3.5.2.1: + # + # "Note: Future drafts of this specification will detail the use of regular expressions + # and reference an appropriate standardized grammar." + # + # So we will just use Python's. + if re.match(constraint, str(value)) is None: + report('does not match regular expression', constraint) + return False + except re.error: + pass # should be validated elsewhere + + return True + + +# +# Repository +# + +def get_data_type_value(context, presentation, field_name, type_name): + the_type = get_type_by_name(context, type_name, 'data_types') + if the_type is not None: + value = getattr(presentation, field_name) + if value is not None: + return coerce_data_type_value(context, presentation, the_type, None, None, value, None) + else: + context.validation.report('field "%s" in "%s" refers to unknown data type "%s"' + % (field_name, presentation._fullname, type_name), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + return None + + +# +# Utils +# + +PRIMITIVE_DATA_TYPES = { + # YAML 1.2: + 'tag:yaml.org,2002:str': unicode, + 'tag:yaml.org,2002:integer': int, + 'tag:yaml.org,2002:float': float, + 'tag:yaml.org,2002:bool': bool, + 'tag:yaml.org,2002:null': None.__class__, + + # TOSCA aliases: + 'string': unicode, + 'integer': int, + 'float': float, + 'boolean': bool, + 'null': None.__class__} + + +@implements_specification('3.2.1-3', 'tosca-simple-1.0') +def get_primitive_data_type(type_name): + """ + Many of the types we use in this profile are built-in types from the YAML 1.2 specification + (i.e., those identified by the "tag:yaml.org,2002" version tag) [YAML-1.2]. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + return PRIMITIVE_DATA_TYPES.get(type_name) + + +def get_data_type_name(the_type): + """ + Returns the name of the type, whether it's a DataType, a primitive type, or another class. + """ + + return the_type._name if hasattr(the_type, '_name') else full_type_name(the_type) + + +def coerce_value(context, presentation, the_type, entry_schema, constraints, value, aspect=None): # pylint: disable=too-many-return-statements + """ + Returns the value after it's coerced to its type, reporting validation errors if it cannot be + coerced. + + Supports both complex data types and primitives. + + Data types can use the ``coerce_value`` extension to hook their own specialized function. + If the extension is present, we will delegate to that hook. + """ + + # TODO: should support models as well as presentations + + is_function, func = get_function(context, presentation, value) + if is_function: + return func + + if the_type is None: + return value + + if the_type == None.__class__: + if value is not None: + context.validation.report('field "%s" is of type "null" but has a non-null value: %s' + % (presentation._name, safe_repr(value)), + locator=presentation._locator, level=Issue.BETWEEN_FIELDS) + return None + + # Delegate to 'coerce_value' extension + if hasattr(the_type, '_get_extension'): + coerce_value_fn_name = the_type._get_extension('coerce_value') + if coerce_value_fn_name is not None: + if value is None: + return None + coerce_value_fn = import_fullname(coerce_value_fn_name) + return coerce_value_fn(context, presentation, the_type, entry_schema, constraints, + value, aspect) + + if hasattr(the_type, '_coerce_value'): + # Delegate to '_coerce_value' (likely a DataType instance) + return the_type._coerce_value(context, presentation, entry_schema, constraints, value, + aspect) + + # Coerce to primitive type + return coerce_to_primitive(context, presentation, the_type, constraints, value, aspect) + + +def coerce_to_primitive(context, presentation, primitive_type, constraints, value, aspect=None): + """ + Returns the value after it's coerced to a primitive type, translating exceptions to validation + errors if it cannot be coerced. + """ + + if value is None: + return None + + try: + # Coerce + value = validate_primitive(value, primitive_type, + context.validation.allow_primitive_coersion) + + # Check constraints + apply_constraints_to_value(context, presentation, constraints, value) + except (ValueError, TypeError) as e: + report_issue_for_bad_format(context, presentation, primitive_type, value, aspect, e) + value = None + + return value + + +def coerce_to_data_type_class(context, presentation, cls, entry_schema, constraints, value, + aspect=None): + """ + Returns the value after it's coerced to a data type class, reporting validation errors if it + cannot be coerced. Constraints will be applied after coersion. + + Will either call a ``_create`` static function in the class, or instantiate it using a + constructor if ``_create`` is not available. + + This will usually be called by a ``coerce_value`` extension hook in a :class:`DataType`. + """ + + try: + if hasattr(cls, '_create'): + # Instantiate using creator function + value = cls._create(context, presentation, entry_schema, constraints, value, aspect) + else: + # Normal instantiation + value = cls(entry_schema, constraints, value, aspect) + except ValueError as e: + report_issue_for_bad_format(context, presentation, cls, value, aspect, e) + value = None + + # Check constraints + value = apply_constraints_to_value(context, presentation, constraints, value) + + return value + + +def apply_constraints_to_value(context, presentation, constraints, value): + """ + Applies all constraints to the value. If the value conforms, returns the value. If it does not + conform, returns None. + """ + + if (value is not None) and (constraints is not None): + valid = True + for constraint in constraints: + if not constraint._apply_to_value(context, presentation, value): + valid = False + if not valid: + value = None + return value + + +def get_container_data_type(presentation): + if presentation is None: + return None + if type(presentation).__name__ == 'DataType': + return presentation + return get_container_data_type(presentation._container) + + +def report_issue_for_bad_format(context, presentation, the_type, value, aspect, e): + if aspect == 'default': + aspect = '"default" value' + elif aspect is not None: + aspect = '"%s" aspect' % aspect + + if aspect is not None: + context.validation.report('%s for field "%s" is not a valid "%s": %s' + % (aspect, presentation._name or presentation._container._name, + get_data_type_name(the_type), safe_repr(value)), + locator=presentation._locator, level=Issue.BETWEEN_FIELDS, + exception=e) + else: + context.validation.report('field "%s" is not a valid "%s": %s' + % (presentation._name or presentation._container._name, + get_data_type_name(the_type), safe_repr(value)), + locator=presentation._locator, level=Issue.BETWEEN_FIELDS, + exception=e) diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/functions.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/functions.py new file mode 100644 index 0000000..ecbfde9 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/functions.py @@ -0,0 +1,681 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 StringIO import StringIO # Note: cStringIO does not support Unicode +import re + +from aria.utils.collections import FrozenList +from aria.utils.formatting import (as_raw, safe_repr) +from aria.utils.type import full_type_name +from aria.parser import implements_specification +from aria.parser.exceptions import InvalidValueError +from aria.parser.validation import Issue +from aria.modeling.exceptions import CannotEvaluateFunctionException +from aria.modeling.models import (Node, NodeTemplate, Relationship, RelationshipTemplate) +from aria.modeling.functions import (Function, Evaluation) + + +# +# Intrinsic +# + +@implements_specification('4.3.1', 'tosca-simple-1.0') +class Concat(Function): + """ + The ``concat`` function is used to concatenate two or more string values within a TOSCA + service template. + """ + + def __init__(self, context, presentation, argument): + self.locator = presentation._locator + + if not isinstance(argument, list): + raise InvalidValueError( + 'function "concat" argument must be a list of string expressions: {0}' + .format(safe_repr(argument)), + locator=self.locator) + + string_expressions = [] + for index, an_argument in enumerate(argument): + string_expressions.append(parse_string_expression(context, presentation, 'concat', + index, None, an_argument)) + self.string_expressions = FrozenList(string_expressions) + + @property + def as_raw(self): + string_expressions = [] + for string_expression in self.string_expressions: + if hasattr(string_expression, 'as_raw'): + string_expression = as_raw(string_expression) + string_expressions.append(string_expression) + return {'concat': string_expressions} + + def __evaluate__(self, container_holder): + final = True + value = StringIO() + for e in self.string_expressions: + e, final = evaluate(e, final, container_holder) + if e is not None: + value.write(unicode(e)) + value = value.getvalue() or u'' + return Evaluation(value, final) + + +@implements_specification('4.3.2', 'tosca-simple-1.0') +class Token(Function): + """ + The ``token`` function is used within a TOSCA service template on a string to parse out + (tokenize) substrings separated by one or more token characters within a larger string. + """ + + def __init__(self, context, presentation, argument): + self.locator = presentation._locator + + if (not isinstance(argument, list)) or (len(argument) != 3): + raise InvalidValueError('function "token" argument must be a list of 3 parameters: {0}' + .format(safe_repr(argument)), + locator=self.locator) + + self.string_with_tokens = parse_string_expression(context, presentation, 'token', 0, + 'the string to tokenize', argument[0]) + self.string_of_token_chars = parse_string_expression(context, presentation, 'token', 1, + 'the token separator characters', + argument[1]) + self.substring_index = parse_int(context, presentation, 'token', 2, + 'the 0-based index of the token to return', argument[2]) + + @property + def as_raw(self): + string_with_tokens = self.string_with_tokens + if hasattr(string_with_tokens, 'as_raw'): + string_with_tokens = as_raw(string_with_tokens) + string_of_token_chars = self.string_of_token_chars + if hasattr(string_of_token_chars, 'as_raw'): + string_of_token_chars = as_raw(string_of_token_chars) + return {'token': [string_with_tokens, string_of_token_chars, self.substring_index]} + + def __evaluate__(self, container_holder): + final = True + string_with_tokens, final = evaluate(self.string_with_tokens, final, container_holder) + string_of_token_chars, final = evaluate(self.string_of_token_chars, final, container_holder) + + if string_of_token_chars: + regex = '[' + ''.join(re.escape(c) for c in string_of_token_chars) + ']' + split = re.split(regex, string_with_tokens) + if self.substring_index < len(split): + return Evaluation(split[self.substring_index], final) + + raise CannotEvaluateFunctionException() + + +# +# Property +# + +@implements_specification('4.4.1', 'tosca-simple-1.0') +class GetInput(Function): + """ + The ``get_input`` function is used to retrieve the values of properties declared within the + inputs section of a TOSCA Service Template. + """ + + def __init__(self, context, presentation, argument): + self.locator = presentation._locator + + self.input_property_name = parse_string_expression(context, presentation, 'get_input', + None, 'the input property name', + argument) + + if isinstance(self.input_property_name, basestring): + the_input = context.presentation.get_from_dict('service_template', 'topology_template', + 'inputs', self.input_property_name) + if the_input is None: + raise InvalidValueError( + 'function "get_input" argument is not a valid input name: {0}' + .format(safe_repr(argument)), + locator=self.locator) + + @property + def as_raw(self): + return {'get_input': as_raw(self.input_property_name)} + + def __evaluate__(self, container_holder): + service = container_holder.service + if service is None: + raise CannotEvaluateFunctionException() + + value = service.inputs.get(self.input_property_name) + if value is not None: + value = value.value + return Evaluation(value, False) # We never return final evaluations! + + raise InvalidValueError( + 'function "get_input" argument is not a valid input name: {0}' + .format(safe_repr(self.input_property_name)), + locator=self.locator) + + +@implements_specification('4.4.2', 'tosca-simple-1.0') +class GetProperty(Function): + """ + The ``get_property`` function is used to retrieve property values between modelable entities + defined in the same service template. + """ + + def __init__(self, context, presentation, argument): + self.locator = presentation._locator + + if (not isinstance(argument, list)) or (len(argument) < 2): + raise InvalidValueError( + 'function "get_property" argument must be a list of at least 2 string expressions: ' + '{0}'.format(safe_repr(argument)), + locator=self.locator) + + self.modelable_entity_name = parse_modelable_entity_name(context, presentation, + 'get_property', 0, argument[0]) + # The first of these will be tried as a req-or-cap name: + self.nested_property_name_or_index = argument[1:] + + @property + def as_raw(self): + return {'get_property': [self.modelable_entity_name] + self.nested_property_name_or_index} + + def __evaluate__(self, container_holder): + modelable_entities = get_modelable_entities(container_holder, 'get_property', self.locator, + self.modelable_entity_name) + req_or_cap_name = self.nested_property_name_or_index[0] + + for modelable_entity in modelable_entities: + properties = None + + # First argument refers to a requirement template? + if hasattr(modelable_entity, 'requirement_templates') \ + and modelable_entity.requirement_templates \ + and (req_or_cap_name in [v.name for v in modelable_entity.requirement_templates]): + for requirement in modelable_entity.requirement_templates: + if requirement.name == req_or_cap_name: + # TODO + raise CannotEvaluateFunctionException() + # First argument refers to a capability? + elif hasattr(modelable_entity, 'capabilities') \ + and modelable_entity.capabilities \ + and (req_or_cap_name in modelable_entity.capabilities): + properties = modelable_entity.capabilities[req_or_cap_name].properties + nested_property_name_or_index = self.nested_property_name_or_index[1:] + # First argument refers to a capability template? + elif hasattr(modelable_entity, 'capability_templates') \ + and modelable_entity.capability_templates \ + and (req_or_cap_name in modelable_entity.capability_templates): + properties = modelable_entity.capability_templates[req_or_cap_name].properties + nested_property_name_or_index = self.nested_property_name_or_index[1:] + else: + properties = modelable_entity.properties + nested_property_name_or_index = self.nested_property_name_or_index + + evaluation = get_modelable_entity_parameter(modelable_entity, properties, + nested_property_name_or_index) + if evaluation is not None: + return evaluation + + raise InvalidValueError( + 'function "get_property" could not find "{0}" in modelable entity "{1}"' + .format('.'.join(self.nested_property_name_or_index), self.modelable_entity_name), + locator=self.locator) + + +# +# Attribute +# + +@implements_specification('4.5.1', 'tosca-simple-1.0') +class GetAttribute(Function): + """ + The ``get_attribute`` function is used to retrieve the values of named attributes declared + by the referenced node or relationship template name. + """ + + def __init__(self, context, presentation, argument): + self.locator = presentation._locator + + if (not isinstance(argument, list)) or (len(argument) < 2): + raise InvalidValueError( + 'function "get_attribute" argument must be a list of at least 2 string expressions:' + ' {0}'.format(safe_repr(argument)), + locator=self.locator) + + self.modelable_entity_name = parse_modelable_entity_name(context, presentation, + 'get_attribute', 0, argument[0]) + # The first of these will be tried as a req-or-cap name: + self.nested_attribute_name_or_index = argument[1:] + + @property + def as_raw(self): + return {'get_attribute': [self.modelable_entity_name] + self.nested_attribute_name_or_index} + + def __evaluate__(self, container_holder): + modelable_entities = get_modelable_entities(container_holder, 'get_attribute', self.locator, + self.modelable_entity_name) + for modelable_entity in modelable_entities: + attributes = modelable_entity.attributes + nested_attribute_name_or_index = self.nested_attribute_name_or_index + evaluation = get_modelable_entity_parameter(modelable_entity, attributes, + nested_attribute_name_or_index) + if evaluation is not None: + evaluation.final = False # We never return final evaluations! + return evaluation + + raise InvalidValueError( + 'function "get_attribute" could not find "{0}" in modelable entity "{1}"' + .format('.'.join(self.nested_attribute_name_or_index), self.modelable_entity_name), + locator=self.locator) + + +# +# Operation +# + +@implements_specification('4.6.1', 'tosca-simple-1.0') # pylint: disable=abstract-method +class GetOperationOutput(Function): + """ + The ``get_operation_output`` function is used to retrieve the values of variables exposed / + exported from an interface operation. + """ + + def __init__(self, context, presentation, argument): + self.locator = presentation._locator + + if (not isinstance(argument, list)) or (len(argument) != 4): + raise InvalidValueError( + 'function "get_operation_output" argument must be a list of 4 parameters: {0}' + .format(safe_repr(argument)), + locator=self.locator) + + self.modelable_entity_name = parse_string_expression(context, presentation, + 'get_operation_output', 0, + 'modelable entity name', argument[0]) + self.interface_name = parse_string_expression(context, presentation, 'get_operation_output', + 1, 'the interface name', argument[1]) + self.operation_name = parse_string_expression(context, presentation, 'get_operation_output', + 2, 'the operation name', argument[2]) + self.output_variable_name = parse_string_expression(context, presentation, + 'get_operation_output', 3, + 'the output name', argument[3]) + + @property + def as_raw(self): + interface_name = self.interface_name + if hasattr(interface_name, 'as_raw'): + interface_name = as_raw(interface_name) + operation_name = self.operation_name + if hasattr(operation_name, 'as_raw'): + operation_name = as_raw(operation_name) + output_variable_name = self.output_variable_name + if hasattr(output_variable_name, 'as_raw'): + output_variable_name = as_raw(output_variable_name) + return {'get_operation_output': [self.modelable_entity_name, interface_name, operation_name, + output_variable_name]} + + +# +# Navigation +# + +@implements_specification('4.7.1', 'tosca-simple-1.0') +class GetNodesOfType(Function): + """ + The ``get_nodes_of_type`` function can be used to retrieve a list of all known instances of + nodes of the declared Node Type. + """ + + def __init__(self, context, presentation, argument): + self.locator = presentation._locator + + self.node_type_name = parse_string_expression(context, presentation, 'get_nodes_of_type', + None, 'the node type name', argument) + + if isinstance(self.node_type_name, basestring): + node_types = context.presentation.get('service_template', 'node_types') + if (node_types is None) or (self.node_type_name not in node_types): + raise InvalidValueError( + 'function "get_nodes_of_type" argument is not a valid node type name: {0}' + .format(safe_repr(argument)), + locator=self.locator) + + @property + def as_raw(self): + node_type_name = self.node_type_name + if hasattr(node_type_name, 'as_raw'): + node_type_name = as_raw(node_type_name) + return {'get_nodes_of_type': node_type_name} + + def __evaluate__(self, container): + pass + + +# +# Artifact +# + +@implements_specification('4.8.1', 'tosca-simple-1.0') # pylint: disable=abstract-method +class GetArtifact(Function): + """ + The ``get_artifact`` function is used to retrieve artifact location between modelable + entities defined in the same service template. + """ + + def __init__(self, context, presentation, argument): + self.locator = presentation._locator + + if (not isinstance(argument, list)) or (len(argument) < 2) or (len(argument) > 4): + raise InvalidValueError( + 'function "get_artifact" argument must be a list of 2 to 4 parameters: {0}' + .format(safe_repr(argument)), + locator=self.locator) + + self.modelable_entity_name = parse_string_expression(context, presentation, 'get_artifact', + 0, 'modelable entity name', + argument[0]) + self.artifact_name = parse_string_expression(context, presentation, 'get_artifact', 1, + 'the artifact name', argument[1]) + self.location = parse_string_expression(context, presentation, 'get_artifact', 2, + 'the location or "LOCAL_FILE"', argument[2]) + self.remove = parse_bool(context, presentation, 'get_artifact', 3, 'the removal flag', + argument[3]) + + @property + def as_raw(self): + artifact_name = self.artifact_name + if hasattr(artifact_name, 'as_raw'): + artifact_name = as_raw(artifact_name) + location = self.location + if hasattr(location, 'as_raw'): + location = as_raw(location) + return {'get_artifacts': [self.modelable_entity_name, artifact_name, location, self.remove]} + + +# +# Utils +# + +def get_function(context, presentation, value): + functions = context.presentation.presenter.functions + if isinstance(value, dict) and (len(value) == 1): + key = value.keys()[0] + if key in functions: + try: + return True, functions[key](context, presentation, value[key]) + except InvalidValueError as e: + context.validation.report(issue=e.issue) + return True, None + return False, None + + +def parse_string_expression(context, presentation, name, index, explanation, value): # pylint: disable=unused-argument + is_function, func = get_function(context, presentation, value) + if is_function: + return func + else: + value = str(value) + return value + + +def parse_int(context, presentation, name, index, explanation, value): # pylint: disable=unused-argument + if not isinstance(value, int): + try: + value = int(value) + except ValueError: + raise invalid_value(name, index, 'an integer', explanation, value, + presentation._locator) + return value + + +def parse_bool(context, presentation, name, index, explanation, value): # pylint: disable=unused-argument + if not isinstance(value, bool): + raise invalid_value(name, index, 'a boolean', explanation, value, presentation._locator) + return value + + +def parse_modelable_entity_name(context, presentation, name, index, value): + value = parse_string_expression(context, presentation, name, index, 'the modelable entity name', + value) + if value == 'SELF': + the_self, _ = parse_self(presentation) + if the_self is None: + raise invalid_modelable_entity_name(name, index, value, presentation._locator, + 'a node template or a relationship template') + elif value == 'HOST': + _, self_variant = parse_self(presentation) + if self_variant != 'node_template': + raise invalid_modelable_entity_name(name, index, value, presentation._locator, + 'a node template') + elif (value == 'SOURCE') or (value == 'TARGET'): + _, self_variant = parse_self(presentation) + if self_variant != 'relationship_template': + raise invalid_modelable_entity_name(name, index, value, presentation._locator, + 'a relationship template') + elif isinstance(value, basestring): + node_templates = \ + context.presentation.get('service_template', 'topology_template', 'node_templates') \ + or {} + relationship_templates = \ + context.presentation.get('service_template', 'topology_template', + 'relationship_templates') \ + or {} + if (value not in node_templates) and (value not in relationship_templates): + raise InvalidValueError( + 'function "{0}" parameter {1:d} is not a valid modelable entity name: {2}' + .format(name, index + 1, safe_repr(value)), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + return value + + +def parse_self(presentation): + from ..types import (NodeType, RelationshipType) + from ..templates import ( + NodeTemplate as NodeTemplatePresentation, + RelationshipTemplate as RelationshipTemplatePresentation + ) + + if presentation is None: + return None, None + elif isinstance(presentation, NodeTemplatePresentation) or isinstance(presentation, NodeType): + return presentation, 'node_template' + elif isinstance(presentation, RelationshipTemplatePresentation) \ + or isinstance(presentation, RelationshipType): + return presentation, 'relationship_template' + else: + return parse_self(presentation._container) + + +def evaluate(value, final, container_holder): + """ + Calls ``__evaluate__`` and passes on ``final`` state. + """ + + if hasattr(value, '__evaluate__'): + value = value.__evaluate__(container_holder) + if not value.final: + final = False + return value.value, final + else: + return value, final + + +@implements_specification('4.1', 'tosca-simple-1.0') +def get_modelable_entities(container_holder, name, locator, modelable_entity_name): + """ + The following keywords MAY be used in some TOSCA function in place of a TOSCA Node or + Relationship Template name. + """ + + if modelable_entity_name == 'SELF': + return get_self(container_holder, name, locator) + elif modelable_entity_name == 'HOST': + return get_hosts(container_holder, name, locator) + elif modelable_entity_name == 'SOURCE': + return get_source(container_holder, name, locator) + elif modelable_entity_name == 'TARGET': + return get_target(container_holder, name, locator) + elif isinstance(modelable_entity_name, basestring): + modelable_entities = [] + + service = container_holder.service + if service is not None: + for node in service.nodes.itervalues(): + if node.node_template.name == modelable_entity_name: + modelable_entities.append(node) + else: + service_template = container_holder.service_template + if service_template is not None: + for node_template in service_template.node_templates.itervalues(): + if node_template.name == modelable_entity_name: + modelable_entities.append(node_template) + + if not modelable_entities: + raise CannotEvaluateFunctionException() + + return modelable_entities + + raise InvalidValueError('function "{0}" could not find modelable entity "{1}"' + .format(name, modelable_entity_name), + locator=locator) + + +def get_self(container_holder, name, locator): + """ + A TOSCA orchestrator will interpret this keyword as the Node or Relationship Template instance + that contains the function at the time the function is evaluated. + """ + + container = container_holder.container + if (not isinstance(container, Node)) and \ + (not isinstance(container, NodeTemplate)) and \ + (not isinstance(container, Relationship)) and \ + (not isinstance(container, RelationshipTemplate)): + raise InvalidValueError('function "{0}" refers to "SELF" but it is not contained in ' + 'a node or a relationship: {1}'.format(name, + full_type_name(container)), + locator=locator) + + return [container] + + +def get_hosts(container_holder, name, locator): + """ + A TOSCA orchestrator will interpret this keyword to refer to the all nodes that "host" the node + using this reference (i.e., as identified by its HostedOn relationship). + + Specifically, TOSCA orchestrators that encounter this keyword when evaluating the get_attribute + or ``get_property`` functions SHALL search each node along the "HostedOn" relationship chain + starting at the immediate node that hosts the node where the function was evaluated (and then + that node's host node, and so forth) until a match is found or the "HostedOn" relationship chain + ends. + """ + + container = container_holder.container + if (not isinstance(container, Node)) and (not isinstance(container, NodeTemplate)): + raise InvalidValueError('function "{0}" refers to "HOST" but it is not contained in ' + 'a node: {1}'.format(name, full_type_name(container)), + locator=locator) + + if not isinstance(container, Node): + # NodeTemplate does not have "host"; we'll wait until instantiation + raise CannotEvaluateFunctionException() + + host = container.host + if host is None: + # We might have a host later + raise CannotEvaluateFunctionException() + + return [host] + + +def get_source(container_holder, name, locator): + """ + A TOSCA orchestrator will interpret this keyword as the Node Template instance that is at the + source end of the relationship that contains the referencing function. + """ + + container = container_holder.container + if (not isinstance(container, Relationship)) and \ + (not isinstance(container, RelationshipTemplate)): + raise InvalidValueError('function "{0}" refers to "SOURCE" but it is not contained in ' + 'a relationship: {1}'.format(name, full_type_name(container)), + locator=locator) + + if not isinstance(container, RelationshipTemplate): + # RelationshipTemplate does not have "source_node"; we'll wait until instantiation + raise CannotEvaluateFunctionException() + + return [container.source_node] + + +def get_target(container_holder, name, locator): + """ + A TOSCA orchestrator will interpret this keyword as the Node Template instance that is at the + target end of the relationship that contains the referencing function. + """ + + container = container_holder.container + if (not isinstance(container, Relationship)) and \ + (not isinstance(container, RelationshipTemplate)): + raise InvalidValueError('function "{0}" refers to "TARGET" but it is not contained in ' + 'a relationship: {1}'.format(name, full_type_name(container)), + locator=locator) + + if not isinstance(container, RelationshipTemplate): + # RelationshipTemplate does not have "target_node"; we'll wait until instantiation + raise CannotEvaluateFunctionException() + + return [container.target_node] + + +def get_modelable_entity_parameter(modelable_entity, parameters, nested_parameter_name_or_index): + if not parameters: + return Evaluation(None, True) + + found = True + final = True + value = parameters + + for name_or_index in nested_parameter_name_or_index: + if (isinstance(value, dict) and (name_or_index in value)) \ + or ((isinstance(value, list) and (name_or_index < len(value)))): + value = value[name_or_index] # Parameter + # We are not using Parameter.value, but rather Parameter._value, because we want to make + # sure to get "final" (it is swallowed by Parameter.value) + value, final = evaluate(value._value, final, value) + else: + found = False + break + + return Evaluation(value, final) if found else None + + +def invalid_modelable_entity_name(name, index, value, locator, contexts): + return InvalidValueError('function "{0}" parameter {1:d} can be "{2}" only in {3}' + .format(name, index + 1, value, contexts), + locator=locator, level=Issue.FIELD) + + +def invalid_value(name, index, the_type, explanation, value, locator): + return InvalidValueError( + 'function "{0}" {1} is not {2}{3}: {4}' + .format(name, + 'parameter {0:d}'.format(index + 1) if index is not None else 'argument', + the_type, + ', {0}'.format(explanation) if explanation is not None else '', + safe_repr(value)), + locator=locator, level=Issue.FIELD) diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/interfaces.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/interfaces.py new file mode 100644 index 0000000..23a03b7 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/interfaces.py @@ -0,0 +1,530 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.collections import (merge, deepcopy_with_locators, OrderedDict) +from aria.parser.presentation import get_locator +from aria.parser.validation import Issue + +from .parameters import (coerce_parameter_value, convert_parameter_definitions_to_values) + + +# +# InterfaceType +# + +def get_inherited_operations(context, presentation): + """ + Returns our operation definitions added on top of those of our parent, if we have one + (recursively). + + Allows overriding all aspects of parent operations except input data types. + """ + + # Get operations from parent + parent = presentation._get_parent(context) + operations = get_inherited_operations(context, parent) if parent is not None else OrderedDict() + + # Add/merge our operations + our_operations = presentation.operations # OperationDefinition + merge_operation_definitions(context, operations, our_operations, presentation._name, + presentation, 'type') + + for operation in operations.itervalues(): + operation._reset_method_cache() + + return operations + + +# +# InterfaceDefinition +# + +def get_and_override_input_definitions_from_type(context, presentation): + """ + Returns our input definitions added on top of those of the interface type, if specified. + + Allows overriding all aspects of parent interface type inputs except data types. + """ + + inputs = OrderedDict() + + # Get inputs from type + the_type = presentation._get_type(context) # InterfaceType + type_inputs = the_type._get_inputs(context) if the_type is not None else None + if type_inputs: + for input_name, type_input in type_inputs.iteritems(): + inputs[input_name] = type_input._clone(presentation) + + # Add/merge our inputs + our_inputs = presentation.inputs # PropertyDefinition + if our_inputs: + merge_input_definitions(context, inputs, our_inputs, presentation._name, None, presentation, + 'definition') + + return inputs + + +def get_and_override_operation_definitions_from_type(context, presentation): + """ + Returns our operation definitions added on top of those of the interface type, if specified. + + Allows overriding all aspects of parent interface type inputs except data types. + """ + + operations = OrderedDict() + + # Get operations from type + the_type = presentation._get_type(context) # InterfaceType + type_operations = the_type._get_operations(context) if the_type is not None else None + if type_operations: + for operations_name, type_operation in type_operations.iteritems(): + operations[operations_name] = type_operation._clone(presentation) + + # Add/merge our operations + our_operations = presentation.operations # OperationDefinition + merge_operation_definitions(context, operations, our_operations, presentation._name, + presentation, 'definition') + + return operations + + +# +# NodeType, RelationshipType, GroupType +# + +def get_inherited_interface_definitions(context, presentation, type_name, for_presentation=None): + """ + Returns our interface definitions added on top of those of our parent, if we have one + (recursively). + + Allows overriding all aspects of parent interfaces except interface and operation input data + types. + """ + + if for_presentation is None: + for_presentation = presentation + + # Get interfaces from parent + parent = presentation._get_parent(context) + interfaces = get_inherited_interface_definitions(context, parent, type_name, for_presentation) \ + if parent is not None else OrderedDict() + + # Add/merge interfaces from their types + merge_interface_definitions_from_their_types(context, interfaces, presentation) + + # Add/merge our interfaces + our_interfaces = presentation.interfaces + merge_interface_definitions(context, interfaces, our_interfaces, presentation, for_presentation) + + return interfaces + + +# +# NodeTemplate, RelationshipTemplate, GroupTemplate +# + +def get_template_interfaces(context, presentation, type_name): + """ + Returns the assigned interface_template values while making sure they are defined in the type. + This includes the interfaces themselves, their operations, and inputs for interfaces and + operations. + + Interface and operation inputs' default values, if available, will be used if we did not assign + them. + + Makes sure that required inputs indeed end up with a value. + + This code is especially complex due to the many levels of nesting involved. + """ + + template_interfaces = OrderedDict() + + the_type = presentation._get_type(context) # NodeType, RelationshipType, GroupType + # InterfaceDefinition (or InterfaceAssignment in the case of RelationshipTemplate): + interface_definitions = the_type._get_interfaces(context) if the_type is not None else None + + # Copy over interfaces from the type (will initialize inputs with default values) + if interface_definitions is not None: + for interface_name, interface_definition in interface_definitions.iteritems(): + # Note that in the case of a RelationshipTemplate, we will already have the values as + # InterfaceAssignment. It will not be converted, just cloned. + template_interfaces[interface_name] = \ + convert_interface_definition_from_type_to_template(context, interface_definition, + presentation) + + # Fill in our interfaces + our_interface_assignments = presentation.interfaces + if our_interface_assignments: + # InterfaceAssignment: + for interface_name, our_interface_assignment in our_interface_assignments.iteritems(): + if interface_name in template_interfaces: + interface_assignment = template_interfaces[interface_name] # InterfaceAssignment + # InterfaceDefinition (or InterfaceAssignment in the case of RelationshipTemplate): + interface_definition = interface_definitions[interface_name] + merge_interface(context, presentation, interface_assignment, + our_interface_assignment, interface_definition, interface_name) + else: + context.validation.report( + 'interface definition "%s" not declared at %s "%s" in "%s"' + % (interface_name, type_name, presentation.type, presentation._fullname), + locator=our_interface_assignment._locator, level=Issue.BETWEEN_TYPES) + + # Check that there are no required inputs that we haven't assigned + for interface_name, interface_template in template_interfaces.iteritems(): + if interface_name in interface_definitions: + # InterfaceDefinition (or InterfaceAssignment in the case of RelationshipTemplate): + interface_definition = interface_definitions[interface_name] + our_interface_assignment = our_interface_assignments.get(interface_name) \ + if our_interface_assignments is not None else None + validate_required_inputs(context, presentation, interface_template, + interface_definition, our_interface_assignment, interface_name) + + return template_interfaces + + +# +# Utils +# + +def convert_interface_definition_from_type_to_template(context, presentation, container): + from ..assignments import InterfaceAssignment + + if isinstance(presentation, InterfaceAssignment): + # Nothing to convert, so just clone + return presentation._clone(container) + + raw = convert_interface_definition_from_type_to_raw_template(context, presentation) + return InterfaceAssignment(name=presentation._name, raw=raw, container=container) + + +def convert_interface_definition_from_type_to_raw_template(context, presentation): # pylint: disable=invalid-name + raw = OrderedDict() + + # Copy default values for inputs + interface_inputs = presentation._get_inputs(context) + if interface_inputs is not None: + raw['inputs'] = convert_parameter_definitions_to_values(context, interface_inputs) + + # Copy operations + operations = presentation._get_operations(context) + if operations: + for operation_name, operation in operations.iteritems(): + raw[operation_name] = OrderedDict() + description = operation.description + if description is not None: + raw[operation_name]['description'] = deepcopy_with_locators(description._raw) + implementation = operation.implementation + if implementation is not None: + raw[operation_name]['implementation'] = deepcopy_with_locators(implementation._raw) + inputs = operation.inputs + if inputs is not None: + raw[operation_name]['inputs'] = convert_parameter_definitions_to_values(context, + inputs) + + return raw + + +def convert_requirement_interface_definitions_from_type_to_raw_template(context, raw_requirement, # pylint: disable=invalid-name + interface_definitions): + if not interface_definitions: + return + if 'interfaces' not in raw_requirement: + raw_requirement['interfaces'] = OrderedDict() + for interface_name, interface_definition in interface_definitions.iteritems(): + raw_interface = convert_interface_definition_from_type_to_raw_template(context, + interface_definition) + if interface_name in raw_requirement['interfaces']: + merge(raw_requirement['interfaces'][interface_name], raw_interface) + else: + raw_requirement['interfaces'][interface_name] = raw_interface + + +def merge_interface(context, presentation, interface_assignment, our_interface_assignment, + interface_definition, interface_name): + # Assign/merge interface inputs + assign_raw_inputs(context, interface_assignment._raw, our_interface_assignment.inputs, + interface_definition._get_inputs(context), interface_name, None, presentation) + + # Assign operation implementations and inputs + our_operation_templates = our_interface_assignment.operations # OperationAssignment + # OperationDefinition or OperationAssignment: + operation_definitions = interface_definition._get_operations(context) \ + if hasattr(interface_definition, '_get_operations') else interface_definition.operations + if our_operation_templates: + # OperationAssignment: + for operation_name, our_operation_template in our_operation_templates.iteritems(): + operation_definition = operation_definitions.get(operation_name) # OperationDefinition + + our_input_assignments = our_operation_template.inputs + our_implementation = our_operation_template.implementation + + if operation_definition is None: + context.validation.report( + 'interface definition "%s" refers to an unknown operation "%s" in "%s"' + % (interface_name, operation_name, presentation._fullname), + locator=our_operation_template._locator, level=Issue.BETWEEN_TYPES) + + if (our_input_assignments is not None) or (our_implementation is not None): + # Make sure we have the dict + if (operation_name not in interface_assignment._raw) \ + or (interface_assignment._raw[operation_name] is None): + interface_assignment._raw[operation_name] = OrderedDict() + + if our_implementation is not None: + interface_assignment._raw[operation_name]['implementation'] = \ + deepcopy_with_locators(our_implementation._raw) + + # Assign/merge operation inputs + input_definitions = operation_definition.inputs \ + if operation_definition is not None else None + assign_raw_inputs(context, interface_assignment._raw[operation_name], + our_input_assignments, input_definitions, interface_name, + operation_name, presentation) + + +def merge_raw_input_definition(context, the_raw_input, our_input, interface_name, operation_name, + presentation, type_name): + # Check if we changed the type + # TODO: allow a sub-type? + input_type1 = the_raw_input.get('type') + input_type2 = our_input.type + if input_type1 != input_type2: + if operation_name is not None: + context.validation.report( + 'interface %s "%s" changes operation input "%s.%s" type from "%s" to "%s" in "%s"' + % (type_name, interface_name, operation_name, our_input._name, input_type1, + input_type2, presentation._fullname), + locator=input_type2._locator, level=Issue.BETWEEN_TYPES) + else: + context.validation.report( + 'interface %s "%s" changes input "%s" type from "%s" to "%s" in "%s"' + % (type_name, interface_name, our_input._name, input_type1, input_type2, + presentation._fullname), + locator=input_type2._locator, level=Issue.BETWEEN_TYPES) + + # Merge + merge(the_raw_input, our_input._raw) + + +def merge_input_definitions(context, inputs, our_inputs, interface_name, operation_name, + presentation, type_name): + for input_name, our_input in our_inputs.iteritems(): + if input_name in inputs: + merge_raw_input_definition(context, inputs[input_name]._raw, our_input, interface_name, + operation_name, presentation, type_name) + else: + inputs[input_name] = our_input._clone(presentation) + + +def merge_raw_input_definitions(context, raw_inputs, our_inputs, interface_name, operation_name, + presentation, type_name): + for input_name, our_input in our_inputs.iteritems(): + if input_name in raw_inputs: + merge_raw_input_definition(context, raw_inputs[input_name], our_input, interface_name, + operation_name, presentation, type_name) + else: + raw_inputs[input_name] = deepcopy_with_locators(our_input._raw) + + +def merge_raw_operation_definition(context, raw_operation, our_operation, interface_name, + presentation, type_name): + if not isinstance(our_operation._raw, dict): + # Convert short form to long form + raw_operation['implementation'] = deepcopy_with_locators(our_operation._raw) + return + + # Add/merge inputs + our_operation_inputs = our_operation.inputs + if our_operation_inputs: + # Make sure we have the dict + if ('inputs' not in raw_operation) or (raw_operation.get('inputs') is None): + raw_operation['inputs'] = OrderedDict() + + merge_raw_input_definitions(context, raw_operation['inputs'], our_operation_inputs, + interface_name, our_operation._name, presentation, type_name) + + # Override the description + if our_operation._raw.get('description') is not None: + raw_operation['description'] = deepcopy_with_locators(our_operation._raw['description']) + + # Add/merge implementation + if our_operation._raw.get('implementation') is not None: + if raw_operation.get('implementation') is not None: + merge(raw_operation['implementation'], + deepcopy_with_locators(our_operation._raw['implementation'])) + else: + raw_operation['implementation'] = \ + deepcopy_with_locators(our_operation._raw['implementation']) + + +def merge_operation_definitions(context, operations, our_operations, interface_name, presentation, + type_name): + if not our_operations: + return + for operation_name, our_operation in our_operations.iteritems(): + if operation_name in operations: + merge_raw_operation_definition(context, operations[operation_name]._raw, our_operation, + interface_name, presentation, type_name) + else: + operations[operation_name] = our_operation._clone(presentation) + + +def merge_raw_operation_definitions(context, raw_operations, our_operations, interface_name, + presentation, type_name): + for operation_name, our_operation in our_operations.iteritems(): + if operation_name in raw_operations: + raw_operation = raw_operations[operation_name] + if isinstance(raw_operation, basestring): + # Convert short form to long form + raw_operations[operation_name] = OrderedDict((('implementation', raw_operation),)) + raw_operation = raw_operations[operation_name] + merge_raw_operation_definition(context, raw_operation, our_operation, interface_name, + presentation, type_name) + else: + raw_operations[operation_name] = deepcopy_with_locators(our_operation._raw) + + +# From either an InterfaceType or an InterfaceDefinition: +def merge_interface_definition(context, interface, our_source, presentation, type_name): + if hasattr(our_source, 'type'): + # Check if we changed the interface type + type1 = interface._get_type(context) + type2 = our_source._get_type(context) + + if (type2 is not None) and not type1._is_descendant(context, type2): + context.validation.report( + 'interface definition type "{0}" is not a descendant of overridden ' + 'interface definition type "{1}"' \ + .format(type1._name, type2._name), + locator=our_source._locator, level=Issue.BETWEEN_TYPES) + + # Add/merge inputs + our_interface_inputs = our_source._get_inputs(context) \ + if hasattr(our_source, '_get_inputs') else our_source.inputs + if our_interface_inputs: + # Make sure we have the dict + if ('inputs' not in interface._raw) or (interface._raw.get('inputs') is None): + interface._raw['inputs'] = OrderedDict() + + merge_raw_input_definitions(context, interface._raw['inputs'], our_interface_inputs, + our_source._name, None, presentation, type_name) + + # Add/merge operations + our_operations = our_source._get_operations(context) \ + if hasattr(our_source, '_get_operations') else our_source.operations + if our_operations is not None: + merge_raw_operation_definitions(context, interface._raw, our_operations, our_source._name, + presentation, type_name) + + +def merge_interface_definitions(context, interfaces, our_interfaces, presentation, + for_presentation=None): + if not our_interfaces: + return + for name, our_interface in our_interfaces.iteritems(): + if name in interfaces: + merge_interface_definition(context, interfaces[name], our_interface, presentation, + 'definition') + else: + interfaces[name] = our_interface._clone(for_presentation) + + +def merge_interface_definitions_from_their_types(context, interfaces, presentation): + for interface in interfaces.itervalues(): + the_type = interface._get_type(context) # InterfaceType + if the_type is not None: + merge_interface_definition(context, interface, the_type, presentation, 'type') + + +def assign_raw_inputs(context, values, assignments, definitions, interface_name, operation_name, + presentation): + if not assignments: + return + + # Make sure we have the dict + if ('inputs' not in values) or (values['inputs'] is None): + values['inputs'] = OrderedDict() + + # Assign inputs + for input_name, assignment in assignments.iteritems(): + if (definitions is not None) and (input_name not in definitions): + if operation_name is not None: + context.validation.report( + 'interface definition "%s" assigns a value to an unknown operation input' + ' "%s.%s" in "%s"' + % (interface_name, operation_name, input_name, presentation._fullname), + locator=assignment._locator, level=Issue.BETWEEN_TYPES) + else: + context.validation.report( + 'interface definition "%s" assigns a value to an unknown input "%s" in "%s"' + % (interface_name, input_name, presentation._fullname), + locator=assignment._locator, level=Issue.BETWEEN_TYPES) + + definition = definitions.get(input_name) if definitions is not None else None + + # Note: default value has already been assigned + + # Coerce value + values['inputs'][input_name] = coerce_parameter_value(context, assignment, definition, + assignment.value) + + +def validate_required_inputs(context, presentation, assignment, definition, original_assignment, + interface_name, operation_name=None): + # The validation of the `required` field of inputs that belong to operations and interfaces + # (as opposed to topology template and workflow inputs) is done only in the parsing stage. + # This reasoning follows the TOSCA spirit, where anything that is declared as required in the + # type, must be assigned in the corresponding template. + input_definitions = definition.inputs + if input_definitions: + for input_name, input_definition in input_definitions.iteritems(): + if input_definition.required: + prop = assignment.inputs.get(input_name) \ + if ((assignment is not None) and (assignment.inputs is not None)) else None + value = prop.value if prop is not None else None + value = value.value if value is not None else None + if value is None: + if operation_name is not None: + context.validation.report( + 'interface definition "%s" does not assign a value to a required' + ' operation input "%s.%s" in "%s"' + % (interface_name, operation_name, input_name, presentation._fullname), + locator=get_locator(original_assignment, presentation._locator), + level=Issue.BETWEEN_TYPES) + else: + context.validation.report( + 'interface definition "%s" does not assign a value to a required input' + ' "%s" in "%s"' + % (interface_name, input_name, presentation._fullname), + locator=get_locator(original_assignment, presentation._locator), + level=Issue.BETWEEN_TYPES) + + if operation_name is not None: + return + + assignment_operations = assignment.operations + operation_definitions = definition._get_operations(context) + if operation_definitions: + for operation_name, operation_definition in operation_definitions.iteritems(): + assignment_operation = assignment_operations.get(operation_name) \ + if assignment_operations is not None else None + original_operation = \ + original_assignment.operations.get(operation_name, original_assignment) \ + if (original_assignment is not None) \ + and (original_assignment.operations is not None) \ + else original_assignment + validate_required_inputs(context, presentation, assignment_operation, + operation_definition, original_operation, interface_name, + operation_name) diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/parameters.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/parameters.py new file mode 100644 index 0000000..9bafeec --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/parameters.py @@ -0,0 +1,230 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.collections import (merge, deepcopy_with_locators, OrderedDict) +from aria.utils.formatting import pluralize +from aria.parser.presentation import Value +from aria.parser.validation import Issue + +from .data_types import (coerce_value, get_primitive_data_type) +from ..presentation.types import get_type_by_name + + +# +# ArtifactType, DataType, CapabilityType, RelationshipType, NodeType, GroupType, PolicyType +# + +def get_inherited_parameter_definitions(context, presentation, field_name, for_presentation=None): + """ + Returns our parameter definitions added on top of those of our parent, if we have one + (recursively). + + Allows overriding all aspects of parent properties except data type. + """ + + if for_presentation is None: + for_presentation = presentation + + # Get definitions from parent + # If we inherit from a primitive, it does not have a parent: + parent = presentation._get_parent(context) if hasattr(presentation, '_get_parent') else None + definitions = get_inherited_parameter_definitions(context, parent, field_name, + for_presentation) \ + if parent is not None else OrderedDict() + + # Add/merge our definitions + # If we inherit from a primitive, it does not have our field + our_definitions = getattr(presentation, field_name, None) + if our_definitions: + our_definitions_clone = OrderedDict() + for name, our_definition in our_definitions.iteritems(): + our_definitions_clone[name] = our_definition._clone(for_presentation) + our_definitions = our_definitions_clone + merge_parameter_definitions(context, presentation, definitions, our_definitions, field_name) + + for definition in definitions.itervalues(): + definition._reset_method_cache() + + return definitions + + +# +# NodeTemplate, RelationshipTemplate, GroupTemplate, PolicyTemplate +# + +def get_assigned_and_defined_parameter_values(context, presentation, field_name): + """ + Returns the assigned parameter values while making sure they are defined in our type. + + The parameter definition's default value, if available, will be used if we did not assign it. + + Makes sure that required parameters indeed end up with a value. + """ + + values = OrderedDict() + + the_type = presentation._get_type(context) + field_name_plural = pluralize(field_name) + assignments = getattr(presentation, field_name_plural) + get_fn_name = '_get_{0}'.format(field_name_plural) + definitions = getattr(the_type, get_fn_name)(context) if the_type is not None else None + + # Fill in our assignments, but make sure they are defined + if assignments: + for name, value in assignments.iteritems(): + if (definitions is not None) and (name in definitions): + definition = definitions[name] + values[name] = coerce_parameter_value(context, value, definition, value.value) + else: + context.validation.report('assignment to undefined {0} "{1}" in "{2}"' + .format(field_name, name, presentation._fullname), + locator=value._locator, level=Issue.BETWEEN_TYPES) + + # Fill in defaults from the definitions + if definitions: + for name, definition in definitions.iteritems(): + # Note: attributes will always have a default value, even if it's None + if (name not in values) and \ + (('default' in definition._raw) or (field_name == 'attribute')): + values[name] = coerce_parameter_value(context, presentation, definition, + definition.default) + + validate_required_values(context, presentation, values, definitions) + + # Fill in nulls for missing values that are *not* required + if definitions: + for name, definition in definitions.iteritems(): + if (name not in values) and not getattr(definition, 'required', False): + values[name] = coerce_parameter_value(context, presentation, definition, None) + + return values + + +# +# TopologyTemplate +# + +def get_parameter_values(context, presentation, field_name): + values = OrderedDict() + + parameters = getattr(presentation, field_name) + + # Fill in defaults and values + if parameters: + for name, parameter in parameters.iteritems(): + if values.get(name) is None: + if hasattr(parameter, 'value') and (parameter.value is not None): + # For parameters only: + values[name] = coerce_parameter_value(context, presentation, parameter, + parameter.value) + else: + default = parameter.default if hasattr(parameter, 'default') else None + values[name] = coerce_parameter_value(context, presentation, parameter, default) + + return values + + +# +# Utils +# + +def validate_required_values(context, presentation, values, definitions): + """ + Check if required properties have not been assigned. + """ + + if not definitions: + return + for name, definition in definitions.iteritems(): + if getattr(definition, 'required', False) and \ + ((values is None) or (values.get(name) is None)): + context.validation.report('required property "%s" is not assigned a value in "%s"' + % (name, presentation._fullname), + locator=presentation._get_child_locator('properties'), + level=Issue.BETWEEN_TYPES) + + +def merge_raw_parameter_definition(context, presentation, raw_property_definition, + our_property_definition, field_name, property_name): + # Check if we changed the parameter type + type1_name = raw_property_definition.get('type') + type1 = get_type_by_name(context, type1_name, 'data_types') + if type1 is None: + type1 = get_primitive_data_type(type1_name) + our_property_definition._reset_method_cache() + type2 = our_property_definition._get_type(context) + + if type1 != type2: + if not hasattr(type1, '_is_descendant') or not type1._is_descendant(context, type2): + context.validation.report( + 'property definition type "{0}" is not a descendant of overridden ' + 'property definition type "{1}"' \ + .format(type1_name, type2._name), + locator=presentation._get_child_locator(field_name, property_name), + level=Issue.BETWEEN_TYPES) + + merge(raw_property_definition, our_property_definition._raw) + + +def merge_raw_parameter_definitions(context, presentation, raw_property_definitions, + our_property_definitions, field_name): + if not our_property_definitions: + return + for property_name, our_property_definition in our_property_definitions.iteritems(): + if property_name in raw_property_definitions: + raw_property_definition = raw_property_definitions[property_name] + merge_raw_parameter_definition(context, presentation, raw_property_definition, + our_property_definition, field_name, property_name) + else: + raw_property_definitions[property_name] = \ + deepcopy_with_locators(our_property_definition._raw) + + +def merge_parameter_definitions(context, presentation, property_definitions, + our_property_definitions, field_name): + if not our_property_definitions: + return + for property_name, our_property_definition in our_property_definitions.iteritems(): + if property_name in property_definitions: + property_definition = property_definitions[property_name] + merge_raw_parameter_definition(context, presentation, property_definition._raw, + our_property_definition, field_name, property_name) + else: + property_definitions[property_name] = our_property_definition + + +# Works on properties, inputs, and parameters +def coerce_parameter_value(context, presentation, definition, value, aspect=None): + the_type = definition._get_type(context) if definition is not None else None + entry_schema = definition.entry_schema if definition is not None else None + constraints = definition._get_constraints(context) \ + if ((definition is not None) and hasattr(definition, '_get_constraints')) else None + value = coerce_value(context, presentation, the_type, entry_schema, constraints, value, aspect) + if (the_type is not None) and hasattr(the_type, '_name'): + type_name = the_type._name + else: + type_name = getattr(definition, 'type', None) + description = getattr(definition, 'description', None) + description = description.value if description is not None else None + required = getattr(definition, 'required', None) + return Value(type_name, value, description, required) + + +def convert_parameter_definitions_to_values(context, definitions): + values = OrderedDict() + for name, definition in definitions.iteritems(): + default = definition.default + values[name] = coerce_parameter_value(context, definition, definition, default) + return values diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/policies.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/policies.py new file mode 100644 index 0000000..0376798 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/policies.py @@ -0,0 +1,79 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ..presentation.types import convert_name_to_full_type_name + + +# +# PolicyType +# + +def get_inherited_targets(context, presentation): + """ + Returns our target node types and group types if we have them or those of our parent, if we have + one (recursively). + """ + + parent = presentation._get_parent(context) + + node_types, group_types = get_inherited_targets(context, parent) \ + if parent is not None else ([], []) + + our_targets = presentation.targets + if our_targets: + all_node_types = context.presentation.get('service_template', 'node_types') or {} + all_group_types = context.presentation.get('service_template', 'group_types') or {} + node_types = [] + group_types = [] + + for our_target in our_targets: + if our_target in all_node_types: + our_target = convert_name_to_full_type_name(context, our_target, all_node_types) + node_types.append(all_node_types[our_target]) + elif our_target in all_group_types: + our_target = convert_name_to_full_type_name(context, our_target, all_group_types) + group_types.append(all_group_types[our_target]) + + return node_types, group_types + + +# +# PolicyTemplate +# + +def get_policy_targets(context, presentation): + """ + Returns our target node templates and groups if we have them. + """ + + node_templates = [] + groups = [] + + our_targets = presentation.targets + if our_targets: + all_node_templates = \ + context.presentation.get('service_template', 'topology_template', 'node_templates') \ + or {} + all_groups = \ + context.presentation.get('service_template', 'topology_template', 'groups') \ + or {} + + for our_target in our_targets: + if our_target in all_node_templates: + node_templates.append(all_node_templates[our_target]) + elif our_target in all_groups: + groups.append(all_groups[our_target]) + + return node_templates, groups diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/requirements.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/requirements.py new file mode 100644 index 0000000..6bdb5b1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/requirements.py @@ -0,0 +1,364 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.parser.validation import Issue +from aria.utils.collections import (deepcopy_with_locators, OrderedDict) + +from .parameters import (convert_parameter_definitions_to_values, validate_required_values, + coerce_parameter_value) +from .interfaces import (convert_requirement_interface_definitions_from_type_to_raw_template, + merge_interface_definitions, merge_interface, validate_required_inputs) + + +# +# NodeType +# + +def get_inherited_requirement_definitions(context, presentation): + """ + Returns our requirement definitions added on top of those of our parent, if we have one + (recursively). + + Allows overriding requirement definitions if they have the same name. + """ + + parent = presentation._get_parent(context) + requirement_definitions = get_inherited_requirement_definitions(context, parent) \ + if parent is not None else [] + + our_requirement_definitions = presentation.requirements + if our_requirement_definitions: + for requirement_name, our_requirement_definition in our_requirement_definitions: + # Remove existing requirement definitions of this name if they exist + for name, requirement_definition in requirement_definitions: + if name == requirement_name: + requirement_definitions.remove((name, requirement_definition)) + + requirement_definitions.append((requirement_name, our_requirement_definition)) + + return requirement_definitions + + +# +# NodeTemplate +# + +def get_template_requirements(context, presentation): + """ + Returns our requirements added on top of those of the node type if they exist there. + + If the requirement has a relationship, the relationship properties and interfaces are assigned. + + Returns the assigned property, interface input, and interface operation input values while + making sure they are defined in our type. Default values, if available, will be used if we did + not assign them. Also makes sure that required properties and inputs indeed end up with a value. + """ + + requirement_assignments = [] + + the_type = presentation._get_type(context) # NodeType + requirement_definitions = the_type._get_requirements(context) if the_type is not None else None + + # Add our requirement assignments + our_requirement_assignments = presentation.requirements + if our_requirement_assignments: + add_requirement_assignments(context, presentation, requirement_assignments, + requirement_definitions, our_requirement_assignments) + + # Validate occurrences + if requirement_definitions: + for requirement_name, requirement_definition in requirement_definitions: + # Allowed occurrences + allowed_occurrences = requirement_definition.occurrences + allowed_occurrences = allowed_occurrences if allowed_occurrences is not None else None + + # Count actual occurrences + actual_occurrences = 0 + for name, _ in requirement_assignments: + if name == requirement_name: + actual_occurrences += 1 + + if allowed_occurrences is None: + # If not specified, we interpret this to mean that exactly 1 occurrence is required + if actual_occurrences == 0: + # If it's not there, we will automatically add it (this behavior is not in the + # TOSCA spec, but seems implied) + requirement_assignment, \ + relationship_property_definitions, \ + relationship_interface_definitions = \ + convert_requirement_from_definition_to_assignment(context, + requirement_definition, + None, presentation) + validate_requirement_assignment(context, presentation, requirement_assignment, + relationship_property_definitions, + relationship_interface_definitions) + requirement_assignments.append((requirement_name, requirement_assignment)) + elif actual_occurrences > 1: + context.validation.report( + 'requirement "%s" is allowed only one occurrence in "%s": %d' + % (requirement_name, presentation._fullname, actual_occurrences), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + else: + if not allowed_occurrences.is_in(actual_occurrences): + if allowed_occurrences.value[1] == 'UNBOUNDED': + context.validation.report( + 'requirement "%s" does not have at least %d occurrences in "%s": has %d' + % (requirement_name, allowed_occurrences.value[0], + presentation._fullname, actual_occurrences), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + else: + context.validation.report( + 'requirement "%s" is allowed between %d and %d occurrences in "%s":' + ' has %d' + % (requirement_name, allowed_occurrences.value[0], + allowed_occurrences.value[1], presentation._fullname, + actual_occurrences), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + + return requirement_assignments + + +# +# Utils +# + +def convert_requirement_from_definition_to_assignment(context, requirement_definition, # pylint: disable=too-many-branches + our_requirement_assignment, container): + from ..assignments import RequirementAssignment + + raw = OrderedDict() + + # Capability type name: + raw['capability'] = deepcopy_with_locators(requirement_definition.capability) + + node_type = requirement_definition._get_node_type(context) + if node_type is not None: + raw['node'] = deepcopy_with_locators(node_type._name) + + relationship_type = None + relationship_template = None + relationship_property_definitions = None + relationship_interface_definitions = None + + # First try to find the relationship if we declared it + # RelationshipAssignment: + our_relationship = our_requirement_assignment.relationship \ + if our_requirement_assignment is not None else None + if our_relationship is not None: + relationship_type, relationship_type_variant = our_relationship._get_type(context) + if relationship_type_variant == 'relationship_template': + relationship_template = relationship_type + relationship_type = relationship_template._get_type(context) + + definition_relationship_type = None + relationship_definition = requirement_definition.relationship # RelationshipDefinition + if relationship_definition is not None: + definition_relationship_type = relationship_definition._get_type(context) + + # If not exists, try at the node type + if relationship_type is None: + relationship_type = definition_relationship_type + else: + # Make sure the type is derived + if not definition_relationship_type._is_descendant(context, relationship_type): + context.validation.report( + 'assigned relationship type "%s" is not a descendant of declared relationship type' + ' "%s"' \ + % (relationship_type._name, definition_relationship_type._name), + locator=container._locator, level=Issue.BETWEEN_TYPES) + + if relationship_type is not None: + raw['relationship'] = OrderedDict() + + type_name = our_relationship.type if our_relationship is not None else None + if type_name is None: + type_name = relationship_type._name + + raw['relationship']['type'] = deepcopy_with_locators(type_name) + + # These are our property definitions + relationship_property_definitions = relationship_type._get_properties(context) + + if relationship_template is not None: + # Property values from template + raw['relationship']['properties'] = relationship_template._get_property_values(context) + else: + if relationship_property_definitions: + # Convert property definitions to values + raw['relationship']['properties'] = \ + convert_parameter_definitions_to_values(context, + relationship_property_definitions) + + # These are our interface definitions + # InterfaceDefinition: + relationship_interface_definitions = OrderedDict(relationship_type._get_interfaces(context)) + + # Convert interface definitions to templates + convert_requirement_interface_definitions_from_type_to_raw_template( + context, + raw['relationship'], + relationship_interface_definitions) + + if relationship_definition: + # Merge extra interface definitions + # InterfaceDefinition: + definition_interface_definitions = relationship_definition.interfaces + merge_interface_definitions(context, relationship_interface_definitions, + definition_interface_definitions, requirement_definition, + container) + + if relationship_template is not None: + # Interfaces from template + interfaces = relationship_template._get_interfaces(context) + if interfaces: + raw['relationship']['interfaces'] = OrderedDict() + for interface_name, interface in interfaces.iteritems(): + raw['relationship']['interfaces'][interface_name] = interface._raw + + return \ + RequirementAssignment(name=requirement_definition._name, raw=raw, container=container), \ + relationship_property_definitions, \ + relationship_interface_definitions + + +def add_requirement_assignments(context, presentation, requirement_assignments, + requirement_definitions, our_requirement_assignments): + for requirement_name, our_requirement_assignment in our_requirement_assignments: + requirement_definition = get_first_requirement(requirement_definitions, requirement_name) + if requirement_definition is not None: + requirement_assignment, \ + relationship_property_definitions, \ + relationship_interface_definitions = \ + convert_requirement_from_definition_to_assignment(context, requirement_definition, + our_requirement_assignment, + presentation) + merge_requirement_assignment(context, + relationship_property_definitions, + relationship_interface_definitions, + requirement_assignment, our_requirement_assignment) + validate_requirement_assignment(context, + our_requirement_assignment.relationship \ + or our_requirement_assignment, + requirement_assignment, + relationship_property_definitions, + relationship_interface_definitions) + requirement_assignments.append((requirement_name, requirement_assignment)) + else: + context.validation.report('requirement "%s" not declared at node type "%s" in "%s"' + % (requirement_name, presentation.type, + presentation._fullname), + locator=our_requirement_assignment._locator, + level=Issue.BETWEEN_TYPES) + + +def merge_requirement_assignment(context, relationship_property_definitions, + relationship_interface_definitions, requirement, our_requirement): + our_capability = our_requirement.capability + if our_capability is not None: + requirement._raw['capability'] = deepcopy_with_locators(our_capability) + + our_node = our_requirement.node + if our_node is not None: + requirement._raw['node'] = deepcopy_with_locators(our_node) + + our_node_filter = our_requirement.node_filter + if our_node_filter is not None: + requirement._raw['node_filter'] = deepcopy_with_locators(our_node_filter._raw) + + our_relationship = our_requirement.relationship # RelationshipAssignment + if (our_relationship is not None) and (our_relationship.type is None): + # Make sure we have a dict + if 'relationship' not in requirement._raw: + requirement._raw['relationship'] = OrderedDict() + + merge_requirement_assignment_relationship(context, our_relationship, + relationship_property_definitions, + relationship_interface_definitions, + requirement, our_relationship) + + +def merge_requirement_assignment_relationship(context, presentation, property_definitions, + interface_definitions, requirement, our_relationship): + our_relationship_properties = our_relationship._raw.get('properties') + if our_relationship_properties: + # Make sure we have a dict + if 'properties' not in requirement._raw['relationship']: + requirement._raw['relationship']['properties'] = OrderedDict() + + # Merge our properties + for property_name, prop in our_relationship_properties.iteritems(): + if property_name in property_definitions: + definition = property_definitions[property_name] + requirement._raw['relationship']['properties'][property_name] = \ + coerce_parameter_value(context, presentation, definition, prop) + else: + context.validation.report( + 'relationship property "%s" not declared at definition of requirement "%s"' + ' in "%s"' + % (property_name, requirement._fullname, + presentation._container._container._fullname), + locator=our_relationship._get_child_locator('properties', property_name), + level=Issue.BETWEEN_TYPES) + + our_interfaces = our_relationship.interfaces + if our_interfaces: + # Make sure we have a dict + if 'interfaces' not in requirement._raw['relationship']: + requirement._raw['relationship']['interfaces'] = OrderedDict() + + # Merge interfaces + for interface_name, our_interface in our_interfaces.iteritems(): + if interface_name not in requirement._raw['relationship']['interfaces']: + requirement._raw['relationship']['interfaces'][interface_name] = OrderedDict() + + if (interface_definitions is not None) and (interface_name in interface_definitions): + interface_definition = interface_definitions[interface_name] + interface_assignment = requirement.relationship.interfaces[interface_name] + merge_interface(context, presentation, interface_assignment, our_interface, + interface_definition, interface_name) + else: + context.validation.report( + 'relationship interface "%s" not declared at definition of requirement "%s"' + ' in "%s"' + % (interface_name, requirement._fullname, + presentation._container._container._fullname), + locator=our_relationship._locator, level=Issue.BETWEEN_TYPES) + + +def validate_requirement_assignment(context, presentation, requirement_assignment, + relationship_property_definitions, + relationship_interface_definitions): + relationship = requirement_assignment.relationship + if relationship is None: + return + + validate_required_values(context, presentation, relationship.properties, + relationship_property_definitions) + + if relationship_interface_definitions: + for interface_name, relationship_interface_definition \ + in relationship_interface_definitions.iteritems(): + interface_assignment = relationship.interfaces.get(interface_name) \ + if relationship.interfaces is not None else None + validate_required_inputs(context, presentation, interface_assignment, + relationship_interface_definition, None, interface_name) + + +def get_first_requirement(requirement_definitions, name): + if requirement_definitions is not None: + for requirement_name, requirement_definition in requirement_definitions: + if requirement_name == name: + return requirement_definition + return None diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/substitution_mappings.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/substitution_mappings.py new file mode 100644 index 0000000..e2af4b8 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/modeling/substitution_mappings.py @@ -0,0 +1,167 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.formatting import safe_repr +from aria.parser.validation import Issue + + +def validate_substitution_mappings_requirement(context, presentation): + + # validate that the requirement in substitution_mapping is defined in the substitution node type + substitution_node_type = presentation._container._get_type(context) + if substitution_node_type is None: + return + for req_name, req in substitution_node_type._get_requirements(context): + if req_name == presentation._name: + substitution_type_requirement = req + break + else: + context.validation.report( + 'substitution mapping requirement "{0}" is not declared in node type "{1}"'.format( + presentation._name, substitution_node_type._name), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + return + + if not _validate_mapping_format(presentation): + _report_invalid_mapping_format(context, presentation, field='requirement') + return + + # validate that the mapped requirement is defined in the corresponding node template + node_template = _get_node_template(context, presentation) + if node_template is None: + _report_missing_node_template(context, presentation, field='requirement') + return + mapped_requirement_name = presentation._raw[1] + for req_name, req in node_template._get_requirements(context): + if req_name == mapped_requirement_name: + node_template_requirement = req + break + else: + context.validation.report( + 'substitution mapping requirement "{0}" refers to an unknown requirement of node ' + 'template "{1}": {mapped_requirement_name}'.format( + presentation._name, node_template._name, + mapped_requirement_name=safe_repr(mapped_requirement_name)), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + return + + # validate that the requirement's capability type in substitution_mapping is derived from the + # requirement's capability type in the corresponding node template + substitution_type_requirement_capability_type = \ + substitution_type_requirement._get_capability_type(context) + node_template_requirement_capability_type = \ + node_template_requirement._get_capability(context)[0] + if not node_template_requirement_capability_type._is_descendant( + context, substitution_type_requirement_capability_type): + context.validation.report( + 'substitution mapping requirement "{0}" of capability type "{1}" is not a descendant ' + 'of the mapped node template capability type "{2}"'.format( + presentation._name, + substitution_type_requirement_capability_type._name, + node_template_requirement_capability_type._name), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + + +def validate_substitution_mappings_capability(context, presentation): + + # validate that the capability in substitution_mapping is defined in the substitution node type + substitution_node_type = presentation._container._get_type(context) + if substitution_node_type is None: + return + substitution_type_capabilities = substitution_node_type._get_capabilities(context) + substitution_type_capability = substitution_type_capabilities.get(presentation._name) + if substitution_type_capability is None: + context.validation.report( + 'substitution mapping capability "{0}" ' + 'is not declared in node type "{substitution_type}"'.format( + presentation._name, substitution_type=substitution_node_type._name), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + return + + if not _validate_mapping_format(presentation): + _report_invalid_mapping_format(context, presentation, field='capability') + return + + # validate that the capability in substitution_mapping is declared in the corresponding + # node template + node_template = _get_node_template(context, presentation) + if node_template is None: + _report_missing_node_template(context, presentation, field='capability') + return + mapped_capability_name = presentation._raw[1] + node_template_capability = node_template._get_capabilities(context).get(mapped_capability_name) + + if node_template_capability is None: + context.validation.report( + 'substitution mapping capability "{0}" refers to an unknown ' + 'capability of node template "{1}": {mapped_capability_name}'.format( + presentation._name, node_template._name, + mapped_capability_name=safe_repr(mapped_capability_name)), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + return + + # validate that the capability type in substitution_mapping is derived from the capability type + # in the corresponding node template + substitution_type_capability_type = substitution_type_capability._get_type(context) + node_template_capability_type = node_template_capability._get_type(context) + + if not substitution_type_capability_type._is_descendant(context, node_template_capability_type): + context.validation.report( + 'node template capability type "{0}" is not a descendant of substitution mapping ' + 'capability "{1}" of type "{2}"'.format( + node_template_capability_type._name, + presentation._name, + substitution_type_capability_type._name), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + + +# +# Utils +# + +def _validate_mapping_format(presentation): + """Validate that the mapping is a list of 2 strings""" + if not isinstance(presentation._raw, list) or \ + len(presentation._raw) != 2 or \ + not isinstance(presentation._raw[0], basestring) or \ + not isinstance(presentation._raw[1], basestring): + return False + return True + + +def _get_node_template(context, presentation): + node_template_name = presentation._raw[0] + node_template = context.presentation.get_from_dict('service_template', 'topology_template', + 'node_templates', node_template_name) + return node_template + + +def _report_missing_node_template(context, presentation, field): + context.validation.report( + 'substitution mappings {field} "{node_template_mapping}" ' + 'refers to an unknown node template: {node_template_name}'.format( + field=field, + node_template_mapping=presentation._name, + node_template_name=safe_repr(presentation._raw[0])), + locator=presentation._locator, level=Issue.FIELD) + + +def _report_invalid_mapping_format(context, presentation, field): + context.validation.report( + 'substitution mapping {field} "{field_name}" is not a list of 2 strings: {value}'.format( + field=field, + field_name=presentation._name, + value=safe_repr(presentation._raw)), + locator=presentation._locator, level=Issue.FIELD) diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/__init__.py new file mode 100644 index 0000000..ae1e83e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/__init__.py @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/extensible.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/extensible.py new file mode 100644 index 0000000..0e3c94d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/extensible.py @@ -0,0 +1,33 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.caching import cachedmethod +from aria.parser.presentation import (Presentation, has_fields, primitive_dict_field) + + +@has_fields +class ExtensiblePresentation(Presentation): + """ + A presentation that supports an optional ``_extensions`` dict field. + """ + + @primitive_dict_field() + def _extensions(self): + pass + + @cachedmethod + def _get_extension(self, name, default=None): + extensions = self._extensions + return extensions.get(name, default) if extensions is not None else None # pylint: disable=no-member diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/field_getters.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/field_getters.py new file mode 100644 index 0000000..f14164a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/field_getters.py @@ -0,0 +1,37 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.formatting import safe_repr +from aria.parser.exceptions import InvalidValueError + + +def data_type_class_getter(cls): + """ + Wraps the field value in a specialized data type class. + + Can be used with the :func:`field_getter` decorator. + """ + + def getter(field, presentation, context=None): + raw = field.default_get(presentation, context) + if raw is not None: + try: + return cls(None, None, raw, None) + except ValueError as e: + raise InvalidValueError( + '%s is not a valid "%s" in "%s": %s' + % (field.full_name, field.full_cls_name, presentation._name, safe_repr(raw)), + cause=e, locator=field.get_locator(raw)) + return getter diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/field_validators.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/field_validators.py new file mode 100644 index 0000000..e5853d8 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/field_validators.py @@ -0,0 +1,588 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 re + +from aria.utils.formatting import safe_repr +from aria.parser import implements_specification +from aria.parser.presentation import (report_issue_for_unknown_type, derived_from_validator) +from aria.parser.validation import Issue + +from ..modeling.data_types import (get_primitive_data_type, get_data_type_name, coerce_value, + get_container_data_type) +from .types import (get_type_by_name, convert_name_to_full_type_name) + + + +# +# NodeTemplate, RelationshipTemplate +# + +@implements_specification('3.7.3.3', 'tosca-simple-1.0') +def copy_validator(template_type_name, templates_dict_name): + """ + Makes sure that the field refers to an existing template defined in the root presenter. + + Use with the :func:`field_validator` decorator for the ``copy`` field in + :class:`NodeTemplate` and :class:`RelationshipTemplate`. + """ + + def validator_fn(field, presentation, context): + field.default_validate(presentation, context) + + # Make sure type exists + value = getattr(presentation, field.name) + if value is not None: + copy = context.presentation.get_from_dict('service_template', 'topology_template', + templates_dict_name, value) + if copy is None: + report_issue_for_unknown_type(context, presentation, template_type_name, field.name) + else: + if copy.copy is not None: + context.validation.report( + '"copy" field refers to a %s that itself is a copy in "%s": %s' + % (template_type_name, presentation._fullname, safe_repr(value)), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + + return validator_fn + + +# +# PropertyDefinition, AttributeDefinition, ParameterDefinition, EntrySchema +# + +def data_type_validator(type_name='data type'): + """ + Makes sure that the field refers to a valid data type, whether complex or primitive. + + Used with the :func:`field_validator` decorator for the ``type`` fields in + :class:`PropertyDefinition`, :class:`AttributeDefinition`, :class:`ParameterDefinition`, + and :class:`EntrySchema`. + + Extra behavior beyond validation: generated function returns true if field is a complex data + type. + """ + + def validator(field, presentation, context): + field.default_validate(presentation, context) + + value = getattr(presentation, field.name) + if value is not None: + # Test for circular definitions + container_data_type = get_container_data_type(presentation) + if (container_data_type is not None) and (container_data_type._name == value): + context.validation.report( + 'type of property "%s" creates a circular value hierarchy: %s' + % (presentation._fullname, safe_repr(value)), + locator=presentation._get_child_locator('type'), level=Issue.BETWEEN_TYPES) + + # Can be a complex data type + if get_type_by_name(context, value, 'data_types') is not None: + return True + + # Can be a primitive data type + if get_primitive_data_type(value) is None: + report_issue_for_unknown_type(context, presentation, type_name, field.name) + + return False + + return validator + + +# +# PropertyDefinition, AttributeDefinition +# + +def entry_schema_validator(field, presentation, context): + """ + According to whether the data type supports ``entry_schema`` (e.g., it is or inherits from + list or map), make sure that we either have or don't have a valid data type value. + + Used with the :func:`field_validator` decorator for the ``entry_schema`` field in + :class:`PropertyDefinition` and :class:`AttributeDefinition`. + """ + + field.default_validate(presentation, context) + + def type_uses_entry_schema(the_type): + use_entry_schema = the_type._get_extension('use_entry_schema', False) \ + if hasattr(the_type, '_get_extension') else False + if use_entry_schema: + return True + parent = the_type._get_parent(context) if hasattr(the_type, '_get_parent') else None + if parent is None: + return False + return type_uses_entry_schema(parent) + + value = getattr(presentation, field.name) + the_type = presentation._get_type(context) + if the_type is None: + return + use_entry_schema = type_uses_entry_schema(the_type) + + if use_entry_schema: + if value is None: + context.validation.report( + '"entry_schema" does not have a value as required by data type "%s" in "%s"' + % (get_data_type_name(the_type), presentation._container._fullname), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + else: + if value is not None: + context.validation.report( + '"entry_schema" has a value but it is not used by data type "%s" in "%s"' + % (get_data_type_name(the_type), presentation._container._fullname), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + + +def data_value_validator(field, presentation, context): + """ + Makes sure that the field contains a valid value according to data type and constraints. + + Used with the :func:`field_validator` decorator for the ``default`` field in + :class:`PropertyDefinition` and :class:`AttributeDefinition`. + """ + + field.default_validate(presentation, context) + + value = getattr(presentation, field.name) + if value is not None: + the_type = presentation._get_type(context) + entry_schema = presentation.entry_schema + # AttributeDefinition does not have this: + constraints = presentation._get_constraints(context) \ + if hasattr(presentation, '_get_constraints') else None + coerce_value(context, presentation, the_type, entry_schema, constraints, value, field.name) + + +# +# DataType +# + +_data_type_validator = data_type_validator() +_data_type_derived_from_validator = derived_from_validator(convert_name_to_full_type_name, + 'data_types') + + +def data_type_derived_from_validator(field, presentation, context): + """ + Makes sure that the field refers to a valid parent data type (complex or primitive). + + Used with the :func:`field_validator` decorator for the ``derived_from`` field in + :class:`DataType`. + """ + + if _data_type_validator(field, presentation, context): + # Validate derivation only if a complex data type (primitive types have no derivation + # hierarchy) + _data_type_derived_from_validator(field, presentation, context) + + +def data_type_constraints_validator(field, presentation, context): + """ + Makes sure that we do not have constraints if we are a complex type (with no primitive + ancestor). + """ + + field.default_validate(presentation, context) + + value = getattr(presentation, field.name) + if value is not None: + if presentation._get_primitive_ancestor(context) is None: + context.validation.report( + 'data type "%s" defines constraints but does not have a primitive ancestor' + % presentation._fullname, + locator=presentation._get_child_locator(field.name), level=Issue.BETWEEN_TYPES) + + +def data_type_properties_validator(field, presentation, context): + """ + Makes sure that we do not have properties if we have a primitive ancestor. + + Used with the :func:`field_validator` decorator for the ``properties`` field in + :class:`DataType`. + """ + + field.default_validate(presentation, context) + + values = getattr(presentation, field.name) + if values is not None: + if presentation._get_primitive_ancestor(context) is not None: + context.validation.report( + 'data type "%s" defines properties even though it has a primitive ancestor' + % presentation._fullname, + locator=presentation._get_child_locator(field.name), level=Issue.BETWEEN_TYPES) + + +# +# ConstraintClause +# + +def constraint_clause_field_validator(field, presentation, context): + """ + Makes sure that field contains a valid value for the container type. + + Used with the :func:`field_validator` decorator for various field in :class:`ConstraintClause`. + """ + + field.default_validate(presentation, context) + + value = getattr(presentation, field.name) + if value is not None: + the_type = presentation._get_type(context) + constraints = the_type._get_constraints(context) \ + if hasattr(the_type, '_get_constraints') else None + coerce_value(context, presentation, the_type, None, constraints, value, field.name) + + +def constraint_clause_in_range_validator(field, presentation, context): + """ + Makes sure that the value is a list with exactly two elements, that both lower bound contains a + valid value for the container type, and that the upper bound is either "UNBOUNDED" or a valid + value for the container type. + + Used with the :func:`field_validator` decorator for the ``in_range`` field in + :class:`ConstraintClause`. + """ + + field.default_validate(presentation, context) + + values = getattr(presentation, field.name) + if isinstance(values, list): + # Make sure list has exactly two elements + if len(values) == 2: + lower, upper = values + the_type = presentation._get_type(context) + + # Lower bound must be coercible + lower = coerce_value(context, presentation, the_type, None, None, lower, field.name) + + if upper != 'UNBOUNDED': + # Upper bound be coercible + upper = coerce_value(context, presentation, the_type, None, None, upper, field.name) + + # Second "in_range" value must be greater than first + if (lower is not None) and (upper is not None) and (lower >= upper): + context.validation.report( + 'upper bound of "in_range" constraint is not greater than the lower bound' + ' in "%s": %s <= %s' + % (presentation._container._fullname, safe_repr(lower), safe_repr(upper)), + locator=presentation._locator, level=Issue.FIELD) + else: + context.validation.report( + 'constraint "%s" is not a list of exactly 2 elements in "%s"' + % (field.name, presentation._fullname), + locator=presentation._get_child_locator(field.name), level=Issue.FIELD) + + +def constraint_clause_valid_values_validator(field, presentation, context): + """ + Makes sure that the value is a list of valid values for the container type. + + Used with the :func:`field_validator` decorator for the ``valid_values`` field in + :class:`ConstraintClause`. + """ + + field.default_validate(presentation, context) + + values = getattr(presentation, field.name) + if isinstance(values, list): + the_type = presentation._get_type(context) + for value in values: + coerce_value(context, presentation, the_type, None, None, value, field.name) + + +def constraint_clause_pattern_validator(field, presentation, context): + """ + Makes sure that the value is a valid regular expression. + + Used with the :func:`field_validator` decorator for the ``pattern`` field in + :class:`ConstraintClause`. + """ + + field.default_validate(presentation, context) + + value = getattr(presentation, field.name) + if value is not None: + try: + # From TOSCA 1.0 3.5.2.1: + # + # "Note: Future drafts of this specification will detail the use of regular expressions + # and reference an appropriate standardized grammar." + # + # So we will just use Python's. + re.compile(value) + except re.error as e: + context.validation.report( + 'constraint "%s" is not a valid regular expression in "%s"' + % (field.name, presentation._fullname), + locator=presentation._get_child_locator(field.name), level=Issue.FIELD, exception=e) + + +# +# RequirementAssignment +# + +def node_template_or_type_validator(field, presentation, context): + """ + Makes sure that the field refers to either a node template or a node type. + + Used with the :func:`field_validator` decorator for the ``node`` field in + :class:`RequirementAssignment`. + """ + + field.default_validate(presentation, context) + + value = getattr(presentation, field.name) + if value is not None: + node_templates = \ + context.presentation.get('service_template', 'topology_template', 'node_templates') \ + or {} + if (value not in node_templates) and \ + (get_type_by_name(context, value, 'node_types') is None): + report_issue_for_unknown_type(context, presentation, 'node template or node type', + field.name) + + +def capability_definition_or_type_validator(field, presentation, context): + """ + Makes sure refers to either a capability assignment name in the node template referred to by the + ``node`` field or a general capability type. + + If the value refers to a capability type, make sure the ``node`` field was not assigned. + + Used with the :func:`field_validator` decorator for the ``capability`` field in + :class:`RequirementAssignment`. + """ + + field.default_validate(presentation, context) + + value = getattr(presentation, field.name) + if value is not None: + node, node_variant = presentation._get_node(context) + if node_variant == 'node_template': + capabilities = node._get_capabilities(context) + if value in capabilities: + return + + if get_type_by_name(context, value, 'capability_types') is not None: + if node is not None: + context.validation.report( + '"%s" refers to a capability type even though "node" has a value in "%s"' + % (presentation._name, presentation._container._fullname), + locator=presentation._get_child_locator(field.name), level=Issue.BETWEEN_FIELDS) + return + + if node_variant == 'node_template': + context.validation.report( + 'requirement "%s" refers to an unknown capability definition name or capability' + ' type in "%s": %s' + % (presentation._name, presentation._container._fullname, safe_repr(value)), + locator=presentation._get_child_locator(field.name), level=Issue.BETWEEN_TYPES) + else: + context.validation.report( + 'requirement "%s" refers to an unknown capability type in "%s": %s' + % (presentation._name, presentation._container._fullname, safe_repr(value)), + locator=presentation._get_child_locator(field.name), level=Issue.BETWEEN_TYPES) + + +def node_filter_validator(field, presentation, context): + """ + Makes sure that the field has a value only if "node" refers to a node type. + + Used with the :func:`field_validator` decorator for the ``node_filter`` field in + :class:`RequirementAssignment`. + """ + + field.default_validate(presentation, context) + + value = getattr(presentation, field.name) + if value is not None: + _, node_type_variant = presentation._get_node(context) + if node_type_variant != 'node_type': + context.validation.report( + 'requirement "%s" has a node filter even though "node" does not refer to a node' + ' type in "%s"' + % (presentation._fullname, presentation._container._fullname), + locator=presentation._locator, level=Issue.BETWEEN_FIELDS) + + +# +# RelationshipAssignment +# + +def relationship_template_or_type_validator(field, presentation, context): + """ + Makes sure that the field refers to either a relationship template or a relationship type. + + Used with the :func:`field_validator` decorator for the ``type`` field in + :class:`RelationshipAssignment`. + """ + + field.default_validate(presentation, context) + + value = getattr(presentation, field.name) + if value is not None: + relationship_templates = \ + context.presentation.get('service_template', 'topology_template', + 'relationship_templates') \ + or {} + if (value not in relationship_templates) and \ + (get_type_by_name(context, value, 'relationship_types') is None): + report_issue_for_unknown_type(context, presentation, + 'relationship template or relationship type', field.name) + + +# +# PolicyType +# + +def list_node_type_or_group_type_validator(field, presentation, context): + """ + Makes sure that the field's elements refer to either node types or a group types. + + Used with the :func:`field_validator` decorator for the ``targets`` field in + :class:`PolicyType`. + """ + + field.default_validate(presentation, context) + + values = getattr(presentation, field.name) + if values is not None: + for value in values: + if (get_type_by_name(context, value, 'node_types') is None) and \ + (get_type_by_name(context, value, 'group_types') is None): + report_issue_for_unknown_type(context, presentation, 'node type or group type', + field.name, value) + + +# +# PolicyTemplate +# + +def policy_targets_validator(field, presentation, context): + """ + Makes sure that the field's elements refer to either node templates or groups, and that + they match the node types and group types declared in the policy type. + + Used with the :func:`field_validator` decorator for the ``targets`` field in + :class:`PolicyTemplate`. + """ + + field.default_validate(presentation, context) + + values = getattr(presentation, field.name) + if values is not None: + for value in values: + node_templates = \ + context.presentation.get('service_template', 'topology_template', + 'node_templates') \ + or {} + groups = context.presentation.get('service_template', 'topology_template', 'groups') \ + or {} + if (value not in node_templates) and (value not in groups): + report_issue_for_unknown_type(context, presentation, 'node template or group', + field.name, value) + + policy_type = presentation._get_type(context) + if policy_type is None: + break + + node_types, group_types = policy_type._get_targets(context) + + is_valid = False + + if value in node_templates: + our_node_type = node_templates[value]._get_type(context) + for node_type in node_types: + if node_type._is_descendant(context, our_node_type): + is_valid = True + break + + elif value in groups: + our_group_type = groups[value]._get_type(context) + for group_type in group_types: + if group_type._is_descendant(context, our_group_type): + is_valid = True + break + + if not is_valid: + context.validation.report( + 'policy definition target does not match either a node type or a group type' + ' declared in the policy type in "%s": %s' + % (presentation._name, safe_repr(value)), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + + +# +# NodeFilter +# + +def node_filter_properties_validator(field, presentation, context): + """ + Makes sure that the field's elements refer to defined properties in the target node type. + + Used with the :func:`field_validator` decorator for the ``properties`` field in + :class:`NodeFilter`. + """ + + field.default_validate(presentation, context) + + values = getattr(presentation, field.name) + if values is not None: + node_type = presentation._get_node_type(context) + if node_type is not None: + properties = node_type._get_properties(context) + for name, _ in values: + if name not in properties: + context.validation.report( + 'node filter refers to an unknown property definition in "%s": %s' + % (node_type._name, name), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + + +def node_filter_capabilities_validator(field, presentation, context): + """ + Makes sure that the field's elements refer to defined capabilities and properties in the target + node type. + + Used with the :func:`field_validator` decorator for the ``capabilities`` field in + :class:`NodeFilter`. + """ + + field.default_validate(presentation, context) + + values = getattr(presentation, field.name) + if values is not None: # pylint: disable=too-many-nested-blocks + node_type = presentation._get_node_type(context) + if node_type is not None: + capabilities = node_type._get_capabilities(context) + for name, value in values: + capability = capabilities.get(name) + if capability is not None: + properties = value.properties + capability_properties = capability.properties + if (properties is not None) and (capability_properties is not None): + for property_name, _ in properties: + if property_name not in capability_properties: + context.validation.report( + 'node filter refers to an unknown capability definition' + ' property in "%s": %s' + % (node_type._name, property_name), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) + else: + context.validation.report( + 'node filter refers to an unknown capability definition in "%s": %s' + % (node_type._name, name), + locator=presentation._locator, level=Issue.BETWEEN_TYPES) diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/types.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/types.py new file mode 100644 index 0000000..5f9750e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presentation/types.py @@ -0,0 +1,63 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + + +def convert_name_to_full_type_name(context, name, types_dict): # pylint: disable=unused-argument + """ + Converts a type name to its full type name, or else returns it unchanged. + + Works by checking for ``shorthand_name`` and ``type_qualified_name`` in the types' + ``_extensions`` field. See also + :class:`aria_extension_tosca.v1_0.presentation.extensible.ExtensiblePresentation`. + + Can be used as the conversion function argument in ``type_validator`` and + ``derived_from_validator``. + """ + + if (name is not None) and types_dict and (name not in types_dict): + for full_name, the_type in types_dict.iteritems(): + if hasattr(the_type, '_extensions') and the_type._extensions \ + and ((the_type._extensions.get('shorthand_name') == name) \ + or (the_type._extensions.get('type_qualified_name') == name)): + return full_name + return name + + +def get_type_by_name(context, name, *types_dict_names): + """ + Gets a type either by its full name or its shorthand name or type-qualified name. + + Works by checking for ``shorthand_name`` and ``type_qualified_name`` in the types' + ``_extensions`` field. See also + :class:`~aria_extension_tosca.v1_0.presentation.extensible.ExtensiblePresentation`. + + The arguments from the third onwards are used to locate a nested field under + ``service_template`` under the root presenter. + """ + + if name is not None: + types_dict = context.presentation.get('service_template', *types_dict_names) + if types_dict: + the_type = types_dict.get(name) + if the_type is not None: + # Full name + return the_type + for the_type in types_dict.itervalues(): + if hasattr(the_type, '_extensions') and the_type._extensions \ + and ((the_type._extensions.get('shorthand_name') == name) \ + or (the_type._extensions.get('type_qualified_name') == name)): + # Shorthand name + return the_type + return None diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presenter.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presenter.py new file mode 100644 index 0000000..8e1809f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/presenter.py @@ -0,0 +1,83 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.collections import (FrozenList, EMPTY_READ_ONLY_LIST) +from aria.utils.caching import cachedmethod +from aria.parser.presentation import Presenter + +from .modeling import create_service_template_model +from .modeling.functions import (Concat, Token, GetInput, GetProperty, GetAttribute, + GetOperationOutput, GetNodesOfType, GetArtifact) +from .templates import ServiceTemplate + + +class ToscaSimplePresenter1_0(Presenter): # pylint: disable=invalid-name,abstract-method + """ + ARIA presenter for the `TOSCA Simple Profile v1.0 cos01 `__. + + Supported ``tosca_definitions_version`` values: + + * ``tosca_simple_yaml_1_0`` + """ + + DSL_VERSIONS = ('tosca_simple_yaml_1_0',) + ALLOWED_IMPORTED_DSL_VERSIONS = ('tosca_simple_yaml_1_0',) + SIMPLE_PROFILE_LOCATION = 'tosca-simple-1.0/tosca-simple-1.0.yaml' + SPECIAL_IMPORTS = { + 'aria-1.0': 'aria-1.0/aria-1.0.yaml', + 'azure-plugin':'azure-plugin/azureplugin.yaml'} + + @property + @cachedmethod + def service_template(self): + return ServiceTemplate(raw=self._raw) + + @property + @cachedmethod + def functions(self): + return { + 'concat': Concat, + 'token': Token, + 'get_input': GetInput, + 'get_property': GetProperty, + 'get_attribute': GetAttribute, + 'get_operation_output': GetOperationOutput, + 'get_nodes_of_type': GetNodesOfType, + 'get_artifact': GetArtifact} + + # Presentation + + def _dump(self, context): + self.service_template._dump(context) + + def _validate(self, context): + self.service_template._validate(context) + + # Presenter + + @cachedmethod + def _get_import_locations(self, context): + import_locations = [] + if context.presentation.import_profile: + import_locations.append(self.SIMPLE_PROFILE_LOCATION) + imports = self._get('service_template', 'imports') + if imports: + import_locations += [self.SPECIAL_IMPORTS.get(i.file, i.file) for i in imports] + return FrozenList(import_locations) if import_locations else EMPTY_READ_ONLY_LIST + + @cachedmethod + def _get_model(self, context): # pylint: disable=no-self-use + return create_service_template_model(context) diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/templates.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/templates.py new file mode 100644 index 0000000..3c36bb8 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/templates.py @@ -0,0 +1,736 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.collections import (FrozenDict, FrozenList) +from aria.utils.caching import cachedmethod +from aria.parser import implements_specification +from aria.parser.presentation import (has_fields, primitive_field, primitive_list_field, + object_field, object_list_field, object_dict_field, + object_sequenced_list_field, field_validator, + type_validator, list_type_validator) + +from .assignments import (PropertyAssignment, AttributeAssignment, RequirementAssignment, + CapabilityAssignment, InterfaceAssignment, ArtifactAssignment) +from .definitions import ParameterDefinition +from .filters import NodeFilter +from .misc import (Description, MetaData, Repository, Import, SubstitutionMappings) +from .modeling.parameters import (get_assigned_and_defined_parameter_values, get_parameter_values) +from .modeling.interfaces import get_template_interfaces +from .modeling.requirements import get_template_requirements +from .modeling.capabilities import get_template_capabilities +from .modeling.artifacts import get_inherited_artifact_definitions +from .modeling.policies import get_policy_targets +from .modeling.copy import get_default_raw_from_copy +from .presentation.extensible import ExtensiblePresentation +from .presentation.field_validators import copy_validator, policy_targets_validator +from .presentation.types import (convert_name_to_full_type_name, get_type_by_name) +from .types import (ArtifactType, DataType, CapabilityType, InterfaceType, RelationshipType, + NodeType, GroupType, PolicyType) + + +@has_fields +@implements_specification('3.7.3', 'tosca-simple-1.0') +class NodeTemplate(ExtensiblePresentation): + """ + A Node Template specifies the occurrence of a manageable software component as part of an + application's topology model which is defined in a TOSCA Service Template. A Node template is an + instance of a specified Node Type and can provide customized properties, constraints or + operations which override the defaults provided by its Node Type and its implementations. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(type_validator('node type', convert_name_to_full_type_name, 'node_types')) + @primitive_field(str, required=True) + def type(self): + """ + The required name of the Node Type the Node Template is based upon. + + :type: :obj:`basestring` + """ + + @object_field(Description) + def description(self): + """ + An optional description for the Node Template. + + :type: :class:`Description` + """ + + @primitive_list_field(str) + def directives(self): + """ + An optional list of directive values to provide processing instructions to orchestrators and + tooling. + + :type: [:obj:`basestring`] + """ + + @object_dict_field(PropertyAssignment) + def properties(self): + """ + An optional list of property value assignments for the Node Template. + + :type: {:obj:`basestring`: :class:`PropertyAssignment`} + """ + + @object_dict_field(AttributeAssignment) + def attributes(self): + """ + An optional list of attribute value assignments for the Node Template. + + :type: {:obj:`basestring`: :class:`AttributeAssignment`} + """ + + @object_sequenced_list_field(RequirementAssignment) + def requirements(self): + """ + An optional sequenced list of requirement assignments for the Node Template. + + :type: list of (str, :class:`RequirementAssignment`) + """ + + @object_dict_field(CapabilityAssignment) + def capabilities(self): + """ + An optional list of capability assignments for the Node Template. + + :type: {:obj:`basestring`: :class:`CapabilityAssignment`} + """ + + @object_dict_field(InterfaceAssignment) + def interfaces(self): + """ + An optional list of named interface definitions for the Node Template. + + :type: {:obj:`basestring`: :class:`InterfaceAssignment`} + """ + + @object_dict_field(ArtifactAssignment) + def artifacts(self): + """ + An optional list of named artifact definitions for the Node Template. + + :type: {:obj:`basestring`: :class:`ArtifactAssignment`} + """ + + @object_field(NodeFilter) + def node_filter(self): + """ + The optional filter definition that TOSCA orchestrators would use to select the correct + target node. This keyname is only valid if the directive has the value of "selectable" set. + + :type: :class:`NodeFilter` + """ + + @field_validator(copy_validator('node template', 'node_templates')) + @primitive_field(str) + def copy(self): + """ + The optional (symbolic) name of another node template to copy into (all keynames and values) + and use as a basis for this node template. + + :type: :obj:`basestring` + """ + + @cachedmethod + def _get_default_raw(self): + return get_default_raw_from_copy(self, 'node_templates') + + @cachedmethod + def _get_type(self, context): + return get_type_by_name(context, self.type, 'node_types') + + @cachedmethod + def _get_property_values(self, context): + return FrozenDict(get_assigned_and_defined_parameter_values(context, self, 'property')) + + @cachedmethod + def _get_attribute_default_values(self, context): + return FrozenDict(get_assigned_and_defined_parameter_values(context, self, 'attribute')) + + @cachedmethod + def _get_requirements(self, context): + return FrozenList(get_template_requirements(context, self)) + + @cachedmethod + def _get_capabilities(self, context): + return FrozenDict(get_template_capabilities(context, self)) + + @cachedmethod + def _get_interfaces(self, context): + return FrozenDict(get_template_interfaces(context, self, 'node template')) + + @cachedmethod + def _get_artifacts(self, context): + return FrozenDict(get_inherited_artifact_definitions(context, self)) + + def _validate(self, context): + super(NodeTemplate, self)._validate(context) + self._get_property_values(context) + self._get_requirements(context) + self._get_capabilities(context) + self._get_interfaces(context) + self._get_artifacts(context) + + def _dump(self, context): + self._dump_content(context, ( + 'description', + 'type', + 'directives', + 'properties', + 'attributes', + 'requirements', + 'capabilities', + 'interfaces', + 'artifacts', + 'node_filter', + 'copy')) + + +@has_fields +@implements_specification('3.7.4', 'tosca-simple-1.0') +class RelationshipTemplate(ExtensiblePresentation): + """ + A Relationship Template specifies the occurrence of a manageable relationship between node + templates as part of an application's topology model that is defined in a TOSCA Service + Template. A Relationship template is an instance of a specified Relationship Type and can + provide customized properties, constraints or operations which override the defaults provided by + its Relationship Type and its implementations. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(type_validator('relationship type', convert_name_to_full_type_name, + 'relationship_types')) + @primitive_field(str, required=True) + def type(self): + """ + The required name of the Relationship Type the Relationship Template is based upon. + + :type: :obj:`basestring` + """ + + @object_field(Description) + def description(self): + """ + An optional description for the Relationship Template. + + :type: :class:`Description` + """ + + @object_dict_field(PropertyAssignment) + def properties(self): + """ + An optional list of property assignments for the Relationship Template. + + :type: {:obj:`basestring`: :class:`PropertyAssignment`} + """ + + @object_dict_field(AttributeAssignment) + def attributes(self): + """ + An optional list of attribute assignments for the Relationship Template. + + :type: {:obj:`basestring`: :class:`AttributeAssignment`} + """ + + @object_dict_field(InterfaceAssignment) + def interfaces(self): + """ + An optional list of named interface definitions for the Node Template. + + ARIA NOTE: Spec is wrong here, should be Relationship Template. + + :type: {:obj:`basestring`: :class:`InterfaceAssignment`} + """ + + @field_validator(copy_validator('relationship template', 'relationship_templates')) + @primitive_field(str) + def copy(self): + """ + The optional (symbolic) name of another relationship template to copy into (all keynames and + values) and use as a basis for this relationship template. + + :type: :obj:`basestring` + """ + + @cachedmethod + def _get_default_raw(self): + return get_default_raw_from_copy(self, 'relationship_templates') + + @cachedmethod + def _get_type(self, context): + return get_type_by_name(context, self.type, 'relationship_types') + + @cachedmethod + def _get_property_values(self, context): + return FrozenDict(get_assigned_and_defined_parameter_values(context, self, 'property')) + + @cachedmethod + def _get_interfaces(self, context): + return FrozenDict(get_template_interfaces(context, self, 'relationship template')) + + def _validate(self, context): + super(RelationshipTemplate, self)._validate(context) + self._get_property_values(context) + self._get_interfaces(context) + + def _dump(self, context): + self._dump_content(context, ( + 'description', + 'type', + 'properties', + 'attributes', + 'interfaces', + 'copy')) + + +@has_fields +@implements_specification('3.7.5', 'tosca-simple-1.0') +class GroupTemplate(ExtensiblePresentation): + """ + A group definition defines a logical grouping of node templates, typically for management + purposes, but is separate from the application's topology template. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(type_validator('group type', convert_name_to_full_type_name, + 'group_types')) + @primitive_field(str, required=True) + def type(self): + """ + The required name of the group type the group definition is based upon. + + :type: :obj:`basestring` + """ + + @object_field(Description) + def description(self): + """ + The optional description for the group definition. + + :type: :class:`Description` + """ + + @object_dict_field(PropertyAssignment) + def properties(self): + """ + An optional list of property value assignments for the group definition. + + :type: {:obj:`basestring`: :class:`PropertyAssignment`} + """ + + @field_validator(list_type_validator('node template', 'topology_template', 'node_templates')) + @primitive_list_field(str) + def members(self): + """ + The optional list of one or more node template names that are members of this group + definition. + + :type: [:obj:`basestring`] + """ + + @object_dict_field(InterfaceAssignment) + def interfaces(self): + """ + An optional list of named interface definitions for the group definition. + + :type: {:obj:`basestring`: :class:`InterfaceDefinition`} + """ + + @cachedmethod + def _get_type(self, context): + return get_type_by_name(context, self.type, 'group_types') + + @cachedmethod + def _get_property_values(self, context): + return FrozenDict(get_assigned_and_defined_parameter_values(context, self, 'property')) + + @cachedmethod + def _get_interfaces(self, context): + return FrozenDict(get_template_interfaces(context, self, 'group definition')) + + def _validate(self, context): + super(GroupTemplate, self)._validate(context) + self._get_property_values(context) + self._get_interfaces(context) + + +@has_fields +@implements_specification('3.7.6', 'tosca-simple-1.0') +class PolicyTemplate(ExtensiblePresentation): + """ + A policy definition defines a policy that can be associated with a TOSCA topology or top-level + entity definition (e.g., group definition, node template, etc.). + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(type_validator('policy type', convert_name_to_full_type_name, 'policy_types')) + @primitive_field(str, required=True) + def type(self): + """ + The required name of the policy type the policy definition is based upon. + + :type: :obj:`basestring` + """ + + @object_field(Description) + def description(self): + """ + The optional description for the policy definition. + + :type: :class:`Description` + """ + + @object_dict_field(PropertyAssignment) + def properties(self): + """ + An optional list of property value assignments for the policy definition. + + :type: {:obj:`basestring`: :class:`PropertyAssignment` + """ + + @field_validator(policy_targets_validator) + @primitive_list_field(str) + def targets(self): + """ + An optional list of valid Node Templates or Groups the Policy can be applied to. + + :type: [:obj:`basestring`] + """ + + @cachedmethod + def _get_type(self, context): + return get_type_by_name(context, self.type, 'policy_types') + + @cachedmethod + def _get_property_values(self, context): + return FrozenDict(get_assigned_and_defined_parameter_values(context, self, 'property')) + + @cachedmethod + def _get_targets(self, context): + node_templates, groups = get_policy_targets(context, self) + return FrozenList(node_templates), FrozenList(groups) + + def _validate(self, context): + super(PolicyTemplate, self)._validate(context) + self._get_property_values(context) + + +@has_fields +@implements_specification('3.8', 'tosca-simple-1.0') +class TopologyTemplate(ExtensiblePresentation): + """ + This section defines the topology template of a cloud application. The main ingredients of the + topology template are node templates representing components of the application and relationship + templates representing links between the components. These elements are defined in the nested + ``node_templates`` section and the nested relationship_templates sections, respectively. + Furthermore, a topology template allows for defining input parameters, output parameters as well + as grouping of node templates. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @object_field(Description) + def description(self): + """ + The optional description for the Topology Template. + + :type: :class:`Description` + """ + + @object_dict_field(ParameterDefinition) + def inputs(self): + """ + An optional list of input parameters (i.e., as parameter definitions) for the Topology + Template. + + :type: {:obj:`basestring`: :class:`ParameterDefinition`} + """ + + @object_dict_field(NodeTemplate) + def node_templates(self): + """ + An optional list of node template definitions for the Topology Template. + + :type: {:obj:`basestring`: :class:`NodeTemplate`} + """ + + @object_dict_field(RelationshipTemplate) + def relationship_templates(self): + """ + An optional list of relationship templates for the Topology Template. + + :type: {:obj:`basestring`: :class:`RelationshipTemplate`} + """ + + @object_dict_field(GroupTemplate) + def groups(self): + """ + An optional list of Group definitions whose members are node templates defined within this + same Topology Template. + + :class:`GroupTemplate` + """ + + @object_dict_field(PolicyTemplate) + def policies(self): + """ + An optional list of Policy definitions for the Topology Template. + + :type: {:obj:`basestring`: :class:`PolicyTemplate`} + """ + + @object_dict_field(ParameterDefinition) + def outputs(self): + """ + An optional list of output parameters (i.e., as parameter definitions) for the Topology + Template. + + :type: {:obj:`basestring`: :class:`ParameterDefinition`} + """ + + @object_field(SubstitutionMappings) + def substitution_mappings(self): + """ + An optional declaration that exports the topology template as an implementation of a Node + type. + + This also includes the mappings between the external Node Types named capabilities and + requirements to existing implementations of those capabilities and requirements on Node + templates declared within the topology template. + """ + + @cachedmethod + def _get_input_values(self, context): + return FrozenDict(get_parameter_values(context, self, 'inputs')) + + @cachedmethod + def _get_output_values(self, context): + return FrozenDict(get_parameter_values(context, self, 'outputs')) + + def _validate(self, context): + super(TopologyTemplate, self)._validate(context) + self._get_input_values(context) + self._get_output_values(context) + + def _dump(self, context): + self._dump_content(context, ( + 'description', + 'inputs', + 'node_templates', + 'relationship_templates', + 'groups', + 'policies', + 'outputs', + 'substitution_mappings')) + + +@has_fields +@implements_specification('3.9', 'tosca-simple-1.0') +class ServiceTemplate(ExtensiblePresentation): + """ + Servicate template. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__. + """ + + @primitive_field(str) + @implements_specification('3.9.3.1', 'tosca-simple-1.0') + def tosca_definitions_version(self): + """ + Defines the version of the TOSCA Simple Profile specification the template (grammar) + complies with. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + + :type: :obj:`basestring` + """ + + @object_field(MetaData) + def metadata(self): + """ + Defines a section used to declare additional metadata information. Domain-specific TOSCA + profile specifications may define keynames that are required for their implementations. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + + :type: :class:`MetaData` + """ + + @object_field(Description) + @implements_specification('3.9.3.6', 'tosca-simple-1.0') + def description(self): + """ + Declares a description for this Service Template and its contents. + + :type: :class:`Description` + """ + + @primitive_field() + @implements_specification('3.9.3.7', 'tosca-simple-1.0') + def dsl_definitions(self): + """ + Declares optional DSL-specific definitions and conventions. For example, in YAML, this + allows defining reusable YAML macros (i.e., YAML alias anchors) for use throughout the TOSCA + Service Template. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @object_dict_field(Repository) + @implements_specification('3.9.3.8', 'tosca-simple-1.0') + def repositories(self): + """ + Declares the list of external repositories which contain artifacts that are referenced in + the service template along with their addresses and necessary credential information used to + connect to them in order to retrieve the artifacts. + + :type: {:obj:`basestring`: :class:`Repository`} + """ + + @object_list_field(Import) + @implements_specification('3.9.3.9', 'tosca-simple-1.0') + def imports(self): + """ + Declares import statements external TOSCA Definitions documents. For example, these may be + file location or URIs relative to the service template file within the same TOSCA CSAR file. + + :type: list of :class:`Import` + """ + + @object_dict_field(ArtifactType) + @implements_specification('3.9.3.10', 'tosca-simple-1.0') + def artifact_types(self): + """ + This section contains an optional list of artifact type definitions for use in the service + template. + + :type: {:obj:`basestring`: :class:`ArtifactType`} + """ + + @object_dict_field(DataType) + @implements_specification('3.9.3.11', 'tosca-simple-1.0') + def data_types(self): + """ + Declares a list of optional TOSCA Data Type definitions. + + :type: {:obj:`basestring`: :class:`DataType`} + """ + + @object_dict_field(CapabilityType) + @implements_specification('3.9.3.12', 'tosca-simple-1.0') + def capability_types(self): + """ + This section contains an optional list of capability type definitions for use in the service + template. + + :type: {:obj:`basestring`: :class:`CapabilityType`} + """ + + @object_dict_field(InterfaceType) + @implements_specification('3.9.3.13', 'tosca-simple-1.0') + def interface_types(self): + """ + This section contains an optional list of interface type definitions for use in the service + template. + + :type: {:obj:`basestring`: :class:`InterfaceType`} + """ + + @object_dict_field(RelationshipType) + @implements_specification('3.9.3.14', 'tosca-simple-1.0') + def relationship_types(self): + """ + This section contains a set of relationship type definitions for use in the service + template. + + :type: {:obj:`basestring`: :class:`RelationshipType`} + """ + + @object_dict_field(NodeType) + @implements_specification('3.9.3.15', 'tosca-simple-1.0') + def node_types(self): + """ + This section contains a set of node type definitions for use in the service template. + + :type: {:obj:`basestring`: :class:`NodeType`} + """ + + @object_dict_field(GroupType) + @implements_specification('3.9.3.16', 'tosca-simple-1.0') + def group_types(self): + """ + This section contains a list of group type definitions for use in the service template. + + :type: {:obj:`basestring`: :class:`GroupType`} + """ + + @object_dict_field(PolicyType) + @implements_specification('3.9.3.17', 'tosca-simple-1.0') + def policy_types(self): + """ + This section contains a list of policy type definitions for use in the service template. + + :type: {:obj:`basestring`: :class:`PolicyType`} + """ + + @object_field(TopologyTemplate) + def topology_template(self): + """ + Defines the topology template of an application or service, consisting of node templates + that represent the application's or service's components, as well as relationship templates + representing relations between the components. + + :type: :class:`TopologyTemplate` + """ + + def _dump(self, context): + self._dump_content(context, ( + 'description', + 'tosca_definitions_version', + 'metadata', + 'repositories', + 'imports', + 'artifact_types', + 'data_types', + 'capability_types', + 'interface_types', + 'relationship_types', + 'node_types', + 'group_types', + 'policy_types', + 'topology_template')) diff --git a/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/types.py b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/types.py new file mode 100644 index 0000000..43af44b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/extensions/aria_extension_tosca/simple_v1_0/types.py @@ -0,0 +1,892 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.collections import (FrozenDict, FrozenList) +from aria.utils.caching import cachedmethod +from aria.parser import implements_specification +from aria.parser.presentation import (has_fields, allow_unknown_fields, primitive_field, + primitive_list_field, object_field, object_dict_field, + object_list_field, object_sequenced_list_field, + object_dict_unknown_fields, field_getter, field_validator, + list_type_validator, derived_from_validator, + get_parent_presentation) + +from .assignments import ArtifactAssignmentForType +from .data_types import Version +from .definitions import (PropertyDefinition, AttributeDefinition, InterfaceDefinition, + RequirementDefinition, CapabilityDefinition, OperationDefinition) +from .misc import (Description, ConstraintClause) +from .modeling.artifacts import get_inherited_artifact_definitions +from .modeling.capabilities import (get_inherited_valid_source_types, + get_inherited_capability_definitions) +from .modeling.data_types import (get_data_type, get_inherited_constraints, coerce_data_type_value, + validate_data_type_name) +from .modeling.interfaces import (get_inherited_interface_definitions, get_inherited_operations) +from .modeling.policies import get_inherited_targets +from .modeling.parameters import get_inherited_parameter_definitions +from .modeling.requirements import get_inherited_requirement_definitions +from .presentation.extensible import ExtensiblePresentation +from .presentation.field_getters import data_type_class_getter +from .presentation.field_validators import (data_type_derived_from_validator, + data_type_constraints_validator, + data_type_properties_validator, + list_node_type_or_group_type_validator) +from .presentation.types import convert_name_to_full_type_name + + + +@has_fields +@implements_specification('3.6.3', 'tosca-simple-1.0') +class ArtifactType(ExtensiblePresentation): + """ + An Artifact Type is a reusable entity that defines the type of one or more files that are used + to define implementation or deployment artifacts that are referenced by nodes or relationships + on their operations. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(derived_from_validator(convert_name_to_full_type_name, 'artifact_types')) + @primitive_field(str) + def derived_from(self): + """ + An optional parent Artifact Type name the Artifact Type derives from. + + :type: :obj:`basestring` + """ + + @field_getter(data_type_class_getter(Version)) + @primitive_field() + def version(self): + """ + An optional version for the Artifact Type definition. + + :type: :class:`Version` + """ + + @object_field(Description) + def description(self): + """ + An optional description for the Artifact Type. + + :type: :class:`Description` + """ + + @primitive_field(str) + def mime_type(self): + """ + The required mime type property for the Artifact Type. + + :type: :obj:`basestring` + """ + + @primitive_list_field(str) + def file_ext(self): + """ + The required file extension property for the Artifact Type. + + :type: [:obj:`basestring`] + """ + + @object_dict_field(PropertyDefinition) + def properties(self): + """ + An optional list of property definitions for the Artifact Type. + + :type: {:obj:`basestring`: :class:`PropertyDefinition`} + """ + + @cachedmethod + def _get_parent(self, context): + return get_parent_presentation(context, self, convert_name_to_full_type_name, + 'artifact_types') + + @cachedmethod + def _get_properties(self, context): + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) + + def _validate(self, context): + super(ArtifactType, self)._validate(context) + self._get_properties(context) + + def _dump(self, context): + self._dump_content(context, ( + 'description', + 'version', + 'derived_from', + 'mime_type', + 'file_ext', + 'properties')) + + +@has_fields +@implements_specification('3.6.5', 'tosca-simple-1.0') +class DataType(ExtensiblePresentation): + """ + A Data Type definition defines the schema for new named datatypes in TOSCA. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(data_type_derived_from_validator) + @primitive_field(str) + def derived_from(self): + """ + The optional key used when a datatype is derived from an existing TOSCA Data Type. + + :type: :obj:`basestring` + """ + + @object_field(Version) + def version(self): + """ + An optional version for the Data Type definition. + + :type: :class:`Version` + """ + + @object_field(Description) + def description(self): + """ + The optional description for the Data Type. + + :type: :class:`Description` + """ + + @field_validator(data_type_constraints_validator) + @object_list_field(ConstraintClause) + def constraints(self): + """ + The optional list of sequenced constraint clauses for the Data Type. + + :type: list of (str, :class:`ConstraintClause`) + """ + + @field_validator(data_type_properties_validator) + @object_dict_field(PropertyDefinition) + def properties(self): + """ + The optional list property definitions that comprise the schema for a complex Data Type in + TOSCA. + + :type: {:obj:`basestring`: :class:`PropertyDefinition`} + """ + + @cachedmethod + def _get_parent(self, context): + return get_data_type(context, self, 'derived_from', allow_none=True) + + @cachedmethod + def _is_descendant(self, context, the_type): + if the_type is None: + return False + if not hasattr(the_type, '_name'): + # Must be a primitive type + return self._get_primitive_ancestor(context) == the_type + if the_type._name == self._name: + return True + return self._is_descendant(context, the_type._get_parent(context)) + + @cachedmethod + def _get_primitive_ancestor(self, context): + parent = self._get_parent(context) + if parent is not None: + if not isinstance(parent, DataType): + return parent + else: + return parent._get_primitive_ancestor(context) # pylint: disable=no-member + return None + + @cachedmethod + def _get_properties(self, context): + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) + + @cachedmethod + def _get_constraints(self, context): + return get_inherited_constraints(context, self) + + def _validate(self, context): + super(DataType, self)._validate(context) + validate_data_type_name(context, self) + self._get_properties(context) + + def _coerce_value(self, context, presentation, entry_schema, constraints, value, aspect): + return coerce_data_type_value(context, presentation, self, entry_schema, constraints, value, + aspect) + + def _dump(self, context): + self._dump_content(context, ( + 'description', + 'version', + 'derived_from', + 'constraints', + 'properties')) + + +@has_fields +@implements_specification('3.6.6', 'tosca-simple-1.0') +class CapabilityType(ExtensiblePresentation): + """ + A Capability Type is a reusable entity that describes a kind of capability that a Node Type can + declare to expose. Requirements (implicit or explicit) that are declared as part of one node can + be matched to (i.e., fulfilled by) the Capabilities declared by another node. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(derived_from_validator(convert_name_to_full_type_name, 'capability_types')) + @primitive_field(str) + def derived_from(self): + """ + An optional parent capability type name this new Capability Type derives from. + + :type: :obj:`basestring` + """ + + @object_field(Version) + def version(self): + """ + An optional version for the Capability Type definition. + + :type: :class:`Version` + """ + + @object_field(Description) + def description(self): + """ + An optional description for the Capability Type. + + :type: :class:`Description` + """ + + @object_dict_field(PropertyDefinition) + def properties(self): + """ + An optional list of property definitions for the Capability Type. + + ARIA NOTE: The spec says 'list', but the examples are all of dicts. + + :type: {:obj:`basestring`: :class:`PropertyDefinition`} + """ + + @object_dict_field(AttributeDefinition) + def attributes(self): + """ + An optional list of attribute definitions for the Capability Type. + + :type: {:obj:`basestring`: :class:`AttributeDefinition`} + """ + + @field_validator(list_type_validator('node type', convert_name_to_full_type_name, 'node_types')) + @primitive_list_field(str) + def valid_source_types(self): + """ + An optional list of one or more valid names of Node Types that are supported as valid + sources of any relationship established to the declared Capability Type. + + :type: [:obj:`basestring`] + """ + + @cachedmethod + def _get_parent(self, context): + return get_parent_presentation(context, self, convert_name_to_full_type_name, + 'capability_types') + + @cachedmethod + def _is_descendant(self, context, other_type): + """returns True iff `other_type` is a descendant of the represented capability type""" + if other_type is None: + return False + elif other_type._name == self._name: + return True + return self._is_descendant(context, other_type._get_parent(context)) + + @cachedmethod + def _get_properties(self, context): + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) + + @cachedmethod + def _get_valid_source_types(self, context): + return get_inherited_valid_source_types(context, self) + + def _validate(self, context): + super(CapabilityType, self)._validate(context) + self._get_properties(context) + + def _dump(self, context): + self._dump_content(context, ( + 'description', + 'version', + 'derived_from', + 'valid_source_types', + 'properties', + 'attributes')) + + +@allow_unknown_fields +@has_fields +@implements_specification('3.6.4', 'tosca-simple-1.0') +class InterfaceType(ExtensiblePresentation): + """ + An Interface Type is a reusable entity that describes a set of operations that can be used to + interact with or manage a node or relationship in a TOSCA topology. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(derived_from_validator(convert_name_to_full_type_name, 'interface_types')) + @primitive_field(str) + def derived_from(self): + """ + An optional parent Interface Type name this new Interface Type derives from. + + :type: :obj:`basestring` + """ + + @object_field(Version) + def version(self): + """ + An optional version for the Interface Type definition. + + :type: :class:`Version` + """ + + @object_field(Description) + def description(self): + """ + An optional description for the Interface Type. + + :type: :class:`Description` + """ + + @object_dict_field(PropertyDefinition) + def inputs(self): + """ + The optional list of input parameter definitions. + + :type: {:obj:`basestring`: :class:`PropertyDefinition`} + """ + + @object_dict_unknown_fields(OperationDefinition) + def operations(self): + """ + :type: {:obj:`basestring`: :class:`OperationDefinition`} + """ + + @cachedmethod + def _get_parent(self, context): + return get_parent_presentation(context, self, convert_name_to_full_type_name, + 'interface_types') + + @cachedmethod + def _is_descendant(self, context, the_type): + if the_type is None: + return False + elif the_type._name == self._name: + return True + return self._is_descendant(context, the_type._get_parent(context)) + + @cachedmethod + def _get_inputs(self, context): + return FrozenDict(get_inherited_parameter_definitions(context, self, 'inputs')) + + @cachedmethod + def _get_operations(self, context): + return FrozenDict(get_inherited_operations(context, self)) + + def _validate(self, context): + super(InterfaceType, self)._validate(context) + self._get_inputs(context) + for operation in self.operations.itervalues(): # pylint: disable=no-member + operation._validate(context) + + def _dump(self, context): + self._dump_content(context, ( + 'description', + 'version', + 'derived_from', + 'inputs', + 'operations')) + + +@has_fields +@implements_specification('3.6.9', 'tosca-simple-1.0') +class RelationshipType(ExtensiblePresentation): + """ + A Relationship Type is a reusable entity that defines the type of one or more relationships + between Node Types or Node Templates. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(derived_from_validator(convert_name_to_full_type_name, 'relationship_types')) + @primitive_field(str) + def derived_from(self): + """ + An optional parent Relationship Type name the Relationship Type derives from. + + :type: :obj:`basestring` + """ + + @object_field(Version) + def version(self): + """ + An optional version for the Relationship Type definition. + + :type: :class:`Version` + """ + + @object_field(Description) + def description(self): + """ + An optional description for the Relationship Type. + + :type: :class:`Description` + """ + + @object_dict_field(PropertyDefinition) + def properties(self): + """ + An optional list of property definitions for the Relationship Type. + + :type: {:obj:`basestring`: :class:`PropertyDefinition`} + """ + + @object_dict_field(AttributeDefinition) + def attributes(self): + """ + An optional list of attribute definitions for the Relationship Type. + + :type: {:obj:`basestring`: :class:`AttributeDefinition`} + """ + + @object_dict_field(InterfaceDefinition) + def interfaces(self): + """ + An optional list of interface definitions interfaces supported by the Relationship Type. + + :type: {:obj:`basestring`: :class:`InterfaceDefinition`} + """ + + @field_validator(list_type_validator('capability type', convert_name_to_full_type_name, + 'capability_types')) + @primitive_list_field(str) + def valid_target_types(self): + """ + An optional list of one or more names of Capability Types that are valid targets for this + relationship. + + :type: [:obj:`basestring`] + """ + + @cachedmethod + def _get_parent(self, context): + return get_parent_presentation(context, self, convert_name_to_full_type_name, + 'relationship_types') + + @cachedmethod + def _is_descendant(self, context, the_type): + if the_type is None: + return False + elif the_type._name == self._name: + return True + return self._is_descendant(context, the_type._get_parent(context)) + + @cachedmethod + def _get_properties(self, context): + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) + + @cachedmethod + def _get_attributes(self, context): + return FrozenDict(get_inherited_parameter_definitions(context, self, 'attributes')) + + @cachedmethod + def _get_interfaces(self, context): + return FrozenDict(get_inherited_interface_definitions(context, self, 'relationship type')) + + def _validate(self, context): + super(RelationshipType, self)._validate(context) + self._get_properties(context) + self._get_attributes(context) + self._get_interfaces(context) + + def _dump(self, context): + self._dump_content(context, ( + 'description', + 'version', + 'derived_from', + 'valid_target_types', + 'properties', + 'attributes', + 'interfaces')) + + +@has_fields +@implements_specification('3.6.8', 'tosca-simple-1.0') +class NodeType(ExtensiblePresentation): + """ + A Node Type is a reusable entity that defines the type of one or more Node Templates. As such, a + Node Type defines the structure of observable properties via a Properties Definition, the + Requirements and Capabilities of the node as well as its supported interfaces. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(derived_from_validator(convert_name_to_full_type_name, 'node_types')) + @primitive_field(str) + def derived_from(self): + """ + An optional parent Node Type name this new Node Type derives from. + + :type: :obj:`basestring` + """ + + @object_field(Version) + def version(self): + """ + An optional version for the Node Type definition. + + :type: :class:`Version` + """ + + @object_field(Description) + def description(self): + """ + An optional description for the Node Type. + + :type: :class:`Description` + """ + + @object_dict_field(PropertyDefinition) + def properties(self): + """ + An optional list of property definitions for the Node Type. + + :type: {:obj:`basestring`: :class:`PropertyDefinition`} + """ + + @object_dict_field(AttributeDefinition) + def attributes(self): + """ + An optional list of attribute definitions for the Node Type. + + :type: {:obj:`basestring`: :class:`AttributeDefinition`} + """ + + @object_sequenced_list_field(RequirementDefinition) + def requirements(self): + """ + An optional sequenced list of requirement definitions for the Node Type. + + ARIA NOTE: The spec seems wrong to make this a sequenced list. It seems that when you have + more than one requirement of the same name, behavior is undefined. The idea is to use the + "occurrences" field if you need to limit the number of requirement assignments. + + :type: list of (str, :class:`RequirementDefinition`) + """ + + @object_dict_field(CapabilityDefinition) + def capabilities(self): + """ + An optional list of capability definitions for the Node Type. + + :type: list of :class:`CapabilityDefinition` + """ + + @object_dict_field(InterfaceDefinition) + def interfaces(self): + """ + An optional list of interface definitions supported by the Node Type. + + :type: {:obj:`basestring`: :class:`InterfaceDefinition`} + """ + + @object_dict_field(ArtifactAssignmentForType) + def artifacts(self): + """ + An optional list of named artifact definitions for the Node Type. + + :type: {:obj:`basestring`: :class:`ArtifactAssignmentForType`} + """ + + @cachedmethod + def _get_parent(self, context): + return get_parent_presentation(context, self, convert_name_to_full_type_name, 'node_types') + + @cachedmethod + def _is_descendant(self, context, the_type): + if the_type is None: + return False + elif the_type._name == self._name: + return True + return self._is_descendant(context, the_type._get_parent(context)) + + @cachedmethod + def _get_properties(self, context): + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) + + @cachedmethod + def _get_attributes(self, context): + return FrozenDict(get_inherited_parameter_definitions(context, self, 'attributes')) + + @cachedmethod + def _get_requirements(self, context): + return FrozenList(get_inherited_requirement_definitions(context, self)) + + @cachedmethod + def _get_capabilities(self, context): + return FrozenDict(get_inherited_capability_definitions(context, self)) + + @cachedmethod + def _get_interfaces(self, context): + return FrozenDict(get_inherited_interface_definitions(context, self, 'node type')) + + @cachedmethod + def _get_artifacts(self, context): + return FrozenDict(get_inherited_artifact_definitions(context, self)) + + def _validate(self, context): + super(NodeType, self)._validate(context) + self._get_properties(context) + self._get_attributes(context) + self._get_requirements(context) + self._get_capabilities(context) + self._get_interfaces(context) + self._get_artifacts(context) + + def _dump(self, context): + self._dump_content(context, ( + 'description', + 'version', + 'derived_from', + 'properties', + 'attributes', + 'interfaces', + 'artifacts', + 'requirements', + 'capabilities')) + + +@has_fields +@implements_specification('3.6.10', 'tosca-simple-1.0') +class GroupType(ExtensiblePresentation): + """ + A Group Type defines logical grouping types for nodes, typically for different management + purposes. Groups can effectively be viewed as logical nodes that are not part of the physical + deployment topology of an application, yet can have capabilities and the ability to attach + policies and interfaces that can be applied (depending on the group type) to its member nodes. + + Conceptually, group definitions allow the creation of logical "membership" relationships to + nodes in a service template that are not a part of the application's explicit requirement + dependencies in the topology template (i.e. those required to actually get the application + deployed and running). Instead, such logical membership allows for the introduction of things + such as group management and uniform application of policies (i.e., requirements that are also + not bound to the application itself) to the group's members. + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(derived_from_validator(convert_name_to_full_type_name, 'group_types')) + @primitive_field(str) + def derived_from(self): + """ + An optional parent Group Type name the Group Type derives from. + + :type: :obj:`basestring` + """ + + @object_field(Version) + def version(self): + """ + An optional version for the Group Type definition. + + :type: :class:`Version` + """ + + @object_field(Description) + def description(self): + """ + The optional description for the Group Type. + + :type: :class:`Description` + """ + + @object_dict_field(PropertyDefinition) + def properties(self): + """ + An optional list of property definitions for the Group Type. + + :type: {:obj:`basestring`: :class:`PropertyDefinition`} + """ + + @field_validator(list_type_validator('node type', convert_name_to_full_type_name, 'node_types')) + @primitive_list_field(str) + def members(self): + """ + An optional list of one or more names of Node Types that are valid (allowed) as members of + the Group Type. + + Note: This can be viewed by TOSCA Orchestrators as an implied relationship from the listed + members nodes to the group, but one that does not have operational lifecycle considerations. + For example, if we were to name this as an explicit Relationship Type we might call this + "MemberOf" (group). + + :type: [:obj:`basestring`] + """ + + @object_dict_field(InterfaceDefinition) + def interfaces(self): + """ + An optional list of interface definitions supported by the Group Type. + + :type: {:obj:`basestring`: :class:`InterfaceDefinition`} + """ + + @cachedmethod + def _get_parent(self, context): + return get_parent_presentation(context, self, convert_name_to_full_type_name, + 'group_types') + + @cachedmethod + def _is_descendant(self, context, the_type): + if the_type is None: + return False + elif the_type._name == self._name: + return True + return self._is_descendant(context, the_type._get_parent(context)) + + @cachedmethod + def _get_properties(self, context): + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) + + @cachedmethod + def _get_interfaces(self, context): + return FrozenDict(get_inherited_interface_definitions(context, self, 'group type')) + + def _validate(self, context): + super(GroupType, self)._validate(context) + self._get_properties(context) + self._get_interfaces(context) + + def _dump(self, context): + self._dump_content(context, ( + 'description', + 'version', + 'derived_from', + 'members', + 'properties', + 'interfaces')) + + +@has_fields +@implements_specification('3.6.11', 'tosca-simple-1.0') +class PolicyType(ExtensiblePresentation): + """ + A Policy Type defines a type of requirement that affects or governs an application or service's + topology at some stage of its lifecycle, but is not explicitly part of the topology itself + (i.e., it does not prevent the application or service from being deployed or run if it did not + exist). + + See the `TOSCA Simple Profile v1.0 cos01 specification `__ + """ + + @field_validator(derived_from_validator(convert_name_to_full_type_name, 'policy_types')) + @primitive_field(str) + def derived_from(self): + """ + An optional parent Policy Type name the Policy Type derives from. + + :type: :obj:`basestring` + """ + + @object_field(Version) + def version(self): + """ + An optional version for the Policy Type definition. + + :type: :class:`Version` + """ + + @object_field(Description) + def description(self): + """ + The optional description for the Policy Type. + + :type: :class:`Description` + """ + + @object_dict_field(PropertyDefinition) + def properties(self): + """ + An optional list of property definitions for the Policy Type. + + :type: :class:`PropertyDefinition` + """ + + @field_validator(list_node_type_or_group_type_validator) + @primitive_list_field(str) + def targets(self): + """ + An optional list of valid Node Types or Group Types the Policy Type can be applied to. + + Note: This can be viewed by TOSCA Orchestrators as an implied relationship to the target + nodes, but one that does not have operational lifecycle considerations. For example, if we + were to name this as an explicit Relationship Type we might call this "AppliesTo" (node or + group). + + :type: [:obj:`basestring`] + """ + + @cachedmethod + def _get_parent(self, context): + return get_parent_presentation(context, self, convert_name_to_full_type_name, + 'policy_types') + + @cachedmethod + def _get_properties(self, context): + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) + + @cachedmethod + def _get_targets(self, context): + node_types, group_types = get_inherited_targets(context, self) + return FrozenList(node_types), FrozenList(group_types) + + def _validate(self, context): + super(PolicyType, self)._validate(context) + self._get_properties(context) + + def _dump(self, context): + self._dump_content(context, ( + 'description', + 'version', + 'derived_from', + 'targets', + 'properties')) diff --git a/azure/aria/aria-extension-cloudify/src/aria/release/asf-release.sh b/azure/aria/aria-extension-cloudify/src/aria/release/asf-release.sh new file mode 100644 index 0000000..18f5b38 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/release/asf-release.sh @@ -0,0 +1,283 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 script is meant to help with the creation of Apache-compliant +# release candidates, as well as finalizing releases by using said candidates. +# +# Creation of a release candidate includes: +# 1) Creating a source package (a snapshot of the repository) +# 2) Creating a Pythonic sdist (generated docs, examples, etc., but no tests etc.) +# 3) Creating a Pythonic bdist (Wheel; binary distribution) +# 4) Publishing these packages on to https://dist.apache.org/repos/dist/dev/incubator/ariatosca/ +# 5) Publishing the sdist and bdist packages on test-PyPI (https://test.pypi.org/) +# +# Finalization of a release includes: +# 1) Copying of the source, sdist and bdist packages from /dist/dev to /dist/release +# (i.e. from https://dist.apache.org/repos/dist/dev/incubator/ariatosca/ +# to https://dist.apache.org/repos/dist/release/incubator/ariatosca/) +# 2) Publishing the sdist and bdist packages on PyPI (https://pypi.org) +# 3) Tagging the git repository for the release version +# +# Read more about Apache release rules and regulations at: +# 1) https://www.apache.org/dev/#releases +# 2) https://www.apache.org/legal/release-policy.html +# 3) https://www.apache.org/dev/release-distribution.html +# 4) https://www.apache.org/dev/release-publishing.html +# 5) https://www.apache.org/dev/release-signing.html +# 6) http://incubator.apache.org/incubation/Incubation_Policy.html#Releases +# 7) http://incubator.apache.org/guides/releasemanagement.html + + +set -e + + +function create_apache_release_candidate { + if [ "$#" -lt 1 ]; then + echo "Must provide git branch for release candidate" >&2 + return 1 + fi + + local GIT_BRANCH=$1 + local OPTIONAL_ARIATOSCA_DIST_DEV_PATH=$2 + + ARIA_DIR=$(_get_aria_dir) + pushd ${ARIA_DIR} + + git checkout ${GIT_BRANCH} + local VERSION=$(cat VERSION) + + echo "Creating Apache release candidate for version ${VERSION}..." + + make clean + _create_source_package ${GIT_BRANCH} ${VERSION} + _create_sdist_and_bdist_packages + _publish_to_apache_dev ${VERSION} ${OPTIONAL_ARIATOSCA_DIST_DEV_PATH} + _publish_to_test_pypi + git checkout - + popd +} + + +function finalize_apache_release { + if [ "$#" -ne 1 ]; then + echo "Must provide git branch for release tagging" >&2 + return 1 + fi + + local GIT_BRANCH=$1 + + ARIA_DIR=$(_get_aria_dir) + pushd ${ARIA_DIR} + + git checkout ${GIT_BRANCH} + local VERSION=$(cat VERSION) + + read -p "Enter 'Yes' to confirm release finalization for version ${VERSION}: " yn + case $yn in + Yes ) echo "Finalizing Apache release...";; + * ) git checkout -; return;; + esac + + _publish_to_apache_release ${VERSION} + _publish_to_real_pypi + _create_git_tag ${VERSION} + git checkout - + popd +} + + +function _get_aria_dir { + SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + ARIA_DIR="$(dirname "${SCRIPT_DIR}")" + echo ${ARIA_DIR} +} + + +function _create_source_package { + local GIT_BRANCH=$1 + local VERSION=$2 + local INCUBATING_ARCHIVE_CONTENT_DIR=apache-ariatosca-${VERSION}-incubating # e.g. apache-ariatosca-0.1.0-incubating + local INCUBATING_ARCHIVE=${INCUBATING_ARCHIVE_CONTENT_DIR}.tar.gz # e.g. apache-ariatosca-0.1.0-incubating.tar.gz + local SOURCE_PACKAGE_DIR="source" + + echo "Creating source package..." + mkdir -p dist/${SOURCE_PACKAGE_DIR} + pushd dist/${SOURCE_PACKAGE_DIR} + # re-cloning repository, to ensure repo snapshot is clean and not environment-dependent + wget https://github.com/apache/incubator-ariatosca/archive/${GIT_BRANCH}.zip + unzip ${GIT_BRANCH}.zip > /dev/null + mv incubator-ariatosca-${GIT_BRANCH} ${INCUBATING_ARCHIVE_CONTENT_DIR} + tar -czvf ${INCUBATING_ARCHIVE} ${INCUBATING_ARCHIVE_CONTENT_DIR} > /dev/null + rm -rf ${INCUBATING_ARCHIVE_CONTENT_DIR} + rm ${GIT_BRANCH}.zip + + _sign_package ${INCUBATING_ARCHIVE} + popd +} + +function _sign_package { + local ARCHIVE_NAME=$1 + + echo "Signing archive ${ARCHIVE_NAME}..." + gpg --armor --output ${ARCHIVE_NAME}.asc --detach-sig ${ARCHIVE_NAME} + gpg --print-md MD5 ${ARCHIVE_NAME} > ${ARCHIVE_NAME}.md5 + gpg --print-md SHA512 ${ARCHIVE_NAME} > ${ARCHIVE_NAME}.sha +} + + +function _create_sdist_and_bdist_packages { + local SDIST_PACKAGE_DIR="sdist" + local BDIST_PACKAGE_DIR="bdist" + + echo "Creating sdist and bdist packages..." + make docs + python setup.py sdist -d dist/${SDIST_PACKAGE_DIR} bdist_wheel -d dist/${BDIST_PACKAGE_DIR} + + # pushing LICENSE and additional files into the binary distribution archive + find dist/${BDIST_PACKAGE_DIR} -type f -name '*.whl' -exec zip -u {} LICENSE NOTICE DISCLAIMER \; + + pushd dist/${SDIST_PACKAGE_DIR} + local SDIST_ARCHIVE=$(find . -type f -name "*.tar.gz" -printf '%P\n') + _sign_package ${SDIST_ARCHIVE} + popd + + pushd dist/${BDIST_PACKAGE_DIR} + local BDIST_ARCHIVE=$(find . -type f -name "*.whl" -printf '%P\n') + _sign_package ${BDIST_ARCHIVE} + popd +} + + +function _publish_to_test_pypi { + echo "Publishing to test PyPI..." + _publish_to_pypi https://test.pypi.org/legacy/ +} + + +function _publish_to_apache_dev { + local VERSION=$1 + local ARIATOSCA_DIST_DEV_PATH=$2 + + local DIST_DIR=$(pwd)/dist + local RELEASE_DIR=${VERSION}-incubating # e.g. 0.1.0-incubating + + echo "Publishing to Apache dist dev..." + if [ -z "${ARIATOSCA_DIST_DEV_PATH}" ]; then + local TMP_DIR=$(mktemp -d) + echo "Checking out ARIA dist dev to ${TMP_DIR}" + pushd ${TMP_DIR} + svn co https://dist.apache.org/repos/dist/dev/incubator/ariatosca/ + popd + pushd ${TMP_DIR}/ariatosca + else + pushd ${ARIATOSCA_DIST_DEV_PATH} + fi + + svn up + cp -r ${DIST_DIR} . + mv dist/ ${RELEASE_DIR}/ + svn add ${RELEASE_DIR} + svn commit -m "ARIA ${VERSION} release candidate" + popd +} + + +function _publish_to_real_pypi { + echo "Publishing to PyPI..." + _publish_to_pypi https://upload.pypi.org/legacy/ +} + + +function _publish_to_pypi { + local REPOSITORY_URL=$1 + + pushd dist + + pushd sdist + local SDIST_ARCHIVE=$(find . -type f -name "*.tar.gz" -printf '%P\n') + twine upload --repository-url ${REPOSITORY_URL} ${SDIST_ARCHIVE} ${SDIST_ARCHIVE}.asc + popd + + pushd bdist + local BDIST_ARCHIVE=$(find . -type f -name "*.whl" -printf '%P\n') + twine upload --repository-url ${REPOSITORY_URL} ${BDIST_ARCHIVE} ${BDIST_ARCHIVE}.asc + popd + + popd +} + + +function _publish_to_apache_release { + local VERSION=$1 + local RELEASE_DIR=${VERSION}-incubating # e.g. 0.1.0-incubating + + echo "Publishing to Apache dist..." + + local TMP_DIR=$(mktemp -d) + echo "Checking out ARIA dist dev to ${TMP_DIR}" + pushd ${TMP_DIR} + + svn co https://dist.apache.org/repos/dist/dev/incubator/ariatosca/ ariatosca-dev + svn co https://dist.apache.org/repos/dist/release/incubator/ariatosca/ ariatosca-release + cp -r ariatosca-dev/${RELEASE_DIR} ariatosca-release + + pushd ariatosca-release + svn add ${RELEASE_DIR} + # TODO: remove older releases? + svn commit -m "ARIA ${VERSION} release" + popd + popd +} + + +function _create_git_tag { + local VERSION=$1 + + echo "Creating git tag ${VERSION}" + git tag -a ${VERSION} -m "ARIA ${VERSION}" + git push --tags origin +} + + +function pushd { + command pushd "$@" > /dev/null +} + + + +function popd { + command popd "$@" > /dev/null +} + + + +if [ "$#" -ne 2 ]; then + echo "Usage: $0 {candidate,package} " >&2 + exit 1 +fi + +OPERATION=$1 +GIT_BRANCH=$2 + +if [ "${OPERATION}" == "candidate" ]; then + create_apache_release_candidate ${GIT_BRANCH} +elif [ "${OPERATION}" == "package" ]; then + finalize_apache_release ${GIT_BRANCH} +else + echo "First parameter must be either 'candidate' or 'package'" >&2 + exit 1 +fi diff --git a/azure/aria/aria-extension-cloudify/src/aria/requirements.in b/azure/aria/aria-extension-cloudify/src/aria/requirements.in new file mode 100644 index 0000000..a451c38 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/requirements.in @@ -0,0 +1,41 @@ +# 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. + +# In order to create the requirements.txt file, execute +# pip-compile --output-file requirements.txt requirements.in (pip-tools package is needed). + +requests>=2.3.0, <=2.16.0 +networkx>=1.9, <1.10 # version 1.10 dropped support of python 2.6 +retrying>=1.3.0, <1.4.0 +blinker>1.3, <1.5 +jsonpickle>0.9.0, <=0.9.4 +ruamel.yaml>=0.11.12, <0.12.0 # version 0.12.0 dropped support of python 2.6 +Jinja2>=2.8, <2.9 +shortuuid>=0.5, <0.6 +CacheControl[filecache]>=0.11.0, <0.13 +SQLAlchemy>=1.1.0, <1.2 # version 1.2 dropped support of python 2.6 +wagon==0.6.0 +bottle>=0.12.0, <0.13 +setuptools>=35.0.0, <36.0.0 +click>=6.0, < 7.0 +colorama>=0.3.7, <=0.3.9 +PrettyTable>=0.7,<0.8 +click_didyoumean==0.0.3 +backports.shutil_get_terminal_size==1.0.0 +logutils==0.3.4.1 +psutil>=5.2.2, < 6.0.0 +importlib ; python_version < '2.7' +ordereddict ; python_version < '2.7' +total-ordering ; python_version < '2.7' # only one version on pypi +wheel<=0.29.0 ; python_version < '2.7' +Fabric==1.13.0 +pycrypto==2.6.1 diff --git a/azure/aria/aria-extension-cloudify/src/aria/requirements.txt b/azure/aria/aria-extension-cloudify/src/aria/requirements.txt new file mode 100644 index 0000000..936662f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/requirements.txt @@ -0,0 +1,43 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# pip-compile --output-file requirements.txt requirements.in +# +appdirs==1.4.3 # via setuptools +backports.shutil_get_terminal_size==1.0.0 +blinker==1.4 +bottle==0.12.13 +cachecontrol[filecache]==0.12.1 +click==6.7 +click_didyoumean==0.0.3 +colorama==0.3.9 +decorator==4.0.11 # via networkx +Fabric==1.13.0 +importlib==1.0.4 ; python_version < "2.7" +jinja2==2.8.1 +jsonpickle==0.9.4 +lockfile==0.12.2 # via cachecontrol +logutils==0.3.4.1 +markupsafe==1.0 # via jinja2 +msgpack-python==0.4.8 # via cachecontrol +networkx==1.9.1 +ordereddict==1.1 ; python_version < "2.7" +packaging==16.8 # via setuptools +prettytable==0.7.2 +psutil==5.2.2 +pycrypto==2.6.1 +pyparsing==2.2.0 # via packaging +requests==2.13.0 +retrying==1.3.3 +ruamel.ordereddict==0.4.9 # via ruamel.yaml +ruamel.yaml==0.11.15 +shortuuid==0.5.0 +six==1.10.0 # via packaging, retrying, setuptools +sqlalchemy==1.1.6 +total-ordering==0.1.0 ; python_version < "2.7" +wagon==0.6.0 +wheel==0.29.0 ; python_version < "2.7" + +# The following packages are considered to be unsafe in a requirements file: +setuptools==35.0.2 diff --git a/azure/aria/aria-extension-cloudify/src/aria/setup.py b/azure/aria/aria-extension-cloudify/src/aria/setup.py new file mode 100644 index 0000000..04795a5 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/setup.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 sys + +from setuptools import setup, find_packages +from setuptools.command.install import install +from setuptools.command.develop import develop + + +_PACKAGE_NAME = 'apache-ariatosca' +_PYTHON_SUPPORTED_VERSIONS = [(2, 6), (2, 7)] +_EXTENSION_DIR = 'extensions' +_EXTENSION_NAMES = [ + 'aria_extension_tosca' +] + +if (sys.version_info[0], sys.version_info[1]) not in _PYTHON_SUPPORTED_VERSIONS: + raise NotImplementedError( + '{0} Package support Python version 2.6 & 2.7 Only'.format( + _PACKAGE_NAME)) + +root_dir = os.path.dirname(__file__) + +with open(os.path.join(root_dir, 'VERSION')) as version_file: + __version__ = version_file.read().strip() + incubating_version = '{0}-incubating'.format(__version__) + +with open(os.path.join(root_dir, 'README.rst')) as readme: + long_description = readme.read() + +install_requires = [] + +ssh_requires = [ + 'Fabric>=1.13.0, <1.14', +] +win_ssh_requires = [ + # Fabric depends on the pypiwin32 on Windows, but doesn't install it + 'pypiwin32==219' +] + +extras_require = { + 'ssh': ssh_requires, + 'ssh:sys_platform=="win32"': win_ssh_requires +} + +with open(os.path.join(root_dir, 'requirements.in')) as requirements: + for requirement in requirements.readlines(): + requirement = requirement.split('#')[0].strip() # get rid of comments or trailing comments + if not requirement: + continue # skip empty and comment lines + + # dependencies which use environment markers have to go in as conditional dependencies + # under "extra_require" rather than "install_requires", or otherwise the environment + # markers get ignored when installing from wheel. See more here: + # https://wheel.readthedocs.io/en/latest/index.html#defining-conditional-dependencies + # https://hynek.me/articles/conditional-python-dependencies/ + if ';' in requirement: + package, condition = requirement.split(';') + cond_name = ':{0}'.format(condition.strip()) + extras_require.setdefault(cond_name, []) + extras_require[cond_name].append(package.strip()) + else: + install_requires.append(requirement) + + +console_scripts = ['aria = aria.cli.main:main'] + + +def _generate_user_options(command): + return command.user_options + [ + ('skip-ctx', None, 'Install with or without the ctx (Defaults to False)') + ] + + +def _generate_boolean_options(command): + return command.boolean_options + ['skip-ctx'] + + +def _initialize_options(custom_cmd): + custom_cmd.command.initialize_options(custom_cmd) + custom_cmd.skip_ctx = False + + +def _run(custom_cmd): + if custom_cmd.skip_ctx is False: + console_scripts.append('ctx = aria.orchestrator.execution_plugin.ctx_proxy.client:main') + custom_cmd.command.run(custom_cmd) + + +class InstallCommand(install): + command = install + + user_options = _generate_user_options(install) + boolean_options = _generate_boolean_options(install) + initialize_options = _initialize_options + run = _run + + +class DevelopCommand(develop): + command = develop + + user_options = _generate_user_options(develop) + boolean_options = _generate_boolean_options(develop) + initialize_options = _initialize_options + run = _run + +setup( + name=_PACKAGE_NAME, + version=__version__, + description='ARIA', + long_description=long_description, + license='Apache License 2.0', + author='ARIA', + author_email='dev@ariatosca.incubator.apache.org', + url='http://ariatosca.incubator.apache.org/', + download_url=( + 'https://dist.apache.org/repos/dist/release/incubator/ariatosca/' + incubating_version), + classifiers=[ + 'Development Status :: 4 - Beta', + 'Environment :: Console', + 'Environment :: Web Environment', + 'Intended Audience :: Developers', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: OS Independent', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Topic :: System :: Networking', + 'Topic :: System :: Systems Administration'], + packages=find_packages(include=['aria*']) + + find_packages(where=_EXTENSION_DIR, + include=['{0}*'.format(name) for name in _EXTENSION_NAMES]), + package_dir=dict((name, '{0}/{1}'.format(_EXTENSION_DIR, name)) for name in _EXTENSION_NAMES), + package_data={ + 'aria': [ + 'cli/config/config_template.yaml' + ], + 'aria_extension_tosca': [ + 'profiles/tosca-simple-1.0/**', + 'profiles/tosca-simple-nfv-1.0/**', + 'profiles/aria-1.0/**', + 'profiles/azure-plugin/**' + ] + }, + platforms=['any'], + zip_safe=False, + install_requires=install_requires, + extras_require=extras_require, + entry_points={ + 'console_scripts': console_scripts + }, + cmdclass={ + 'install': InstallCommand, # used in pip install ... + 'develop': DevelopCommand # used in pip install -e ... + } +) diff --git a/azure/aria/aria-extension-cloudify/src/aria/test_ssh.py b/azure/aria/aria-extension-cloudify/src/aria/test_ssh.py new file mode 100644 index 0000000..5256cf8 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/test_ssh.py @@ -0,0 +1,528 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 contextlib +import json +import logging +import os + +import pytest + +import fabric.api +from fabric.contrib import files +from fabric import context_managers + +from aria.modeling import models +from aria.orchestrator import events +from aria.orchestrator import workflow +from aria.orchestrator.workflows import api +from aria.orchestrator.workflows.executor import process +from aria.orchestrator.workflows.core import engine, graph_compiler +from aria.orchestrator.workflows.exceptions import ExecutorException +from aria.orchestrator.exceptions import TaskAbortException, TaskRetryException +from aria.orchestrator.execution_plugin import operations +from aria.orchestrator.execution_plugin import constants +from aria.orchestrator.execution_plugin.exceptions import ProcessException, TaskException +from aria.orchestrator.execution_plugin.ssh import operations as ssh_operations + +from tests import mock, storage, resources +from tests.orchestrator.workflows.helpers import events_collector + +_CUSTOM_BASE_DIR = '/tmp/new-aria-ctx' + +import tests +KEY_FILENAME = os.path.join(tests.ROOT_DIR, 'tests/resources/keys/test') + +_FABRIC_ENV = { + 'disable_known_hosts': True, + 'user': 'test', + 'key_filename': KEY_FILENAME +} + + +import mockssh +@pytest.fixture(scope='session') +def server(): + with mockssh.Server({'test': KEY_FILENAME}) as s: + yield s + + +#@pytest.mark.skipif(not os.environ.get('TRAVIS'), reason='actual ssh server required') +class TestWithActualSSHServer(object): + + def test_run_script_basic(self): + expected_attribute_value = 'some_value' + props = self._execute(env={'test_value': expected_attribute_value}) + assert props['test_value'].value == expected_attribute_value + + @pytest.mark.skip(reason='sudo privileges are required') + def test_run_script_as_sudo(self): + self._execute(use_sudo=True) + with self._ssh_env(): + assert files.exists('/opt/test_dir') + fabric.api.sudo('rm -rf /opt/test_dir') + + def test_run_script_default_base_dir(self): + props = self._execute() + assert props['work_dir'].value == '{0}/work'.format(constants.DEFAULT_BASE_DIR) + + @pytest.mark.skip(reason='Re-enable once output from process executor can be captured') + @pytest.mark.parametrize('hide_groups', [[], ['everything']]) + def test_run_script_with_hide(self, hide_groups): + self._execute(hide_output=hide_groups) + output = 'TODO' + expected_log_message = ('[localhost] run: source {0}/scripts/' + .format(constants.DEFAULT_BASE_DIR)) + if hide_groups: + assert expected_log_message not in output + else: + assert expected_log_message in output + + def test_run_script_process_config(self): + expected_env_value = 'test_value_env' + expected_arg1_value = 'test_value_arg1' + expected_arg2_value = 'test_value_arg2' + expected_cwd = '/tmp' + expected_base_dir = _CUSTOM_BASE_DIR + props = self._execute( + env={'test_value_env': expected_env_value}, + process={ + 'args': [expected_arg1_value, expected_arg2_value], + 'cwd': expected_cwd, + 'base_dir': expected_base_dir + }) + assert props['env_value'].value == expected_env_value + assert len(props['bash_version'].value) > 0 + assert props['arg1_value'].value == expected_arg1_value + assert props['arg2_value'].value == expected_arg2_value + assert props['cwd'].value == expected_cwd + assert props['ctx_path'].value == '{0}/ctx'.format(expected_base_dir) + + def test_run_script_command_prefix(self): + props = self._execute(process={'command_prefix': 'bash -i'}) + assert 'i' in props['dollar_dash'].value + + def test_run_script_reuse_existing_ctx(self): + expected_test_value_1 = 'test_value_1' + expected_test_value_2 = 'test_value_2' + props = self._execute( + test_operations=['{0}_1'.format(self.test_name), + '{0}_2'.format(self.test_name)], + env={'test_value1': expected_test_value_1, + 'test_value2': expected_test_value_2}) + assert props['test_value1'].value == expected_test_value_1 + assert props['test_value2'].value == expected_test_value_2 + + def test_run_script_download_resource_plain(self, tmpdir): + resource = tmpdir.join('resource') + resource.write('content') + self._upload(str(resource), 'test_resource') + props = self._execute() + assert props['test_value'].value == 'content' + + def test_run_script_download_resource_and_render(self, tmpdir): + resource = tmpdir.join('resource') + resource.write('{{ctx.service.name}}') + self._upload(str(resource), 'test_resource') + props = self._execute() + assert props['test_value'].value == self._workflow_context.service.name + + @pytest.mark.parametrize('value', ['string-value', [1, 2, 3], {'key': 'value'}]) + def test_run_script_inputs_as_env_variables_no_override(self, value): + props = self._execute(custom_input=value) + return_value = props['test_value'].value + expected = return_value if isinstance(value, basestring) else json.loads(return_value) + assert value == expected + + @pytest.mark.parametrize('value', ['string-value', [1, 2, 3], {'key': 'value'}]) + def test_run_script_inputs_as_env_variables_process_env_override(self, value): + props = self._execute(custom_input='custom-input-value', + env={'custom_env_var': value}) + return_value = props['test_value'].value + expected = return_value if isinstance(value, basestring) else json.loads(return_value) + assert value == expected + + def test_run_script_error_in_script(self): + exception = self._execute_and_get_task_exception() + assert isinstance(exception, TaskException) + + def test_run_script_abort_immediate(self): + exception = self._execute_and_get_task_exception() + assert isinstance(exception, TaskAbortException) + assert exception.message == 'abort-message' + + def test_run_script_retry(self): + exception = self._execute_and_get_task_exception() + assert isinstance(exception, TaskRetryException) + assert exception.message == 'retry-message' + + def test_run_script_abort_error_ignored_by_script(self): + exception = self._execute_and_get_task_exception() + assert isinstance(exception, TaskAbortException) + assert exception.message == 'abort-message' + + def test_run_commands(self): + temp_file_path = '/tmp/very_temporary_file' + with self._ssh_env(): + if files.exists(temp_file_path): + fabric.api.run('rm {0}'.format(temp_file_path)) + self._execute(commands=['touch {0}'.format(temp_file_path)]) + with self._ssh_env(): + assert files.exists(temp_file_path) + fabric.api.run('rm {0}'.format(temp_file_path)) + + @pytest.fixture(autouse=True) + def _setup(self, request, workflow_context, executor, capfd, server): + print 'HI!!!!!!!!!!', server.port + self._workflow_context = workflow_context + self._executor = executor + self._capfd = capfd + self.test_name = request.node.originalname or request.node.name + with self._ssh_env(server): + for directory in [constants.DEFAULT_BASE_DIR, _CUSTOM_BASE_DIR]: + if files.exists(directory): + fabric.api.run('rm -rf {0}'.format(directory)) + + @contextlib.contextmanager + def _ssh_env(self, server): + with self._capfd.disabled(): + with context_managers.settings(fabric.api.hide('everything'), + host_string='localhost:{0}'.format(server.port), + **_FABRIC_ENV): + yield + + def _execute(self, + env=None, + use_sudo=False, + hide_output=None, + process=None, + custom_input='', + test_operations=None, + commands=None): + process = process or {} + if env: + process.setdefault('env', {}).update(env) + + test_operations = test_operations or [self.test_name] + + local_script_path = os.path.join(resources.DIR, 'scripts', 'test_ssh.sh') + script_path = os.path.basename(local_script_path) + self._upload(local_script_path, script_path) + + if commands: + operation = operations.run_commands_with_ssh + else: + operation = operations.run_script_with_ssh + + node = self._workflow_context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + arguments = { + 'script_path': script_path, + 'fabric_env': _FABRIC_ENV, + 'process': process, + 'use_sudo': use_sudo, + 'custom_env_var': custom_input, + 'test_operation': '', + } + if hide_output: + arguments['hide_output'] = hide_output + if commands: + arguments['commands'] = commands + interface = mock.models.create_interface( + node.service, + 'test', + 'op', + operation_kwargs=dict( + function='{0}.{1}'.format( + operations.__name__, + operation.__name__), + arguments=arguments) + ) + node.interfaces[interface.name] = interface + + @workflow + def mock_workflow(ctx, graph): + ops = [] + for test_operation in test_operations: + op_arguments = arguments.copy() + op_arguments['test_operation'] = test_operation + ops.append(api.task.OperationTask( + node, + interface_name='test', + operation_name='op', + arguments=op_arguments)) + + graph.sequence(*ops) + return graph + tasks_graph = mock_workflow(ctx=self._workflow_context) # pylint: disable=no-value-for-parameter + graph_compiler.GraphCompiler( + self._workflow_context, self._executor.__class__).compile(tasks_graph) + eng = engine.Engine({self._executor.__class__: self._executor}) + eng.execute(self._workflow_context) + return self._workflow_context.model.node.get_by_name( + mock.models.DEPENDENCY_NODE_NAME).attributes + + def _execute_and_get_task_exception(self, *args, **kwargs): + signal = events.on_failure_task_signal + with events_collector(signal) as collected: + with pytest.raises(ExecutorException): + self._execute(*args, **kwargs) + return collected[signal][0]['kwargs']['exception'] + + def _upload(self, source, path): + self._workflow_context.resource.service.upload( + entry_id=str(self._workflow_context.service.id), + source=source, + path=path) + + @pytest.fixture + def executor(self): + result = process.ProcessExecutor() + try: + yield result + finally: + result.close() + + @pytest.fixture + def workflow_context(self, tmpdir): + workflow_context = mock.context.simple(str(tmpdir)) + workflow_context.states = [] + workflow_context.exception = None + yield workflow_context + storage.release_sqlite_storage(workflow_context.model) + + +class TestFabricEnvHideGroupsAndRunCommands(object): + + def test_fabric_env_default_override(self): + # first sanity for no override + self._run() + assert self.mock.settings_merged['timeout'] == constants.FABRIC_ENV_DEFAULTS['timeout'] + # now override + invocation_fabric_env = self.default_fabric_env.copy() + timeout = 1000000 + invocation_fabric_env['timeout'] = timeout + self._run(fabric_env=invocation_fabric_env) + assert self.mock.settings_merged['timeout'] == timeout + + def test_implicit_host_string(self, mocker): + expected_host_address = '1.1.1.1' + mocker.patch.object(self._Ctx.task.actor, 'host') + mocker.patch.object(self._Ctx.task.actor.host, 'host_address', expected_host_address) + fabric_env = self.default_fabric_env.copy() + del fabric_env['host_string'] + self._run(fabric_env=fabric_env) + assert self.mock.settings_merged['host_string'] == expected_host_address + + def test_explicit_host_string(self): + fabric_env = self.default_fabric_env.copy() + host_string = 'explicit_host_string' + fabric_env['host_string'] = host_string + self._run(fabric_env=fabric_env) + assert self.mock.settings_merged['host_string'] == host_string + + def test_override_warn_only(self): + fabric_env = self.default_fabric_env.copy() + self._run(fabric_env=fabric_env) + assert self.mock.settings_merged['warn_only'] is True + fabric_env = self.default_fabric_env.copy() + fabric_env['warn_only'] = False + self._run(fabric_env=fabric_env) + assert self.mock.settings_merged['warn_only'] is False + + def test_missing_host_string(self): + with pytest.raises(TaskAbortException) as exc_ctx: + fabric_env = self.default_fabric_env.copy() + del fabric_env['host_string'] + self._run(fabric_env=fabric_env) + assert '`host_string` not supplied' in str(exc_ctx.value) + + def test_missing_user(self): + with pytest.raises(TaskAbortException) as exc_ctx: + fabric_env = self.default_fabric_env.copy() + del fabric_env['user'] + self._run(fabric_env=fabric_env) + assert '`user` not supplied' in str(exc_ctx.value) + + def test_missing_key_or_password(self): + with pytest.raises(TaskAbortException) as exc_ctx: + fabric_env = self.default_fabric_env.copy() + del fabric_env['key_filename'] + self._run(fabric_env=fabric_env) + assert 'Access credentials not supplied' in str(exc_ctx.value) + + def test_hide_in_settings_and_non_viable_groups(self): + groups = ('running', 'stdout') + self._run(hide_output=groups) + assert set(self.mock.settings_merged['hide_output']) == set(groups) + with pytest.raises(TaskAbortException) as exc_ctx: + self._run(hide_output=('running', 'bla')) + assert '`hide_output` must be a subset of' in str(exc_ctx.value) + + def test_run_commands(self): + def test(use_sudo): + commands = ['command1', 'command2'] + self._run( + commands=commands, + use_sudo=use_sudo) + assert all(item in self.mock.settings_merged.items() for + item in self.default_fabric_env.items()) + assert self.mock.settings_merged['warn_only'] is True + assert self.mock.settings_merged['use_sudo'] == use_sudo + assert self.mock.commands == commands + self.mock.settings_merged = {} + self.mock.commands = [] + test(use_sudo=False) + test(use_sudo=True) + + def test_failed_command(self): + with pytest.raises(ProcessException) as exc_ctx: + self._run(commands=['fail']) + exception = exc_ctx.value + assert exception.stdout == self.MockCommandResult.stdout + assert exception.stderr == self.MockCommandResult.stderr + assert exception.command == self.MockCommandResult.command + assert exception.exit_code == self.MockCommandResult.return_code + + class MockCommandResult(object): + stdout = 'mock_stdout' + stderr = 'mock_stderr' + command = 'mock_command' + return_code = 1 + + def __init__(self, failed): + self.failed = failed + + class MockFabricApi(object): + + def __init__(self): + self.commands = [] + self.settings_merged = {} + + @contextlib.contextmanager + def settings(self, *args, **kwargs): + self.settings_merged.update(kwargs) + if args: + groups = args[0] + self.settings_merged.update({'hide_output': groups}) + yield + + def run(self, command): + self.commands.append(command) + self.settings_merged['use_sudo'] = False + return TestFabricEnvHideGroupsAndRunCommands.MockCommandResult(command == 'fail') + + def sudo(self, command): + self.commands.append(command) + self.settings_merged['use_sudo'] = True + return TestFabricEnvHideGroupsAndRunCommands.MockCommandResult(command == 'fail') + + def hide(self, *groups): + return groups + + def exists(self, *args, **kwargs): + raise RuntimeError + + class _Ctx(object): + INSTRUMENTATION_FIELDS = () + + class Task(object): + @staticmethod + def abort(message=None): + models.Task.abort(message) + actor = None + + class Actor(object): + host = None + + class Model(object): + @contextlib.contextmanager + def instrument(self, *args, **kwargs): + yield + task = Task + task.actor = Actor + model = Model() + logger = logging.getLogger() + + @staticmethod + @contextlib.contextmanager + def _mock_self_logging(*args, **kwargs): + yield + _Ctx.logging_handlers = _mock_self_logging + + @pytest.fixture(autouse=True) + def _setup(self, mocker): + self.default_fabric_env = { + 'host_string': 'test', + 'user': 'test', + 'key_filename': 'test', + } + self.mock = self.MockFabricApi() + mocker.patch('fabric.api', self.mock) + + def _run(self, + commands=(), + fabric_env=None, + process=None, + use_sudo=False, + hide_output=None): + operations.run_commands_with_ssh( + ctx=self._Ctx, + commands=commands, + process=process, + fabric_env=fabric_env or self.default_fabric_env, + use_sudo=use_sudo, + hide_output=hide_output) + + +class TestUtilityFunctions(object): + + def test_paths(self): + base_dir = '/path' + local_script_path = '/local/script/path.py' + paths = ssh_operations._Paths(base_dir=base_dir, + local_script_path=local_script_path) + assert paths.local_script_path == local_script_path + assert paths.remote_ctx_dir == base_dir + assert paths.base_script_path == 'path.py' + assert paths.remote_ctx_path == '/path/ctx' + assert paths.remote_scripts_dir == '/path/scripts' + assert paths.remote_work_dir == '/path/work' + assert paths.remote_env_script_path.startswith('/path/scripts/env-path.py-') + assert paths.remote_script_path.startswith('/path/scripts/path.py-') + + def test_write_environment_script_file(self): + base_dir = '/path' + local_script_path = '/local/script/path.py' + paths = ssh_operations._Paths(base_dir=base_dir, + local_script_path=local_script_path) + env = {'one': "'1'"} + local_socket_url = 'local_socket_url' + remote_socket_url = 'remote_socket_url' + env_script_lines = set([l for l in ssh_operations._write_environment_script_file( + process={'env': env}, + paths=paths, + local_socket_url=local_socket_url, + remote_socket_url=remote_socket_url + ).getvalue().split('\n') if l]) + expected_env_script_lines = set([ + 'export PATH=/path:$PATH', + 'export PYTHONPATH=/path:$PYTHONPATH', + 'chmod +x /path/ctx', + 'chmod +x {0}'.format(paths.remote_script_path), + 'export CTX_SOCKET_URL={0}'.format(remote_socket_url), + 'export LOCAL_CTX_SOCKET_URL={0}'.format(local_socket_url), + 'export one=\'1\'' + ]) + assert env_script_lines == expected_env_script_lines diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/.pylintrc b/azure/aria/aria-extension-cloudify/src/aria/tests/.pylintrc new file mode 100644 index 0000000..0352dd3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/.pylintrc @@ -0,0 +1,422 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +[MASTER] + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=.git + +# Add files or directories matching the regex patterns to the blacklist. The +# regex matches against base names, not paths. +ignore-patterns= + +# Pickle collected data for later comparisons. +persistent=yes + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Use multiple processes to speed up Pylint. +jobs=4 + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +extension-pkg-whitelist= + +# Allow optimization of some AST trees. This will activate a peephole AST +# optimizer, which will apply various small optimizations. For instance, it can +# be used to obtain the result of joining multiple strings with the addition +# operator. Joining a lot of strings can lead to a maximum recursion error in +# Pylint and this flag can prevent that. It has one side effect, the resulting +# AST will be different than the one from reality. This option is deprecated +# and it will be removed in Pylint 2.0. +optimize-ast=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +#enable= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +disable=import-star-module-level,old-octal-literal,oct-method,print-statement,unpacking-in-except,parameter-unpacking,backtick,old-raise-syntax,old-ne-operator,long-suffix,dict-view-method,dict-iter-method,metaclass-assignment,next-method-called,raising-string,indexing-exception,raw_input-builtin,long-builtin,file-builtin,execfile-builtin,coerce-builtin,cmp-builtin,buffer-builtin,basestring-builtin,apply-builtin,filter-builtin-not-iterating,using-cmp-argument,useless-suppression,range-builtin-not-iterating,suppressed-message,no-absolute-import,old-division,cmp-method,reload-builtin,zip-builtin-not-iterating,intern-builtin,unichr-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,input-builtin,round-builtin,hex-method,nonzero-method,map-builtin-not-iterating,redefined-builtin,no-self-use,missing-docstring,attribute-defined-outside-init,redefined-outer-name,import-error,redefined-variable-type,broad-except,protected-access,global-statement,too-many-locals,abstract-method,no-member,unused-argument + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=colorized + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". This option is deprecated +# and it will be removed in Pylint 2.0. +files-output=no + +# Tells whether to display a full report or only the messages +reports=yes + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=(_+[a-zA-Z0-9]*?$)|dummy|args|kwargs + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_,_cb + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,future.builtins + + +[SPELLING] + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging + + +[BASIC] + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,v,f,ex,e,_,id + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +property-classes=abc.abstractproperty + +# Regular expression matching correct function names +function-rgx=[a-z_][a-z0-9_]*$ + +# Naming hint for function names +function-name-hint=[a-z_][a-z0-9_]*$ + +# Regular expression matching correct variable names +variable-rgx=[a-z_][a-z0-9_]*$ + +# Naming hint for variable names +variable-name-hint=[a-z_][a-z0-9_]*$ + +# Regular expression matching correct constant names +const-rgx=(([A-Za-z_][A-Za-z0-9_]*)|(__.*__))$ + +# Naming hint for constant names +const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression matching correct attribute names +attr-rgx=[a-z_][a-z0-9_]*$ + +# Naming hint for attribute names +attr-name-hint=[a-z_][a-z0-9_]*$ + +# Regular expression matching correct argument names +argument-rgx=[a-z_][a-z0-9_]*$ + +# Naming hint for argument names +argument-name-hint=[a-z_][a-z0-9_]*$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]*|(__.*__))$ + +# Naming hint for class attribute names +class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]*|(__.*__))$ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Naming hint for inline iteration names +inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ + +# Regular expression matching correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Naming hint for class names +class-name-hint=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression matching correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Naming hint for module names +module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression matching correct method names +method-rgx=[a-z_][a-z0-9_]*$ + +# Naming hint for method names +method-name-hint=[a-z_][a-z0-9_]*$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + + +[ELIF] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=100 + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + +# List of optional constructs for which whitespace checking is disabled. `dict- +# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. +# `trailing-comma` allows a space between comma and closing bracket: (a, ). +# `empty-line` allows space-only lines. +no-space-check=trailing-comma,dict-separator + +# Maximum number of lines in a module +max-module-lines=1500 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict,_fields,_replace,_source,_make + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=15 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of locals for function / method body +max-locals=30 + +# Maximum number of return / yield for function / method body +max-returns=10 + +# Maximum number of branch for function / method body +max-branches=15 + +# Maximum number of statements in function / method body +max-statements=50 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=25 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=0 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=50 + +# Maximum number of boolean expressions in a if statement +max-bool-expr=5 + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=Exception + + +[pre-commit-hook] +limit=9.5 diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/__init__.py new file mode 100644 index 0000000..ace30c8 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/__init__.py @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 . import storage, mock + +ROOT_DIR = os.path.dirname(os.path.dirname(__file__)) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/cli/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/__init__.py new file mode 100644 index 0000000..ae1e83e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/__init__.py @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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/azure/aria/aria-extension-cloudify/src/aria/tests/cli/base_test.py b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/base_test.py new file mode 100644 index 0000000..da9d72c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/base_test.py @@ -0,0 +1,77 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 StringIO import StringIO + +import pytest + +from . import runner +from . import utils + + +@pytest.fixture +def mock_storage(): + return utils.MockStorage() + + +@pytest.mark.usefixtures("redirect_logger") +class TestCliBase(object): + + @staticmethod + @pytest.fixture(scope="class") + def redirect_logger(): + + utils.setup_logger(logger_name='aria.cli.main', + handlers=[logging.StreamHandler(TestCliBase._logger_output)], + logger_format='%(message)s') + yield + utils.setup_logger(logger_name='aria.cli.main', + handlers=_default_logger_config['handlers'], + level=_default_logger_config['level']) + + _logger_output = StringIO() + + def invoke(self, command): + self._logger_output.truncate(0) + return runner.invoke(command) + + @property + def logger_output_string(self): + return self._logger_output.getvalue() + + +def assert_exception_raised(outcome, expected_exception, expected_msg=''): + assert isinstance(outcome.exception, expected_exception) + assert expected_msg in str(outcome.exception) + + +# This exists as I wanted to mocked a function using monkeypatch to return a function that raises an +# exception. I tried doing that using a lambda in-place, but this can't be accomplished in a trivial +# way it seems. So I wrote this silly function instead +def raise_exception(exception, msg=''): + + def inner(*args, **kwargs): + raise exception(msg) + + return inner + + +def get_default_logger_config(): + logger = logging.getLogger('aria.cli.main') + return {'handlers': logger.handlers, + 'level': logger.level} + +_default_logger_config = get_default_logger_config() diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/cli/runner.py b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/runner.py new file mode 100644 index 0000000..7e4243b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/runner.py @@ -0,0 +1,27 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 click.testing + +import aria.cli.commands as commands + + +def invoke(command_string): + command_list = command_string.split() + command, sub, args = command_list[0], command_list[1], command_list[2:] + runner = click.testing.CliRunner() + outcome = runner.invoke(getattr( + getattr(commands, command), sub), args) + return outcome diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_node_templates.py b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_node_templates.py new file mode 100644 index 0000000..ff7ff28 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_node_templates.py @@ -0,0 +1,133 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest +from mock import ANY, MagicMock + +from aria.cli.env import _Environment + +from .base_test import ( # pylint: disable=unused-import + TestCliBase, + mock_storage +) +from ..mock import models as mock_models + + +class TestNodeTemplatesShow(TestCliBase): + + def test_header_strings(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('node_templates show 1') + assert 'Showing node template 1' in self.logger_output_string + assert 'Node template properties:' in self.logger_output_string + assert 'Nodes:' in self.logger_output_string + + def test_no_properties_no_nodes(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('node_templates show 1') + + assert 'No properties' in self.logger_output_string + assert 'prop1' not in self.logger_output_string + assert 'value1' not in self.logger_output_string + assert 'No nodes' in self.logger_output_string + assert mock_models.NODE_NAME not in self.logger_output_string + + def test_one_property_no_nodes(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + m = MagicMock(return_value=mock_models.create_node_template_with_dependencies( + include_property=True)) + monkeypatch.setattr(mock_storage.node_template, 'get', m) + self.invoke('node_templates show 2') + assert 'No properties' not in self.logger_output_string + assert 'prop1' in self.logger_output_string and 'value1' in self.logger_output_string + assert 'No nodes' in self.logger_output_string + assert mock_models.NODE_NAME not in self.logger_output_string + + def test_no_properties_one_node(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + m = MagicMock(return_value=mock_models.create_node_template_with_dependencies( + include_node=True)) + monkeypatch.setattr(mock_storage.node_template, 'get', m) + self.invoke('node_templates show 3') + assert 'No properties' in self.logger_output_string + assert 'prop1' not in self.logger_output_string + assert 'value1' not in self.logger_output_string + assert 'No nodes' not in self.logger_output_string + assert mock_models.NODE_NAME in self.logger_output_string + + def test_one_property_one_node(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + m = MagicMock(return_value=mock_models.create_node_template_with_dependencies( + include_node=True, include_property=True)) + monkeypatch.setattr(mock_storage.node_template, 'get', m) + self.invoke('node_templates show 4') + assert 'No properties' not in self.logger_output_string + assert 'prop1' in self.logger_output_string and 'value1' in self.logger_output_string + assert 'No nodes' not in self.logger_output_string + assert mock_models.NODE_NAME in self.logger_output_string + + +class TestNodeTemplatesList(TestCliBase): + + @pytest.mark.parametrize('sort_by, order, sort_by_in_output, order_in_output', [ + ('', '', 'service_template_name', 'asc'), + ('', ' --descending', 'service_template_name', 'desc'), + (' --sort-by name', '', 'name', 'asc'), + (' --sort-by name', ' --descending', 'name', 'desc') + ]) + def test_list_specified_service_template(self, monkeypatch, mock_storage, sort_by, order, + sort_by_in_output, order_in_output): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('node_templates list -t {service_template_name}{sort_by}{order}' + .format(service_template_name=mock_models.SERVICE_TEMPLATE_NAME, + sort_by=sort_by, + order=order)) + assert 'Listing node templates for service template {name}...'\ + .format(name=mock_models.SERVICE_TEMPLATE_NAME) in self.logger_output_string + assert 'Listing all node templates...' not in self.logger_output_string + + node_templates_list = mock_storage.node_template.list + node_templates_list.assert_called_once_with(sort={sort_by_in_output: order_in_output}, + filters={'service_template': ANY}) + assert 'Node templates:' in self.logger_output_string + assert mock_models.SERVICE_TEMPLATE_NAME in self.logger_output_string + assert mock_models.NODE_TEMPLATE_NAME in self.logger_output_string + + @pytest.mark.parametrize('sort_by, order, sort_by_in_output, order_in_output', [ + ('', '', 'service_template_name', 'asc'), + ('', ' --descending', 'service_template_name', 'desc'), + (' --sort-by name', '', 'name', 'asc'), + (' --sort-by name', ' --descending', 'name', 'desc') + ]) + def test_list_no_specified_service_template(self, monkeypatch, mock_storage, sort_by, order, + sort_by_in_output, order_in_output): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('node_templates list{sort_by}{order}'.format(sort_by=sort_by, order=order)) + assert 'Listing all node templates...' in self.logger_output_string + assert 'Listing node templates for service template {name}...'\ + .format(name=mock_models.SERVICE_TEMPLATE_NAME) not in self.logger_output_string + + node_templates_list = mock_storage.node_template.list + node_templates_list.assert_called_once_with(sort={sort_by_in_output: order_in_output}, + filters={}) + assert 'Node templates:' in self.logger_output_string + assert mock_models.SERVICE_TEMPLATE_NAME in self.logger_output_string + assert mock_models.NODE_TEMPLATE_NAME in self.logger_output_string diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_nodes.py b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_nodes.py new file mode 100644 index 0000000..0233989 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_nodes.py @@ -0,0 +1,101 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest +import mock + +from aria.cli.env import _Environment + +from .base_test import ( # pylint: disable=unused-import + TestCliBase, + mock_storage +) +from ..mock import models as mock_models + + +class TestNodesShow(TestCliBase): + + def test_header_strings(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('nodes show 1') + assert 'Showing node 1' in self.logger_output_string + assert 'Node:' in self.logger_output_string + assert 'Node attributes:' in self.logger_output_string + + def test_no_attributes(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('nodes show 2') + assert 'No attributes' in self.logger_output_string + assert 'attribute1' not in self.logger_output_string + assert 'value1' not in self.logger_output_string + + def test_one_attribute(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + m = mock.MagicMock( + return_value=mock_models.create_node_with_dependencies(include_attribute=True)) + monkeypatch.setattr(mock_storage.node, 'get', m) + self.invoke('nodes show 3') + assert 'No attributes' not in self.logger_output_string + assert 'attribute1' in self.logger_output_string + assert 'value1' in self.logger_output_string + + +class TestNodesList(TestCliBase): + + @pytest.mark.parametrize('sort_by, order, sort_by_in_output, order_in_output', [ + ('', '', 'service_name', 'asc'), + ('', ' --descending', 'service_name', 'desc'), + (' --sort-by name', '', 'name', 'asc'), + (' --sort-by name', ' --descending', 'name', 'desc') + ]) + def test_list_specified_service(self, monkeypatch, mock_storage, sort_by, order, + sort_by_in_output, order_in_output): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('nodes list -s test_s{sort_by}{order}'.format(sort_by=sort_by, + order=order)) + assert 'Listing nodes for service test_s...' in self.logger_output_string + assert 'Listing all nodes...' not in self.logger_output_string + + nodes_list = mock_storage.node.list + nodes_list.assert_called_once_with(sort={sort_by_in_output: order_in_output}, + filters={'service': mock.ANY}) + assert 'Nodes:' in self.logger_output_string + assert 'test_s' in self.logger_output_string + assert 'test_n' in self.logger_output_string + + @pytest.mark.parametrize('sort_by, order, sort_by_in_output, order_in_output', [ + ('', '', 'service_name', 'asc'), + ('', ' --descending', 'service_name', 'desc'), + (' --sort-by name', '', 'name', 'asc'), + (' --sort-by name', ' --descending', 'name', 'desc') + ]) + def test_list_no_specified_service(self, monkeypatch, mock_storage, sort_by, order, + sort_by_in_output, order_in_output): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('nodes list{sort_by}{order}'.format(sort_by=sort_by, + order=order)) + assert 'Listing nodes for service test_s...' not in self.logger_output_string + assert 'Listing all nodes...' in self.logger_output_string + + nodes_list = mock_storage.node.list + nodes_list.assert_called_once_with(sort={sort_by_in_output: order_in_output}, + filters={}) + assert 'Nodes:' in self.logger_output_string + assert 'test_s' in self.logger_output_string + assert 'test_n' in self.logger_output_string diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_service_templates.py b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_service_templates.py new file mode 100644 index 0000000..cc0150e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_service_templates.py @@ -0,0 +1,273 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 zipfile + +import pytest +import mock + +from aria.cli import service_template_utils, csar +from aria.cli.env import _Environment +from aria.core import Core +from aria.exceptions import AriaException +from aria.storage import exceptions as storage_exceptions + +from .base_test import ( # pylint: disable=unused-import + TestCliBase, + assert_exception_raised, + raise_exception, + mock_storage +) +from ..mock import models as mock_models + + +class TestServiceTemplatesShow(TestCliBase): + + def test_header_string(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('service_templates show test_st') + assert 'Showing service template test_st...' in self.logger_output_string + + def test_no_services_no_description(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('service_templates show test_st') + + assert 'Description:' not in self.logger_output_string + assert 'Existing services:' not in self.logger_output_string + + def test_no_services_yes_description(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + st = mock_models.create_service_template(description='test_description') + monkeypatch.setattr(mock_storage.service_template, 'get_by_name', + mock.MagicMock(return_value=st)) + + self.invoke('service_templates show test_st') + assert 'Description:' in self.logger_output_string + assert 'test_description' in self.logger_output_string + assert 'Existing services:' not in self.logger_output_string + + def test_one_service_no_description(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + st = mock_models.create_service_template() + s = mock_models.create_service(st) + st.services = {s.name: s} + monkeypatch.setattr(mock_storage.service_template, 'get_by_name', + mock.MagicMock(return_value=st)) + + self.invoke('service_templates show test_st') + + assert 'Description:' not in self.logger_output_string + assert 'Existing services:' in self.logger_output_string + assert mock_models.SERVICE_NAME in self.logger_output_string + + def test_one_service_yes_description(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + st = mock_models.create_service_template(description='test_description') + s = mock_models.create_service(st) + st.services = {s.name: s} + monkeypatch.setattr(mock_storage.service_template, 'get_by_name', + mock.MagicMock(return_value=st)) + + self.invoke('service_templates show test_st') + + assert 'Description:' in self.logger_output_string + assert 'test_description' in self.logger_output_string + assert 'Existing services:' in self.logger_output_string + assert 'test_s' in self.logger_output_string + + +class TestServiceTemplatesList(TestCliBase): + + def test_header_string(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('service_templates list') + assert 'Listing all service templates...' in self.logger_output_string + + @pytest.mark.parametrize('sort_by, order, sort_by_in_output, order_in_output', [ + ('', '', 'created_at', 'asc'), + ('', ' --descending', 'created_at', 'desc'), + (' --sort-by name', '', 'name', 'asc'), + (' --sort-by name', ' --descending', 'name', 'desc') + ]) + def test_all_sorting_combinations(self, monkeypatch, mock_storage, sort_by, order, + sort_by_in_output, order_in_output): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('service_templates list{sort_by}{order}'.format(sort_by=sort_by, order=order)) + + mock_storage.service_template.list.assert_called_with( + sort={sort_by_in_output: order_in_output}) + assert mock_models.SERVICE_TEMPLATE_NAME in self.logger_output_string + + +class TestServiceTemplatesStore(TestCliBase): + + def test_header_string(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('service_templates store stubpath test_st') + assert 'Storing service template test_st...' in self.logger_output_string + + def test_store_no_exception(self, monkeypatch, mock_object): + + monkeypatch.setattr(Core, 'create_service_template', mock_object) + monkeypatch.setattr(service_template_utils, 'get', mock_object) + monkeypatch.setattr(os.path, 'dirname', mock_object) + self.invoke('service_templates store stubpath {name}'.format( + name=mock_models.SERVICE_TEMPLATE_NAME)) + assert 'Service template {name} stored'.format( + name=mock_models.SERVICE_TEMPLATE_NAME) in self.logger_output_string + + def test_store_relative_path_single_yaml_file(self, monkeypatch, mock_object): + monkeypatch.setattr(Core, 'create_service_template', mock_object) + monkeypatch.setattr(os.path, 'isfile', lambda x: True) + monkeypatch.setattr(service_template_utils, '_is_archive', lambda x: False) + + self.invoke('service_templates store service_template.yaml {name}'.format( + name=mock_models.SERVICE_TEMPLATE_NAME)) + + mock_object.assert_called_with(os.path.join(os.getcwd(), 'service_template.yaml'), + mock.ANY, + mock.ANY) + + def test_store_raises_exception_resulting_from_name_uniqueness(self, monkeypatch, mock_object): + + monkeypatch.setattr(service_template_utils, 'get', mock_object) + monkeypatch.setattr(Core, + 'create_service_template', + raise_exception(storage_exceptions.NotFoundError, + msg='UNIQUE constraint failed')) + monkeypatch.setattr(os.path, 'dirname', mock_object) + + assert_exception_raised( + self.invoke('service_templates store stubpath test_st'), + expected_exception=storage_exceptions.NotFoundError, + expected_msg='There already a exists a service template with the same name') + + def test_store_raises_exception(self, monkeypatch, mock_object): + + monkeypatch.setattr(service_template_utils, 'get', mock_object) + monkeypatch.setattr(Core, + 'create_service_template', + raise_exception(storage_exceptions.NotFoundError)) + monkeypatch.setattr(os.path, 'dirname', mock_object) + + assert_exception_raised( + self.invoke('service_templates store stubpath test_st'), + expected_exception=storage_exceptions.StorageError) + + +class TestServiceTemplatesDelete(TestCliBase): + + def test_header_string(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('service_templates delete test_st') + assert 'Deleting service template test_st...' in self.logger_output_string + + def test_delete_no_exception(self, monkeypatch, mock_object): + + monkeypatch.setattr(_Environment, 'model_storage', mock_object) + monkeypatch.setattr(Core, 'delete_service_template', mock_object) + self.invoke('service_templates delete {name}'.format( + name=mock_models.SERVICE_TEMPLATE_NAME)) + assert 'Service template {name} deleted'.format( + name=mock_models.SERVICE_TEMPLATE_NAME) in self.logger_output_string + + def test_delete_raises_exception(self, monkeypatch, mock_object): + + monkeypatch.setattr(_Environment, 'model_storage', mock_object) + monkeypatch.setattr(Core, + 'delete_service_template', + raise_exception(storage_exceptions.StorageError)) + + assert_exception_raised( + self.invoke('service_templates delete test_st'), + expected_exception=storage_exceptions.StorageError, + expected_msg='') + + +class TestServiceTemplatesInputs(TestCliBase): + + def test_header_string(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('service_templates inputs test_st') + assert 'Showing inputs for service template test_st...' in self.logger_output_string + + def test_inputs_existing_inputs(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + input = mock_models.create_input(name='input1', value='value1') + st = mock_models.create_service_template(inputs={'input1': input}) + monkeypatch.setattr(mock_storage.service_template, 'get_by_name', + mock.MagicMock(return_value=st)) + + self.invoke('service_templates inputs with_inputs') + assert 'input1' in self.logger_output_string and 'value1' in self.logger_output_string + + def test_inputs_no_inputs(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('service_templates inputs without_inputs') + assert 'No inputs' in self.logger_output_string + + +class TestServiceTemplatesValidate(TestCliBase): + + def test_header_string(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('service_templates validate stubpath') + assert 'Validating service template: stubpath' in self.logger_output_string + + def test_validate_no_exception(self, monkeypatch, mock_object): + monkeypatch.setattr(Core, 'validate_service_template', mock_object) + monkeypatch.setattr(service_template_utils, 'get', mock_object) + self.invoke('service_templates validate stubpath') + assert 'Service template validated successfully' in self.logger_output_string + + def test_validate_raises_exception(self, monkeypatch, mock_object): + monkeypatch.setattr(Core, 'validate_service_template', raise_exception(AriaException)) + monkeypatch.setattr(service_template_utils, 'get', mock_object) + assert_exception_raised( + self.invoke('service_templates validate stubpath'), + expected_exception=AriaException) + + +class TestServiceTemplatesCreateArchive(TestCliBase): + + def test_header_string(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('service_templates create_archive stubpath stubdest') + assert 'Creating a CSAR archive' in self.logger_output_string + + def test_create_archive_successful(self, monkeypatch, mock_object): + monkeypatch.setattr(csar, 'write', mock_object) + self.invoke('service_templates create_archive stubpath stubdest') + assert 'CSAR archive created at stubdest' in self.logger_output_string + + def test_create_archive_from_relative_path(self, monkeypatch, mock_object): + + monkeypatch.setattr(os.path, 'isfile', mock_object) + monkeypatch.setattr(zipfile, 'ZipFile', mock.MagicMock) + + self.invoke('service_templates create_archive archive stubdest') + mock_object.assert_called_with(os.path.join(os.getcwd(), 'archive')) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_services.py b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_services.py new file mode 100644 index 0000000..7dc84bc --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/test_services.py @@ -0,0 +1,227 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest +import mock + +from aria.cli.env import _Environment +from aria.core import Core +from aria.exceptions import DependentActiveExecutionsError, DependentAvailableNodesError +from aria.modeling.exceptions import ParameterException +from aria.storage import exceptions as storage_exceptions + +from .base_test import ( # pylint: disable=unused-import + TestCliBase, + raise_exception, + assert_exception_raised, + mock_storage +) +from ..mock import models as mock_models + + +class TestServicesList(TestCliBase): + + @pytest.mark.parametrize('sort_by, order, sort_by_in_output, order_in_output', [ + ('', '', 'created_at', 'asc'), + ('', ' --descending', 'created_at', 'desc'), + (' --sort-by name', '', 'name', 'asc'), + (' --sort-by name', ' --descending', 'name', 'desc') + ]) + def test_no_specified_service_template(self, monkeypatch, mock_storage, sort_by, order, + sort_by_in_output, order_in_output): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('services list{sort_by}{order}'.format(sort_by=sort_by, order=order)) + assert 'Listing all services...' in self.logger_output_string + assert 'Listing services for service template' not in self.logger_output_string + + mock_storage.service.list.assert_called_once_with(sort={sort_by_in_output: order_in_output}, + filters={}) + assert 'Services:' in self.logger_output_string + assert mock_models.SERVICE_TEMPLATE_NAME in self.logger_output_string + assert mock_models.SERVICE_NAME in self.logger_output_string + + @pytest.mark.parametrize('sort_by, order, sort_by_in_output, order_in_output', [ + ('', '', 'created_at', 'asc'), + ('', ' --descending', 'created_at', 'desc'), + (' --sort-by name', '', 'name', 'asc'), + (' --sort-by name', ' --descending', 'name', 'desc') + ]) + def test_specified_service_template(self, monkeypatch, mock_storage, sort_by, order, + sort_by_in_output, order_in_output): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('services list -t test_st{sort_by}{order}'.format(sort_by=sort_by, order=order)) + assert 'Listing services for service template test_st...' in self.logger_output_string + assert 'Listing all services...' not in self.logger_output_string + + mock_storage.service.list.assert_called_once_with(sort={sort_by_in_output: order_in_output}, + filters={'service_template': mock.ANY}) + assert 'Services:' in self.logger_output_string + assert mock_models.SERVICE_TEMPLATE_NAME in self.logger_output_string + assert mock_models.SERVICE_NAME in self.logger_output_string + + +class TestServicesCreate(TestCliBase): + + def test_header_string(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('services create -t test_st test_s') + assert 'Creating new service from service template test_st...' in self.logger_output_string + + def test_no_exception(self, monkeypatch, mock_storage): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + + m = mock.MagicMock(return_value=mock_models.create_service_with_dependencies()) + monkeypatch.setattr(Core, 'create_service', m) + self.invoke('services create -t test_st test_s') + assert "Service created. The service's name is test_s" in self.logger_output_string + + def test_raises_storage_error_resulting_from_name_uniqueness(self, monkeypatch, + mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + monkeypatch.setattr(Core, + 'create_service', + raise_exception(storage_exceptions.NotFoundError, + msg='UNIQUE constraint failed')) + assert_exception_raised( + self.invoke('services create -t test_st test_s'), + expected_exception=storage_exceptions.NotFoundError, + expected_msg='There already a exists a service with the same name') + + assert "Service created. The service's name is test_s" not in self.logger_output_string + + def test_raises_other_storage_error(self, monkeypatch, mock_object): + monkeypatch.setattr(_Environment, 'model_storage', mock_object) + monkeypatch.setattr(Core, + 'create_service', + raise_exception(storage_exceptions.NotFoundError)) + + assert_exception_raised( + self.invoke('services create -t test_st test_s'), + expected_exception=storage_exceptions.NotFoundError) + + assert "Service created. The service's name is test_s" not in self.logger_output_string + + def test_raises_inputs_exception(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + monkeypatch.setattr(Core, + 'create_service', + raise_exception(ParameterException)) + + assert_exception_raised( + self.invoke('services create -t with_inputs test_s'), + expected_exception=ParameterException) + + assert "Service created. The service's name is test_s" not in self.logger_output_string + + +class TestServicesDelete(TestCliBase): + + def test_header_string(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('services delete test_s') + assert 'Deleting service test_s...' in self.logger_output_string + + def test_delete_no_exception(self, monkeypatch, mock_storage, mock_object): + + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + monkeypatch.setattr(Core, 'delete_service', mock_object) + self.invoke('services delete test_s') + assert 'Service test_s deleted' in self.logger_output_string + + def test_delete_active_execution_error(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + mock_service_with_execution = \ + mock.MagicMock(return_value=mock_models.create_service_with_dependencies( + include_execution=True)) + monkeypatch.setattr(mock_storage.service, 'get', mock_service_with_execution) + assert_exception_raised( + self.invoke('services delete test_s'), + expected_exception=DependentActiveExecutionsError, + expected_msg="Can't delete service `{name}` - there is an active execution " + "for this service. Active execution ID: 1".format( + name=mock_models.SERVICE_NAME)) + + def test_delete_available_nodes_error(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + assert_exception_raised( + self.invoke('services delete test_s'), + expected_exception=DependentAvailableNodesError, + expected_msg="Can't delete service `{name}` - there are available nodes " + "for this service. Available node IDs: 1".format( + name=mock_models.SERVICE_NAME)) + + def test_delete_available_nodes_error_with_force(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('services delete service_with_available_nodes --force') + + assert mock_storage.service.delete.call_count == 1 + assert 'Service service_with_available_nodes deleted' in self.logger_output_string + + +class TestServicesOutputs(TestCliBase): + + def test_header_string(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('services outputs test_s') + assert 'Showing outputs for service test_s...' in self.logger_output_string + + def test_outputs_no_outputs(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('services outputs service_with_no_outputs') + + assert 'No outputs' in self.logger_output_string + assert 'output1' not in self.logger_output_string + assert 'value1' not in self.logger_output_string + + def test_outputs_one_output(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + s = mock_models.create_service_with_dependencies(include_output=True) + monkeypatch.setattr(mock_storage.service, 'get_by_name', mock.MagicMock(return_value=s)) + + self.invoke('services outputs test_s') + + assert 'output1' in self.logger_output_string + assert 'value1' in self.logger_output_string + assert 'No outputs' not in self.logger_output_string + + +class TestServicesInputs(TestCliBase): + + def test_header_string(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('services inputs test_s') + assert 'Showing inputs for service test_s...' in self.logger_output_string + + def test_inputs_no_inputs(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + self.invoke('services inputs service_with_no_inputs') + + assert 'No inputs' in self.logger_output_string + assert 'input1' not in self.logger_output_string + assert 'value1' not in self.logger_output_string + + def test_inputs_one_input(self, monkeypatch, mock_storage): + monkeypatch.setattr(_Environment, 'model_storage', mock_storage) + s = mock_models.create_service_with_dependencies(include_input=True) + monkeypatch.setattr(mock_storage.service, 'get_by_name', mock.MagicMock(return_value=s)) + + self.invoke('services inputs test_s') + + assert 'input1' in self.logger_output_string + assert 'value1' in self.logger_output_string + assert 'No inputs' not in self.logger_output_string diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/cli/utils.py b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/utils.py new file mode 100644 index 0000000..a1e0c9a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/cli/utils.py @@ -0,0 +1,101 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 mock import MagicMock + +from ..mock import models as mock_models + + +def setup_logger(logger_name, + level=logging.INFO, + handlers=None, + remove_existing_handlers=True, + logger_format=None, + propagate=True): + """ + :param logger_name: Name of the logger. + :param level: Level for the logger (not for specific handler). + :param handlers: An optional list of handlers (formatter will be + overridden); If None, only a StreamHandler for + sys.stdout will be used. + :param remove_existing_handlers: Determines whether to remove existing + handlers before adding new ones + :param logger_format: the format this logger will have. + :param propagate: propagate the message the parent logger. + :return: A logger instance. + :rtype: logging.Logger + """ + + logger = logging.getLogger(logger_name) + + if remove_existing_handlers: + for handler in logger.handlers: + logger.removeHandler(handler) + + for handler in handlers: + if logger_format: + formatter = logging.Formatter(fmt=logger_format) + handler.setFormatter(formatter) + logger.addHandler(handler) + + logger.setLevel(level) + if not propagate: + logger.propagate = False + + return logger + + +class MockStorage(object): + + def __init__(self): + self.service_template = MockServiceTemplateStorage() + self.service = MockServiceStorage() + self.node_template = MockNodeTemplateStorage() + self.node = MockNodeStorage() + + +class MockServiceTemplateStorage(object): + + def __init__(self): + self.list = MagicMock(return_value=[mock_models.create_service_template()]) + self.get_by_name = MagicMock(return_value=mock_models.create_service_template()) + + +class MockServiceStorage(object): + + def __init__(self): + + self.s = mock_models.create_service_with_dependencies() + + self.list = MagicMock(return_value=[self.s]) + self.create = MagicMock(return_value=self.s) + self.get = MagicMock( + return_value=mock_models.create_service_with_dependencies(include_node=True)) + self.get_by_name = MagicMock(return_value=self.s) + self.delete = MagicMock() + + +class MockNodeTemplateStorage(object): + def __init__(self): + self.get = MagicMock(return_value=mock_models.create_node_template_with_dependencies()) + self.list = MagicMock(return_value=[mock_models.create_node_template_with_dependencies()]) + + +class MockNodeStorage(object): + def __init__(self): + self.get = MagicMock(return_value=mock_models.create_node_with_dependencies()) + self.list = MagicMock(return_value=[mock_models.create_node_with_dependencies()]) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/conftest.py b/azure/aria/aria-extension-cloudify/src/aria/tests/conftest.py new file mode 100644 index 0000000..8f2c273 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/conftest.py @@ -0,0 +1,47 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +import aria +from aria import logger + + +@pytest.fixture(scope='session', autouse=True) +def install_aria_extensions(): + aria.install_aria_extensions() + + +@pytest.fixture(autouse=True) +def logging_handler_cleanup(request): + """ + Each time a test runs, the loggers do not clear. we need to manually clear them or we'd have + logging overload. + + Since every type of logger (node/relationship/workflow) share the same name, we should + clear the logger each test. This should not happen in real world use. + :param request: + :return: + """ + def clear_logging_handlers(): + logging.getLogger(logger.TASK_LOGGER_NAME).handlers = [] + request.addfinalizer(clear_logging_handlers) + + +@pytest.fixture +def mock_object(mocker): + return mocker.MagicMock() diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/end2end/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/end2end/__init__.py new file mode 100644 index 0000000..ae1e83e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/end2end/__init__.py @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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/azure/aria/aria-extension-cloudify/src/aria/tests/end2end/test_hello_world.py b/azure/aria/aria-extension-cloudify/src/aria/tests/end2end/test_hello_world.py new file mode 100644 index 0000000..094ffc3 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/end2end/test_hello_world.py @@ -0,0 +1,61 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 requests + +from .testenv import testenv # pylint: disable=unused-import +from .. import helpers + + +def test_hello_world(testenv): + hello_world_template_uri = helpers.get_example_uri('hello-world', 'hello-world.yaml') + service_name = testenv.install_service(hello_world_template_uri) + + try: + _verify_deployed_service_in_storage(service_name, testenv.model_storage) + _verify_webserver_up('http://localhost:9090') + finally: + # Even if some assertions failed, attempt to execute uninstall so the + # webserver process doesn't stay up once the test is finished + testenv.uninstall_service() + + _verify_webserver_down('http://localhost:9090') + testenv.verify_clean_storage() + + +def _verify_webserver_up(http_endpoint): + server_response = requests.get(http_endpoint, timeout=10) + assert server_response.status_code == 200 + + +def _verify_webserver_down(http_endpoint): + try: + requests.get(http_endpoint, timeout=10) + assert False + except requests.exceptions.ConnectionError: + pass + + +def _verify_deployed_service_in_storage(service_name, model_storage): + service_templates = model_storage.service_template.list() + assert len(service_templates) == 1 + assert len(service_templates[0].services) == 1 + service = service_templates[0].services[service_name] + assert service.name == service_name + assert len(service.executions) == 1 + assert len(service.nodes) == 2 + assert service.outputs['port'].value == 9090 + assert all(node.state == node.STARTED for node in service.nodes.itervalues()) + assert len(service.executions[0].logs) > 0 diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/end2end/test_nodecellar.py b/azure/aria/aria-extension-cloudify/src/aria/tests/end2end/test_nodecellar.py new file mode 100644 index 0000000..e8cfa84 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/end2end/test_nodecellar.py @@ -0,0 +1,42 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 .testenv import testenv # pylint: disable=unused-import +from .. import helpers + + +def test_nodecellar(testenv): + nodecellar_template_uri = helpers.get_service_template_uri( + 'tosca-simple-1.0', 'node-cellar', 'node-cellar.yaml') + + service_name = testenv.install_service(nodecellar_template_uri, dry=True) + _verify_deployed_service_in_storage(service_name, testenv.model_storage) + + # testing dry execution of custom workflows + testenv.execute_workflow(service_name, 'maintenance_on', dry=True) + testenv.execute_workflow(service_name, 'maintenance_off', dry=True) + + testenv.uninstall_service(dry=True) + testenv.verify_clean_storage() + + +def _verify_deployed_service_in_storage(service_name, model_storage): + service_templates = model_storage.service_template.list() + assert len(service_templates) == 1 + assert len(service_templates[0].services) == 1 + service = service_templates[0].services[service_name] + assert service.name == service_name + assert len(service.executions) == 0 # dry executions leave no traces + assert len(service.nodes) == 15 diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/end2end/testenv.py b/azure/aria/aria-extension-cloudify/src/aria/tests/end2end/testenv.py new file mode 100644 index 0000000..43ec274 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/end2end/testenv.py @@ -0,0 +1,102 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 sys + +import pytest +import sh + + +@pytest.fixture +def testenv(tmpdir, request, monkeypatch): + test_name = request.node.name + workdir = str(tmpdir) + + # Setting the workdir environment variable for the CLI + monkeypatch.setenv('ARIA_WORKDIR', workdir) + return TestEnvironment(workdir, test_name) + + +class TestEnvironment(object): + + def __init__(self, workdir, test_name): + self.workdir = workdir + self.test_name = test_name + + self.cli = self._get_cli() + env = self._get_aria_env() + self.model_storage = env.model_storage + self.resource_storage = env.resource_storage + self.plugin_manager = env.plugin_manager + + def install_service(self, service_template_path, dry=False, service_template_name=None, + service_name=None): + service_template_name = service_template_name or self.test_name + service_name = service_name or self.test_name + + self.cli.service_templates.store(service_template_path, service_template_name) + self.cli.services.create(service_name, service_template_name=service_template_name) + self.execute_workflow(service_name, 'install', dry=dry) + return service_name + + def uninstall_service(self, service_name=None, service_template_name=None, dry=False, + force_service_delete=False): + service_name = service_name or self.test_name + self.execute_workflow(service_name, 'uninstall', dry=dry) + self.cli.services.delete(service_name, force=force_service_delete) + self.cli.service_templates.delete(service_template_name or self.test_name) + + def execute_workflow(self, service_name, workflow_name, dry=False): + self.cli.executions.start(workflow_name, service_name=service_name, dry=dry) + + def verify_clean_storage(self): + assert len(self.model_storage.service_template.list()) == 0 + assert len(self.model_storage.service.list()) == 0 + assert len(self.model_storage.execution.list()) == 0 + assert len(self.model_storage.node_template.list()) == 0 + assert len(self.model_storage.node.list()) == 0 + assert len(self.model_storage.log.list()) == 0 + + def _get_cli(self): + cli = sh.aria.bake('-vvv', _out=sys.stdout, _err=sys.stderr) + + class PatchedCli(object): + """ + The ``sh`` library supports underscore-dash auto-replacement for commands and option + flags yet not for subcommands (e.g. ``aria service-templates``). This class fixes this. + """ + def __getattr__(self, attr): + if '_' in attr: + return cli.bake(attr.replace('_', '-')) + return getattr(cli, attr) + + def __call__(self, *args, **kwargs): + """ + This is to support the ``aria`` command itself (e.g. ``aria --version`` calls). + """ + return cli(*args, **kwargs) + + return PatchedCli() + + def _get_aria_env(self): + """ + A somewhat hacky but most simple way of acquiring environment context such as the model + storage, resource storage, etc. Note that the ``ARIA_WORKDIR`` environment variable must be + exported before the import below is used, as the import itself will initialize the ``.aria`` + directory. + """ + from aria.cli import env as cli_env + reload(cli_env) # reloading the module in-between tests + return cli_env.env diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/fixtures.py b/azure/aria/aria-extension-cloudify/src/aria/tests/fixtures.py new file mode 100644 index 0000000..3b1b9b5 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/fixtures.py @@ -0,0 +1,70 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 shutil + +import pytest + +from aria import ( + application_model_storage, + application_resource_storage +) +from aria.orchestrator import plugin +from aria.storage import ( + sql_mapi, + filesystem_rapi +) + +from . import storage + + +@pytest.fixture +def inmemory_model(): + model = application_model_storage(sql_mapi.SQLAlchemyModelAPI, + initiator=storage.init_inmemory_model_storage) + yield model + storage.release_sqlite_storage(model) + + +@pytest.fixture +def fs_model(tmpdir): + result = application_model_storage(sql_mapi.SQLAlchemyModelAPI, + initiator_kwargs=dict(base_dir=str(tmpdir)), + initiator=sql_mapi.init_storage) + yield result + storage.release_sqlite_storage(result) + + +@pytest.fixture +def resource_storage(tmpdir): + result = tmpdir.join('resources') + result.mkdir() + resource_storage = application_resource_storage( + filesystem_rapi.FileSystemResourceAPI, + api_kwargs=dict(directory=str(result))) + yield resource_storage + shutil.rmtree(str(result)) + + +@pytest.fixture +def plugins_dir(tmpdir): + result = tmpdir.join('plugins') + result.mkdir() + return str(result) + + +@pytest.fixture +def plugin_manager(model, plugins_dir): + return plugin.PluginManager(model=model, plugins_dir=plugins_dir) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/helpers.py b/azure/aria/aria-extension-cloudify/src/aria/tests/helpers.py new file mode 100644 index 0000000..4c3194b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/helpers.py @@ -0,0 +1,82 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 json + +from . import ROOT_DIR +from .resources import DIR as RESOURCES_DIR + + +def get_example_uri(*args): + return os.path.join(ROOT_DIR, 'examples', *args) + + +def get_resource_uri(*args): + return os.path.join(RESOURCES_DIR, *args) + + +def get_service_template_uri(*args): + return os.path.join(RESOURCES_DIR, 'service-templates', *args) + + +class FilesystemDataHolder(object): + + def __init__(self, path, reset=False): + self._path = path + if reset or not os.path.exists(self._path) or open(self._path).read() == '': + self._dump({}) + + def _load(self): + with open(self._path) as f: + return json.load(f) + + def _dump(self, value): + with open(self._path, 'w') as f: + return json.dump(value, f) + + def __contains__(self, item): + return item in self._load() + + def __setitem__(self, key, value): + dict_ = self._load() + dict_[key] = value + self._dump(dict_) + + def __getitem__(self, item): + return self._load()[item] + + def __iter__(self): + return iter(self._load()) + + def get(self, item, default=None): + return self._load().get(item, default) + + def setdefault(self, key, value): + dict_ = self._load() + return_value = dict_.setdefault(key, value) + self._dump(dict_) + return return_value + + def update(self, dict_=None, **kwargs): + current_dict = self._load() + if dict_: + current_dict.update(dict_) + current_dict.update(**kwargs) + self._dump(current_dict) + + @property + def path(self): + return self._path diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/instantiation/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/instantiation/__init__.py new file mode 100644 index 0000000..ae1e83e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/instantiation/__init__.py @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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/azure/aria/aria-extension-cloudify/src/aria/tests/instantiation/test_configuration.py b/azure/aria/aria-extension-cloudify/src/aria/tests/instantiation/test_configuration.py new file mode 100644 index 0000000..6ac0c9c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/instantiation/test_configuration.py @@ -0,0 +1,172 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from tests.parser.service_templates import consume_literal +from aria.modeling.utils import parameters_as_values + + +TEMPLATE = """ +tosca_definitions_version: tosca_simple_yaml_1_0 + +interface_types: + MyInterface: + derived_from: tosca.interfaces.Root + inputs: + interface_string: + type: string + default: value1 + interface_integer: + type: integer + default: 1 + operation: + implementation: operation.sh + inputs: + operation_string: + type: string + default: value2 + operation_integer: + type: integer + default: 2 + interface_integer: # will override interface input + type: integer + default: 3 + +node_types: + LocalNode: + derived_from: tosca.nodes.Root + interfaces: + MyInterface: + type: MyInterface + + RemoteNode: + derived_from: tosca.nodes.Compute + interfaces: + MyInterface: + type: MyInterface + +topology_template: + node_templates: + local_node: + type: LocalNode + + remote_node: + type: RemoteNode +""" + + +BROKEN_TEMPLATE = """ +tosca_definitions_version: tosca_simple_yaml_1_0 + +interface_types: + MyInterface: + derived_from: tosca.interfaces.Root + inputs: + ctx: # reserved name + type: string + default: value1 + interface_integer: + type: integer + default: 1 + operation: + implementation: operation.sh + inputs: + operation_string: + type: string + default: value2 + toolbelt: # reserved name + type: integer + default: 2 + +node_types: + LocalNode: + derived_from: tosca.nodes.Root + interfaces: + MyInterface: + type: MyInterface + +topology_template: + node_templates: + local_node: + type: LocalNode +""" + + +@pytest.fixture +def service(): + context, _ = consume_literal(TEMPLATE) + yield context.modeling.instance + + +@pytest.fixture +def broken_service_issues(): + context, _ = consume_literal(BROKEN_TEMPLATE, no_issues=False) + yield context.validation.issues + + +def test_local(service): + interface = service.nodes['local_node_1'].interfaces['MyInterface'] + operation = interface.operations['operation'] + assert parameters_as_values(interface.inputs) == { + 'interface_string': 'value1', + 'interface_integer': 1 + } + assert parameters_as_values(operation.inputs) == { + 'operation_string': 'value2', + 'operation_integer': 2, + 'interface_integer': 3 + } + assert parameters_as_values(operation.arguments) == { + 'process': {}, + 'script_path': 'operation.sh', + 'interface_string': 'value1', + 'interface_integer': 3, + 'operation_string': 'value2', + 'operation_integer': 2 + } + + +def test_remote(service): + interface = service.nodes['remote_node_1'].interfaces['MyInterface'] + operation = interface.operations['operation'] + assert parameters_as_values(interface.inputs) == { + 'interface_string': 'value1', + 'interface_integer': 1 + } + assert parameters_as_values(operation.inputs) == { + 'operation_string': 'value2', + 'operation_integer': 2, + 'interface_integer': 3 + } + assert parameters_as_values(operation.arguments) == { + 'process': {}, + 'use_sudo': False, + 'fabric_env': {'user': '', 'password': '', 'key': None, 'key_filename': None}, + 'script_path': 'operation.sh', + 'hide_output': [], + 'interface_string': 'value1', + 'interface_integer': 3, + 'operation_string': 'value2', + 'operation_integer': 2 + } + + +def test_reserved_arguments(broken_service_issues): + assert len(broken_service_issues) == 1 + message = broken_service_issues[0].message + assert message.startswith('using reserved arguments in operation "operation":') + assert '"ctx"' in message + assert '"toolbelt"' in message diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/mock/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/mock/__init__.py new file mode 100644 index 0000000..9183b77 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/mock/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 . import models, context, topology, operations, workflow diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/mock/context.py b/azure/aria/aria-extension-cloudify/src/aria/tests/mock/context.py new file mode 100644 index 0000000..ac0a8a7 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/mock/context.py @@ -0,0 +1,57 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria +from aria.orchestrator import context +from aria.storage import ( + sql_mapi, + filesystem_rapi, +) + +from . import models +from ..storage import init_inmemory_model_storage +from .topology import create_simple_topology_two_nodes + + +def simple(tmpdir, inmemory=False, context_kwargs=None, topology=None): + initiator = init_inmemory_model_storage if inmemory else None + initiator_kwargs = {} if inmemory else dict(base_dir=tmpdir) + topology = topology or create_simple_topology_two_nodes + + model_storage = aria.application_model_storage( + sql_mapi.SQLAlchemyModelAPI, initiator=initiator, initiator_kwargs=initiator_kwargs) + resource_storage = aria.application_resource_storage( + filesystem_rapi.FileSystemResourceAPI, + api_kwargs=dict(directory=os.path.join(tmpdir, 'resources')) + ) + + service_id = topology(model_storage) + execution = models.create_execution(model_storage.service.get(service_id)) + model_storage.execution.put(execution) + + final_kwargs = dict( + name='simple_context', + model_storage=model_storage, + resource_storage=resource_storage, + service_id=service_id, + workflow_name=models.WORKFLOW_NAME, + execution_id=execution.id, + task_max_attempts=models.TASK_MAX_ATTEMPTS, + task_retry_interval=models.TASK_RETRY_INTERVAL + ) + final_kwargs.update(context_kwargs or {}) + return context.workflow.WorkflowContext(**final_kwargs) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/mock/models.py b/azure/aria/aria-extension-cloudify/src/aria/tests/mock/models.py new file mode 100644 index 0000000..8a3b87e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/mock/models.py @@ -0,0 +1,358 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 datetime import datetime + +from aria.modeling import models +from aria.orchestrator import decorators +from aria.orchestrator.workflows.builtin.workflows import ( + NORMATIVE_STANDARD_INTERFACE, + NORMATIVE_CREATE, + NORMATIVE_START, + NORMATIVE_STOP, + NORMATIVE_DELETE, + NORMATIVE_CONFIGURE, + + NORMATIVE_CONFIGURE_INTERFACE, + NORMATIVE_PRE_CONFIGURE_SOURCE, + NORMATIVE_PRE_CONFIGURE_TARGET, + NORMATIVE_POST_CONFIGURE_SOURCE, + NORMATIVE_POST_CONFIGURE_TARGET, + + NORMATIVE_ADD_SOURCE, + NORMATIVE_ADD_TARGET, + NORMATIVE_REMOVE_TARGET, + NORMATIVE_REMOVE_SOURCE +) + +SERVICE_TEMPLATE_NAME = 'test_service_template' +SERVICE_NAME = 'test_service1' +NODE_TEMPLATE_NAME = 'test_node_template' +NODE_NAME = 'test_node1' +WORKFLOW_NAME = 'test_workflow' +TASK_RETRY_INTERVAL = 1 +TASK_MAX_ATTEMPTS = 1 + +DEPENDENCY_NODE_TEMPLATE_NAME = 'dependency_node_template' +DEPENDENCY_NODE_NAME = 'dependency_node' +DEPENDENT_NODE_TEMPLATE_NAME = 'dependent_node_template' +DEPENDENT_NODE_NAME = 'dependent_node' + + +def create_service_template(name=SERVICE_TEMPLATE_NAME, description=None, inputs=None): + now = datetime.now() + inputs = inputs or {} + return models.ServiceTemplate( + name=name, + description=description, + inputs=inputs, + created_at=now, + updated_at=now, + main_file_name='main_file_name', + node_types=models.Type(variant='node', name='test_node_type'), + group_types=models.Type(variant='group', name='test_group_type'), + policy_types=models.Type(variant='policy', name='test_policy_type'), + relationship_types=models.Type(variant='relationship', name='test_relationship_type'), + capability_types=models.Type(variant='capability', name='test_capability_type'), + artifact_types=models.Type(variant='artifact', name='test_artifact_type'), + interface_types=models.Type(variant='interface', name='test_interface_type') + ) + + +def create_service(service_template, name=SERVICE_NAME, inputs=None): + now = datetime.utcnow() + inputs = inputs or {} + return models.Service( + name=name, + inputs=inputs, + service_template=service_template, + description='', + created_at=now, + updated_at=now, + ) + + +def create_service_with_dependencies(include_execution=False, + include_input=False, + include_output=False, + include_node=False): + service_template = create_service_template() + service = create_service(service_template=service_template) + if include_execution: + execution = create_execution(service=service, status=models.Execution.STARTED) + service.executions = [execution] + execution.id = '1' + if include_input: + input = create_input(name='input1', value='value1') + service.inputs = {'input1': input} + if include_output: + output = create_output(name='output1', value='value1') + service.outputs = {'output1': output} + if include_node: + node_template = create_node_template(service_template=service_template) + node = create_node(node_template, service, state=models.Node.STARTED) + node.id = '1' + return service + + +def create_node_template_with_dependencies(include_node=False, include_property=False): + service_template = create_service_template() + node_template = create_node_template(service_template=service_template) + if include_node: + service = create_service(service_template=service_template) + create_node(dependency_node_template=node_template, service=service) + if include_property: + node_template.properties = {'prop1': create_property(name='prop1', value='value1')} + return node_template + + +def create_node_with_dependencies(include_attribute=False): + + node_template = create_node_template_with_dependencies() + node_template.service_template.services[0] = create_service(node_template.service_template) + node = create_node(node_template, node_template.service_template.services[0]) + if include_attribute: + node.attributes['attribute1'] = models.Attribute.wrap('attribute1', 'value1') # pylint: disable=unsubscriptable-object + return node + + +def create_node_template(service_template, + name=NODE_TEMPLATE_NAME, + type=models.Type(variant='node', name='test_node_type'), + capability_templates=None, + requirement_templates=None, + interface_templates=None): + capability_templates = capability_templates or {} + requirement_templates = requirement_templates or [] + interface_templates = interface_templates or {} + node_template = models.NodeTemplate( + name=name, + type=type, + capability_templates=capability_templates, + requirement_templates=requirement_templates, + interface_templates=interface_templates, + service_template=service_template) + + service_template.node_templates[node_template.name] = node_template + return node_template + + +def create_dependency_node_template(service_template, name=DEPENDENCY_NODE_TEMPLATE_NAME): + node_type = service_template.node_types.get_descendant('test_node_type') + capability_type = service_template.capability_types.get_descendant('test_capability_type') + + capability_template = models.CapabilityTemplate( + name='capability', + type=capability_type + ) + return create_node_template( + service_template=service_template, + name=name, + type=node_type, + capability_templates=_dictify(capability_template) + ) + + +def create_dependent_node_template( + service_template, dependency_node_template, name=DEPENDENT_NODE_TEMPLATE_NAME): + the_type = service_template.node_types.get_descendant('test_node_type') + + requirement_template = models.RequirementTemplate( + name='requirement', + target_node_template=dependency_node_template + ) + return create_node_template( + service_template=service_template, + name=name, + type=the_type, + interface_templates=_dictify(get_standard_interface_template(service_template)), + requirement_templates=[requirement_template], + ) + + +def create_node(dependency_node_template, service, name=NODE_NAME, state=models.Node.INITIAL): + node = models.Node( + name=name, + type=dependency_node_template.type, + version=None, + node_template=dependency_node_template, + state=state, + service=service, + interfaces=get_standard_interface(service), + ) + service.nodes[node.name] = node + return node + + +def create_relationship(source, target): + return models.Relationship( + source_node=source, + target_node=target, + interfaces=get_configure_interfaces(service=source.service), + ) + + +def create_interface_template(service_template, interface_name, operation_name, + operation_kwargs=None, interface_kwargs=None): + the_type = service_template.interface_types.get_descendant('test_interface_type') + operation_template = models.OperationTemplate( + name=operation_name, + **(operation_kwargs or {}) + ) + return models.InterfaceTemplate( + type=the_type, + operation_templates=_dictify(operation_template), + name=interface_name, + **(interface_kwargs or {}) + ) + + +def create_operation(operation_name, operation_kwargs=None): + if operation_kwargs and operation_kwargs.get('arguments'): + operation_kwargs['arguments'] = dict( + (argument_name, models.Argument.wrap(argument_name, argument_value)) + for argument_name, argument_value in operation_kwargs['arguments'].iteritems() + if argument_value is not None) + + return models.Operation( + name=operation_name, + **(operation_kwargs or {}) + ) + + +def create_interface(service, interface_name, operation_name, operation_kwargs=None, + interface_kwargs=None): + the_type = service.service_template.interface_types.get_descendant('test_interface_type') + operation = create_operation(operation_name, operation_kwargs) + + return models.Interface( + type=the_type, + operations=_dictify(operation), + name=interface_name, + **(interface_kwargs or {}) + ) + + +def create_execution(service, status=models.Execution.PENDING): + return models.Execution( + service=service, + status=status, + workflow_name=WORKFLOW_NAME, + created_at=datetime.utcnow(), + started_at=datetime.utcnow(), + inputs={} + ) + + +def create_plugin(name='test_plugin', package_version='0.1'): + return models.Plugin( + name=name, + archive_name='archive_name', + distribution='distribution', + distribution_release='dist_release', + distribution_version='dist_version', + package_name='package', + package_source='source', + package_version=package_version, + supported_platform='any', + supported_py_versions=['python27'], + uploaded_at=datetime.now(), + wheels=[], + ) + + +def create_plugin_specification(name='test_plugin', version='0.1'): + return models.PluginSpecification( + name=name, + version=version + ) + + +def _create_parameter(name, value, model_cls): + return model_cls.wrap(name, value) + + +def create_property(name, value): + return _create_parameter(name, value, model_cls=models.Property) + + +def create_input(name, value): + return _create_parameter(name, value, model_cls=models.Input) + + +def create_output(name, value): + return _create_parameter(name, value, model_cls=models.Output) + + +def _dictify(item): + return dict(((item.name, item),)) + + +def get_standard_interface_template(service_template): + the_type = service_template.interface_types.get_descendant('test_interface_type') + + op_templates = dict( + (op_name, models.OperationTemplate( + name=op_name, implementation='{0}.{1}'.format(__file__, mock_operation.__name__))) + for op_name in (NORMATIVE_CREATE, NORMATIVE_CONFIGURE, NORMATIVE_START, + NORMATIVE_STOP, NORMATIVE_DELETE) + ) + return models.InterfaceTemplate(name=NORMATIVE_STANDARD_INTERFACE, + operation_templates=op_templates, + type=the_type) + + +def get_standard_interface(service): + the_type = service.service_template.interface_types.get_descendant('test_interface_type') + + ops = dict( + (op_name, models.Operation( + name=op_name, implementation='{0}.{1}'.format(__file__, mock_operation.__name__))) + for op_name in (NORMATIVE_CREATE, NORMATIVE_CONFIGURE, NORMATIVE_START, + NORMATIVE_STOP, NORMATIVE_DELETE) + ) + return { + NORMATIVE_STANDARD_INTERFACE: + models.Interface(name=NORMATIVE_STANDARD_INTERFACE, operations=ops, type=the_type) + } + + +def get_configure_interfaces(service): + the_type = service.service_template.interface_types.get_descendant('test_interface_type') + + operations = dict( + (op_name, models.Operation( + name=op_name, implementation='{0}.{1}'.format(__file__, mock_operation.__name__))) + for op_name in (NORMATIVE_PRE_CONFIGURE_SOURCE, + NORMATIVE_POST_CONFIGURE_SOURCE, + NORMATIVE_ADD_SOURCE, + NORMATIVE_REMOVE_SOURCE, + + NORMATIVE_PRE_CONFIGURE_TARGET, + NORMATIVE_POST_CONFIGURE_TARGET, + NORMATIVE_ADD_TARGET, + NORMATIVE_REMOVE_TARGET) + ) + interface = { + NORMATIVE_CONFIGURE_INTERFACE: models.Interface( + name=NORMATIVE_CONFIGURE_INTERFACE, operations=operations, type=the_type) + } + + return interface + + +@decorators.operation +def mock_operation(*args, **kwargs): + pass diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/mock/operations.py b/azure/aria/aria-extension-cloudify/src/aria/tests/mock/operations.py new file mode 100644 index 0000000..c752a8e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/mock/operations.py @@ -0,0 +1,59 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +NODE_OPERATIONS_INSTALL = [ + ('Standard', 'create'), + ('Standard', 'configure'), + ('Standard', 'start') +] + +NODE_OPERATIONS_UNINSTALL = [ + ('Standard', 'stop'), + ('Standard', 'delete') +] + +NODE_OPERATIONS = NODE_OPERATIONS_INSTALL + NODE_OPERATIONS_UNINSTALL + +RELATIONSHIP_OPERATIONS_INSTALL = [ + ('Configure', 'pre_configure_source'), + ('Configure', 'pre_configure_target'), + ('Configure', 'add_source'), + ('Configure', 'add_target') +] + +RELATIONSHIP_OPERATIONS_UNINSTALL = [ + ('Configure', 'remove_target'), + ('Configure', 'target_changed') +] + +RELATIONSHIP_OPERATIONS = RELATIONSHIP_OPERATIONS_INSTALL + RELATIONSHIP_OPERATIONS_UNINSTALL + +OPERATIONS_INSTALL = [ + ('Standard', 'create'), + ('Configure', 'pre_configure_source'), + ('Configure', 'pre_configure_target'), + ('Standard', 'configure'), + ('Standard', 'start'), + ('Configure', 'add_source'), + ('Configure', 'add_target'), + ('Configure', 'target_changed') +] + +OPERATIONS_UNINSTALL = [ + ('Configure', 'remove_target'), + ('Configure', 'target_changed'), + ('Standard', 'stop'), + ('Standard', 'delete') +] diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/mock/topology.py b/azure/aria/aria-extension-cloudify/src/aria/tests/mock/topology.py new file mode 100644 index 0000000..9f0521f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/mock/topology.py @@ -0,0 +1,96 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.modeling import models as aria_models + +from . import models + + +def create_simple_topology_single_node(model_storage, create_operation): + service_template = models.create_service_template() + service = models.create_service(service_template) + + node_template = models.create_dependency_node_template(service_template) + interface_template = models.create_interface_template( + service_template, + 'Standard', 'create', + operation_kwargs=dict( + function=create_operation, + arguments={'key': aria_models.Argument.wrap('key', 'create'), + 'value': aria_models.Argument.wrap('value', True)}) + ) + node_template.interface_templates[interface_template.name] = interface_template # pylint: disable=unsubscriptable-object + + node = models.create_node(node_template, service, name=models.DEPENDENCY_NODE_NAME) + interface = models.create_interface( + service, + 'Standard', 'create', + operation_kwargs=dict( + function=create_operation, + arguments={'key': aria_models.Argument.wrap('key', 'create'), + 'value': aria_models.Argument.wrap('value', True)}) + ) + node.interfaces[interface.name] = interface # pylint: disable=unsubscriptable-object + + model_storage.service_template.put(service_template) + model_storage.service.put(service) + + +def create_simple_topology_two_nodes(model_storage): + service_template = models.create_service_template() + service = models.create_service(service_template) + + # Creating a simple service with node -> node as a graph + + dependency_node_template = models.create_dependency_node_template(service_template) + dependent_node_template = models.create_dependent_node_template(service_template, + dependency_node_template) + + dependency_node = models.create_node( + dependency_node_template, service, models.DEPENDENCY_NODE_NAME) + dependent_node = models.create_node( + dependent_node_template, service, models.DEPENDENT_NODE_NAME) + + dependent_node.outbound_relationships.append(models.create_relationship( # pylint: disable=no-member + source=dependent_node, + target=dependency_node + )) + + model_storage.service_template.put(service_template) + model_storage.service.put(service) + + return service.id + + +def create_simple_topology_three_nodes(model_storage): + ################################################################################# + # Creating a simple deployment with the following topology: + # node1 <----| + # | <- node0 + # node2 <----| + # meaning node0 has two relationships: node1 and node2 (one each). + + service_id = create_simple_topology_two_nodes(model_storage) + service = model_storage.service.get(service_id) + third_node_template = models.create_dependency_node_template( + service.service_template, name='another_dependency_node_template') + third_node = models.create_node(third_node_template, service, 'another_dependency_node') + new_relationship = models.create_relationship( + source=model_storage.node.get_by_name(models.DEPENDENT_NODE_NAME), + target=third_node, + ) + model_storage.relationship.put(new_relationship) + + return service_id diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/mock/workflow.py b/azure/aria/aria-extension-cloudify/src/aria/tests/mock/workflow.py new file mode 100644 index 0000000..b12b9fa --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/mock/workflow.py @@ -0,0 +1,26 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 + +from aria.orchestrator.decorators import workflow + + +@workflow +def mock_workflow(graph, ctx, output_path=None, **kwargs): # pylint: disable=unused-argument + if output_path: + # writes call arguments to the specified output file + with open(output_path, 'w') as f: + json.dump(kwargs, f) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/modeling/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/modeling/__init__.py new file mode 100644 index 0000000..072ef54 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/modeling/__init__.py @@ -0,0 +1,34 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 sqlalchemy import ( + Column, + Text, + Integer, +) + +from aria.modeling import ( + models, + types as modeling_types, + mixins +) + + +class MockModel(models.aria_declarative_base, mixins.ModelMixin): #pylint: disable=abstract-method + __tablename__ = 'mock_model' + model_dict = Column(modeling_types.Dict) + model_list = Column(modeling_types.List) + value = Column(Integer) + name = Column(Text) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/modeling/test_mixins.py b/azure/aria/aria-extension-cloudify/src/aria/tests/modeling/test_mixins.py new file mode 100644 index 0000000..2d94d7c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/modeling/test_mixins.py @@ -0,0 +1,215 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +import sqlalchemy + +from aria.storage import ( + ModelStorage, + sql_mapi +) +from aria import modeling +from aria.modeling.exceptions import ValueFormatException + +from ..storage import ( + release_sqlite_storage, + init_inmemory_model_storage +) +from . import MockModel +from ..mock import ( + models, + context as mock_context +) + + +@pytest.fixture +def storage(): + base_storage = ModelStorage(sql_mapi.SQLAlchemyModelAPI, + initiator=init_inmemory_model_storage) + base_storage.register(MockModel) + yield base_storage + release_sqlite_storage(base_storage) + + +@pytest.fixture(scope='module', autouse=True) +def module_cleanup(): + modeling.models.aria_declarative_base.metadata.remove(MockModel.__table__) # pylint: disable=no-member + + +@pytest.fixture +def context(tmpdir): + ctx = mock_context.simple(str(tmpdir)) + yield ctx + release_sqlite_storage(ctx.model) + + +def test_inner_dict_update(storage): + inner_dict = {'inner_value': 1} + + mock_model = MockModel(model_dict={'inner_dict': inner_dict, 'value': 0}) + storage.mock_model.put(mock_model) + + storage_mm = storage.mock_model.get(mock_model.id) + assert storage_mm == mock_model + + storage_mm.model_dict['inner_dict']['inner_value'] = 2 + storage_mm.model_dict['value'] = -1 + storage.mock_model.update(storage_mm) + storage_mm = storage.mock_model.get(storage_mm.id) + + assert storage_mm.model_dict['inner_dict']['inner_value'] == 2 + assert storage_mm.model_dict['value'] == -1 + + +def test_inner_list_update(storage): + mock_model = MockModel(model_list=[0, [1]]) + storage.mock_model.put(mock_model) + + storage_mm = storage.mock_model.get(mock_model.id) + assert storage_mm == mock_model + + storage_mm.model_list[1][0] = 'new_inner_value' + storage_mm.model_list[0] = 'new_value' + storage.mock_model.update(storage_mm) + storage_mm = storage.mock_model.get(storage_mm.id) + + assert storage_mm.model_list[1][0] == 'new_inner_value' + assert storage_mm.model_list[0] == 'new_value' + + +def test_model_to_dict(context): + service = context.service + service = service.to_dict() + + expected_keys = [ + 'description', + 'created_at', + 'updated_at' + ] + + for expected_key in expected_keys: + assert expected_key in service + + +def test_relationship_model_ordering(context): + service = context.model.service.get_by_name(models.SERVICE_NAME) + source_node = context.model.node.get_by_name(models.DEPENDENT_NODE_NAME) + target_node = context.model.node.get_by_name(models.DEPENDENCY_NODE_NAME) + + new_node_template = modeling.models.NodeTemplate( + name='new_node_template', + type=source_node.type, + service_template=service.service_template + ) + + new_node = modeling.models.Node( + name='new_node', + type=source_node.type, + service=service, + version=None, + node_template=new_node_template, + state=modeling.models.Node.INITIAL, + ) + + source_node.outbound_relationships.append(modeling.models.Relationship( + source_node=source_node, + target_node=new_node, + )) + + new_node.outbound_relationships.append(modeling.models.Relationship( # pylint: disable=no-member + source_node=new_node, + target_node=target_node, + )) + + context.model.node_template.put(new_node_template) + context.model.node.put(new_node) + context.model.node.refresh(source_node) + context.model.node.refresh(target_node) + + def flip_and_assert(node, direction): + """ + Reversed the order of relationships and assert effects took place. + :param node: the node instance to operate on + :param direction: the type of relationships to flip (inbound/outbound) + :return: + """ + assert direction in ('inbound', 'outbound') + + def get_relationships(): + return getattr(node, direction + '_relationships') + + relationships = get_relationships() + assert len(relationships) == 2 + + reversed_relationship = list(reversed(relationships)) + assert relationships != reversed_relationship + + relationships[:] = reversed_relationship + context.model.node.update(node) + assert get_relationships() == reversed_relationship + + flip_and_assert(source_node, 'outbound') + flip_and_assert(target_node, 'inbound') + + +class StrictClass(modeling.models.aria_declarative_base, modeling.mixins.ModelMixin): + __tablename__ = 'strict_class' + + strict_dict = sqlalchemy.Column(modeling.types.StrictDict(basestring, basestring)) + strict_list = sqlalchemy.Column(modeling.types.StrictList(basestring)) + + +def test_strict_dict(): + + strict_class = StrictClass() + + def assert_strict(sc): + with pytest.raises(ValueFormatException): + sc.strict_dict = {'key': 1} + + with pytest.raises(ValueFormatException): + sc.strict_dict = {1: 'value'} + + with pytest.raises(ValueFormatException): + sc.strict_dict = {1: 1} + + assert_strict(strict_class) + strict_class.strict_dict = {'key': 'value'} + assert strict_class.strict_dict == {'key': 'value'} + + assert_strict(strict_class) + with pytest.raises(ValueFormatException): + strict_class.strict_dict['key'] = 1 + with pytest.raises(ValueFormatException): + strict_class.strict_dict[1] = 'value' + with pytest.raises(ValueFormatException): + strict_class.strict_dict[1] = 1 + + +def test_strict_list(): + strict_class = StrictClass() + + def assert_strict(sc): + with pytest.raises(ValueFormatException): + sc.strict_list = [1] + + assert_strict(strict_class) + strict_class.strict_list = ['item'] + assert strict_class.strict_list == ['item'] + + assert_strict(strict_class) + with pytest.raises(ValueFormatException): + strict_class.strict_list[0] = 1 diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/modeling/test_models.py b/azure/aria/aria-extension-cloudify/src/aria/tests/modeling/test_models.py new file mode 100644 index 0000000..25b4080 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/modeling/test_models.py @@ -0,0 +1,872 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 datetime import datetime +from contextlib import contextmanager + +import pytest + +from aria import application_model_storage +from aria.storage import ( + sql_mapi, +) +from aria.storage.exceptions import StorageError +from aria.modeling.exceptions import ValueFormatException +from aria.modeling.models import ( + ServiceTemplate, + Service, + ServiceUpdate, + ServiceUpdateStep, + ServiceModification, + Execution, + Task, + Plugin, + Relationship, + NodeTemplate, + Node, + Input, + Output, + Property, + Attribute, + Configuration, + Argument, + Type +) + +from tests import mock +from tests.storage import release_sqlite_storage, init_inmemory_model_storage + + +@contextmanager +def sql_storage(storage_func): + storage = None + try: + storage = storage_func() + yield storage + finally: + if storage: + release_sqlite_storage(storage) + + +def _empty_storage(): + return application_model_storage(sql_mapi.SQLAlchemyModelAPI, + initiator=init_inmemory_model_storage) + + +def _service_template_storage(): + storage = _empty_storage() + service_template = mock.models.create_service_template() + storage.service_template.put(service_template) + return storage + + +def _service_storage(): + storage = _service_template_storage() + service = mock.models.create_service( + storage.service_template.get_by_name(mock.models.SERVICE_TEMPLATE_NAME)) + storage.service.put(service) + return storage + + +def _service_update_storage(): + storage = _service_storage() + service_update = ServiceUpdate( + service=storage.service.list()[0], + created_at=now, + service_plan={}, + ) + storage.service_update.put(service_update) + return storage + + +def _node_template_storage(): + storage = _service_storage() + service_template = storage.service_template.list()[0] + dependency_node_template = mock.models.create_dependency_node_template(service_template) + mock.models.create_dependent_node_template(service_template, dependency_node_template) + storage.service_template.update(service_template) + return storage + + +def _nodes_storage(): + storage = _node_template_storage() + service = storage.service.get_by_name(mock.models.SERVICE_NAME) + dependency_node_template = storage.node_template.get_by_name( + mock.models.DEPENDENCY_NODE_TEMPLATE_NAME) + mock.models.create_node(dependency_node_template, service, + name=mock.models.DEPENDENCY_NODE_NAME) + + dependent_node_template = mock.models.create_dependent_node_template(service.service_template, + dependency_node_template) + + mock.models.create_node(dependent_node_template, service, name=mock.models.DEPENDENT_NODE_NAME) + storage.service.update(service) + return storage + + +def _execution_storage(): + storage = _service_storage() + execution = mock.models.create_execution(storage.service.list()[0]) + plugin = mock.models.create_plugin() + storage.execution.put(execution) + storage.plugin.put(plugin) + return storage + + +@pytest.fixture +def empty_storage(): + with sql_storage(_empty_storage) as storage: + yield storage + + +@pytest.fixture +def service_template_storage(): + with sql_storage(_service_template_storage) as storage: + yield storage + + +@pytest.fixture +def service_storage(): + with sql_storage(_service_storage) as storage: + yield storage + + +@pytest.fixture +def service_update_storage(): + with sql_storage(_service_update_storage) as storage: + yield storage + + +@pytest.fixture +def node_template_storage(): + with sql_storage(_node_template_storage) as storage: + yield storage + + +@pytest.fixture +def nodes_storage(): + with sql_storage(_nodes_storage) as storage: + yield storage + + +@pytest.fixture +def execution_storage(): + with sql_storage(_execution_storage) as storage: + yield storage + + +m_cls = type('MockClass') +now = datetime.utcnow() + + +def _test_model(is_valid, storage, model_cls, model_kwargs): + if is_valid: + model = model_cls(**model_kwargs) + getattr(storage, model_cls.__modelname__).put(model) + return model + else: + with pytest.raises((ValueFormatException, StorageError, TypeError),): + getattr(storage, model_cls.__modelname__).put(model_cls(**model_kwargs)) + + +class TestServiceTemplate(object): + + @pytest.mark.parametrize( + 'is_valid, description, created_at, updated_at, main_file_name', + [ + (False, [], now, now, '/path'), + (False, 'description', 'error', now, '/path'), + (False, 'description', now, 'error', '/path'), + (False, 'description', now, now, {}), + + (True, 'description', now, now, '/path'), + ] + ) + + def test_service_template_model_creation(self, empty_storage, is_valid, description, created_at, + updated_at, main_file_name): + _test_model(is_valid=is_valid, + storage=empty_storage, + model_cls=ServiceTemplate, + model_kwargs=dict( + description=description, + created_at=created_at, + updated_at=updated_at, + main_file_name=main_file_name) + ) + + +class TestService(object): + + @pytest.mark.parametrize( + 'is_valid, name, created_at, description, inputs, ' + 'outputs, updated_at', + [ + (False, m_cls, now, 'desc', {}, {}, now), + (False, 'name', m_cls, 'desc', {}, {}, now), + (False, 'name', now, m_cls, {}, {}, now), + (False, 'name', now, 'desc', m_cls, {}, now), + (False, 'name', now, 'desc', {}, m_cls, now), + (False, 'name', now, 'desc', {}, {}, m_cls), + + (True, 'name', now, 'desc', {}, {}, now), + (True, None, now, 'desc', {}, {}, now), + (True, 'name', now, None, {}, {}, now), + (True, 'name', now, 'desc', {}, {}, None), + (True, 'name', now, 'desc', {}, {}, now), + ] + ) + def test_service_model_creation(self, service_storage, is_valid, name, created_at, description, + inputs, outputs, updated_at): + service = _test_model( + is_valid=is_valid, + storage=service_storage, + model_cls=Service, + model_kwargs=dict( + name=name, + service_template=service_storage.service_template.list()[0], + created_at=created_at, + description=description, + inputs=inputs, + outputs=outputs, + updated_at=updated_at + )) + if is_valid: + assert service.service_template == \ + service_storage.service_template.list()[0] + + +class TestExecution(object): + + @pytest.mark.parametrize( + 'is_valid, created_at, started_at, ended_at, error, inputs, ' + 'status, workflow_name', + [ + (False, m_cls, now, now, 'error', {}, Execution.STARTED, 'wf_name'), + (False, now, m_cls, now, 'error', {}, Execution.STARTED, 'wf_name'), + (False, now, now, m_cls, 'error', {}, Execution.STARTED, 'wf_name'), + (False, now, now, now, m_cls, {}, Execution.STARTED, 'wf_name'), + (False, now, now, now, 'error', m_cls, Execution.STARTED, 'wf_name'), + (False, now, now, now, 'error', {}, m_cls, 'wf_name'), + (False, now, now, now, 'error', {}, Execution.STARTED, m_cls), + + (True, now, now, now, 'error', {}, Execution.STARTED, 'wf_name'), + (True, now, None, now, 'error', {}, Execution.STARTED, 'wf_name'), + (True, now, now, None, 'error', {}, Execution.STARTED, 'wf_name'), + (True, now, now, now, None, {}, Execution.STARTED, 'wf_name'), + ] + ) + def test_execution_model_creation(self, service_storage, is_valid, created_at, started_at, + ended_at, error, inputs, status, workflow_name): + execution = _test_model( + is_valid=is_valid, + storage=service_storage, + model_cls=Execution, + model_kwargs=dict( + service=service_storage.service.list()[0], + created_at=created_at, + started_at=started_at, + ended_at=ended_at, + error=error, + inputs=inputs, + status=status, + workflow_name=workflow_name, + )) + if is_valid: + assert execution.service == service_storage.service.list()[0] + assert execution.service_template == service_storage.service_template.list()[0] + + def test_execution_status_transition(self): + def create_execution(status): + execution = Execution( + id='e_id', + workflow_name='w_name', + status=status, + inputs={}, + created_at=now, + ) + return execution + + valid_transitions = { + Execution.PENDING: [Execution.STARTED, + Execution.CANCELLED, + Execution.PENDING], + Execution.STARTED: [Execution.FAILED, + Execution.SUCCEEDED, + Execution.CANCELLED, + Execution.CANCELLING, + Execution.STARTED], + Execution.CANCELLING: [Execution.FAILED, + Execution.SUCCEEDED, + Execution.CANCELLED, + Execution.CANCELLING], + Execution.FAILED: [Execution.FAILED], + Execution.SUCCEEDED: [Execution.SUCCEEDED], + Execution.CANCELLED: [Execution.CANCELLED, Execution.PENDING] + } + + invalid_transitions = { + Execution.PENDING: [Execution.FAILED, + Execution.SUCCEEDED, + Execution.CANCELLING], + Execution.STARTED: [Execution.PENDING], + Execution.CANCELLING: [Execution.PENDING, + Execution.STARTED], + Execution.FAILED: [Execution.STARTED, + Execution.SUCCEEDED, + Execution.CANCELLED, + Execution.CANCELLING], + Execution.SUCCEEDED: [Execution.PENDING, + Execution.STARTED, + Execution.FAILED, + Execution.CANCELLED, + Execution.CANCELLING], + Execution.CANCELLED: [Execution.STARTED, + Execution.FAILED, + Execution.SUCCEEDED, + Execution.CANCELLING], + } + + for current_status, valid_transitioned_statues in valid_transitions.items(): + for transitioned_status in valid_transitioned_statues: + execution = create_execution(current_status) + execution.status = transitioned_status + + for current_status, invalid_transitioned_statues in invalid_transitions.items(): + for transitioned_status in invalid_transitioned_statues: + execution = create_execution(current_status) + with pytest.raises(ValueError): + execution.status = transitioned_status + + +class TestServiceUpdate(object): + @pytest.mark.parametrize( + 'is_valid, created_at, service_plan, service_update_nodes, ' + 'service_update_service, service_update_node_templates, ' + 'modified_entity_ids, state', + [ + (False, m_cls, {}, {}, {}, [], {}, 'state'), + (False, now, m_cls, {}, {}, [], {}, 'state'), + (False, now, {}, m_cls, {}, [], {}, 'state'), + (False, now, {}, {}, m_cls, [], {}, 'state'), + (False, now, {}, {}, {}, m_cls, {}, 'state'), + (False, now, {}, {}, {}, [], m_cls, 'state'), + (False, now, {}, {}, {}, [], {}, m_cls), + + (True, now, {}, {}, {}, [], {}, 'state'), + (True, now, {}, None, {}, [], {}, 'state'), + (True, now, {}, {}, None, [], {}, 'state'), + (True, now, {}, {}, {}, None, {}, 'state'), + (True, now, {}, {}, {}, [], None, 'state'), + (True, now, {}, {}, {}, [], {}, None), + ] + ) + def test_service_update_model_creation(self, service_storage, is_valid, created_at, + service_plan, service_update_nodes, + service_update_service, service_update_node_templates, + modified_entity_ids, state): + service_update = _test_model( + is_valid=is_valid, + storage=service_storage, + model_cls=ServiceUpdate, + model_kwargs=dict( + service=service_storage.service.list()[0], + created_at=created_at, + service_plan=service_plan, + service_update_nodes=service_update_nodes, + service_update_service=service_update_service, + service_update_node_templates=service_update_node_templates, + modified_entity_ids=modified_entity_ids, + state=state + )) + if is_valid: + assert service_update.service == \ + service_storage.service.list()[0] + + +class TestServiceUpdateStep(object): + + @pytest.mark.parametrize( + 'is_valid, action, entity_id, entity_type', + [ + (False, m_cls, 'id', ServiceUpdateStep.ENTITY_TYPES.NODE), + (False, ServiceUpdateStep.ACTION_TYPES.ADD, m_cls, + ServiceUpdateStep.ENTITY_TYPES.NODE), + (False, ServiceUpdateStep.ACTION_TYPES.ADD, 'id', m_cls), + + (True, ServiceUpdateStep.ACTION_TYPES.ADD, 'id', + ServiceUpdateStep.ENTITY_TYPES.NODE) + ] + ) + def test_service_update_step_model_creation(self, service_update_storage, is_valid, action, + entity_id, entity_type): + service_update_step = _test_model( + is_valid=is_valid, + storage=service_update_storage, + model_cls=ServiceUpdateStep, + model_kwargs=dict( + service_update= + service_update_storage.service_update.list()[0], + action=action, + entity_id=entity_id, + entity_type=entity_type + )) + if is_valid: + assert service_update_step.service_update == \ + service_update_storage.service_update.list()[0] + + def test_service_update_step_order(self): + add_node = ServiceUpdateStep( + id='add_step', + action='add', + entity_type='node', + entity_id='node_id') + + modify_node = ServiceUpdateStep( + id='modify_step', + action='modify', + entity_type='node', + entity_id='node_id') + + remove_node = ServiceUpdateStep( + id='remove_step', + action='remove', + entity_type='node', + entity_id='node_id') + + for step in (add_node, modify_node, remove_node): + assert hash((step.id, step.entity_id)) == hash(step) + + assert remove_node < modify_node < add_node + assert not remove_node > modify_node > add_node + + add_rel = ServiceUpdateStep( + id='add_step', + action='add', + entity_type='relationship', + entity_id='relationship_id') + + remove_rel = ServiceUpdateStep( + id='remove_step', + action='remove', + entity_type='relationship', + entity_id='relationship_id') + + assert remove_rel < remove_node < add_node < add_rel + assert not add_node < None + + +class TestServiceModification(object): + @pytest.mark.parametrize( + 'is_valid, context, created_at, ended_at, modified_node_templates, nodes, status', + [ + (False, m_cls, now, now, {}, {}, ServiceModification.STARTED), + (False, {}, m_cls, now, {}, {}, ServiceModification.STARTED), + (False, {}, now, m_cls, {}, {}, ServiceModification.STARTED), + (False, {}, now, now, m_cls, {}, ServiceModification.STARTED), + (False, {}, now, now, {}, m_cls, ServiceModification.STARTED), + (False, {}, now, now, {}, {}, m_cls), + + (True, {}, now, now, {}, {}, ServiceModification.STARTED), + (True, {}, now, None, {}, {}, ServiceModification.STARTED), + (True, {}, now, now, None, {}, ServiceModification.STARTED), + (True, {}, now, now, {}, None, ServiceModification.STARTED), + ] + ) + def test_service_modification_model_creation(self, service_storage, is_valid, context, + created_at, ended_at, modified_node_templates, + nodes, status): + service_modification = _test_model( + is_valid=is_valid, + storage=service_storage, + model_cls=ServiceModification, + model_kwargs=dict( + service=service_storage.service.list()[0], + context=context, + created_at=created_at, + ended_at=ended_at, + modified_node_templates=modified_node_templates, + nodes=nodes, + status=status, + )) + if is_valid: + assert service_modification.service == \ + service_storage.service.list()[0] + + +class TestNodeTemplate(object): + @pytest.mark.parametrize( + 'is_valid, name, properties', + [ + (False, m_cls, {}), + (False, 'name', m_cls), + + (True, 'name', {}), + ] + ) + def test_node_template_model_creation(self, service_storage, is_valid, name, properties): + node_template = _test_model( + is_valid=is_valid, + storage=service_storage, + model_cls=NodeTemplate, + model_kwargs=dict( + name=name, + type=service_storage.type.list()[0], + properties=properties, + service_template=service_storage.service_template.list()[0] + )) + if is_valid: + assert node_template.service_template == \ + service_storage.service_template.list()[0] + + +class TestNode(object): + @pytest.mark.parametrize( + 'is_valid, name, state, version', + [ + (False, m_cls, 'state', 1), + (False, 'name', 'state', 1), + (False, 'name', m_cls, 1), + (False, m_cls, 'state', m_cls), + + (True, 'name', 'initial', 1), + (True, None, 'initial', 1), + (True, 'name', 'initial', 1), + (True, 'name', 'initial', None), + ] + ) + def test_node_model_creation(self, node_template_storage, is_valid, name, state, version): + node = _test_model( + is_valid=is_valid, + storage=node_template_storage, + model_cls=Node, + model_kwargs=dict( + node_template=node_template_storage.node_template.list()[0], + type=node_template_storage.type.list()[0], + name=name, + state=state, + version=version, + service=node_template_storage.service.list()[0] + )) + if is_valid: + assert node.node_template == node_template_storage.node_template.list()[0] + assert node.service == \ + node_template_storage.service.list()[0] + + +class TestNodeHostAddress(object): + + host_address = '1.1.1.1' + + def test_host_address_on_none_hosted_node(self, service_storage): + node_template = self._node_template(service_storage, host_address='not considered') + node = self._node(service_storage, + node_template, + is_host=False, + host_address='not considered') + assert node.host_address is None + + def test_property_host_address_on_host_node(self, service_storage): + node_template = self._node_template(service_storage, host_address=self.host_address) + node = self._node(service_storage, node_template, is_host=True, host_address=None) + assert node.host_address == self.host_address + + def test_runtime_property_host_address_on_host_node(self, service_storage): + node_template = self._node_template(service_storage, host_address='not considered') + node = self._node(service_storage, node_template, is_host=True, + host_address=self.host_address) + assert node.host_address == self.host_address + + def test_no_host_address_configured_on_host_node(self, service_storage): + node_template = self._node_template(service_storage, host_address=None) + node = self._node(service_storage, node_template, is_host=True, host_address=None) + assert node.host_address is None + + def test_runtime_property_on_hosted_node(self, service_storage): + host_node_template = self._node_template(service_storage, host_address=None) + host_node = self._node(service_storage, + host_node_template, + is_host=True, + host_address=self.host_address) + node_template = self._node_template(service_storage, host_address=None) + node = self._node(service_storage, + node_template, + is_host=False, + host_address=None, + host_fk=host_node.id) + assert node.host_address == self.host_address + + def _node_template(self, storage, host_address): + kwargs = dict( + name='node_template', + type=storage.type.list()[0], + service_template=storage.service_template.list()[0] + ) + if host_address: + kwargs['properties'] = {'host_address': Property.wrap('host_address', host_address)} + node = NodeTemplate(**kwargs) + storage.node_template.put(node) + return node + + def _node(self, storage, node_template, is_host, host_address, host_fk=None): + kwargs = dict( + name='node', + node_template=node_template, + type=storage.type.list()[0], + state='initial', + service=storage.service.list()[0] + ) + if is_host and (host_address is None): + host_address = node_template.properties.get('host_address') + if host_address is not None: + host_address = host_address.value + if host_address: + kwargs.setdefault('attributes', {})['ip'] = Attribute.wrap('ip', host_address) + if is_host: + kwargs['host_fk'] = 1 + elif host_fk: + kwargs['host_fk'] = host_fk + node = Node(**kwargs) + storage.node.put(node) + return node + + +class TestRelationship(object): + @pytest.mark.parametrize( + 'is_valid, source_position, target_position', + [ + (False, m_cls, 0), + (False, 0, m_cls), + + (True, 0, 0), + (True, None, 0), + (True, 0, None), + ] + ) + def test_relationship_model_creation(self, nodes_storage, is_valid, source_position, + target_position): + nodes = nodes_storage.node + source_node = nodes.get_by_name(mock.models.DEPENDENT_NODE_NAME) + target_node = nodes.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + _test_model(is_valid=is_valid, + storage=nodes_storage, + model_cls=Relationship, + model_kwargs=dict( + source_node=source_node, + target_node=target_node, + source_position=source_position, + target_position=target_position + )) + + +class TestPlugin(object): + @pytest.mark.parametrize( + 'is_valid, archive_name, distribution, distribution_release, ' + 'distribution_version, package_name, package_source, ' + 'package_version, supported_platform, supported_py_versions, uploaded_at, wheels', + [ + (False, m_cls, 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', 'pak_ver', + 'sup_plat', [], now, []), + (False, 'arc_name', m_cls, 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', 'pak_ver', + 'sup_plat', [], now, []), + (False, 'arc_name', 'dis_name', m_cls, 'dis_ver', 'pak_name', 'pak_src', 'pak_ver', + 'sup_plat', [], now, []), + (False, 'arc_name', 'dis_name', 'dis_rel', m_cls, 'pak_name', 'pak_src', 'pak_ver', + 'sup_plat', [], now, []), + (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', m_cls, 'pak_src', 'pak_ver', + 'sup_plat', [], now, []), + (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', m_cls, 'pak_ver', + 'sup_plat', [], now, []), + (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', m_cls, + 'sup_plat', [], now, []), + (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', + 'pak_ver', m_cls, [], now, []), + (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', + 'pak_ver', 'sup_plat', m_cls, now, []), + (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', + 'pak_ver', 'sup_plat', [], m_cls, []), + (False, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', + 'pak_ver', 'sup_plat', [], now, m_cls), + + (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', 'pak_ver', + 'sup_plat', [], now, []), + (True, 'arc_name', None, 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', 'pak_ver', + 'sup_plat', [], now, []), + (True, 'arc_name', 'dis_name', None, 'dis_ver', 'pak_name', 'pak_src', 'pak_ver', + 'sup_plat', [], now, []), + (True, 'arc_name', 'dis_name', 'dis_rel', None, 'pak_name', 'pak_src', 'pak_ver', + 'sup_plat', [], now, []), + (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', + 'pak_ver', 'sup_plat', [], now, []), + (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', None, 'pak_ver', + 'sup_plat', [], now, []), + (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', None, + 'sup_plat', [], now, []), + (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', + 'pak_ver', None, [], now, []), + (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', + 'pak_ver', 'sup_plat', None, now, []), + (True, 'arc_name', 'dis_name', 'dis_rel', 'dis_ver', 'pak_name', 'pak_src', + 'pak_ver', 'sup_plat', [], now, []), + ] + ) + def test_plugin_model_creation(self, empty_storage, is_valid, archive_name, distribution, + distribution_release, distribution_version, package_name, + package_source, package_version, supported_platform, + supported_py_versions, uploaded_at, wheels): + _test_model(is_valid=is_valid, + storage=empty_storage, + model_cls=Plugin, + model_kwargs=dict( + archive_name=archive_name, + distribution=distribution, + distribution_release=distribution_release, + distribution_version=distribution_version, + package_name=package_name, + package_source=package_source, + package_version=package_version, + supported_platform=supported_platform, + supported_py_versions=supported_py_versions, + uploaded_at=uploaded_at, + wheels=wheels, + )) + + +class TestTask(object): + + @pytest.mark.parametrize( + 'is_valid, status, due_at, started_at, ended_at, max_attempts, attempts_count, ' + 'retry_interval, ignore_failure, name, operation_mapping, arguments, plugin_id', + [ + (False, m_cls, now, now, now, 1, 1, 1, True, 'name', 'map', {}, '1'), + (False, Task.STARTED, m_cls, now, now, 1, 1, 1, True, 'name', 'map', {}, '1'), + (False, Task.STARTED, now, m_cls, now, 1, 1, 1, True, 'name', 'map', {}, '1'), + (False, Task.STARTED, now, now, m_cls, 1, 1, 1, True, 'name', 'map', {}, '1'), + (False, Task.STARTED, now, now, now, m_cls, 1, 1, True, 'name', 'map', {}, '1'), + (False, Task.STARTED, now, now, now, 1, m_cls, 1, True, 'name', 'map', {}, '1'), + (False, Task.STARTED, now, now, now, 1, 1, m_cls, True, 'name', 'map', {}, '1'), + (False, Task.STARTED, now, now, now, 1, 1, 1, True, m_cls, 'map', {}, '1'), + (False, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', m_cls, {}, '1'), + (False, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', 'map', m_cls, '1'), + (False, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', 'map', {}, m_cls), + (False, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', 'map', None, '1'), + + (True, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', 'map', {}, '1'), + (True, Task.STARTED, None, now, now, 1, 1, 1, True, 'name', 'map', {}, '1'), + (True, Task.STARTED, now, None, now, 1, 1, 1, True, 'name', 'map', {}, '1'), + (True, Task.STARTED, now, now, None, 1, 1, 1, True, 'name', 'map', {}, '1'), + (True, Task.STARTED, now, now, now, 1, None, 1, True, 'name', 'map', {}, '1'), + (True, Task.STARTED, now, now, now, 1, 1, None, True, 'name', 'map', {}, '1'), + (True, Task.STARTED, now, now, now, 1, 1, 1, None, 'name', 'map', {}, '1'), + (True, Task.STARTED, now, now, now, 1, 1, 1, True, None, 'map', {}, '1'), + (True, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', None, {}, '1'), + (True, Task.STARTED, now, now, now, 1, 1, 1, True, 'name', 'map', {}, None), + ] + ) + def test_task_model_creation(self, execution_storage, is_valid, status, due_at, started_at, + ended_at, max_attempts, attempts_count, retry_interval, + ignore_failure, name, operation_mapping, arguments, plugin_id): + task = _test_model( + is_valid=is_valid, + storage=execution_storage, + model_cls=Task, + model_kwargs=dict( + status=status, + execution=execution_storage.execution.list()[0], + due_at=due_at, + started_at=started_at, + ended_at=ended_at, + max_attempts=max_attempts, + attempts_count=attempts_count, + retry_interval=retry_interval, + ignore_failure=ignore_failure, + name=name, + function=operation_mapping, + arguments=arguments, + plugin_fk=plugin_id, + )) + if is_valid: + assert task.execution == execution_storage.execution.list()[0] + if task.plugin: + assert task.plugin == execution_storage.plugin.list()[0] + + def test_task_max_attempts_validation(self): + def create_task(max_attempts): + Task(execution_fk='eid', + name='name', + function='', + arguments={}, + max_attempts=max_attempts) + create_task(max_attempts=1) + create_task(max_attempts=2) + create_task(max_attempts=Task.INFINITE_RETRIES) + with pytest.raises(ValueError): + create_task(max_attempts=0) + with pytest.raises(ValueError): + create_task(max_attempts=-2) + + +class TestType(object): + def test_type_hierarchy(self): + super_type = Type(variant='variant', name='super') + sub_type = Type(variant='variant', parent=super_type, name='sub') + additional_type = Type(variant='variant', name='non_related') + + assert super_type.hierarchy == [super_type] + assert sub_type.hierarchy == [sub_type, super_type] + assert additional_type.hierarchy == [additional_type] + + super_type.parent = additional_type + + assert super_type.hierarchy == [super_type, additional_type] + assert sub_type.hierarchy == [sub_type, super_type, additional_type] + + +class TestParameter(object): + + MODELS_DERIVED_FROM_PARAMETER = (Input, Output, Property, Attribute, Configuration, Argument) + + @pytest.mark.parametrize( + 'is_valid, name, type_name, description', + [ + (False, 'name', 'int', []), + (False, 'name', [], 'desc'), + (False, [], 'type_name', 'desc'), + (True, 'name', 'type_name', 'desc'), + ] + ) + def test_derived_from_parameter_model_creation(self, empty_storage, is_valid, name, type_name, + description): + + for model_cls in self.MODELS_DERIVED_FROM_PARAMETER: + _test_model(is_valid=is_valid, + storage=empty_storage, + model_cls=model_cls, + model_kwargs=dict( + name=name, + type_name=type_name, + description=description, + _value={}) + ) + + def test_as_argument(self): + + for model_cls in self.MODELS_DERIVED_FROM_PARAMETER: + model = model_cls(name='name', + type_name='type_name', + description='description', + _value={}) + argument = model.as_argument() + assert isinstance(argument, Argument) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/__init__.py new file mode 100644 index 0000000..ae1e83e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/__init__.py @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/__init__.py new file mode 100644 index 0000000..780db07 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/__init__.py @@ -0,0 +1,32 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 sys + +from aria.orchestrator.workflows.core import engine, graph_compiler + + +def op_path(func, module_path=None): + module_path = module_path or sys.modules[__name__].__name__ + return '{0}.{1}'.format(module_path, func.__name__) + + +def execute(workflow_func, workflow_context, executor): + graph = workflow_func(ctx=workflow_context) + + graph_compiler.GraphCompiler(workflow_context, executor.__class__).compile(graph) + eng = engine.Engine(executors={executor.__class__: executor}) + + eng.execute(workflow_context) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_context_instrumentation.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_context_instrumentation.py new file mode 100644 index 0000000..6cc8096 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_context_instrumentation.py @@ -0,0 +1,108 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.modeling import models +from aria.storage import collection_instrumentation +from aria.orchestrator.context import operation + +from tests import ( + mock, + storage +) + + +class TestContextInstrumentation(object): + + @pytest.fixture + def workflow_ctx(self, tmpdir): + context = mock.context.simple(str(tmpdir), inmemory=True) + yield context + storage.release_sqlite_storage(context.model) + + def test_workflow_context_instrumentation(self, workflow_ctx): + with workflow_ctx.model.instrument(models.Node.attributes): + self._run_common_assertions(workflow_ctx, True) + self._run_common_assertions(workflow_ctx, False) + + def test_operation_context_instrumentation(self, workflow_ctx): + node = workflow_ctx.model.node.list()[0] + task = models.Task(node=node) + workflow_ctx.model.task.put(task) + + ctx = operation.NodeOperationContext( + task.id, node.id, name='', service_id=workflow_ctx.model.service.list()[0].id, + model_storage=workflow_ctx.model, resource_storage=workflow_ctx.resource, + execution_id=1) + + with ctx.model.instrument(models.Node.attributes): + self._run_op_assertions(ctx, True) + self._run_common_assertions(ctx, True) + + self._run_op_assertions(ctx, False) + self._run_common_assertions(ctx, False) + + @staticmethod + def ctx_assert(expr, is_under_ctx): + if is_under_ctx: + assert expr + else: + assert not expr + + def _run_op_assertions(self, ctx, is_under_ctx): + self.ctx_assert(isinstance(ctx.node.attributes, + collection_instrumentation._InstrumentedDict), is_under_ctx) + assert not isinstance(ctx.node.properties, + collection_instrumentation._InstrumentedCollection) + + for rel in ctx.node.inbound_relationships: + self.ctx_assert( + isinstance(rel, collection_instrumentation._WrappedModel), is_under_ctx) + self.ctx_assert( + isinstance(rel.source_node.attributes, + collection_instrumentation._InstrumentedDict), + is_under_ctx) + self.ctx_assert( + isinstance(rel.target_node.attributes, + collection_instrumentation._InstrumentedDict), + is_under_ctx) + + def _run_common_assertions(self, ctx, is_under_ctx): + + for node in ctx.model.node: + self.ctx_assert( + isinstance(node.attributes, collection_instrumentation._InstrumentedDict), + is_under_ctx) + assert not isinstance(node.properties, + collection_instrumentation._InstrumentedCollection) + + for rel in ctx.model.relationship: + self.ctx_assert( + isinstance(rel, collection_instrumentation._WrappedModel), is_under_ctx) + + self.ctx_assert( + isinstance(rel.source_node.attributes, + collection_instrumentation._InstrumentedDict), + is_under_ctx) + self.ctx_assert( + isinstance(rel.target_node.attributes, + collection_instrumentation._InstrumentedDict), + is_under_ctx) + + assert not isinstance(rel.source_node.properties, + collection_instrumentation._InstrumentedCollection) + assert not isinstance(rel.target_node.properties, + collection_instrumentation._InstrumentedCollection) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_operation.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_operation.py new file mode 100644 index 0000000..111e121 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_operation.py @@ -0,0 +1,498 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 time + +import pytest + +from aria.orchestrator.workflows.executor import process, thread + +from aria import ( + workflow, + operation, +) +from aria.orchestrator import context +from aria.orchestrator.workflows import api + +import tests +from tests import ( + mock, + storage, + helpers +) +from . import ( + op_path, + execute, +) + + +@pytest.fixture +def ctx(tmpdir): + context = mock.context.simple( + str(tmpdir), + context_kwargs=dict(workdir=str(tmpdir.join('workdir'))) + ) + yield context + storage.release_sqlite_storage(context.model) + + +@pytest.fixture +def thread_executor(): + result = thread.ThreadExecutor() + try: + yield result + finally: + result.close() + + +@pytest.fixture +def dataholder(tmpdir): + dataholder_path = str(tmpdir.join('dataholder')) + holder = helpers.FilesystemDataHolder(dataholder_path) + return holder + + +def test_node_operation_task_execution(ctx, thread_executor, dataholder): + interface_name = 'Standard' + operation_name = 'create' + + arguments = {'putput': True, 'holder_path': dataholder.path} + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface = mock.models.create_interface( + node.service, + interface_name, + operation_name, + operation_kwargs=dict(function=op_path(basic_node_operation, module_path=__name__), + arguments=arguments) + ) + node.interfaces[interface.name] = interface + ctx.model.node.update(node) + + @workflow + def basic_workflow(graph, **_): + graph.add_tasks( + api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=operation_name, + arguments=arguments + ) + ) + + execute(workflow_func=basic_workflow, workflow_context=ctx, executor=thread_executor) + + assert dataholder['ctx_name'] == context.operation.NodeOperationContext.__name__ + + # Task bases assertions + assert dataholder['actor_name'] == node.name + assert dataholder['task_name'] == api.task.OperationTask.NAME_FORMAT.format( + type='node', + name=node.name, + interface=interface_name, + operation=operation_name + ) + operations = interface.operations + assert len(operations) == 1 + assert dataholder['function'] == operations.values()[0].function # pylint: disable=no-member + assert dataholder['arguments']['putput'] is True + + # Context based attributes (sugaring) + assert dataholder['template_name'] == node.node_template.name + assert dataholder['node_name'] == node.name + + +def test_relationship_operation_task_execution(ctx, thread_executor, dataholder): + interface_name = 'Configure' + operation_name = 'post_configure' + + arguments = {'putput': True, 'holder_path': dataholder.path} + relationship = ctx.model.relationship.list()[0] + interface = mock.models.create_interface( + relationship.source_node.service, + interface_name, + operation_name, + operation_kwargs=dict(function=op_path(basic_relationship_operation, module_path=__name__), + arguments=arguments), + ) + + relationship.interfaces[interface.name] = interface + ctx.model.relationship.update(relationship) + + @workflow + def basic_workflow(graph, **_): + graph.add_tasks( + api.task.OperationTask( + relationship, + interface_name=interface_name, + operation_name=operation_name, + arguments=arguments + ) + ) + + execute(workflow_func=basic_workflow, workflow_context=ctx, executor=thread_executor) + + assert dataholder['ctx_name'] == context.operation.RelationshipOperationContext.__name__ + + # Task bases assertions + assert dataholder['actor_name'] == relationship.name + assert interface_name in dataholder['task_name'] + operations = interface.operations + assert dataholder['function'] == operations.values()[0].function # pylint: disable=no-member + assert dataholder['arguments']['putput'] is True + + # Context based attributes (sugaring) + dependency_node_template = ctx.model.node_template.get_by_name( + mock.models.DEPENDENCY_NODE_TEMPLATE_NAME) + dependency_node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + dependent_node_template = ctx.model.node_template.get_by_name( + mock.models.DEPENDENT_NODE_TEMPLATE_NAME) + dependent_node = ctx.model.node.get_by_name(mock.models.DEPENDENT_NODE_NAME) + + assert dataholder['target_node_template_name'] == dependency_node_template.name + assert dataholder['target_node_name'] == dependency_node.name + assert dataholder['relationship_name'] == relationship.name + assert dataholder['source_node_template_name'] == dependent_node_template.name + assert dataholder['source_node_name'] == dependent_node.name + + +def test_invalid_task_operation_id(ctx, thread_executor, dataholder): + """ + Checks that the right id is used. The task created with id == 1, thus running the task on + node with id == 2. will check that indeed the node uses the correct id. + :param ctx: + :param thread_executor: + :return: + """ + interface_name = 'Standard' + operation_name = 'create' + + other_node, node = ctx.model.node.list() + assert other_node.id == 1 + assert node.id == 2 + + interface = mock.models.create_interface( + node.service, + interface_name=interface_name, + operation_name=operation_name, + operation_kwargs=dict(function=op_path(get_node_id, module_path=__name__), + arguments={'holder_path': dataholder.path}) + ) + node.interfaces[interface.name] = interface + ctx.model.node.update(node) + + @workflow + def basic_workflow(graph, **_): + graph.add_tasks( + api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=operation_name, + ) + ) + + execute(workflow_func=basic_workflow, workflow_context=ctx, executor=thread_executor) + + op_node_id = dataholder[api.task.OperationTask.NAME_FORMAT.format( + type='node', + name=node.name, + interface=interface_name, + operation=operation_name + )] + assert op_node_id == node.id + assert op_node_id != other_node.id + + +def test_plugin_workdir(ctx, thread_executor, tmpdir): + interface_name = 'Standard' + operation_name = 'create' + + plugin = mock.models.create_plugin() + ctx.model.plugin.put(plugin) + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + filename = 'test_file' + content = 'file content' + arguments = {'filename': filename, 'content': content} + interface = mock.models.create_interface( + node.service, + interface_name, + operation_name, + operation_kwargs=dict( + function='{0}.{1}'.format(__name__, _test_plugin_workdir.__name__), + plugin=plugin, + arguments=arguments) + ) + node.interfaces[interface.name] = interface + ctx.model.node.update(node) + + @workflow + def basic_workflow(graph, **_): + graph.add_tasks(api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=operation_name, + arguments=arguments)) + + execute(workflow_func=basic_workflow, workflow_context=ctx, executor=thread_executor) + expected_file = tmpdir.join('workdir', 'plugins', str(ctx.service.id), + plugin.name, + filename) + assert expected_file.read() == content + + +@pytest.fixture(params=[ + (thread.ThreadExecutor, {}), + (process.ProcessExecutor, {'python_path': [tests.ROOT_DIR]}), +]) +def executor(request): + ex_cls, kwargs = request.param + ex = ex_cls(**kwargs) + try: + yield ex + finally: + ex.close() + + +def test_node_operation_logging(ctx, executor): + interface_name, operation_name = mock.operations.NODE_OPERATIONS_INSTALL[0] + + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + + arguments = { + 'op_start': 'op_start', + 'op_end': 'op_end', + } + interface = mock.models.create_interface( + node.service, + interface_name, + operation_name, + operation_kwargs=dict( + function=op_path(logged_operation, module_path=__name__), + arguments=arguments) + ) + node.interfaces[interface.name] = interface + ctx.model.node.update(node) + + @workflow + def basic_workflow(graph, **_): + graph.add_tasks( + api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=operation_name, + arguments=arguments + ) + ) + execute(workflow_func=basic_workflow, workflow_context=ctx, executor=executor) + _assert_loggins(ctx, arguments) + + +def test_relationship_operation_logging(ctx, executor): + interface_name, operation_name = mock.operations.RELATIONSHIP_OPERATIONS_INSTALL[0] + + relationship = ctx.model.relationship.list()[0] + arguments = { + 'op_start': 'op_start', + 'op_end': 'op_end', + } + interface = mock.models.create_interface( + relationship.source_node.service, + interface_name, + operation_name, + operation_kwargs=dict(function=op_path(logged_operation, module_path=__name__), + arguments=arguments) + ) + relationship.interfaces[interface.name] = interface + ctx.model.relationship.update(relationship) + + @workflow + def basic_workflow(graph, **_): + graph.add_tasks( + api.task.OperationTask( + relationship, + interface_name=interface_name, + operation_name=operation_name, + arguments=arguments + ) + ) + + execute(workflow_func=basic_workflow, workflow_context=ctx, executor=executor) + _assert_loggins(ctx, arguments) + + +def test_attribute_consumption(ctx, executor, dataholder): + # region Updating node operation + node_int_name, node_op_name = mock.operations.NODE_OPERATIONS_INSTALL[0] + + source_node = ctx.model.node.get_by_name(mock.models.DEPENDENT_NODE_NAME) + + arguments = {'dict_': {'key': 'value'}, + 'set_test_dict': {'key2': 'value2'}} + interface = mock.models.create_interface( + source_node.service, + node_int_name, + node_op_name, + operation_kwargs=dict( + function=op_path(attribute_altering_operation, module_path=__name__), + arguments=arguments) + ) + source_node.interfaces[interface.name] = interface + ctx.model.node.update(source_node) + # endregion + + # region updating relationship operation + rel_int_name, rel_op_name = mock.operations.RELATIONSHIP_OPERATIONS_INSTALL[2] + + relationship = ctx.model.relationship.list()[0] + interface = mock.models.create_interface( + relationship.source_node.service, + rel_int_name, + rel_op_name, + operation_kwargs=dict( + function=op_path(attribute_consuming_operation, module_path=__name__), + arguments={'holder_path': dataholder.path} + ) + ) + relationship.interfaces[interface.name] = interface + ctx.model.relationship.update(relationship) + # endregion + + @workflow + def basic_workflow(graph, **_): + graph.sequence( + api.task.OperationTask( + source_node, + interface_name=node_int_name, + operation_name=node_op_name, + arguments=arguments + ), + api.task.OperationTask( + relationship, + interface_name=rel_int_name, + operation_name=rel_op_name, + ) + ) + + execute(workflow_func=basic_workflow, workflow_context=ctx, executor=executor) + target_node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + + assert len(source_node.attributes) == len(target_node.attributes) == 2 + assert source_node.attributes['key'] != target_node.attributes['key'] + assert source_node.attributes['key'].value == \ + target_node.attributes['key'].value == \ + dataholder['key'] == 'value' + + assert source_node.attributes['key2'] != target_node.attributes['key2'] + assert source_node.attributes['key2'].value == \ + target_node.attributes['key2'].value == \ + dataholder['key2'] == 'value2' + + +def _assert_loggins(ctx, arguments): + # The logs should contain the following: Workflow Start, Operation Start, custom operation + # log string (op_start), custom operation log string (op_end), Operation End, Workflow End. + + executions = ctx.model.execution.list() + assert len(executions) == 1 + execution = executions[0] + + tasks = ctx.model.task.list(filters={'_stub_type': None}) + assert len(tasks) == 1 + task = tasks[0] + assert len(task.logs) == 4 + + logs = ctx.model.log.list() + assert len(logs) == len(execution.logs) == 6 + assert set(logs) == set(execution.logs) + + assert all(l.execution == execution for l in logs) + assert all(l in logs and l.task == task for l in task.logs) + + op_start_log = [l for l in logs if arguments['op_start'] in l.msg and l.level.lower() == 'info'] + assert len(op_start_log) == 1 + op_start_log = op_start_log[0] + + op_end_log = [l for l in logs if arguments['op_end'] in l.msg and l.level.lower() == 'debug'] + assert len(op_end_log) == 1 + op_end_log = op_end_log[0] + + assert op_start_log.created_at < op_end_log.created_at + + +@operation +def logged_operation(ctx, **_): + ctx.logger.info(ctx.task.arguments['op_start'].value) + # enables to check the relation between the created_at field properly + time.sleep(1) + ctx.logger.debug(ctx.task.arguments['op_end'].value) + + +@operation +def basic_node_operation(ctx, holder_path, **_): + holder = helpers.FilesystemDataHolder(holder_path) + + operation_common(ctx, holder) + holder['template_name'] = ctx.node_template.name + holder['node_name'] = ctx.node.name + + +@operation +def basic_relationship_operation(ctx, holder_path, **_): + holder = helpers.FilesystemDataHolder(holder_path) + + operation_common(ctx, holder) + holder['target_node_template_name'] = ctx.target_node_template.name + holder['target_node_name'] = ctx.target_node.name + holder['relationship_name'] = ctx.relationship.name + holder['source_node_template_name'] = ctx.source_node_template.name + holder['source_node_name'] = ctx.source_node.name + + +def operation_common(ctx, holder): + holder['ctx_name'] = ctx.__class__.__name__ + + holder['actor_name'] = ctx.task.actor.name + holder['task_name'] = ctx.task.name + holder['function'] = ctx.task.function + holder['arguments'] = dict(i.unwrapped for i in ctx.task.arguments.itervalues()) + + +@operation +def get_node_id(ctx, holder_path, **_): + helpers.FilesystemDataHolder(holder_path)[ctx.name] = ctx.node.id + + +@operation +def _test_plugin_workdir(ctx, filename, content): + with open(os.path.join(ctx.plugin_workdir, filename), 'w') as f: + f.write(content) + + +@operation +def attribute_altering_operation(ctx, dict_, set_test_dict, **_): + ctx.node.attributes.update(dict_) + + for key, value in set_test_dict.items(): + ctx.node.attributes[key] = value + + +@operation +def attribute_consuming_operation(ctx, holder_path, **_): + holder = helpers.FilesystemDataHolder(holder_path) + ctx.target_node.attributes.update(ctx.source_node.attributes) + holder.update(**ctx.target_node.attributes) + + ctx.target_node.attributes['key2'] = ctx.source_node.attributes['key2'] + holder['key2'] = ctx.target_node.attributes['key2'] diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_resource_render.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_resource_render.py new file mode 100644 index 0000000..8249086 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_resource_render.py @@ -0,0 +1,72 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from tests import mock, storage + +_IMPLICIT_CTX_TEMPLATE = '{{ctx.service.name}}' +_IMPLICIT_CTX_TEMPLATE_PATH = 'implicit-ctx.template' +_VARIABLES_TEMPLATE = '{{variable}}' +_VARIABLES_TEMPLATE_PATH = 'variables.template' + + +def test_get_resource_and_render_implicit_ctx_no_variables(ctx): + content = ctx.get_resource_and_render(_IMPLICIT_CTX_TEMPLATE_PATH) + assert content == mock.models.SERVICE_NAME + + +def test_get_resource_and_render_provided_variables(ctx): + variable = 'VARIABLE' + content = ctx.get_resource_and_render(_VARIABLES_TEMPLATE_PATH, + variables={'variable': variable}) + assert content == variable + + +def test_download_resource_and_render_implicit_ctx_no_variables(tmpdir, ctx): + destination = tmpdir.join('destination') + ctx.download_resource_and_render(destination=str(destination), + path=_IMPLICIT_CTX_TEMPLATE_PATH) + assert destination.read() == mock.models.SERVICE_NAME + + +def test_download_resource_and_render_provided_variables(tmpdir, ctx): + destination = tmpdir.join('destination') + variable = 'VARIABLE' + ctx.download_resource_and_render(destination=str(destination), + path=_VARIABLES_TEMPLATE_PATH, + variables={'variable': variable}) + assert destination.read() == variable + + +@pytest.fixture +def ctx(tmpdir): + context = mock.context.simple(str(tmpdir)) + yield context + storage.release_sqlite_storage(context.model) + + +@pytest.fixture(autouse=True) +def resources(tmpdir, ctx): + implicit_ctx_template_path = tmpdir.join(_IMPLICIT_CTX_TEMPLATE_PATH) + implicit_ctx_template_path.write(_IMPLICIT_CTX_TEMPLATE) + variables_template_path = tmpdir.join(_VARIABLES_TEMPLATE_PATH) + variables_template_path.write(_VARIABLES_TEMPLATE) + ctx.resource.service.upload(entry_id='1', + source=str(implicit_ctx_template_path), + path=_IMPLICIT_CTX_TEMPLATE_PATH) + ctx.resource.service.upload(entry_id='1', + source=str(variables_template_path), + path=_VARIABLES_TEMPLATE_PATH) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_serialize.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_serialize.py new file mode 100644 index 0000000..091e23c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_serialize.py @@ -0,0 +1,104 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.orchestrator.workflows import api +from aria.orchestrator.workflows.core import engine, graph_compiler +from aria.orchestrator.workflows.executor import process +from aria.orchestrator import workflow, operation +import tests +from tests import mock +from tests import storage + +TEST_FILE_CONTENT = 'CONTENT' +TEST_FILE_ENTRY_ID = 'entry' +TEST_FILE_NAME = 'test_file' + + +def test_serialize_operation_context(context, executor, tmpdir): + test_file = tmpdir.join(TEST_FILE_NAME) + test_file.write(TEST_FILE_CONTENT) + resource = context.resource + resource.service_template.upload(TEST_FILE_ENTRY_ID, str(test_file)) + + node = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + plugin = mock.models.create_plugin() + context.model.plugin.put(plugin) + interface = mock.models.create_interface( + node.service, + 'test', + 'op', + operation_kwargs=dict(function=_operation_mapping(), + plugin=plugin) + ) + node.interfaces[interface.name] = interface + context.model.node.update(node) + + graph = _mock_workflow(ctx=context) # pylint: disable=no-value-for-parameter + graph_compiler.GraphCompiler(context, executor.__class__).compile(graph) + eng = engine.Engine({executor.__class__: executor}) + eng.execute(context) + + +@workflow +def _mock_workflow(ctx, graph): + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + graph.add_tasks(api.task.OperationTask(node, interface_name='test', operation_name='op')) + return graph + + +@operation +def _mock_operation(ctx): + # We test several things in this operation + # ctx.task, ctx.node, etc... tell us that the model storage was properly re-created + # a correct ctx.task.function tells us we kept the correct task_id + assert ctx.task.function == _operation_mapping() + # a correct ctx.node.name tells us we kept the correct actor_id + assert ctx.node.name == mock.models.DEPENDENCY_NODE_NAME + # a correct ctx.name tells us we kept the correct name + assert ctx.name is not None + assert ctx.name == ctx.task.name + # a correct ctx.deployment.name tells us we kept the correct deployment_id + assert ctx.service.name == mock.models.SERVICE_NAME + # Here we test that the resource storage was properly re-created + test_file_content = ctx.resource.service_template.read(TEST_FILE_ENTRY_ID, TEST_FILE_NAME) + assert test_file_content == TEST_FILE_CONTENT + # a non empty plugin workdir tells us that we kept the correct base_workdir + assert ctx.plugin_workdir is not None + + +def _operation_mapping(): + return '{name}.{func.__name__}'.format(name=__name__, func=_mock_operation) + + +@pytest.fixture +def executor(): + result = process.ProcessExecutor(python_path=[tests.ROOT_DIR]) + try: + yield result + finally: + result.close() + + +@pytest.fixture +def context(tmpdir): + result = mock.context.simple( + str(tmpdir), + context_kwargs=dict(workdir=str(tmpdir.join('workdir'))) + ) + + yield result + storage.release_sqlite_storage(result.model) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_toolbelt.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_toolbelt.py new file mode 100644 index 0000000..4de9e55 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_toolbelt.py @@ -0,0 +1,164 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria import workflow, operation +from aria.modeling import models +from aria.orchestrator import context +from aria.orchestrator.workflows import api +from aria.orchestrator.workflows.executor import thread + +from tests import ( + mock, + storage, + helpers +) +from . import ( + op_path, + execute, +) + + +@pytest.fixture +def workflow_context(tmpdir): + context = mock.context.simple(str(tmpdir)) + yield context + storage.release_sqlite_storage(context.model) + + +@pytest.fixture +def executor(): + result = thread.ThreadExecutor() + try: + yield result + finally: + result.close() + + +@pytest.fixture +def dataholder(tmpdir): + dataholder_path = str(tmpdir.join('dataholder')) + holder = helpers.FilesystemDataHolder(dataholder_path) + return holder + + +def _get_elements(workflow_context): + dependency_node_template = workflow_context.model.node_template.get_by_name( + mock.models.DEPENDENCY_NODE_TEMPLATE_NAME) + dependency_node_template.host = dependency_node_template + workflow_context.model.node.update(dependency_node_template) + + dependency_node = workflow_context.model.node.get_by_name( + mock.models.DEPENDENCY_NODE_NAME) + dependency_node.host_fk = dependency_node.id + workflow_context.model.node.update(dependency_node) + + dependent_node_template = workflow_context.model.node_template.get_by_name( + mock.models.DEPENDENT_NODE_TEMPLATE_NAME) + dependent_node_template.host = dependency_node_template + workflow_context.model.node_template.update(dependent_node_template) + + dependent_node = workflow_context.model.node.get_by_name( + mock.models.DEPENDENT_NODE_NAME) + dependent_node.host = dependent_node + workflow_context.model.node.update(dependent_node) + + relationship = workflow_context.model.relationship.list()[0] + return dependency_node_template, dependency_node, dependent_node_template, dependent_node, \ + relationship + + +def test_host_ip(workflow_context, executor, dataholder): + + interface_name = 'Standard' + operation_name = 'create' + _, dependency_node, _, _, _ = _get_elements(workflow_context) + arguments = {'putput': True, 'holder_path': dataholder.path} + interface = mock.models.create_interface( + dependency_node.service, + interface_name=interface_name, + operation_name=operation_name, + operation_kwargs=dict(function=op_path(host_ip, module_path=__name__), arguments=arguments) + ) + dependency_node.interfaces[interface.name] = interface + dependency_node.attributes['ip'] = models.Attribute.wrap('ip', '1.1.1.1') + + workflow_context.model.node.update(dependency_node) + + @workflow + def basic_workflow(graph, **_): + graph.add_tasks( + api.task.OperationTask( + dependency_node, + interface_name=interface_name, + operation_name=operation_name, + arguments=arguments + ) + ) + + execute(workflow_func=basic_workflow, workflow_context=workflow_context, executor=executor) + + assert dataholder.get('host_ip') == dependency_node.attributes.get('ip').value + + +def test_relationship_tool_belt(workflow_context, executor, dataholder): + interface_name = 'Configure' + operation_name = 'post_configure' + _, _, _, _, relationship = _get_elements(workflow_context) + arguments = {'putput': True, 'holder_path': dataholder.path} + interface = mock.models.create_interface( + relationship.source_node.service, + interface_name=interface_name, + operation_name=operation_name, + operation_kwargs=dict(function=op_path(relationship_operation, module_path=__name__), + arguments=arguments) + ) + relationship.interfaces[interface.name] = interface + workflow_context.model.relationship.update(relationship) + + @workflow + def basic_workflow(graph, **_): + graph.add_tasks( + api.task.OperationTask( + relationship, + interface_name=interface_name, + operation_name=operation_name, + arguments=arguments + ) + ) + + execute(workflow_func=basic_workflow, workflow_context=workflow_context, executor=executor) + + assert dataholder.get(api.task.OperationTask.NAME_FORMAT.format( + type='relationship', + name=relationship.name, + interface=interface_name, + operation=operation_name)) == relationship.source_node.name + + +def test_wrong_model_toolbelt(): + with pytest.raises(RuntimeError): + context.toolbelt(None) + + +@operation(toolbelt=True) +def host_ip(toolbelt, holder_path, **_): + helpers.FilesystemDataHolder(holder_path)['host_ip'] = toolbelt.host_ip + + +@operation(toolbelt=True) +def relationship_operation(ctx, toolbelt, holder_path, **_): + helpers.FilesystemDataHolder(holder_path)[ctx.name] = toolbelt._op_context.source_node.name diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_workflow.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_workflow.py new file mode 100644 index 0000000..6d53c2a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/context/test_workflow.py @@ -0,0 +1,126 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 datetime import datetime + +import pytest + +from aria import application_model_storage, workflow +from aria.orchestrator import context +from aria.storage import sql_mapi +from aria.orchestrator.workflows.executor import thread, process + +from tests import storage as test_storage, ROOT_DIR +from ... import mock +from . import execute + + +class TestWorkflowContext(object): + + def test_execution_creation_on_workflow_context_creation(self, storage): + ctx = self._create_ctx(storage) + execution = storage.execution.get(ctx.execution.id) # pylint: disable=no-member + assert execution.service == storage.service.get_by_name( + mock.models.SERVICE_NAME) + assert execution.workflow_name == mock.models.WORKFLOW_NAME + assert execution.service_template == storage.service_template.get_by_name( + mock.models.SERVICE_TEMPLATE_NAME) + assert execution.status == storage.execution.model_cls.PENDING + assert execution.inputs == {} + assert execution.created_at <= datetime.utcnow() + + def test_subsequent_workflow_context_creation_do_not_fail(self, storage): + self._create_ctx(storage) + self._create_ctx(storage) + + @staticmethod + def _create_ctx(storage): + """ + + :param storage: + :return WorkflowContext: + """ + service = storage.service.get_by_name(mock.models.SERVICE_NAME) + return context.workflow.WorkflowContext( + name='simple_context', + model_storage=storage, + resource_storage=None, + service_id=service, + execution_id=storage.execution.list(filters=dict(service=service))[0].id, + workflow_name=mock.models.WORKFLOW_NAME, + task_max_attempts=mock.models.TASK_MAX_ATTEMPTS, + task_retry_interval=mock.models.TASK_RETRY_INTERVAL + ) + + @pytest.fixture + def storage(self): + workflow_storage = application_model_storage( + sql_mapi.SQLAlchemyModelAPI, initiator=test_storage.init_inmemory_model_storage) + workflow_storage.service_template.put(mock.models.create_service_template()) + service_template = workflow_storage.service_template.get_by_name( + mock.models.SERVICE_TEMPLATE_NAME) + service = mock.models.create_service(service_template) + workflow_storage.service.put(service) + workflow_storage.execution.put(mock.models.create_execution(service)) + yield workflow_storage + test_storage.release_sqlite_storage(workflow_storage) + + +@pytest.fixture +def ctx(tmpdir): + context = mock.context.simple( + str(tmpdir), + context_kwargs=dict(workdir=str(tmpdir.join('workdir'))) + ) + yield context + test_storage.release_sqlite_storage(context.model) + + +@pytest.fixture(params=[ + (thread.ThreadExecutor, {}), + (process.ProcessExecutor, {'python_path': [ROOT_DIR]}), +]) +def executor(request): + executor_cls, executor_kwargs = request.param + result = executor_cls(**executor_kwargs) + try: + yield result + finally: + result.close() + + +def test_attribute_consumption(ctx, executor): + + node = ctx.model.node.get_by_name(mock.models.DEPENDENT_NODE_NAME) + node.attributes['key'] = ctx.model.attribute.model_cls.wrap('key', 'value') + node.attributes['key2'] = ctx.model.attribute.model_cls.wrap('key2', 'value_to_change') + ctx.model.node.update(node) + + assert node.attributes['key'].value == 'value' + assert node.attributes['key2'].value == 'value_to_change' + + @workflow + def basic_workflow(ctx, **_): + node = ctx.model.node.get_by_name(mock.models.DEPENDENT_NODE_NAME) + node.attributes['new_key'] = 'new_value' + node.attributes['key2'] = 'changed_value' + + execute(workflow_func=basic_workflow, workflow_context=ctx, executor=executor) + node = ctx.model.node.get_by_name(mock.models.DEPENDENT_NODE_NAME) + + assert len(node.attributes) == 3 + assert node.attributes['key'].value == 'value' + assert node.attributes['new_key'].value == 'new_value' + assert node.attributes['key2'].value == 'changed_value' diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/__init__.py new file mode 100644 index 0000000..ae1e83e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/__init__.py @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_common.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_common.py new file mode 100644 index 0000000..dd1e9fb --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_common.py @@ -0,0 +1,193 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 collections import namedtuple + +import requests +import pytest + +from aria.modeling import models +from aria.orchestrator import exceptions +from aria.orchestrator.execution_plugin import common + + +class TestDownloadScript(object): + + @pytest.fixture(autouse=True) + def patch_requests(self, mocker): + def _mock_requests_get(url): + response = namedtuple('Response', 'text status_code') + return response(url, self.status_code) + self.status_code = 200 + mocker.patch.object(requests, 'get', _mock_requests_get) + + def _test_url(self, url): + class Ctx(object): + task = models.Task + + script_path = url + result = common.download_script(Ctx, script_path) + with open(result) as f: + assert script_path == f.read() + assert result.endswith('-some_script.py') + + def test_http_url(self): + self._test_url('http://localhost/some_script.py') + + def test_https_url(self): + self._test_url('https://localhost/some_script.py') + + def test_url_status_code_404(self): + self.status_code = 404 + with pytest.raises(exceptions.TaskAbortException) as exc_ctx: + self.test_http_url() + exception = exc_ctx.value + assert 'status code: 404' in str(exception) + + def test_blueprint_resource(self): + test_script_path = 'my_script.py' + + class Ctx(object): + @staticmethod + def download_resource(destination, path): + assert path == test_script_path + return destination + result = common.download_script(Ctx, test_script_path) + assert result.endswith(test_script_path) + + +class TestCreateProcessConfig(object): + + def test_plain_command(self): + script_path = 'path' + process = common.create_process_config( + script_path=script_path, + process={}, + operation_kwargs={}) + assert process['command'] == script_path + + def test_command_with_args(self): + script_path = 'path' + process = {'args': [1, 2, 3]} + process = common.create_process_config( + script_path=script_path, + process=process, + operation_kwargs={}) + assert process['command'] == '{0} 1 2 3'.format(script_path) + + def test_command_prefix(self): + script_path = 'path' + command_prefix = 'prefix' + process = {'command_prefix': command_prefix} + process = common.create_process_config( + script_path=script_path, + process=process, + operation_kwargs={}) + assert process['command'] == '{0} {1}'.format(command_prefix, script_path) + + def test_command_with_args_and_prefix(self): + script_path = 'path' + command_prefix = 'prefix' + process = {'command_prefix': command_prefix, + 'args': [1, 2, 3]} + process = common.create_process_config( + script_path=script_path, + process=process, + operation_kwargs={}) + assert process['command'] == '{0} {1} 1 2 3'.format(command_prefix, script_path) + + def test_ctx_is_removed(self): + process = common.create_process_config( + script_path='', + process={}, + operation_kwargs={'ctx': 1}) + assert 'ctx' not in process['env'] + + def test_env_passed_explicitly(self): + env = {'one': '1', 'two': '2'} + process = common.create_process_config( + script_path='', + process={'env': env}, + operation_kwargs={}) + assert process['env'] == env + + def test_env_populated_from_operation_kwargs(self): + operation_kwargs = {'one': '1', 'two': '2'} + process = common.create_process_config( + script_path='', + process={}, + operation_kwargs=operation_kwargs) + assert process['env'] == operation_kwargs + + def test_env_merged_from_operation_kwargs_and_process(self): + operation_kwargs = {'one': '1', 'two': '2'} + env = {'three': '3', 'four': '4'} + process = common.create_process_config( + script_path='', + process={'env': env}, + operation_kwargs=operation_kwargs) + assert process['env'] == dict(operation_kwargs.items() + env.items()) + + def test_process_env_gets_precedence_over_operation_kwargs(self): + operation_kwargs = {'one': 'from_kwargs'} + env = {'one': 'from_env_process'} + process = common.create_process_config( + script_path='', + process={'env': env}, + operation_kwargs=operation_kwargs) + assert process['env'] == env + + def test_json_env_vars(self, mocker): + mocker.patch.object(common, 'is_windows', lambda: False) + operation_kwargs = {'a_dict': {'key': 'value'}, + 'a_list': ['a', 'b', 'c'], + 'a_tuple': (4, 5, 6), + 'a_bool': True} + process = common.create_process_config( + script_path='', + process={}, + operation_kwargs=operation_kwargs) + assert process['env'] == {'a_dict': '{"key": "value"}', + 'a_list': '["a", "b", "c"]', + 'a_tuple': '[4, 5, 6]', + 'a_bool': 'true'} + + def test_quote_json_env_vars(self): + operation_kwargs = {'one': []} + process = common.create_process_config( + script_path='', + process={}, + operation_kwargs=operation_kwargs, + quote_json_env_vars=True) + assert process['env']['one'] == "'[]'" + + def test_env_keys_converted_to_string_on_windows(self, mocker): + mocker.patch.object(common, 'is_windows', lambda: True) + env = {u'one': '1'} + process = common.create_process_config( + script_path='', + process={'env': env}, + operation_kwargs={}) + print type(process['env'].keys()[0]) + assert isinstance(process['env'].keys()[0], str) + + def test_env_values_quotes_are_escaped_on_windows(self, mocker): + mocker.patch.object(common, 'is_windows', lambda: True) + env = {'one': '"hello"'} + process = common.create_process_config( + script_path='', + process={'env': env}, + operation_kwargs={}) + assert process['env']['one'] == '\\"hello\\"' diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_ctx_proxy_server.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_ctx_proxy_server.py new file mode 100644 index 0000000..94b7409 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_ctx_proxy_server.py @@ -0,0 +1,285 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 time +import sys +import subprocess +import StringIO + +import pytest + +from aria.orchestrator.execution_plugin import ctx_proxy + + +class TestCtxProxy(object): + + def test_attribute_access(self, server): + response = self.request(server, 'stub_attr', 'some_property') + assert response == 'some_value' + + def test_sugared_attribute_access(self, server): + response = self.request(server, 'stub-attr', 'some-property') + assert response == 'some_value' + + def test_dict_prop_access_get_key(self, server): + response = self.request(server, 'node', 'properties', 'prop1') + assert response == 'value1' + + def test_dict_prop_access_get_key_nested(self, server): + response = self.request(server, 'node', 'properties', 'prop2', 'nested_prop1') + assert response == 'nested_value1' + + def test_dict_prop_access_get_with_list_index(self, server): + response = self.request(server, 'node', 'properties', 'prop3', 2, 'value') + assert response == 'value_2' + + def test_dict_prop_access_set(self, server, ctx): + self.request(server, 'node', 'properties', 'prop4', 'key', '=', 'new_value') + self.request(server, 'node', 'properties', 'prop3', 2, 'value', '=', 'new_value_2') + self.request(server, 'node', 'properties', 'prop4', 'some', 'new', 'path', '=', + 'some_new_value') + assert ctx.node.properties['prop4']['key'] == 'new_value' + assert ctx.node.properties['prop3'][2]['value'] == 'new_value_2' + assert ctx.node.properties['prop4']['some']['new']['path'] == 'some_new_value' + + def test_dict_prop_access_set_with_list_index(self, server, ctx): + self.request(server, 'node', 'properties', 'prop3', 2, '=', 'new_value') + assert ctx.node.properties['prop3'][2] == 'new_value' + + def test_illegal_dict_access(self, server): + self.request(server, 'node', 'properties', 'prop4', 'key', '=', 'new_value') + with pytest.raises(RuntimeError): + self.request(server, 'node', 'properties', 'prop4', 'key', '=', 'new_value', 'what') + + def test_method_invocation(self, server): + args = ['[', 'arg1', 'arg2', 'arg3', ']'] + response_args = self.request(server, 'stub-method', *args) + assert response_args == args[1:-1] + + def test_method_invocation_no_args(self, server): + response = self.request(server, 'stub-method', '[', ']') + assert response == [] + + def test_method_return_value(self, server, ctx): + response_args = self.request(server, 'node', 'get_prop', '[', 'prop2', ']', 'nested_prop1') + assert response_args == 'nested_value1' + + def test_method_return_value_set(self, server, ctx): + self.request( + server, 'node', 'get_prop', '[', 'prop2', ']', 'nested_prop1', '=', 'new_value') + assert ctx.node.properties['prop2']['nested_prop1'] == 'new_value' + + def test_empty_return_value(self, server): + response = self.request(server, 'stub_none') + assert response is None + + def test_client_request_timeout(self, server): + with pytest.raises(IOError): + ctx_proxy.client._client_request(server.socket_url, + args=['stub-sleep', '[', '0.5', ']'], + timeout=0.1) + + def test_processing_exception(self, server): + with pytest.raises(ctx_proxy.client._RequestError): + self.request(server, 'property_that_does_not_exist') + + def test_not_json_serializable(self, server): + with pytest.raises(ctx_proxy.client._RequestError): + self.request(server, 'logger') + + def test_no_string_arg(self, server): + args = ['[', 1, 2, ']'] + response = self.request(server, 'stub_method', *args) + assert response == args[1:-1] + + class StubAttribute(object): + some_property = 'some_value' + + class NodeAttribute(object): + def __init__(self, properties): + self.properties = properties + + def get_prop(self, name): + return self.properties[name] + + @staticmethod + def stub_method(*args): + return args + + @staticmethod + def stub_sleep(seconds): + time.sleep(float(seconds)) + + @staticmethod + def stub_args(arg1, arg2, arg3='arg3', arg4='arg4', *args, **kwargs): + return dict( + arg1=arg1, + arg2=arg2, + arg3=arg3, + arg4=arg4, + args=args, + kwargs=kwargs) + + @pytest.fixture + def ctx(self, mocker): + class MockCtx(object): + INSTRUMENTATION_FIELDS = () + ctx = MockCtx() + properties = { + 'prop1': 'value1', + 'prop2': { + 'nested_prop1': 'nested_value1' + }, + 'prop3': [ + {'index': 0, 'value': 'value_0'}, + {'index': 1, 'value': 'value_1'}, + {'index': 2, 'value': 'value_2'} + ], + 'prop4': { + 'key': 'value' + } + } + ctx.stub_none = None + ctx.stub_method = TestCtxProxy.stub_method + ctx.stub_sleep = TestCtxProxy.stub_sleep + ctx.stub_args = TestCtxProxy.stub_args + ctx.stub_attr = TestCtxProxy.StubAttribute() + ctx.node = TestCtxProxy.NodeAttribute(properties) + ctx.model = mocker.MagicMock() + return ctx + + @pytest.fixture + def server(self, ctx): + result = ctx_proxy.server.CtxProxy(ctx) + result._close_session = lambda *args, **kwargs: {} + yield result + result.close() + + def request(self, server, *args): + return ctx_proxy.client._client_request(server.socket_url, args, timeout=5) + + +class TestArgumentParsing(object): + + def test_socket_url_arg(self): + self.expected.update(dict(socket_url='sock_url')) + ctx_proxy.client.main(['--socket-url', self.expected.get('socket_url')]) + + def test_socket_url_env(self): + expected_socket_url = 'env_sock_url' + os.environ['CTX_SOCKET_URL'] = expected_socket_url + self.expected.update(dict(socket_url=expected_socket_url)) + ctx_proxy.client.main([]) + + def test_socket_url_missing(self): + del os.environ['CTX_SOCKET_URL'] + with pytest.raises(RuntimeError): + ctx_proxy.client.main([]) + + def test_args(self): + self.expected.update(dict(args=['1', '2', '3'])) + ctx_proxy.client.main(self.expected.get('args')) + + def test_timeout(self): + self.expected.update(dict(timeout='10')) + ctx_proxy.client.main(['--timeout', self.expected.get('timeout')]) + self.expected.update(dict(timeout='15')) + ctx_proxy.client.main(['-t', self.expected.get('timeout')]) + + def test_mixed_order(self): + self.expected.update(dict( + args=['1', '2', '3'], timeout='20', socket_url='mixed_socket_url')) + ctx_proxy.client.main( + ['-t', self.expected.get('timeout')] + + ['--socket-url', self.expected.get('socket_url')] + + self.expected.get('args')) + ctx_proxy.client.main( + ['-t', self.expected.get('timeout')] + + self.expected.get('args') + + ['--socket-url', self.expected.get('socket_url')]) + ctx_proxy.client.main( + self.expected.get('args') + + ['-t', self.expected.get('timeout')] + + ['--socket-url', self.expected.get('socket_url')]) + + def test_json_args(self): + args = ['@1', '@[1,2,3]', '@{"key":"value"}'] + expected_args = [1, [1, 2, 3], {'key': 'value'}] + self.expected.update(dict(args=expected_args)) + ctx_proxy.client.main(args) + + def test_json_arg_prefix(self): + args = ['_1', '@1'] + expected_args = [1, '@1'] + self.expected.update(dict(args=expected_args)) + ctx_proxy.client.main(args + ['--json-arg-prefix', '_']) + + def test_json_output(self): + self.assert_valid_output('string', 'string', '"string"') + self.assert_valid_output(1, '1', '1') + self.assert_valid_output([1, '2'], "[1, '2']", '[1, "2"]') + self.assert_valid_output({'key': 1}, + "{'key': 1}", + '{"key": 1}') + self.assert_valid_output(False, 'False', 'false') + self.assert_valid_output(True, 'True', 'true') + self.assert_valid_output([], '[]', '[]') + self.assert_valid_output({}, '{}', '{}') + + def assert_valid_output(self, response, ex_typed_output, ex_json_output): + self.mock_response = response + current_stdout = sys.stdout + + def run(args, expected): + output = StringIO.StringIO() + sys.stdout = output + ctx_proxy.client.main(args) + assert output.getvalue() == expected + + try: + run([], ex_typed_output) + run(['-j'], ex_json_output) + run(['--json-output'], ex_json_output) + finally: + sys.stdout = current_stdout + + def mock_client_request(self, socket_url, args, timeout): + assert socket_url == self.expected.get('socket_url') + assert args == self.expected.get('args') + assert timeout == int(self.expected.get('timeout')) + return self.mock_response + + @pytest.fixture(autouse=True) + def patch_client_request(self, mocker): + mocker.patch.object(ctx_proxy.client, + ctx_proxy.client._client_request.__name__, + self.mock_client_request) + mocker.patch.dict('os.environ', {'CTX_SOCKET_URL': 'stub'}) + + @pytest.fixture(autouse=True) + def defaults(self): + self.expected = dict(args=[], timeout=30, socket_url='stub') + self.mock_response = None + + +class TestCtxEntryPoint(object): + + def test_ctx_in_path(self): + p = subprocess.Popen(['ctx', '--help'], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + p.communicate() + assert not p.wait() diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_global_ctx.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_global_ctx.py new file mode 100644 index 0000000..dad7547 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_global_ctx.py @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.orchestrator import execution_plugin + + +def test_python_script_scope(): + assert execution_plugin.ctx is None + assert execution_plugin.inputs is None + ctx = object() + inputs = object() + with execution_plugin.python_script_scope(operation_ctx=ctx, operation_inputs=inputs): + assert execution_plugin.ctx is ctx + assert execution_plugin.inputs is inputs + assert execution_plugin.ctx is None + assert execution_plugin.inputs is None diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_local.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_local.py new file mode 100644 index 0000000..7f33318 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_local.py @@ -0,0 +1,598 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria import workflow +from aria.orchestrator import events +from aria.orchestrator.workflows import api +from aria.orchestrator.workflows.exceptions import ExecutorException +from aria.orchestrator.exceptions import TaskAbortException, TaskRetryException +from aria.orchestrator.execution_plugin import operations +from aria.orchestrator.execution_plugin.exceptions import ProcessException +from aria.orchestrator.execution_plugin import local +from aria.orchestrator.execution_plugin import constants +from aria.orchestrator.workflows.executor import process +from aria.orchestrator.workflows.core import engine, graph_compiler + +from tests import mock +from tests import storage +from tests.orchestrator.workflows.helpers import events_collector + +IS_WINDOWS = os.name == 'nt' + + +class TestLocalRunScript(object): + + def test_script_path_parameter(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx node attributes map key = value + ''', + windows_script=''' + ctx node attributes map key = value + ''') + props = self._run( + executor, workflow_context, + script_path=script_path) + assert props['map'].value['key'] == 'value' + + def test_process_env(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx node attributes map key1 = "$key1" + ctx node attributes map key2 = "$key2" + ''', + windows_script=''' + ctx node attributes map key1 = %key1% + ctx node attributes map key2 = %key2% + ''') + props = self._run( + executor, workflow_context, + script_path=script_path, + process={ + 'env': { + 'key1': 'value1', + 'key2': 'value2' + } + }) + p_map = props['map'].value + assert p_map['key1'] == 'value1' + assert p_map['key2'] == 'value2' + + def test_process_cwd(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx node attributes map cwd = "$PWD" + ''', + windows_script=''' + ctx node attributes map cwd = %CD% + ''') + tmpdir = str(tmpdir) + props = self._run( + executor, workflow_context, + script_path=script_path, + process={ + 'cwd': tmpdir + }) + p_map = props['map'].value + assert p_map['cwd'] == tmpdir + + def test_process_command_prefix(self, executor, workflow_context, tmpdir): + use_ctx = 'ctx node attributes map key = value' + python_script = ['import subprocess', + 'subprocess.Popen("{0}".split(' ')).communicate()[0]'.format(use_ctx)] + python_script = '\n'.join(python_script) + script_path = self._create_script( + tmpdir, + linux_script=python_script, + windows_script=python_script, + windows_suffix='', + linux_suffix='') + props = self._run( + executor, workflow_context, + script_path=script_path, + process={ + 'env': {'TEST_KEY': 'value'}, + 'command_prefix': 'python' + }) + p_map = props['map'].value + assert p_map['key'] == 'value' + + def test_process_args(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx node attributes map arg1 = "$1" + ctx node attributes map arg2 = "$2" + ''', + windows_script=''' + ctx node attributes map arg1 = %1 + ctx node attributes map arg2 = %2 + ''') + props = self._run( + executor, workflow_context, + script_path=script_path, + process={ + 'args': ['"arg with spaces"', 'arg2'] + }) + assert props['map'].value['arg1'] == 'arg with spaces' + assert props['map'].value['arg2'] == 'arg2' + + def test_no_script_path(self, executor, workflow_context): + exception = self._run_and_get_task_exception( + executor, workflow_context, + script_path=None) + assert isinstance(exception, TaskAbortException) + assert 'script_path' in exception.message + + def test_script_error(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + echo 123123 + command_that_does_not_exist [ ] + ''', + windows_script=''' + @echo off + echo 123123 + command_that_does_not_exist [ ] + ''') + exception = self._run_and_get_task_exception( + executor, workflow_context, + script_path=script_path) + assert isinstance(exception, ProcessException) + assert os.path.basename(script_path) in exception.command + assert exception.exit_code == 1 if IS_WINDOWS else 127 + assert exception.stdout.strip() == '123123' + assert 'command_that_does_not_exist' in exception.stderr + + def test_script_error_from_bad_ctx_request(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx property_that_does_not_exist + ''', + windows_script=''' + ctx property_that_does_not_exist + ''') + exception = self._run_and_get_task_exception( + executor, workflow_context, + script_path=script_path) + assert isinstance(exception, ProcessException) + assert os.path.basename(script_path) in exception.command + assert exception.exit_code == 1 + assert 'RequestError' in exception.stderr + assert 'property_that_does_not_exist' in exception.stderr + + def test_python_script(self, executor, workflow_context, tmpdir): + script = ''' +from aria.orchestrator.execution_plugin import ctx, inputs +if __name__ == '__main__': + ctx.node.attributes['key'] = inputs['key'] +''' + suffix = '.py' + script_path = self._create_script( + tmpdir, + linux_script=script, + windows_script=script, + linux_suffix=suffix, + windows_suffix=suffix) + props = self._run( + executor, workflow_context, + script_path=script_path, + arguments={'key': 'value'}) + assert props['key'].value == 'value' + + @pytest.mark.parametrize( + 'value', ['string-value', [1, 2, 3], 999, 3.14, False, + {'complex1': {'complex2': {'key': 'value'}, 'list': [1, 2, 3]}}]) + def test_inputs_as_environment_variables(self, executor, workflow_context, tmpdir, value): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx node attributes key = "${input_as_env_var}" + ''', + windows_script=''' + ctx node attributes key = "%input_as_env_var%" + ''') + props = self._run( + executor, workflow_context, + script_path=script_path, + env_var=value) + value = props['key'].value + expected = value if isinstance(value, basestring) else json.loads(value) + assert expected == value + + @pytest.mark.parametrize('value', ['override', {'key': 'value'}]) + def test_explicit_env_variables_inputs_override( + self, executor, workflow_context, tmpdir, value): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx node attributes key = "${input_as_env_var}" + ''', + windows_script=''' + ctx node attributes key = "%input_as_env_var%" + ''') + + props = self._run( + executor, workflow_context, + script_path=script_path, + env_var='test-value', + process={ + 'env': { + 'input_as_env_var': value + } + }) + value = props['key'].value + expected = value if isinstance(value, basestring) else json.loads(value) + assert expected == value + + def test_get_nonexistent_runtime_property(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx node attributes nonexistent + ''', + windows_script=''' + ctx node attributes nonexistent + ''') + exception = self._run_and_get_task_exception( + executor, workflow_context, + script_path=script_path) + assert isinstance(exception, ProcessException) + assert os.path.basename(script_path) in exception.command + assert 'RequestError' in exception.stderr + assert 'nonexistent' in exception.stderr + + def test_get_nonexistent_runtime_property_json(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx -j node attributes nonexistent + ''', + windows_script=''' + ctx -j node attributes nonexistent + ''') + exception = self._run_and_get_task_exception( + executor, workflow_context, + script_path=script_path) + assert isinstance(exception, ProcessException) + assert os.path.basename(script_path) in exception.command + assert 'RequestError' in exception.stderr + assert 'nonexistent' in exception.stderr + + def test_abort(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx task abort [ abort-message ] + ''', + windows_script=''' + ctx task abort [ abort-message ] + ''') + exception = self._run_and_get_task_exception( + executor, workflow_context, + script_path=script_path) + assert isinstance(exception, TaskAbortException) + assert exception.message == 'abort-message' + + def test_retry(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx task retry [ retry-message ] + ''', + windows_script=''' + ctx task retry [ retry-message ] + ''') + exception = self._run_and_get_task_exception( + executor, workflow_context, + script_path=script_path) + assert isinstance(exception, TaskRetryException) + assert exception.message == 'retry-message' + + def test_retry_with_interval(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx task retry [ retry-message @100 ] + ''', + windows_script=''' + ctx task retry [ retry-message @100 ] + ''') + exception = self._run_and_get_task_exception( + executor, workflow_context, + script_path=script_path) + assert isinstance(exception, TaskRetryException) + assert exception.message == 'retry-message' + assert exception.retry_interval == 100 + + def test_crash_abort_after_retry(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash + ctx task retry [ retry-message ] + ctx task abort [ should-raise-a-runtime-error ] + ''', + windows_script=''' + ctx task retry [ retry-message ] + ctx task abort [ should-raise-a-runtime-error ] + ''') + exception = self._run_and_get_task_exception( + executor, workflow_context, + script_path=script_path) + assert isinstance(exception, TaskAbortException) + assert exception.message == constants.ILLEGAL_CTX_OPERATION_MESSAGE + + def test_crash_retry_after_abort(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash + ctx task abort [ abort-message ] + ctx task retry [ should-raise-a-runtime-error ] + ''', + windows_script=''' + ctx task abort [ abort-message ] + ctx task retry [ should-raise-a-runtime-error ] + ''') + exception = self._run_and_get_task_exception( + executor, workflow_context, + script_path=script_path) + assert isinstance(exception, TaskAbortException) + assert exception.message == constants.ILLEGAL_CTX_OPERATION_MESSAGE + + def test_crash_abort_after_abort(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash + ctx task abort [ abort-message ] + ctx task abort [ should-raise-a-runtime-error ] + ''', + windows_script=''' + ctx task abort [ abort-message ] + ctx task abort [ should-raise-a-runtime-error ] + ''') + exception = self._run_and_get_task_exception( + executor, workflow_context, + script_path=script_path) + assert isinstance(exception, TaskAbortException) + assert exception.message == constants.ILLEGAL_CTX_OPERATION_MESSAGE + + def test_crash_retry_after_retry(self, executor, workflow_context, tmpdir): + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash + ctx task retry [ retry-message ] + ctx task retry [ should-raise-a-runtime-error ] + ''', + windows_script=''' + ctx task retry [ retry-message ] + ctx task retry [ should-raise-a-runtime-error ] + ''') + exception = self._run_and_get_task_exception( + executor, workflow_context, + script_path=script_path) + assert isinstance(exception, TaskAbortException) + assert exception.message == constants.ILLEGAL_CTX_OPERATION_MESSAGE + + def test_retry_returns_a_nonzero_exit_code(self, executor, workflow_context, tmpdir): + log_path = tmpdir.join('temp.log') + message = 'message' + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx task retry [ "{0}" ] 2> {1} + echo should-not-run > {1} + '''.format(message, log_path), + windows_script=''' + ctx task retry [ "{0}" ] 2> {1} + if %errorlevel% neq 0 exit /b %errorlevel% + echo should-not-run > {1} + '''.format(message, log_path)) + with pytest.raises(ExecutorException): + self._run( + executor, workflow_context, + script_path=script_path) + assert log_path.read().strip() == message + + def test_abort_returns_a_nonzero_exit_code(self, executor, workflow_context, tmpdir): + log_path = tmpdir.join('temp.log') + message = 'message' + script_path = self._create_script( + tmpdir, + linux_script='''#! /bin/bash -e + ctx task abort [ "{0}" ] 2> {1} + echo should-not-run > {1} + '''.format(message, log_path), + windows_script=''' + ctx task abort [ "{0}" ] 2> {1} + if %errorlevel% neq 0 exit /b %errorlevel% + echo should-not-run > {1} + '''.format(message, log_path)) + with pytest.raises(ExecutorException): + self._run( + executor, workflow_context, + script_path=script_path) + assert log_path.read().strip() == message + + def _create_script(self, + tmpdir, + linux_script, + windows_script, + windows_suffix='.bat', + linux_suffix=''): + suffix = windows_suffix if IS_WINDOWS else linux_suffix + script = windows_script if IS_WINDOWS else linux_script + script_path = tmpdir.join('script{0}'.format(suffix)) + script_path.write(script) + return str(script_path) + + def _run_and_get_task_exception(self, *args, **kwargs): + signal = events.on_failure_task_signal + with events_collector(signal) as collected: + with pytest.raises(ExecutorException): + self._run(*args, **kwargs) + return collected[signal][0]['kwargs']['exception'] + + def _run(self, + executor, + workflow_context, + script_path, + process=None, + env_var='value', + arguments=None): + local_script_path = script_path + script_path = os.path.basename(local_script_path) if local_script_path else '' + arguments = arguments or {} + process = process or {} + if script_path: + workflow_context.resource.service.upload( + entry_id=str(workflow_context.service.id), + source=local_script_path, + path=script_path) + + arguments.update({ + 'script_path': script_path, + 'process': process, + 'input_as_env_var': env_var + }) + + node = workflow_context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface = mock.models.create_interface( + node.service, + 'test', + 'op', + operation_kwargs=dict( + function='{0}.{1}'.format( + operations.__name__, + operations.run_script_locally.__name__), + arguments=arguments) + ) + node.interfaces[interface.name] = interface + workflow_context.model.node.update(node) + + @workflow + def mock_workflow(ctx, graph): + graph.add_tasks(api.task.OperationTask( + node, + interface_name='test', + operation_name='op', + arguments=arguments)) + return graph + tasks_graph = mock_workflow(ctx=workflow_context) # pylint: disable=no-value-for-parameter + graph_compiler.GraphCompiler(workflow_context, executor.__class__).compile(tasks_graph) + eng = engine.Engine({executor.__class__: executor}) + eng.execute(workflow_context) + return workflow_context.model.node.get_by_name( + mock.models.DEPENDENCY_NODE_NAME).attributes + + @pytest.fixture + def executor(self): + result = process.ProcessExecutor() + try: + yield result + finally: + result.close() + + @pytest.fixture + def workflow_context(self, tmpdir): + workflow_context = mock.context.simple(str(tmpdir), inmemory=False) + workflow_context.states = [] + workflow_context.exception = None + yield workflow_context + storage.release_sqlite_storage(workflow_context.model) + + +class BaseTestConfiguration(object): + + @pytest.fixture(autouse=True) + def mock_execute(self, mocker): + def eval_func(**_): + self.called = 'eval' + + def execute_func(process, **_): + self.process = process + self.called = 'execute' + self.process = {} + self.called = None + mocker.patch.object(local, '_execute_func', execute_func) + mocker.patch.object(local, '_eval_script_func', eval_func) + + class Ctx(object): + @staticmethod + def download_resource(destination, *args, **kwargs): + return destination + + def _run(self, script_path, process=None): + local.run_script( + script_path=script_path, + process=process, + ctx=self.Ctx) + + +class TestPowerShellConfiguration(BaseTestConfiguration): + + def test_implicit_powershell_call_with_ps1_extension(self): + self._run(script_path='script_path.ps1') + assert self.process['command_prefix'] == 'powershell' + + def test_command_prefix_is_overridden_for_ps1_extension(self): + self._run(script_path='script_path.ps1', + process={'command_prefix': 'bash'}) + assert self.process['command_prefix'] == 'bash' + + def test_explicit_powershell_call(self): + self._run(script_path='script_path.ps1', + process={'command_prefix': 'powershell'}) + assert self.process['command_prefix'] == 'powershell' + + +class TestEvalPythonConfiguration(BaseTestConfiguration): + + def test_explicit_eval_without_py_extension(self): + self._run(script_path='script_path', + process={'eval_python': True}) + assert self.called == 'eval' + + def test_explicit_eval_with_py_extension(self): + self._run(script_path='script_path.py', + process={'eval_python': True}) + assert self.called == 'eval' + + def test_implicit_eval(self): + self._run(script_path='script_path.py') + assert self.called == 'eval' + + def test_explicit_execute_without_py_extension(self): + self._run(script_path='script_path', + process={'eval_python': False}) + assert self.called == 'execute' + + def test_explicit_execute_with_py_extension(self): + self._run(script_path='script_path.py', + process={'eval_python': False}) + assert self.called == 'execute' + + def test_implicit_execute(self): + self._run(script_path='script_path') + assert self.called == 'execute' diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_ssh.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_ssh.py new file mode 100644 index 0000000..b5df939 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/execution_plugin/test_ssh.py @@ -0,0 +1,523 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 contextlib +import json +import logging +import os + +import pytest + +import fabric.api +from fabric.contrib import files +from fabric import context_managers + +from aria.modeling import models +from aria.orchestrator import events +from aria.orchestrator import workflow +from aria.orchestrator.workflows import api +from aria.orchestrator.workflows.executor import process +from aria.orchestrator.workflows.core import (engine, graph_compiler) +from aria.orchestrator.workflows.exceptions import ExecutorException +from aria.orchestrator.exceptions import (TaskAbortException, TaskRetryException) +from aria.orchestrator.execution_plugin import operations +from aria.orchestrator.execution_plugin import constants +from aria.orchestrator.execution_plugin.exceptions import (ProcessException, TaskException) +from aria.orchestrator.execution_plugin.ssh import operations as ssh_operations + +from tests import mock, storage, resources +from tests.orchestrator.workflows.helpers import events_collector + + +_CUSTOM_BASE_DIR = '/tmp/new-aria-ctx' + +_FABRIC_ENV = { + 'host_string': 'localhost', + 'user': 'travis', + # 'password': 'travis', + 'key_filename': '/home/travis/.ssh/id_rsa' +} + + +# To help debug in case of connection failures +logging.getLogger('paramiko.transport').addHandler(logging.StreamHandler()) +logging.getLogger('paramiko.transport').setLevel(logging.DEBUG) + + +@pytest.mark.skipif(not os.environ.get('TRAVIS'), reason='actual ssh server required') +class TestWithActualSSHServer(object): + + def test_run_script_basic(self): + expected_attribute_value = 'some_value' + props = self._execute(env={'test_value': expected_attribute_value}) + assert props['test_value'].value == expected_attribute_value + + @pytest.mark.skip(reason='sudo privileges are required') + def test_run_script_as_sudo(self): + self._execute(use_sudo=True) + with self._ssh_env(): + assert files.exists('/opt/test_dir') + fabric.api.sudo('rm -rf /opt/test_dir') + + def test_run_script_default_base_dir(self): + props = self._execute() + assert props['work_dir'].value == '{0}/work'.format(constants.DEFAULT_BASE_DIR) + + @pytest.mark.skip(reason='Re-enable once output from process executor can be captured') + @pytest.mark.parametrize('hide_groups', [[], ['everything']]) + def test_run_script_with_hide(self, hide_groups): + self._execute(hide_output=hide_groups) + output = 'TODO' + expected_log_message = ('[localhost] run: source {0}/scripts/' + .format(constants.DEFAULT_BASE_DIR)) + if hide_groups: + assert expected_log_message not in output + else: + assert expected_log_message in output + + def test_run_script_process_config(self): + expected_env_value = 'test_value_env' + expected_arg1_value = 'test_value_arg1' + expected_arg2_value = 'test_value_arg2' + expected_cwd = '/tmp' + expected_base_dir = _CUSTOM_BASE_DIR + props = self._execute( + env={'test_value_env': expected_env_value}, + process={ + 'args': [expected_arg1_value, expected_arg2_value], + 'cwd': expected_cwd, + 'base_dir': expected_base_dir + }) + assert props['env_value'].value == expected_env_value + assert len(props['bash_version'].value) > 0 + assert props['arg1_value'].value == expected_arg1_value + assert props['arg2_value'].value == expected_arg2_value + assert props['cwd'].value == expected_cwd + assert props['ctx_path'].value == '{0}/ctx'.format(expected_base_dir) + + def test_run_script_command_prefix(self): + props = self._execute(process={'command_prefix': 'bash -i'}) + assert 'i' in props['dollar_dash'].value + + def test_run_script_reuse_existing_ctx(self): + expected_test_value_1 = 'test_value_1' + expected_test_value_2 = 'test_value_2' + props = self._execute( + test_operations=['{0}_1'.format(self.test_name), + '{0}_2'.format(self.test_name)], + env={'test_value1': expected_test_value_1, + 'test_value2': expected_test_value_2}) + assert props['test_value1'].value == expected_test_value_1 + assert props['test_value2'].value == expected_test_value_2 + + def test_run_script_download_resource_plain(self, tmpdir): + resource = tmpdir.join('resource') + resource.write('content') + self._upload(str(resource), 'test_resource') + props = self._execute() + assert props['test_value'].value == 'content' + + def test_run_script_download_resource_and_render(self, tmpdir): + resource = tmpdir.join('resource') + resource.write('{{ctx.service.name}}') + self._upload(str(resource), 'test_resource') + props = self._execute() + assert props['test_value'].value == self._workflow_context.service.name + + @pytest.mark.parametrize('value', ['string-value', [1, 2, 3], {'key': 'value'}]) + def test_run_script_inputs_as_env_variables_no_override(self, value): + props = self._execute(custom_input=value) + return_value = props['test_value'].value + expected = return_value if isinstance(value, basestring) else json.loads(return_value) + assert value == expected + + @pytest.mark.parametrize('value', ['string-value', [1, 2, 3], {'key': 'value'}]) + def test_run_script_inputs_as_env_variables_process_env_override(self, value): + props = self._execute(custom_input='custom-input-value', + env={'custom_env_var': value}) + return_value = props['test_value'].value + expected = return_value if isinstance(value, basestring) else json.loads(return_value) + assert value == expected + + def test_run_script_error_in_script(self): + exception = self._execute_and_get_task_exception() + assert isinstance(exception, TaskException) + + def test_run_script_abort_immediate(self): + exception = self._execute_and_get_task_exception() + assert isinstance(exception, TaskAbortException) + assert exception.message == 'abort-message' + + def test_run_script_retry(self): + exception = self._execute_and_get_task_exception() + assert isinstance(exception, TaskRetryException) + assert exception.message == 'retry-message' + + def test_run_script_abort_error_ignored_by_script(self): + exception = self._execute_and_get_task_exception() + assert isinstance(exception, TaskAbortException) + assert exception.message == 'abort-message' + + def test_run_commands(self): + temp_file_path = '/tmp/very_temporary_file' + with self._ssh_env(): + if files.exists(temp_file_path): + fabric.api.run('rm {0}'.format(temp_file_path)) + self._execute(commands=['touch {0}'.format(temp_file_path)]) + with self._ssh_env(): + assert files.exists(temp_file_path) + fabric.api.run('rm {0}'.format(temp_file_path)) + + @pytest.fixture(autouse=True) + def _setup(self, request, workflow_context, executor, capfd): + self._workflow_context = workflow_context + self._executor = executor + self._capfd = capfd + self.test_name = request.node.originalname or request.node.name + with self._ssh_env(): + for directory in [constants.DEFAULT_BASE_DIR, _CUSTOM_BASE_DIR]: + if files.exists(directory): + fabric.api.run('rm -rf {0}'.format(directory)) + + @contextlib.contextmanager + def _ssh_env(self): + with self._capfd.disabled(): + with context_managers.settings(fabric.api.hide('everything'), + **_FABRIC_ENV): + yield + + def _execute(self, + env=None, + use_sudo=False, + hide_output=None, + process=None, + custom_input='', + test_operations=None, + commands=None): + process = process or {} + if env: + process.setdefault('env', {}).update(env) + + test_operations = test_operations or [self.test_name] + + local_script_path = os.path.join(resources.DIR, 'scripts', 'test_ssh.sh') + script_path = os.path.basename(local_script_path) + self._upload(local_script_path, script_path) + + if commands: + operation = operations.run_commands_with_ssh + else: + operation = operations.run_script_with_ssh + + node = self._workflow_context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + arguments = { + 'script_path': script_path, + 'fabric_env': _FABRIC_ENV, + 'process': process, + 'use_sudo': use_sudo, + 'custom_env_var': custom_input, + 'test_operation': '', + } + if hide_output: + arguments['hide_output'] = hide_output + if commands: + arguments['commands'] = commands + interface = mock.models.create_interface( + node.service, + 'test', + 'op', + operation_kwargs=dict( + function='{0}.{1}'.format( + operations.__name__, + operation.__name__), + arguments=arguments) + ) + node.interfaces[interface.name] = interface + + @workflow + def mock_workflow(ctx, graph): + ops = [] + for test_operation in test_operations: + op_arguments = arguments.copy() + op_arguments['test_operation'] = test_operation + ops.append(api.task.OperationTask( + node, + interface_name='test', + operation_name='op', + arguments=op_arguments)) + + graph.sequence(*ops) + return graph + tasks_graph = mock_workflow(ctx=self._workflow_context) # pylint: disable=no-value-for-parameter + graph_compiler.GraphCompiler( + self._workflow_context, self._executor.__class__).compile(tasks_graph) + eng = engine.Engine({self._executor.__class__: self._executor}) + eng.execute(self._workflow_context) + return self._workflow_context.model.node.get_by_name( + mock.models.DEPENDENCY_NODE_NAME).attributes + + def _execute_and_get_task_exception(self, *args, **kwargs): + signal = events.on_failure_task_signal + with events_collector(signal) as collected: + with pytest.raises(ExecutorException): + self._execute(*args, **kwargs) + return collected[signal][0]['kwargs']['exception'] + + def _upload(self, source, path): + self._workflow_context.resource.service.upload( + entry_id=str(self._workflow_context.service.id), + source=source, + path=path) + + @pytest.fixture + def executor(self): + result = process.ProcessExecutor() + try: + yield result + finally: + result.close() + + @pytest.fixture + def workflow_context(self, tmpdir): + workflow_context = mock.context.simple(str(tmpdir)) + workflow_context.states = [] + workflow_context.exception = None + yield workflow_context + storage.release_sqlite_storage(workflow_context.model) + + +class TestFabricEnvHideGroupsAndRunCommands(object): + + def test_fabric_env_default_override(self): + # first sanity for no override + self._run() + assert self.mock.settings_merged['timeout'] == constants.FABRIC_ENV_DEFAULTS['timeout'] + # now override + invocation_fabric_env = self.default_fabric_env.copy() + timeout = 1000000 + invocation_fabric_env['timeout'] = timeout + self._run(fabric_env=invocation_fabric_env) + assert self.mock.settings_merged['timeout'] == timeout + + def test_implicit_host_string(self, mocker): + expected_host_address = '1.1.1.1' + mocker.patch.object(self._Ctx.task.actor, 'host') + mocker.patch.object(self._Ctx.task.actor.host, 'host_address', expected_host_address) + fabric_env = self.default_fabric_env.copy() + del fabric_env['host_string'] + self._run(fabric_env=fabric_env) + assert self.mock.settings_merged['host_string'] == expected_host_address + + def test_explicit_host_string(self): + fabric_env = self.default_fabric_env.copy() + host_string = 'explicit_host_string' + fabric_env['host_string'] = host_string + self._run(fabric_env=fabric_env) + assert self.mock.settings_merged['host_string'] == host_string + + def test_override_warn_only(self): + fabric_env = self.default_fabric_env.copy() + self._run(fabric_env=fabric_env) + assert self.mock.settings_merged['warn_only'] is True + fabric_env = self.default_fabric_env.copy() + fabric_env['warn_only'] = False + self._run(fabric_env=fabric_env) + assert self.mock.settings_merged['warn_only'] is False + + def test_missing_host_string(self): + with pytest.raises(TaskAbortException) as exc_ctx: + fabric_env = self.default_fabric_env.copy() + del fabric_env['host_string'] + self._run(fabric_env=fabric_env) + assert '`host_string` not supplied' in str(exc_ctx.value) + + def test_missing_user(self): + with pytest.raises(TaskAbortException) as exc_ctx: + fabric_env = self.default_fabric_env.copy() + del fabric_env['user'] + self._run(fabric_env=fabric_env) + assert '`user` not supplied' in str(exc_ctx.value) + + def test_missing_key_or_password(self): + with pytest.raises(TaskAbortException) as exc_ctx: + fabric_env = self.default_fabric_env.copy() + del fabric_env['key_filename'] + self._run(fabric_env=fabric_env) + assert 'Access credentials not supplied' in str(exc_ctx.value) + + def test_hide_in_settings_and_non_viable_groups(self): + groups = ('running', 'stdout') + self._run(hide_output=groups) + assert set(self.mock.settings_merged['hide_output']) == set(groups) + with pytest.raises(TaskAbortException) as exc_ctx: + self._run(hide_output=('running', 'bla')) + assert '`hide_output` must be a subset of' in str(exc_ctx.value) + + def test_run_commands(self): + def test(use_sudo): + commands = ['command1', 'command2'] + self._run( + commands=commands, + use_sudo=use_sudo) + assert all(item in self.mock.settings_merged.items() for + item in self.default_fabric_env.items()) + assert self.mock.settings_merged['warn_only'] is True + assert self.mock.settings_merged['use_sudo'] == use_sudo + assert self.mock.commands == commands + self.mock.settings_merged = {} + self.mock.commands = [] + test(use_sudo=False) + test(use_sudo=True) + + def test_failed_command(self): + with pytest.raises(ProcessException) as exc_ctx: + self._run(commands=['fail']) + exception = exc_ctx.value + assert exception.stdout == self.MockCommandResult.stdout + assert exception.stderr == self.MockCommandResult.stderr + assert exception.command == self.MockCommandResult.command + assert exception.exit_code == self.MockCommandResult.return_code + + class MockCommandResult(object): + stdout = 'mock_stdout' + stderr = 'mock_stderr' + command = 'mock_command' + return_code = 1 + + def __init__(self, failed): + self.failed = failed + + class MockFabricApi(object): + + def __init__(self): + self.commands = [] + self.settings_merged = {} + + @contextlib.contextmanager + def settings(self, *args, **kwargs): + self.settings_merged.update(kwargs) + if args: + groups = args[0] + self.settings_merged.update({'hide_output': groups}) + yield + + def run(self, command): + self.commands.append(command) + self.settings_merged['use_sudo'] = False + return TestFabricEnvHideGroupsAndRunCommands.MockCommandResult(command == 'fail') + + def sudo(self, command): + self.commands.append(command) + self.settings_merged['use_sudo'] = True + return TestFabricEnvHideGroupsAndRunCommands.MockCommandResult(command == 'fail') + + def hide(self, *groups): + return groups + + def exists(self, *args, **kwargs): + raise RuntimeError + + class _Ctx(object): + INSTRUMENTATION_FIELDS = () + + class Task(object): + @staticmethod + def abort(message=None): + models.Task.abort(message) + actor = None + + class Actor(object): + host = None + + class Model(object): + @contextlib.contextmanager + def instrument(self, *args, **kwargs): + yield + task = Task + task.actor = Actor + model = Model() + logger = logging.getLogger() + + @staticmethod + @contextlib.contextmanager + def _mock_self_logging(*args, **kwargs): + yield + _Ctx.logging_handlers = _mock_self_logging + + @pytest.fixture(autouse=True) + def _setup(self, mocker): + self.default_fabric_env = { + 'host_string': 'test', + 'user': 'test', + 'key_filename': 'test', + } + self.mock = self.MockFabricApi() + mocker.patch('fabric.api', self.mock) + + def _run(self, + commands=(), + fabric_env=None, + process=None, + use_sudo=False, + hide_output=None): + operations.run_commands_with_ssh( + ctx=self._Ctx, + commands=commands, + process=process, + fabric_env=fabric_env or self.default_fabric_env, + use_sudo=use_sudo, + hide_output=hide_output) + + +class TestUtilityFunctions(object): + + def test_paths(self): + base_dir = '/path' + local_script_path = '/local/script/path.py' + paths = ssh_operations._Paths(base_dir=base_dir, + local_script_path=local_script_path) + assert paths.local_script_path == local_script_path + assert paths.remote_ctx_dir == base_dir + assert paths.base_script_path == 'path.py' + assert paths.remote_ctx_path == '/path/ctx' + assert paths.remote_scripts_dir == '/path/scripts' + assert paths.remote_work_dir == '/path/work' + assert paths.remote_env_script_path.startswith('/path/scripts/env-path.py-') + assert paths.remote_script_path.startswith('/path/scripts/path.py-') + + def test_write_environment_script_file(self): + base_dir = '/path' + local_script_path = '/local/script/path.py' + paths = ssh_operations._Paths(base_dir=base_dir, + local_script_path=local_script_path) + env = {'one': "'1'"} + local_socket_url = 'local_socket_url' + remote_socket_url = 'remote_socket_url' + env_script_lines = set([l for l in ssh_operations._write_environment_script_file( + process={'env': env}, + paths=paths, + local_socket_url=local_socket_url, + remote_socket_url=remote_socket_url + ).getvalue().split('\n') if l]) + expected_env_script_lines = set([ + 'export PATH=/path:$PATH', + 'export PYTHONPATH=/path:$PYTHONPATH', + 'chmod +x /path/ctx', + 'chmod +x {0}'.format(paths.remote_script_path), + 'export CTX_SOCKET_URL={0}'.format(remote_socket_url), + 'export LOCAL_CTX_SOCKET_URL={0}'.format(local_socket_url), + 'export one=\'1\'' + ]) + assert env_script_lines == expected_env_script_lines diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/test_workflow_runner.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/test_workflow_runner.py new file mode 100644 index 0000000..011c4cc --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/test_workflow_runner.py @@ -0,0 +1,726 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 +from threading import Thread, Event +from datetime import datetime + +import mock +import pytest + +from aria.modeling import exceptions as modeling_exceptions +from aria.modeling import models +from aria.orchestrator import exceptions +from aria.orchestrator import events +from aria.orchestrator.workflow_runner import WorkflowRunner +from aria.orchestrator.workflows.executor.process import ProcessExecutor +from aria.orchestrator.workflows import api +from aria.orchestrator.workflows.core import engine, graph_compiler +from aria.orchestrator.workflows.executor import thread +from aria.orchestrator import ( + workflow, + operation, +) + +from tests import ( + mock as tests_mock, + storage +) + +from ..fixtures import ( # pylint: disable=unused-import + plugins_dir, + plugin_manager, + fs_model as model, + resource_storage as resource +) + +custom_events = { + 'is_resumed': Event(), + 'is_active': Event(), + 'execution_cancelled': Event(), + 'execution_failed': Event(), +} + + +class TimeoutError(BaseException): + pass + + +class FailingTask(BaseException): + pass + + +def test_undeclared_workflow(request): + # validating a proper error is raised when the workflow is not declared in the service + with pytest.raises(exceptions.UndeclaredWorkflowError): + _create_workflow_runner(request, 'undeclared_workflow') + + +def test_missing_workflow_implementation(service, request): + # validating a proper error is raised when the workflow code path does not exist + workflow = models.Operation( + name='test_workflow', + service=service, + function='nonexistent.workflow.implementation') + service.workflows['test_workflow'] = workflow + + with pytest.raises(exceptions.WorkflowImplementationNotFoundError): + _create_workflow_runner(request, 'test_workflow') + + +def test_builtin_workflow_instantiation(request): + # validates the workflow runner instantiates properly when provided with a builtin workflow + # (expecting no errors to be raised on undeclared workflow or missing workflow implementation) + workflow_runner = _create_workflow_runner(request, 'install') + tasks = list(workflow_runner.execution.tasks) + assert len(tasks) == 18 # expecting 18 tasks for 2 node topology + + +def test_custom_workflow_instantiation(request): + # validates the workflow runner instantiates properly when provided with a custom workflow + # (expecting no errors to be raised on undeclared workflow or missing workflow implementation) + mock_workflow = _setup_mock_workflow_in_service(request) + workflow_runner = _create_workflow_runner(request, mock_workflow) + tasks = list(workflow_runner.execution.tasks) + assert len(tasks) == 2 # mock workflow creates only start workflow and end workflow task + + +def test_existing_active_executions(request, service, model): + existing_active_execution = models.Execution( + service=service, + status=models.Execution.STARTED, + workflow_name='uninstall') + model.execution.put(existing_active_execution) + with pytest.raises(exceptions.ActiveExecutionsError): + _create_workflow_runner(request, 'install') + + +def test_existing_executions_but_no_active_ones(request, service, model): + existing_terminated_execution = models.Execution( + service=service, + status=models.Execution.SUCCEEDED, + workflow_name='uninstall') + model.execution.put(existing_terminated_execution) + # no active executions exist, so no error should be raised + _create_workflow_runner(request, 'install') + + +def test_default_executor(request): + # validates the ProcessExecutor is used by the workflow runner by default + mock_workflow = _setup_mock_workflow_in_service(request) + + with mock.patch('aria.orchestrator.workflow_runner.engine.Engine') as mock_engine_cls: + _create_workflow_runner(request, mock_workflow) + _, engine_kwargs = mock_engine_cls.call_args + assert isinstance(engine_kwargs.get('executors').values()[0], ProcessExecutor) + + +def test_custom_executor(request): + mock_workflow = _setup_mock_workflow_in_service(request) + + custom_executor = mock.MagicMock() + with mock.patch('aria.orchestrator.workflow_runner.engine.Engine') as mock_engine_cls: + _create_workflow_runner(request, mock_workflow, executor=custom_executor) + _, engine_kwargs = mock_engine_cls.call_args + assert engine_kwargs.get('executors').values()[0] == custom_executor + + +def test_task_configuration_parameters(request): + mock_workflow = _setup_mock_workflow_in_service(request) + + task_max_attempts = 5 + task_retry_interval = 7 + with mock.patch('aria.orchestrator.workflow_runner.engine.Engine.execute') as \ + mock_engine_execute: + _create_workflow_runner(request, mock_workflow, task_max_attempts=task_max_attempts, + task_retry_interval=task_retry_interval).execute() + _, engine_kwargs = mock_engine_execute.call_args + assert engine_kwargs['ctx']._task_max_attempts == task_max_attempts + assert engine_kwargs['ctx']._task_retry_interval == task_retry_interval + + +def test_execute(request, service): + mock_workflow = _setup_mock_workflow_in_service(request) + + mock_engine = mock.MagicMock() + with mock.patch('aria.orchestrator.workflow_runner.engine.Engine.execute', + return_value=mock_engine) as mock_engine_execute: + workflow_runner = _create_workflow_runner(request, mock_workflow) + workflow_runner.execute() + + _, engine_kwargs = mock_engine_execute.call_args + assert engine_kwargs['ctx'].service.id == service.id + assert engine_kwargs['ctx'].execution.workflow_name == 'test_workflow' + + mock_engine_execute.assert_called_once_with(ctx=workflow_runner._workflow_context, + resuming=False, + retry_failed=False) + + +def test_cancel_execution(request): + mock_workflow = _setup_mock_workflow_in_service(request) + + mock_engine = mock.MagicMock() + with mock.patch('aria.orchestrator.workflow_runner.engine.Engine', return_value=mock_engine): + workflow_runner = _create_workflow_runner(request, mock_workflow) + workflow_runner.cancel() + mock_engine.cancel_execution.assert_called_once_with(ctx=workflow_runner._workflow_context) + + +def test_execution_model_creation(request, service, model): + mock_workflow = _setup_mock_workflow_in_service(request) + + with mock.patch('aria.orchestrator.workflow_runner.engine.Engine'): + workflow_runner = _create_workflow_runner(request, mock_workflow) + + assert model.execution.get(workflow_runner.execution.id) == workflow_runner.execution + assert workflow_runner.execution.service.id == service.id + assert workflow_runner.execution.workflow_name == mock_workflow + assert workflow_runner.execution.created_at <= datetime.utcnow() + assert workflow_runner.execution.inputs == dict() + + +def test_execution_inputs_override_workflow_inputs(request): + wf_inputs = {'input1': 'value1', 'input2': 'value2', 'input3': 5} + mock_workflow = _setup_mock_workflow_in_service( + request, + inputs=dict((name, models.Input.wrap(name, val)) for name, val + in wf_inputs.iteritems())) + + with mock.patch('aria.orchestrator.workflow_runner.engine.Engine'): + workflow_runner = _create_workflow_runner( + request, mock_workflow, inputs={'input2': 'overriding-value2', 'input3': 7}) + + assert len(workflow_runner.execution.inputs) == 3 + # did not override input1 - expecting the default value from the workflow inputs + assert workflow_runner.execution.inputs['input1'].value == 'value1' + # overrode input2 + assert workflow_runner.execution.inputs['input2'].value == 'overriding-value2' + # overrode input of integer type + assert workflow_runner.execution.inputs['input3'].value == 7 + + +def test_execution_inputs_undeclared_inputs(request): + mock_workflow = _setup_mock_workflow_in_service(request) + + with pytest.raises(modeling_exceptions.UndeclaredInputsException): + _create_workflow_runner(request, mock_workflow, inputs={'undeclared_input': 'value'}) + + +def test_execution_inputs_missing_required_inputs(request): + mock_workflow = _setup_mock_workflow_in_service( + request, inputs={'required_input': models.Input.wrap('required_input', value=None)}) + + with pytest.raises(modeling_exceptions.MissingRequiredInputsException): + _create_workflow_runner(request, mock_workflow, inputs={}) + + +def test_execution_inputs_wrong_type_inputs(request): + mock_workflow = _setup_mock_workflow_in_service( + request, inputs={'input': models.Input.wrap('input', 'value')}) + + with pytest.raises(modeling_exceptions.ParametersOfWrongTypeException): + _create_workflow_runner(request, mock_workflow, inputs={'input': 5}) + + +def test_execution_inputs_builtin_workflow_with_inputs(request): + # built-in workflows don't have inputs + with pytest.raises(modeling_exceptions.UndeclaredInputsException): + _create_workflow_runner(request, 'install', inputs={'undeclared_input': 'value'}) + + +def test_workflow_function_parameters(request, tmpdir): + # validating the workflow function is passed with the + # merged execution inputs, in dict form + + # the workflow function parameters will be written to this file + output_path = str(tmpdir.join('output')) + wf_inputs = {'output_path': output_path, 'input1': 'value1', 'input2': 'value2', 'input3': 5} + + mock_workflow = _setup_mock_workflow_in_service( + request, inputs=dict((name, models.Input.wrap(name, val)) for name, val + in wf_inputs.iteritems())) + + _create_workflow_runner(request, mock_workflow, + inputs={'input2': 'overriding-value2', 'input3': 7}) + + with open(output_path) as f: + wf_call_kwargs = json.load(f) + assert len(wf_call_kwargs) == 3 + assert wf_call_kwargs.get('input1') == 'value1' + assert wf_call_kwargs.get('input2') == 'overriding-value2' + assert wf_call_kwargs.get('input3') == 7 + + +@pytest.fixture +def service(model): + # sets up a service in the storage + service_id = tests_mock.topology.create_simple_topology_two_nodes(model) + service = model.service.get(service_id) + return service + + +def _setup_mock_workflow_in_service(request, inputs=None): + # sets up a mock workflow as part of the service, including uploading + # the workflow code to the service's dir on the resource storage + service = request.getfixturevalue('service') + resource = request.getfixturevalue('resource') + + source = tests_mock.workflow.__file__ + resource.service_template.upload(str(service.service_template.id), source) + mock_workflow_name = 'test_workflow' + arguments = {} + if inputs: + for input in inputs.itervalues(): + arguments[input.name] = input.as_argument() + workflow = models.Operation( + name=mock_workflow_name, + service=service, + function='workflow.mock_workflow', + inputs=inputs or {}, + arguments=arguments) + service.workflows[mock_workflow_name] = workflow + return mock_workflow_name + + +def _create_workflow_runner(request, workflow_name, inputs=None, executor=None, + task_max_attempts=None, task_retry_interval=None): + # helper method for instantiating a workflow runner + service_id = request.getfixturevalue('service').id + model = request.getfixturevalue('model') + resource = request.getfixturevalue('resource') + plugin_manager = request.getfixturevalue('plugin_manager') + + # task configuration parameters can't be set to None, therefore only + # passing those if they've been set by the test + task_configuration_kwargs = dict() + if task_max_attempts is not None: + task_configuration_kwargs['task_max_attempts'] = task_max_attempts + if task_retry_interval is not None: + task_configuration_kwargs['task_retry_interval'] = task_retry_interval + + return WorkflowRunner( + workflow_name=workflow_name, + service_id=service_id, + inputs=inputs or {}, + executor=executor, + model_storage=model, + resource_storage=resource, + plugin_manager=plugin_manager, + **task_configuration_kwargs) + + +class TestResumableWorkflows(object): + + def _create_initial_workflow_runner( + self, workflow_context, workflow, executor, inputs=None): + + service = workflow_context.service + service.workflows['custom_workflow'] = tests_mock.models.create_operation( + 'custom_workflow', + operation_kwargs={ + 'function': '{0}.{1}'.format(__name__, workflow.__name__), + 'inputs': dict((k, models.Input.wrap(k, v)) for k, v in (inputs or {}).items()) + } + ) + workflow_context.model.service.update(service) + + wf_runner = WorkflowRunner( + service_id=workflow_context.service.id, + inputs=inputs or {}, + model_storage=workflow_context.model, + resource_storage=workflow_context.resource, + plugin_manager=None, + workflow_name='custom_workflow', + executor=executor) + return wf_runner + + @staticmethod + def _wait_for_active_and_cancel(workflow_runner): + if custom_events['is_active'].wait(60) is False: + raise TimeoutError("is_active wasn't set to True") + workflow_runner.cancel() + if custom_events['execution_cancelled'].wait(60) is False: + raise TimeoutError("Execution did not end") + + def test_resume_workflow(self, workflow_context, thread_executor): + node = workflow_context.model.node.get_by_name(tests_mock.models.DEPENDENCY_NODE_NAME) + node.attributes['invocations'] = models.Attribute.wrap('invocations', 0) + self._create_interface(workflow_context, node, mock_pass_first_task_only) + + wf_runner = self._create_initial_workflow_runner( + workflow_context, mock_parallel_tasks_workflow, thread_executor, + inputs={'number_of_tasks': 2}) + + wf_thread = Thread(target=wf_runner.execute) + wf_thread.daemon = True + wf_thread.start() + + # Wait for the execution to start + self._wait_for_active_and_cancel(wf_runner) + node = workflow_context.model.node.refresh(node) + + tasks = workflow_context.model.task.list(filters={'_stub_type': None}) + assert any(task.status == task.SUCCESS for task in tasks) + assert any(task.status == task.RETRYING for task in tasks) + custom_events['is_resumed'].set() + assert any(task.status == task.RETRYING for task in tasks) + + # Create a new workflow runner, with an existing execution id. This would cause + # the old execution to restart. + new_wf_runner = WorkflowRunner( + service_id=wf_runner.service.id, + inputs={}, + model_storage=workflow_context.model, + resource_storage=workflow_context.resource, + plugin_manager=None, + execution_id=wf_runner.execution.id, + executor=thread_executor) + + new_wf_runner.execute() + + # Wait for it to finish and assert changes. + node = workflow_context.model.node.refresh(node) + assert all(task.status == task.SUCCESS for task in tasks) + assert node.attributes['invocations'].value == 3 + assert wf_runner.execution.status == wf_runner.execution.SUCCEEDED + + def test_resume_started_task(self, workflow_context, thread_executor): + node = workflow_context.model.node.get_by_name(tests_mock.models.DEPENDENCY_NODE_NAME) + node.attributes['invocations'] = models.Attribute.wrap('invocations', 0) + self._create_interface(workflow_context, node, mock_stuck_task) + + wf_runner = self._create_initial_workflow_runner( + workflow_context, mock_parallel_tasks_workflow, thread_executor, + inputs={'number_of_tasks': 1}) + + wf_thread = Thread(target=wf_runner.execute) + wf_thread.daemon = True + wf_thread.start() + + self._wait_for_active_and_cancel(wf_runner) + node = workflow_context.model.node.refresh(node) + task = workflow_context.model.task.list(filters={'_stub_type': None})[0] + assert node.attributes['invocations'].value == 1 + assert task.status == task.STARTED + assert wf_runner.execution.status in (wf_runner.execution.CANCELLED, + wf_runner.execution.CANCELLING) + custom_events['is_resumed'].set() + + new_thread_executor = thread.ThreadExecutor() + try: + new_wf_runner = WorkflowRunner( + service_id=wf_runner.service.id, + inputs={}, + model_storage=workflow_context.model, + resource_storage=workflow_context.resource, + plugin_manager=None, + execution_id=wf_runner.execution.id, + executor=new_thread_executor) + + new_wf_runner.execute() + finally: + new_thread_executor.close() + + # Wait for it to finish and assert changes. + node = workflow_context.model.node.refresh(node) + assert node.attributes['invocations'].value == 2 + assert task.status == task.SUCCESS + assert wf_runner.execution.status == wf_runner.execution.SUCCEEDED + + def test_resume_failed_task(self, workflow_context, thread_executor): + node = workflow_context.model.node.get_by_name(tests_mock.models.DEPENDENCY_NODE_NAME) + node.attributes['invocations'] = models.Attribute.wrap('invocations', 0) + self._create_interface(workflow_context, node, mock_failed_before_resuming) + + wf_runner = self._create_initial_workflow_runner(workflow_context, + mock_parallel_tasks_workflow, + thread_executor) + wf_thread = Thread(target=wf_runner.execute) + wf_thread.setDaemon(True) + wf_thread.start() + + self._wait_for_active_and_cancel(wf_runner) + node = workflow_context.model.node.refresh(node) + + task = workflow_context.model.task.list(filters={'_stub_type': None})[0] + assert node.attributes['invocations'].value == 2 + assert task.status == task.STARTED + assert wf_runner.execution.status in (wf_runner.execution.CANCELLED, + wf_runner.execution.CANCELLING) + + custom_events['is_resumed'].set() + assert node.attributes['invocations'].value == 2 + + # Create a new workflow runner, with an existing execution id. This would cause + # the old execution to restart. + new_thread_executor = thread.ThreadExecutor() + try: + new_wf_runner = WorkflowRunner( + service_id=wf_runner.service.id, + inputs={}, + model_storage=workflow_context.model, + resource_storage=workflow_context.resource, + plugin_manager=None, + execution_id=wf_runner.execution.id, + executor=new_thread_executor) + + new_wf_runner.execute() + finally: + new_thread_executor.close() + + # Wait for it to finish and assert changes. + node = workflow_context.model.node.refresh(node) + assert node.attributes['invocations'].value == task.max_attempts - 1 + assert task.status == task.SUCCESS + assert wf_runner.execution.status == wf_runner.execution.SUCCEEDED + + def test_resume_failed_task_and_successful_task(self, workflow_context, thread_executor): + node = workflow_context.model.node.get_by_name(tests_mock.models.DEPENDENCY_NODE_NAME) + node.attributes['invocations'] = models.Attribute.wrap('invocations', 0) + self._create_interface(workflow_context, node, mock_pass_first_task_only) + + wf_runner = self._create_initial_workflow_runner( + workflow_context, + mock_parallel_tasks_workflow, + thread_executor, + inputs={'retry_interval': 1, 'max_attempts': 2, 'number_of_tasks': 2} + ) + wf_thread = Thread(target=wf_runner.execute) + wf_thread.setDaemon(True) + wf_thread.start() + + if custom_events['execution_failed'].wait(60) is False: + raise TimeoutError("Execution did not end") + + tasks = workflow_context.model.task.list(filters={'_stub_type': None}) + node = workflow_context.model.node.refresh(node) + assert node.attributes['invocations'].value == 3 + failed_task = [t for t in tasks if t.status == t.FAILED][0] + + # First task passes + assert any(task.status == task.FAILED for task in tasks) + assert failed_task.attempts_count == 2 + # Second task fails + assert any(task.status == task.SUCCESS for task in tasks) + assert wf_runner.execution.status in wf_runner.execution.FAILED + + custom_events['is_resumed'].set() + new_thread_executor = thread.ThreadExecutor() + try: + new_wf_runner = WorkflowRunner( + service_id=wf_runner.service.id, + retry_failed_tasks=True, + inputs={}, + model_storage=workflow_context.model, + resource_storage=workflow_context.resource, + plugin_manager=None, + execution_id=wf_runner.execution.id, + executor=new_thread_executor) + + new_wf_runner.execute() + finally: + new_thread_executor.close() + + # Wait for it to finish and assert changes. + node = workflow_context.model.node.refresh(node) + assert failed_task.attempts_count == 1 + assert node.attributes['invocations'].value == 4 + assert all(task.status == task.SUCCESS for task in tasks) + assert wf_runner.execution.status == wf_runner.execution.SUCCEEDED + + def test_two_sequential_task_first_task_failed(self, workflow_context, thread_executor): + node = workflow_context.model.node.get_by_name(tests_mock.models.DEPENDENCY_NODE_NAME) + node.attributes['invocations'] = models.Attribute.wrap('invocations', 0) + self._create_interface(workflow_context, node, mock_fail_first_task_only) + + wf_runner = self._create_initial_workflow_runner( + workflow_context, + mock_sequential_tasks_workflow, + thread_executor, + inputs={'retry_interval': 1, 'max_attempts': 1, 'number_of_tasks': 2} + ) + wf_thread = Thread(target=wf_runner.execute) + wf_thread.setDaemon(True) + wf_thread.start() + + if custom_events['execution_failed'].wait(60) is False: + raise TimeoutError("Execution did not end") + + tasks = workflow_context.model.task.list(filters={'_stub_type': None}) + node = workflow_context.model.node.refresh(node) + assert node.attributes['invocations'].value == 1 + assert any(t.status == t.FAILED for t in tasks) + assert any(t.status == t.PENDING for t in tasks) + + custom_events['is_resumed'].set() + new_thread_executor = thread.ThreadExecutor() + try: + new_wf_runner = WorkflowRunner( + service_id=wf_runner.service.id, + inputs={}, + model_storage=workflow_context.model, + resource_storage=workflow_context.resource, + plugin_manager=None, + execution_id=wf_runner.execution.id, + executor=new_thread_executor) + + new_wf_runner.execute() + finally: + new_thread_executor.close() + + # Wait for it to finish and assert changes. + node = workflow_context.model.node.refresh(node) + assert node.attributes['invocations'].value == 2 + assert any(t.status == t.SUCCESS for t in tasks) + assert any(t.status == t.FAILED for t in tasks) + assert wf_runner.execution.status == wf_runner.execution.SUCCEEDED + + + + @staticmethod + @pytest.fixture + def thread_executor(): + result = thread.ThreadExecutor() + try: + yield result + finally: + result.close() + + @staticmethod + @pytest.fixture + def workflow_context(tmpdir): + workflow_context = tests_mock.context.simple(str(tmpdir)) + yield workflow_context + storage.release_sqlite_storage(workflow_context.model) + + @staticmethod + def _create_interface(ctx, node, func, arguments=None): + interface_name = 'aria.interfaces.lifecycle' + operation_kwargs = dict(function='{name}.{func.__name__}'.format( + name=__name__, func=func)) + if arguments: + # the operation has to declare the arguments before those may be passed + operation_kwargs['arguments'] = arguments + operation_name = 'create' + interface = tests_mock.models.create_interface(node.service, interface_name, operation_name, + operation_kwargs=operation_kwargs) + node.interfaces[interface.name] = interface + ctx.model.node.update(node) + + return node, interface_name, operation_name + + @staticmethod + def _engine(workflow_func, workflow_context, executor): + graph = workflow_func(ctx=workflow_context) + execution = workflow_context.execution + graph_compiler.GraphCompiler(workflow_context, executor.__class__).compile(graph) + workflow_context.execution = execution + + return engine.Engine(executors={executor.__class__: executor}) + + @pytest.fixture(autouse=True) + def register_to_events(self): + def execution_cancelled(*args, **kwargs): + custom_events['execution_cancelled'].set() + + def execution_failed(*args, **kwargs): + custom_events['execution_failed'].set() + + events.on_cancelled_workflow_signal.connect(execution_cancelled) + events.on_failure_workflow_signal.connect(execution_failed) + yield + events.on_cancelled_workflow_signal.disconnect(execution_cancelled) + events.on_failure_workflow_signal.disconnect(execution_failed) + for event in custom_events.values(): + event.clear() + + +@workflow +def mock_sequential_tasks_workflow(ctx, graph, + retry_interval=1, max_attempts=10, number_of_tasks=1): + node = ctx.model.node.get_by_name(tests_mock.models.DEPENDENCY_NODE_NAME) + graph.sequence(*_create_tasks(node, retry_interval, max_attempts, number_of_tasks)) + + +@workflow +def mock_parallel_tasks_workflow(ctx, graph, + retry_interval=1, max_attempts=10, number_of_tasks=1): + node = ctx.model.node.get_by_name(tests_mock.models.DEPENDENCY_NODE_NAME) + graph.add_tasks(*_create_tasks(node, retry_interval, max_attempts, number_of_tasks)) + + +def _create_tasks(node, retry_interval, max_attempts, number_of_tasks): + return [ + api.task.OperationTask(node, + 'aria.interfaces.lifecycle', + 'create', + retry_interval=retry_interval, + max_attempts=max_attempts) + for _ in xrange(number_of_tasks) + ] + + + +@operation +def mock_failed_before_resuming(ctx): + """ + The task should run atmost ctx.task.max_attempts - 1 times, and only then pass. + overall, the number of invocations should be ctx.task.max_attempts - 1 + """ + ctx.node.attributes['invocations'] += 1 + + if ctx.node.attributes['invocations'] == 2: + custom_events['is_active'].set() + # unfreeze the thread only when all of the invocations are done + while ctx.node.attributes['invocations'] < ctx.task.max_attempts - 1: + time.sleep(5) + + elif ctx.node.attributes['invocations'] == ctx.task.max_attempts - 1: + # pass only just before the end. + return + else: + # fail o.w. + raise FailingTask("stop this task") + + +@operation +def mock_stuck_task(ctx): + ctx.node.attributes['invocations'] += 1 + while not custom_events['is_resumed'].isSet(): + if not custom_events['is_active'].isSet(): + custom_events['is_active'].set() + time.sleep(5) + + +@operation +def mock_pass_first_task_only(ctx): + ctx.node.attributes['invocations'] += 1 + + if ctx.node.attributes['invocations'] != 1: + custom_events['is_active'].set() + if not custom_events['is_resumed'].isSet(): + # if resume was called, increase by one. o/w fail the execution - second task should + # fail as long it was not a part of resuming the workflow + raise FailingTask("wasn't resumed yet") + + +@operation +def mock_fail_first_task_only(ctx): + ctx.node.attributes['invocations'] += 1 + + if not custom_events['is_resumed'].isSet() and ctx.node.attributes['invocations'] == 1: + raise FailingTask("First task should fail") diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/__init__.py new file mode 100644 index 0000000..7f0fd56 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/__init__.py @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 . import api, core diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/api/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/api/__init__.py new file mode 100644 index 0000000..ae1e83e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/api/__init__.py @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/api/test_task.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/api/test_task.py new file mode 100644 index 0000000..9d91b6b --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/api/test_task.py @@ -0,0 +1,223 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.orchestrator import context +from aria.orchestrator.workflows import api + +from tests import mock, storage + + +@pytest.fixture +def ctx(tmpdir): + """ + Create the following graph in storage: + dependency_node <------ dependent_node + :return: + """ + simple_context = mock.context.simple(str(tmpdir), inmemory=False) + simple_context.model.execution.put(mock.models.create_execution(simple_context.service)) + yield simple_context + storage.release_sqlite_storage(simple_context.model) + + +class TestOperationTask(object): + + def test_node_operation_task_creation(self, ctx): + interface_name = 'test_interface' + operation_name = 'create' + + plugin = mock.models.create_plugin('test_plugin', '0.1') + ctx.model.node.update(plugin) + + arguments = {'test_input': True} + + interface = mock.models.create_interface( + ctx.service, + interface_name, + operation_name, + operation_kwargs=dict(plugin=plugin, + function='op_path', + arguments=arguments),) + + node = ctx.model.node.get_by_name(mock.models.DEPENDENT_NODE_NAME) + node.interfaces[interface_name] = interface + ctx.model.node.update(node) + max_attempts = 10 + retry_interval = 10 + ignore_failure = True + + with context.workflow.current.push(ctx): + api_task = api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=operation_name, + arguments=arguments, + max_attempts=max_attempts, + retry_interval=retry_interval, + ignore_failure=ignore_failure) + + assert api_task.name == api.task.OperationTask.NAME_FORMAT.format( + type='node', + name=node.name, + interface=interface_name, + operation=operation_name + ) + assert api_task.function == 'op_path' + assert api_task.actor == node + assert api_task.arguments['test_input'].value is True + assert api_task.retry_interval == retry_interval + assert api_task.max_attempts == max_attempts + assert api_task.ignore_failure == ignore_failure + assert api_task.plugin.name == 'test_plugin' + + def test_source_relationship_operation_task_creation(self, ctx): + interface_name = 'test_interface' + operation_name = 'preconfigure' + + plugin = mock.models.create_plugin('test_plugin', '0.1') + ctx.model.plugin.update(plugin) + + arguments = {'test_input': True} + + interface = mock.models.create_interface( + ctx.service, + interface_name, + operation_name, + operation_kwargs=dict(plugin=plugin, + function='op_path', + arguments=arguments) + ) + + relationship = ctx.model.relationship.list()[0] + relationship.interfaces[interface.name] = interface + max_attempts = 10 + retry_interval = 10 + + with context.workflow.current.push(ctx): + api_task = api.task.OperationTask( + relationship, + interface_name=interface_name, + operation_name=operation_name, + arguments=arguments, + max_attempts=max_attempts, + retry_interval=retry_interval) + + assert api_task.name == api.task.OperationTask.NAME_FORMAT.format( + type='relationship', + name=relationship.name, + interface=interface_name, + operation=operation_name + ) + assert api_task.function == 'op_path' + assert api_task.actor == relationship + assert api_task.arguments['test_input'].value is True + assert api_task.retry_interval == retry_interval + assert api_task.max_attempts == max_attempts + assert api_task.plugin.name == 'test_plugin' + + def test_target_relationship_operation_task_creation(self, ctx): + interface_name = 'test_interface' + operation_name = 'preconfigure' + + plugin = mock.models.create_plugin('test_plugin', '0.1') + ctx.model.node.update(plugin) + + arguments = {'test_input': True} + + interface = mock.models.create_interface( + ctx.service, + interface_name, + operation_name, + operation_kwargs=dict(plugin=plugin, + function='op_path', + arguments=arguments) + ) + + relationship = ctx.model.relationship.list()[0] + relationship.interfaces[interface.name] = interface + max_attempts = 10 + retry_interval = 10 + + with context.workflow.current.push(ctx): + api_task = api.task.OperationTask( + relationship, + interface_name=interface_name, + operation_name=operation_name, + arguments=arguments, + max_attempts=max_attempts, + retry_interval=retry_interval) + + assert api_task.name == api.task.OperationTask.NAME_FORMAT.format( + type='relationship', + name=relationship.name, + interface=interface_name, + operation=operation_name + ) + assert api_task.function == 'op_path' + assert api_task.actor == relationship + assert api_task.arguments['test_input'].value is True + assert api_task.retry_interval == retry_interval + assert api_task.max_attempts == max_attempts + assert api_task.plugin.name == 'test_plugin' + + def test_operation_task_default_values(self, ctx): + interface_name = 'test_interface' + operation_name = 'create' + + plugin = mock.models.create_plugin('package', '0.1') + ctx.model.node.update(plugin) + + dependency_node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + + interface = mock.models.create_interface( + ctx.service, + interface_name, + operation_name, + operation_kwargs=dict(plugin=plugin, + function='op_path')) + dependency_node.interfaces[interface_name] = interface + + with context.workflow.current.push(ctx): + task = api.task.OperationTask( + dependency_node, + interface_name=interface_name, + operation_name=operation_name) + + assert task.arguments == {} + assert task.retry_interval == ctx._task_retry_interval + assert task.max_attempts == ctx._task_max_attempts + assert task.ignore_failure == ctx._task_ignore_failure + assert task.plugin is plugin + + +class TestWorkflowTask(object): + + def test_workflow_task_creation(self, ctx): + + workspace = {} + + mock_class = type('mock_class', (object,), {'test_attribute': True}) + + def sub_workflow(**kwargs): + workspace.update(kwargs) + return mock_class + + with context.workflow.current.push(ctx): + workflow_task = api.task.WorkflowTask(sub_workflow, kwarg='workflow_kwarg') + assert workflow_task.graph is mock_class + assert workflow_task.test_attribute is True diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/api/test_task_graph.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/api/test_task_graph.py new file mode 100644 index 0000000..a569386 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/api/test_task_graph.py @@ -0,0 +1,745 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.orchestrator.workflows.api import task_graph, task + + +class MockTask(task.BaseTask): + def __init__(self): + super(MockTask, self).__init__(ctx={}) + + +@pytest.fixture +def graph(): + return task_graph.TaskGraph(name='mock-graph') + + +class TestTaskGraphTasks(object): + + def test_add_task(self, graph): + task = MockTask() + add_result = graph.add_tasks(task) + assert add_result == [task] + tasks = [t for t in graph.tasks] + assert len(tasks) == 1 + assert tasks[0] == task + + def test_add_empty_group(self, graph): + result = graph.add_tasks([]) + assert result == [] + + def test_add_group(self, graph): + tasks = [MockTask(), MockTask(), MockTask()] + added_tasks = graph.add_tasks(*tasks) + assert added_tasks == tasks + + def test_add_partially_existing_group(self, graph): + task = MockTask() + graph.add_tasks(task) + tasks = [MockTask(), task, MockTask()] + added_tasks = graph.add_tasks(*tasks) + assert added_tasks == [tasks[0], tasks[2]] + + def test_add_recursively_group(self, graph): + recursive_group = [MockTask(), MockTask()] + tasks = [MockTask(), recursive_group, MockTask()] + added_tasks = graph.add_tasks(tasks) + assert added_tasks == [tasks[0], recursive_group[0], recursive_group[1], tasks[2]] + + def test_add_existing_task(self, graph): + task = MockTask() + graph.add_tasks(task) + # adding a task already in graph - should have no effect, and return False + add_result = graph.add_tasks(task) + assert add_result == [] + tasks = [t for t in graph.tasks] + assert len(tasks) == 1 + assert tasks[0] == task + + def test_remove_task(self, graph): + task = MockTask() + other_task = MockTask() + graph.add_tasks(task) + graph.add_tasks(other_task) + graph.remove_tasks(other_task) + tasks = [t for t in graph.tasks] + assert len(tasks) == 1 + assert tasks[0] == task + + def test_remove_tasks_with_dependency(self, graph): + task = MockTask() + dependent_task = MockTask() + graph.add_tasks(task) + graph.add_tasks(dependent_task) + graph.add_dependency(dependent_task, task) + remove_result = graph.remove_tasks(dependent_task) + assert remove_result == [dependent_task] + tasks = [t for t in graph.tasks] + assert len(tasks) == 1 + assert tasks[0] == task + # asserting no dependencies are left for the dependent task + assert len(list(graph.get_dependencies(task))) == 0 + + def test_remove_empty_group(self, graph): + result = graph.remove_tasks([]) + assert result == [] + + def test_remove_group(self, graph): + tasks = [MockTask(), MockTask(), MockTask()] + graph.add_tasks(*tasks) + removed_tasks = graph.remove_tasks(*tasks) + assert removed_tasks == tasks + + def test_remove_partially_existing_group(self, graph): + task = MockTask() + graph.add_tasks(task) + tasks = [MockTask(), task, MockTask()] + removed_tasks = graph.remove_tasks(*tasks) + assert removed_tasks == [task] + + def test_remove_recursively_group(self, graph): + recursive_group = [MockTask(), MockTask()] + tasks = [MockTask(), recursive_group, MockTask()] + graph.add_tasks(tasks) + removed_tasks = graph.remove_tasks(tasks) + assert removed_tasks == [tasks[0], recursive_group[0], recursive_group[1], tasks[2]] + + def test_remove_nonexistent_task(self, graph): + task = MockTask() + task_not_in_graph = MockTask() + graph.add_tasks(task) + # removing a task not in graph - should have no effect, and return False + remove_result = graph.remove_tasks(task_not_in_graph) + assert remove_result == [] + tasks = [t for t in graph.tasks] + assert len(tasks) == 1 + assert tasks[0] == task + + def test_has_task(self, graph): + task = MockTask() + graph.add_tasks(task) + assert graph.has_tasks(task) is True + + def test_has_nonexistent_task(self, graph): + task = MockTask() + task_not_in_graph = MockTask() + graph.add_tasks(task) + assert graph.has_tasks(task_not_in_graph) is False + + def test_has_empty_group(self, graph): + # the "empty task" is in the graph + assert graph.has_tasks([]) is True + + def test_has_group(self, graph): + tasks = [MockTask(), MockTask(), MockTask()] + graph.add_tasks(*tasks) + assert graph.has_tasks(*tasks) is True + + def test_has_partially_existing_group(self, graph): + task = MockTask() + graph.add_tasks(task) + tasks = [MockTask(), task, MockTask()] + assert graph.has_tasks(tasks) is False + + def test_has_recursively_group(self, graph): + recursive_group = [MockTask(), MockTask()] + tasks = [MockTask(), recursive_group, MockTask()] + graph.add_tasks(tasks) + assert graph.has_tasks(tasks) is True + + def test_get_task(self, graph): + task = MockTask() + graph.add_tasks(task) + assert graph.get_task(task.id) == task + + def test_get_nonexistent_task(self, graph): + task = MockTask() + task_not_in_graph = MockTask() + graph.add_tasks(task) + with pytest.raises(task_graph.TaskNotInGraphError): + graph.get_task(task_not_in_graph.id) + + +class TestTaskGraphGraphTraversal(object): + + def test_tasks_iteration(self, graph): + task = MockTask() + other_task = MockTask() + graph.add_tasks(task) + graph.add_tasks(other_task) + tasks = [t for t in graph.tasks] + assert set(tasks) == set([task, other_task]) + + def test_get_dependents(self, graph): + task = MockTask() + dependent_task_1 = MockTask() + dependent_task_2 = MockTask() + transitively_dependent_task = MockTask() + + graph.add_tasks(task) + graph.add_tasks(dependent_task_1) + graph.add_tasks(dependent_task_2) + graph.add_tasks(transitively_dependent_task) + + graph.add_dependency(dependent_task_1, task) + graph.add_dependency(dependent_task_2, task) + graph.add_dependency(transitively_dependent_task, dependent_task_2) + + dependent_tasks = list(graph.get_dependents(task)) + # transitively_dependent_task not expected to appear in the result + assert set(dependent_tasks) == set([dependent_task_1, dependent_task_2]) + + def test_get_task_empty_dependents(self, graph): + task = MockTask() + other_task = MockTask() + graph.add_tasks(task) + graph.add_tasks(other_task) + dependent_tasks = list(graph.get_dependents(task)) + assert len(dependent_tasks) == 0 + + def test_get_nonexistent_task_dependents(self, graph): + task = MockTask() + task_not_in_graph = MockTask() + graph.add_tasks(task) + with pytest.raises(task_graph.TaskNotInGraphError): + list(graph.get_dependents(task_not_in_graph)) + + def test_get_dependencies(self, graph): + task = MockTask() + dependency_task_1 = MockTask() + dependency_task_2 = MockTask() + transitively_dependency_task = MockTask() + + graph.add_tasks(task) + graph.add_tasks(dependency_task_1) + graph.add_tasks(dependency_task_2) + graph.add_tasks(transitively_dependency_task) + + graph.add_dependency(task, dependency_task_1) + graph.add_dependency(task, dependency_task_2) + graph.add_dependency(dependency_task_2, transitively_dependency_task) + + dependency_tasks = list(graph.get_dependencies(task)) + # transitively_dependency_task not expected to appear in the result + assert set(dependency_tasks) == set([dependency_task_1, dependency_task_2]) + + def test_get_task_empty_dependencies(self, graph): + task = MockTask() + other_task = MockTask() + graph.add_tasks(task) + graph.add_tasks(other_task) + dependency_tasks = list(graph.get_dependencies(task)) + assert len(dependency_tasks) == 0 + + def test_get_nonexistent_task_dependencies(self, graph): + task = MockTask() + task_not_in_graph = MockTask() + graph.add_tasks(task) + with pytest.raises(task_graph.TaskNotInGraphError): + list(graph.get_dependencies(task_not_in_graph)) + + +class TestTaskGraphDependencies(object): + + def test_add_dependency(self, graph): + task = MockTask() + dependency_task = MockTask() + unrelated_task = MockTask() + graph.add_tasks(task) + graph.add_tasks(dependency_task) + graph.add_tasks(unrelated_task) + graph.add_dependency(task, dependency_task) + add_result = graph.has_dependency(task, dependency_task) + assert add_result is True + dependency_tasks = list(graph.get_dependencies(task)) + assert len(dependency_tasks) == 1 + assert dependency_tasks[0] == dependency_task + + def test_add_existing_dependency(self, graph): + task = MockTask() + dependency_task = MockTask() + graph.add_tasks(task) + graph.add_tasks(dependency_task) + graph.add_dependency(task, dependency_task) + add_result = graph.has_dependency(task, dependency_task) + # adding a dependency already in graph - should have no effect, and return False + assert add_result is True + graph.add_dependency(task, dependency_task) + add_result = graph.has_dependency(task, dependency_task) + assert add_result is True + dependency_tasks = list(graph.get_dependencies(task)) + assert len(dependency_tasks) == 1 + assert dependency_tasks[0] == dependency_task + + def test_add_dependency_nonexistent_dependent(self, graph): + task = MockTask() + task_not_in_graph = MockTask() + graph.add_tasks(task) + with pytest.raises(task_graph.TaskNotInGraphError): + graph.add_dependency(task_not_in_graph, task) + + def test_add_dependency_nonexistent_dependency(self, graph): + task = MockTask() + task_not_in_graph = MockTask() + graph.add_tasks(task) + with pytest.raises(task_graph.TaskNotInGraphError): + graph.add_dependency(task, task_not_in_graph) + + def test_add_dependency_empty_dependent(self, graph): + task = MockTask() + graph.add_tasks(task) + # expecting add_dependency result to be False - no dependency has been created + assert set(graph.tasks) == set((task,)) + + def test_add_dependency_empty_dependency(self, graph): + task = MockTask() + graph.add_tasks(task) + # expecting add_dependency result to be False - no dependency has been created + assert set(graph.tasks) == set((task,)) + + def test_add_dependency_dependent_group(self, graph): + task = MockTask() + group_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(task) + graph.add_tasks(*group_tasks) + graph.add_dependency(group_tasks, task) + assert graph.has_dependency(group_tasks[0], task) is True + assert graph.has_dependency(group_tasks[1], task) is True + assert graph.has_dependency(group_tasks[2], task) is True + + def test_add_dependency_dependency_group(self, graph): + task = MockTask() + group_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(task) + graph.add_tasks(*group_tasks) + graph.add_dependency(task, group_tasks) + assert graph.has_dependency(task, group_tasks[0]) is True + assert graph.has_dependency(task, group_tasks[1]) is True + assert graph.has_dependency(task, group_tasks[2]) is True + + def test_add_dependency_between_groups(self, graph): + group_1_tasks = [MockTask() for _ in xrange(3)] + group_2_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(*group_1_tasks) + graph.add_tasks(*group_2_tasks) + graph.add_dependency(group_1_tasks, group_2_tasks) + for group_2_task in group_2_tasks: + assert graph.has_dependency(group_1_tasks[0], group_2_task) is True + assert graph.has_dependency(group_1_tasks[1], group_2_task) is True + assert graph.has_dependency(group_1_tasks[2], group_2_task) is True + + def test_add_dependency_dependency_group_with_some_existing_dependencies(self, graph): + task = MockTask() + group_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(task) + graph.add_tasks(*group_tasks) + # adding a dependency on a specific task manually, + # before adding a dependency on the whole parallel + graph.add_dependency(task, group_tasks[1]) + graph.add_dependency(task, group_tasks) + assert graph.has_dependency(task, group_tasks[0]) is True + assert graph.has_dependency(task, group_tasks[1]) is True + assert graph.has_dependency(task, group_tasks[2]) is True + + def test_add_existing_dependency_between_groups(self, graph): + group_1_tasks = [MockTask() for _ in xrange(3)] + group_2_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(*group_1_tasks) + graph.add_tasks(*group_2_tasks) + graph.add_dependency(group_1_tasks, group_2_tasks) + add_result = graph.has_dependency(group_1_tasks, group_2_tasks) + assert add_result is True + # adding a dependency already in graph - should have no effect, and return False + graph.add_dependency(group_1_tasks, group_2_tasks) + add_result = graph.has_dependency(group_1_tasks, group_2_tasks) + assert add_result is True + for group_2_task in group_2_tasks: + assert graph.has_dependency(group_1_tasks[0], group_2_task) is True + assert graph.has_dependency(group_1_tasks[1], group_2_task) is True + assert graph.has_dependency(group_1_tasks[2], group_2_task) is True + + def test_has_dependency(self, graph): + task = MockTask() + dependency_task = MockTask() + graph.add_tasks(task) + graph.add_tasks(dependency_task) + graph.add_dependency(task, dependency_task) + assert graph.has_dependency(task, dependency_task) is True + + def test_has_nonexistent_dependency(self, graph): + task = MockTask() + other_task = MockTask() + graph.add_tasks(task) + graph.add_tasks(other_task) + assert graph.has_dependency(task, other_task) is False + + def test_has_dependency_nonexistent_dependent(self, graph): + task = MockTask() + task_not_in_graph = MockTask() + graph.add_tasks(task) + with pytest.raises(task_graph.TaskNotInGraphError): + graph.has_dependency(task_not_in_graph, task) + + def test_has_dependency_nonexistent_dependency(self, graph): + task = MockTask() + task_not_in_graph = MockTask() + graph.add_tasks(task) + with pytest.raises(task_graph.TaskNotInGraphError): + graph.has_dependency(task, task_not_in_graph) + + def test_has_dependency_empty_dependent(self, graph): + task = MockTask() + graph.add_tasks(task) + # expecting has_dependency result to be False - dependency in an empty form + assert graph.has_dependency([], task) is False + + def test_has_dependency_empty_dependency(self, graph): + task = MockTask() + graph.add_tasks(task) + # expecting has_dependency result to be True - dependency in an empty form + assert graph.has_dependency(task, []) is False + + def test_has_dependency_dependent_group(self, graph): + task = MockTask() + group_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(task) + graph.add_tasks(*group_tasks) + assert graph.has_dependency(group_tasks, task) is False + graph.add_dependency(group_tasks, task) + assert graph.has_dependency(group_tasks, task) is True + + def test_has_dependency_dependency_parallel(self, graph): + task = MockTask() + group_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(task) + graph.add_tasks(*group_tasks) + assert graph.has_dependency(task, group_tasks) is False + graph.add_dependency(task, group_tasks) + assert graph.has_dependency(task, group_tasks) is True + + def test_has_dependency_between_groups(self, graph): + group_1_tasks = [MockTask() for _ in xrange(3)] + group_2_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(*group_1_tasks) + graph.add_tasks(*group_2_tasks) + assert graph.has_dependency(group_2_tasks, group_1_tasks) is False + graph.add_dependency(group_2_tasks, group_1_tasks) + assert graph.has_dependency(group_2_tasks, group_1_tasks) is True + + def test_has_dependency_dependency_parallel_with_some_existing_dependencies(self, graph): + task = MockTask() + parallel_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(task) + parallel = graph.add_tasks(*parallel_tasks) + graph.add_dependency(task, parallel_tasks[1]) + # only a partial dependency exists - has_dependency is expected to return False + assert graph.has_dependency(task, parallel) is False + + def test_has_nonexistent_dependency_between_groups(self, graph): + group_1_tasks = [MockTask() for _ in xrange(3)] + group_2_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(*group_1_tasks) + graph.add_tasks(*group_2_tasks) + assert graph.has_dependency(group_1_tasks, group_2_tasks) is False + + def test_remove_dependency(self, graph): + task = MockTask() + dependency_task = MockTask() + another_dependent_task = MockTask() + graph.add_tasks(task) + graph.add_tasks(dependency_task) + graph.add_tasks(another_dependent_task) + graph.add_dependency(task, dependency_task) + graph.add_dependency(another_dependent_task, dependency_task) + + graph.remove_dependency(task, dependency_task) + remove_result = graph.has_dependency(task, dependency_task) + assert remove_result is False + assert graph.has_dependency(task, dependency_task) is False + assert graph.has_dependency(another_dependent_task, dependency_task) is True + + def test_remove_nonexistent_dependency(self, graph): + task = MockTask() + dependency_task = MockTask() + graph.add_tasks(task) + graph.add_tasks(dependency_task) + # removing a dependency not in graph - should have no effect, and return False + graph.remove_dependency(task, dependency_task) + remove_result = graph.has_dependency(task, dependency_task) + assert remove_result is False + tasks = [t for t in graph.tasks] + assert set(tasks) == set([task, dependency_task]) + + def test_remove_dependency_nonexistent_dependent(self, graph): + task = MockTask() + task_not_in_graph = MockTask() + graph.add_tasks(task) + with pytest.raises(task_graph.TaskNotInGraphError): + graph.remove_dependency(task_not_in_graph, task) + + def test_remove_dependency_nonexistent_dependency(self, graph): + # in this test the dependency *task* is not in the graph, not just the dependency itself + task = MockTask() + task_not_in_graph = MockTask() + graph.add_tasks(task) + with pytest.raises(task_graph.TaskNotInGraphError): + graph.remove_dependency(task, task_not_in_graph) + + def test_remove_dependency_empty_dependent(self, graph): + task = MockTask() + graph.add_tasks(task) + # expecting remove_dependency result to be False - no dependency has been created + graph.remove_dependency([], task) + assert set(graph.tasks) == set((task,)) + + def test_remove_dependency_empty_dependency(self, graph): + task = MockTask() + graph.add_tasks(task) + # expecting remove_dependency result to be False - no dependency has been created + graph.remove_dependency(task, []) + assert set(graph.tasks) == set((task,)) + + def test_remove_dependency_dependent_group(self, graph): + task = MockTask() + group_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(task) + graph.add_tasks(*group_tasks) + graph.add_dependency(group_tasks, task) + graph.remove_dependency(group_tasks, task) + remove_result = graph.has_dependency(group_tasks, task) + assert remove_result is False + assert graph.has_dependency(group_tasks[0], task) is False + assert graph.has_dependency(group_tasks[1], task) is False + assert graph.has_dependency(group_tasks[2], task) is False + + def test_remove_dependency_dependency_group(self, graph): + task = MockTask() + group_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(task) + graph.add_tasks(*group_tasks) + graph.add_dependency(task, group_tasks) + graph.remove_dependency(task, group_tasks) + remove_result = graph.has_dependency(task, group_tasks) + assert remove_result is False + assert graph.has_dependency(task, group_tasks[0]) is False + assert graph.has_dependency(task, group_tasks[1]) is False + assert graph.has_dependency(task, group_tasks[2]) is False + + def test_remove_dependency_between_groups(self, graph): + group_1_tasks = [MockTask() for _ in xrange(3)] + group_2_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(*group_1_tasks) + graph.add_tasks(*group_2_tasks) + graph.add_dependency(group_2_tasks, group_1_tasks) + graph.remove_dependency(group_2_tasks, group_1_tasks) + remove_result = graph.has_dependency(group_2_tasks, group_1_tasks) + assert remove_result is False + for group_2_task in group_2_tasks: + assert graph.has_dependency(group_2_task, group_1_tasks[0]) is False + assert graph.has_dependency(group_2_task, group_1_tasks[1]) is False + assert graph.has_dependency(group_2_task, group_1_tasks[2]) is False + + def test_remove_dependency_dependency_group_with_some_existing_dependencies(self, graph): + task = MockTask() + group_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(task) + graph.add_tasks(*group_tasks) + graph.add_dependency(task, group_tasks[1]) + graph.remove_dependency(task, group_tasks) + remove_result = graph.has_dependency(task, group_tasks) + # only a partial dependency exists - remove_dependency is expected to return False + assert remove_result is False + # no dependencies are expected to have changed + assert graph.has_dependency(task, group_tasks[0]) is False + assert graph.has_dependency(task, group_tasks[1]) is True + assert graph.has_dependency(task, group_tasks[2]) is False + + def test_remove_nonexistent_dependency_between_groups(self, graph): + group_1_tasks = [MockTask() for _ in xrange(3)] + group_2_tasks = [MockTask() for _ in xrange(3)] + graph.add_tasks(*group_1_tasks) + graph.add_tasks(*group_2_tasks) + # removing a dependency not in graph - should have no effect, and return False + graph.remove_dependency(group_2_tasks, group_1_tasks) + remove_result = graph.has_dependency(group_2_tasks, group_1_tasks) + assert remove_result is False + + # nested tests + + def test_group_with_nested_sequence(self, graph): + all_tasks = [MockTask() for _ in xrange(5)] + graph.add_tasks(all_tasks[0], + graph.sequence(all_tasks[1], all_tasks[2], all_tasks[3]), + all_tasks[4]) + assert set(graph.tasks) == set(all_tasks) + + # tasks[2] and tasks[3] should each have a single dependency; the rest should have none + assert len(list(graph.get_dependencies(all_tasks[0]))) == 0 + assert len(list(graph.get_dependencies(all_tasks[1]))) == 0 + assert set(graph.get_dependencies(all_tasks[2])) == set([all_tasks[1]]) + assert set(graph.get_dependencies(all_tasks[3])) == set([all_tasks[2]]) + assert len(list(graph.get_dependencies(all_tasks[4]))) == 0 + + def test_group_with_nested_group(self, graph): + tasks = [MockTask() for _ in xrange(5)] + graph.add_tasks(tasks[0], (tasks[1], tasks[2], tasks[3]), tasks[4]) + graph_tasks = [t for t in graph.tasks] + assert set(graph_tasks) == set(tasks) + # none of the tasks should have any dependencies + for i in xrange(len(tasks)): + assert len(list(graph.get_dependencies(tasks[i]))) == 0 + + def test_group_with_recursively_nested_group(self, graph): + recursively_nested_tasks = [MockTask(), MockTask(), MockTask()] + nested_tasks = [MockTask(), MockTask(), MockTask(), recursively_nested_tasks] + tasks = [MockTask(), MockTask(), MockTask(), nested_tasks] + graph.add_tasks(*tasks) + + assert set(graph.tasks) == set(tasks[:3] + nested_tasks[:3] + recursively_nested_tasks) + for tasks_list in [tasks, nested_tasks, recursively_nested_tasks]: + for i in xrange(len(tasks_list[:3])): + assert len(list(graph.get_dependencies(tasks_list[i]))) == 0 + + def test_group_with_recursively_nested_group_and_interdependencies(self, graph): + recursively_nested_tasks = [MockTask(), MockTask(), MockTask()] + nested_tasks = [MockTask(), MockTask(), MockTask(), recursively_nested_tasks] + tasks = [MockTask(), MockTask(), MockTask(), nested_tasks] + graph.add_tasks(*tasks) + + graph.add_dependency(tasks[2], nested_tasks[2]) + graph.add_dependency(nested_tasks[1], recursively_nested_tasks[0]) + graph.add_dependency(recursively_nested_tasks[1], tasks[0]) + + assert set(graph.tasks) == set(tasks[:3] + nested_tasks[:3] + recursively_nested_tasks) + assert set(graph.get_dependencies(tasks[0])) == set() + assert set(graph.get_dependencies(tasks[1])) == set() + assert set(graph.get_dependencies(tasks[2])) == set([nested_tasks[2]]) + + assert set(graph.get_dependencies(nested_tasks[0])) == set() + assert set(graph.get_dependencies(nested_tasks[1])) == set([recursively_nested_tasks[0]]) + assert set(graph.get_dependencies(nested_tasks[2])) == set() + + assert set(graph.get_dependencies(recursively_nested_tasks[0])) == set() + assert set(graph.get_dependencies(recursively_nested_tasks[1])) == set([tasks[0]]) + assert set(graph.get_dependencies(recursively_nested_tasks[2])) == set() + + +class TestTaskGraphSequence(object): + + def test_sequence(self, graph): + tasks = [MockTask(), MockTask(), MockTask()] + graph.sequence(*tasks) + graph_tasks = [t for t in graph.tasks] + assert set(graph_tasks) == set(tasks) + assert len(list(graph.get_dependencies(tasks[0]))) == 0 + assert set(graph.get_dependencies(tasks[1])) == set([tasks[0]]) + assert set(graph.get_dependencies(tasks[2])) == set([tasks[1]]) + + def test_sequence_with_some_tasks_and_dependencies_already_in_graph(self, graph): + # tests both that tasks which werent previously in graph get inserted, and + # that existing tasks don't get re-added to graph + tasks = [MockTask(), MockTask(), MockTask()] + # insert some tasks and dependencies to the graph + graph.add_tasks(tasks[1]) + graph.add_tasks(tasks[2]) + graph.add_dependency(tasks[2], tasks[1]) + + graph.sequence(*tasks) + graph_tasks = [t for t in graph.tasks] + assert set(graph_tasks) == set(tasks) + assert len(list(graph.get_dependencies(tasks[0]))) == 0 + assert set(graph.get_dependencies(tasks[1])) == set([tasks[0]]) + assert set(graph.get_dependencies(tasks[2])) == set([tasks[1]]) + + def test_sequence_with_nested_sequence(self, graph): + tasks = [MockTask() for _ in xrange(5)] + graph.sequence(tasks[0], graph.sequence(tasks[1], tasks[2], tasks[3]), tasks[4]) + graph_tasks = [t for t in graph.tasks] + assert set(graph_tasks) == set(tasks) + # first task should have no dependencies + assert len(list(graph.get_dependencies(tasks[0]))) == 0 + assert len(list(graph.get_dependencies(tasks[1]))) == 1 + assert len(list(graph.get_dependencies(tasks[2]))) == 2 + assert len(list(graph.get_dependencies(tasks[3]))) == 2 + assert len(list(graph.get_dependencies(tasks[4]))) == 3 + + def test_sequence_with_nested_group(self, graph): + tasks = [MockTask() for _ in xrange(5)] + graph.sequence(tasks[0], (tasks[1], tasks[2], tasks[3]), tasks[4]) + graph_tasks = [t for t in graph.tasks] + assert set(graph_tasks) == set(tasks) + # first task should have no dependencies + assert len(list(graph.get_dependencies(tasks[0]))) == 0 + # rest of the tasks (except last) should have a single dependency - the first task + for i in xrange(1, 4): + assert set(graph.get_dependencies(tasks[i])) == set([tasks[0]]) + # last task should have have a dependency on all tasks except for the first one + assert set(graph.get_dependencies(tasks[4])) == set([tasks[1], tasks[2], tasks[3]]) + + def test_sequence_with_recursively_nested_group(self, graph): + recursively_nested_group = [MockTask(), MockTask()] + nested_group = [MockTask(), recursively_nested_group, MockTask()] + sequence_tasks = [MockTask(), nested_group, MockTask()] + + graph.sequence(*sequence_tasks) + graph_tasks = [t for t in graph.tasks] + assert set(graph_tasks) == set([sequence_tasks[0], nested_group[0], + recursively_nested_group[0], recursively_nested_group[1], + nested_group[2], sequence_tasks[2]]) + + assert list(graph.get_dependencies(nested_group[0])) == [sequence_tasks[0]] + assert list(graph.get_dependencies(recursively_nested_group[0])) == [sequence_tasks[0]] + assert list(graph.get_dependencies(recursively_nested_group[1])) == [sequence_tasks[0]] + assert list(graph.get_dependencies(nested_group[2])) == [sequence_tasks[0]] + + assert list(graph.get_dependents(nested_group[0])) == [sequence_tasks[2]] + assert list(graph.get_dependents(recursively_nested_group[0])) == [sequence_tasks[2]] + assert list(graph.get_dependents(recursively_nested_group[1])) == [sequence_tasks[2]] + assert list(graph.get_dependents(nested_group[2])) == [sequence_tasks[2]] + + def test_sequence_with_empty_group(self, graph): + tasks = [MockTask(), [], MockTask()] + graph.sequence(*tasks) + graph_tasks = set([t for t in graph.tasks]) + assert graph_tasks == set([tasks[0], tasks[2]]) + assert list(graph.get_dependents(tasks[0])) == [tasks[2]] + assert list(graph.get_dependencies(tasks[2])) == [tasks[0]] + + def test_sequence_with_recursively_nested_sequence_and_interdependencies(self, graph): + recursively_nested_tasks = list(graph.sequence(MockTask(), MockTask(), MockTask())) + nested_tasks = list(graph.sequence(MockTask(), + MockTask(), + MockTask(), + recursively_nested_tasks)) + tasks = [MockTask(), MockTask(), MockTask(), nested_tasks] + graph.sequence(*tasks) + + assert set(graph.tasks) == set(tasks[:3] + nested_tasks[:3] + recursively_nested_tasks) + assert set(graph.get_dependencies(tasks[0])) == set() + for i in xrange(1, len(tasks[:-1])): + assert set(graph.get_dependencies(tasks[i])) == set([tasks[i - 1]]) + + assert set(graph.get_dependencies(nested_tasks[0])) == set([tasks[2]]) + for i in xrange(1, len(nested_tasks[:-1])): + assert set(graph.get_dependencies(nested_tasks[i])) == \ + set([tasks[2], nested_tasks[i-1]]) + + assert set(graph.get_dependencies(recursively_nested_tasks[0])) == \ + set([tasks[2], nested_tasks[2]]) + for i in xrange(1, len(recursively_nested_tasks[:-1])): + assert set(graph.get_dependencies(recursively_nested_tasks[i])) == \ + set([tasks[2], nested_tasks[2], recursively_nested_tasks[i-1]]) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/__init__.py new file mode 100644 index 0000000..1809f82 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/__init__.py @@ -0,0 +1,70 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.orchestrator.workflows.builtin import workflows + + +def _assert_relationships(operations, expected_op_full_name, relationships=0): + """ + + :param operations: and iterable of operations + :param expected_op_full_name: Note that source/target doesn't really matter since they are + dropped + :param relationships: the number of relationships + :return: + """ + expected_op_name = expected_op_full_name.rsplit('_', 1)[0] + for _ in xrange(relationships): + # Since the target and source operations start of the same way, we only need to retrieve the + # suffix once + operation = next(operations) + relationship_id_1 = operation.actor.id + _assert_cfg_interface_op(operation, expected_op_name) + + operation = next(operations) + relationship_id_2 = operation.actor.id + _assert_cfg_interface_op(operation, expected_op_name) + + assert relationship_id_1 == relationship_id_2 + + +def assert_node_install_operations(operations, relationships=0): + operations = iter(operations) + + _assert_std_interface_op(next(operations), workflows.NORMATIVE_CREATE) + _assert_relationships(operations, workflows.NORMATIVE_PRE_CONFIGURE_SOURCE, relationships) + _assert_std_interface_op(next(operations), workflows.NORMATIVE_CONFIGURE) + _assert_relationships(operations, workflows.NORMATIVE_POST_CONFIGURE_SOURCE, relationships) + _assert_std_interface_op(next(operations), workflows.NORMATIVE_START) + _assert_relationships(operations, workflows.NORMATIVE_ADD_SOURCE, relationships) + + +def assert_node_uninstall_operations(operations, relationships=0): + operations = iter(operations) + + _assert_std_interface_op(next(operations), workflows.NORMATIVE_STOP) + _assert_relationships(operations, workflows.NORMATIVE_REMOVE_SOURCE, relationships) + _assert_std_interface_op(next(operations), workflows.NORMATIVE_DELETE) + + +def _assert_cfg_interface_op(op, operation_name): + # We need to remove the source/target + assert op.operation_name.rsplit('_', 1)[0] == operation_name + assert op.interface_name == workflows.NORMATIVE_CONFIGURE_INTERFACE + + +def _assert_std_interface_op(op, operation_name): + assert op.operation_name == operation_name + assert op.interface_name == workflows.NORMATIVE_STANDARD_INTERFACE diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_execute_operation.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_execute_operation.py new file mode 100644 index 0000000..8713e3c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_execute_operation.py @@ -0,0 +1,64 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.orchestrator.workflows.api import task +from aria.orchestrator.workflows.builtin.execute_operation import execute_operation + +from tests import mock, storage + + +@pytest.fixture +def ctx(tmpdir): + context = mock.context.simple(str(tmpdir), inmemory=False) + yield context + storage.release_sqlite_storage(context.model) + + +def test_execute_operation(ctx): + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface_name, operation_name = mock.operations.NODE_OPERATIONS_INSTALL[0] + interface = mock.models.create_interface( + ctx.service, + interface_name, + operation_name, + operation_kwargs=dict(function='test') + ) + node.interfaces[interface.name] = interface + ctx.model.node.update(node) + + execute_tasks = list( + task.WorkflowTask( + execute_operation, + ctx=ctx, + interface_name=interface_name, + operation_name=operation_name, + operation_kwargs={}, + allow_kwargs_override=False, + run_by_dependency_order=False, + type_names=[], + node_template_ids=[], + node_ids=[node.id] + ).topological_order() + ) + + assert len(execute_tasks) == 1 + assert getattr(execute_tasks[0].actor, '_wrapped', execute_tasks[0].actor) == node + assert execute_tasks[0].operation_name == operation_name + assert execute_tasks[0].interface_name == interface_name + + +# TODO: add more scenarios diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_heal.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_heal.py new file mode 100644 index 0000000..0a422bd --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_heal.py @@ -0,0 +1,100 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.orchestrator.workflows.api import task +from aria.orchestrator.workflows.builtin.heal import heal + +from tests import mock, storage + +from . import (assert_node_install_operations, assert_node_uninstall_operations) + + +@pytest.fixture +def ctx(tmpdir): + context = mock.context.simple(str(tmpdir)) + yield context + storage.release_sqlite_storage(context.model) + + +@pytest.mark.skip(reason='heal is not implemented for now') +def test_heal_dependent_node(ctx): + dependent_node = \ + ctx.model.node.get_by_name(mock.models.DEPENDENT_NODE_NAME) + dependent_node.host_fk = dependent_node.id + ctx.model.node.update(dependent_node) + heal_graph = task.WorkflowTask(heal, ctx=ctx, node_id=dependent_node.id) + + assert len(list(heal_graph.tasks)) == 2 + uninstall_subgraph, install_subgraph = list(heal_graph.topological_order(reverse=True)) + + assert len(list(uninstall_subgraph.tasks)) == 2 + dependent_node_subgraph_uninstall, dependency_node_subgraph_uninstall = \ + list(uninstall_subgraph.topological_order(reverse=True)) + + assert len(list(install_subgraph.tasks)) == 2 + dependency_node_subgraph_install, dependent_node_subgraph_install = \ + list(install_subgraph.topological_order(reverse=True)) + + dependent_node_uninstall_tasks = \ + list(dependent_node_subgraph_uninstall.topological_order(reverse=True)) + assert isinstance(dependency_node_subgraph_uninstall, task.StubTask) + dependent_node_install_tasks = \ + list(dependent_node_subgraph_install.topological_order(reverse=True)) + assert isinstance(dependency_node_subgraph_install, task.StubTask) + + assert_node_uninstall_operations(dependent_node_uninstall_tasks, relationships=1) + assert_node_install_operations(dependent_node_install_tasks, relationships=1) + + +@pytest.mark.skip(reason='heal is not implemented for now') +def test_heal_dependency_node(ctx): + dependency_node = \ + ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + dependency_node.host_fk = dependency_node.id + ctx.model.node.update(dependency_node) + heal_graph = task.WorkflowTask(heal, ctx=ctx, node_id=dependency_node.id) + # both subgraphs should contain un\install for both the dependent and the dependency + assert len(list(heal_graph.tasks)) == 2 + uninstall_subgraph, install_subgraph = list(heal_graph.topological_order(reverse=True)) + + uninstall_tasks = list(uninstall_subgraph.topological_order(reverse=True)) + assert len(uninstall_tasks) == 4 + unlink_source, unlink_target = uninstall_tasks[:2] + dependent_node_subgraph_uninstall, dependency_node_subgraph_uninstall = uninstall_tasks[2:] + + install_tasks = list(install_subgraph.topological_order(reverse=True)) + assert len(install_tasks) == 4 + dependency_node_subgraph_install, dependent_node_subgraph_install = install_tasks[:2] + establish_source, establish_target = install_tasks[2:] + + assert isinstance(dependent_node_subgraph_uninstall, task.StubTask) + dependency_node_uninstall_tasks = \ + list(dependency_node_subgraph_uninstall.topological_order(reverse=True)) + assert isinstance(dependent_node_subgraph_install, task.StubTask) + dependency_node_install_tasks = \ + list(dependency_node_subgraph_install.topological_order(reverse=True)) + + assert unlink_source.name.startswith('aria.interfaces.relationship_lifecycle.unlink') + assert unlink_target.name.startswith('aria.interfaces.relationship_lifecycle.unlink') + assert_node_uninstall_operations(dependency_node_uninstall_tasks) + + assert_node_install_operations(dependency_node_install_tasks) + assert establish_source.name.startswith('aria.interfaces.relationship_lifecycle.establish') + assert establish_target.name.startswith('aria.interfaces.relationship_lifecycle.establish') + + +# TODO: add tests for contained in scenario diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_install.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_install.py new file mode 100644 index 0000000..1a4e1f9 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_install.py @@ -0,0 +1,46 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.orchestrator.workflows.api import task +from aria.orchestrator.workflows.builtin.install import install + +from tests import mock +from tests import storage + +from . import assert_node_install_operations + + +@pytest.fixture +def ctx(tmpdir): + context = mock.context.simple(str(tmpdir), + topology=mock.topology.create_simple_topology_three_nodes) + yield context + storage.release_sqlite_storage(context.model) + + +def test_install(ctx): + + install_tasks = list(task.WorkflowTask(install, ctx=ctx).topological_order(True)) + + assert len(install_tasks) == 3 + dependency_node_subgraph1, dependency_node_subgraph2, dependent_node_subgraph = install_tasks + dependent_node_tasks = list(dependent_node_subgraph.topological_order(reverse=True)) + dependency_node1_tasks = list(dependency_node_subgraph1.topological_order(reverse=True)) + dependency_node2_tasks = list(dependency_node_subgraph2.topological_order(reverse=True)) + + assert_node_install_operations(dependency_node1_tasks) + assert_node_install_operations(dependency_node2_tasks) + assert_node_install_operations(dependent_node_tasks, relationships=2) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_uninstall.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_uninstall.py new file mode 100644 index 0000000..aa04c38 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/builtin/test_uninstall.py @@ -0,0 +1,47 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.orchestrator.workflows.api import task +from aria.orchestrator.workflows.builtin.uninstall import uninstall + +from tests import mock +from tests import storage + +from . import assert_node_uninstall_operations + + +@pytest.fixture +def ctx(tmpdir): + context = mock.context.simple(str(tmpdir), + topology=mock.topology.create_simple_topology_three_nodes) + yield context + storage.release_sqlite_storage(context.model) + + +def test_uninstall(ctx): + + uninstall_tasks = list(task.WorkflowTask(uninstall, ctx=ctx).topological_order(True)) + + assert len(uninstall_tasks) == 3 + dependent_node_subgraph, dependency_node_subgraph1, dependency_node_subgraph2 = uninstall_tasks + dependent_node_tasks = list(dependent_node_subgraph.topological_order(reverse=True)) + dependency_node1_tasks = list(dependency_node_subgraph1.topological_order(reverse=True)) + dependency_node2_tasks = list(dependency_node_subgraph2.topological_order(reverse=True)) + + assert_node_uninstall_operations(operations=dependency_node1_tasks) + assert_node_uninstall_operations(operations=dependency_node2_tasks) + assert_node_uninstall_operations(operations=dependent_node_tasks, relationships=2) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/__init__.py new file mode 100644 index 0000000..ae1e83e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/__init__.py @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_engine.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_engine.py new file mode 100644 index 0000000..0c704f5 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_engine.py @@ -0,0 +1,564 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 +import threading +from datetime import datetime + +import pytest + +from aria.orchestrator import ( + events, + workflow, + operation, +) +from aria.modeling import models +from aria.orchestrator.workflows import ( + api, + exceptions, +) +from aria.orchestrator.workflows.core import engine, graph_compiler +from aria.orchestrator.workflows.executor import thread + +from tests import mock, storage + + +global_test_holder = {} + + +class BaseTest(object): + + @classmethod + def _execute(cls, workflow_func, workflow_context, executor): + eng = cls._engine(workflow_func=workflow_func, + workflow_context=workflow_context, + executor=executor) + eng.execute(ctx=workflow_context) + return eng + + @staticmethod + def _engine(workflow_func, workflow_context, executor): + graph = workflow_func(ctx=workflow_context) + graph_compiler.GraphCompiler(workflow_context, executor.__class__).compile(graph) + + return engine.Engine(executors={executor.__class__: executor}) + + @staticmethod + def _create_interface(ctx, func, arguments=None): + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface_name = 'aria.interfaces.lifecycle' + operation_kwargs = dict(function='{name}.{func.__name__}'.format( + name=__name__, func=func)) + if arguments: + # the operation has to declare the arguments before those may be passed + operation_kwargs['arguments'] = arguments + operation_name = 'create' + interface = mock.models.create_interface(node.service, interface_name, operation_name, + operation_kwargs=operation_kwargs) + node.interfaces[interface.name] = interface + ctx.model.node.update(node) + + return node, interface_name, operation_name + + @staticmethod + def _op(node, + operation_name, + arguments=None, + max_attempts=None, + retry_interval=None, + ignore_failure=None): + + return api.task.OperationTask( + node, + interface_name='aria.interfaces.lifecycle', + operation_name=operation_name, + arguments=arguments, + max_attempts=max_attempts, + retry_interval=retry_interval, + ignore_failure=ignore_failure, + ) + + @pytest.fixture(autouse=True) + def globals_cleanup(self): + try: + yield + finally: + global_test_holder.clear() + + @pytest.fixture(autouse=True) + def signals_registration(self, ): + def sent_task_handler(ctx, *args, **kwargs): + if ctx.task._stub_type is None: + calls = global_test_holder.setdefault('sent_task_signal_calls', 0) + global_test_holder['sent_task_signal_calls'] = calls + 1 + + def start_workflow_handler(workflow_context, *args, **kwargs): + workflow_context.states.append('start') + + def success_workflow_handler(workflow_context, *args, **kwargs): + workflow_context.states.append('success') + + def failure_workflow_handler(workflow_context, exception, *args, **kwargs): + workflow_context.states.append('failure') + workflow_context.exception = exception + + def cancel_workflow_handler(workflow_context, *args, **kwargs): + workflow_context.states.append('cancel') + + events.start_workflow_signal.connect(start_workflow_handler) + events.on_success_workflow_signal.connect(success_workflow_handler) + events.on_failure_workflow_signal.connect(failure_workflow_handler) + events.on_cancelled_workflow_signal.connect(cancel_workflow_handler) + events.sent_task_signal.connect(sent_task_handler) + try: + yield + finally: + events.start_workflow_signal.disconnect(start_workflow_handler) + events.on_success_workflow_signal.disconnect(success_workflow_handler) + events.on_failure_workflow_signal.disconnect(failure_workflow_handler) + events.on_cancelled_workflow_signal.disconnect(cancel_workflow_handler) + events.sent_task_signal.disconnect(sent_task_handler) + + @pytest.fixture + def executor(self): + result = thread.ThreadExecutor() + try: + yield result + finally: + result.close() + + @pytest.fixture + def workflow_context(self, tmpdir): + workflow_context = mock.context.simple(str(tmpdir)) + workflow_context.states = [] + workflow_context.exception = None + yield workflow_context + storage.release_sqlite_storage(workflow_context.model) + + +class TestEngine(BaseTest): + + def test_empty_graph_execution(self, workflow_context, executor): + @workflow + def mock_workflow(**_): + pass + self._execute(workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'success'] + assert workflow_context.exception is None + assert 'sent_task_signal_calls' not in global_test_holder + execution = workflow_context.execution + assert execution.started_at <= execution.ended_at <= datetime.utcnow() + assert execution.error is None + assert execution.status == models.Execution.SUCCEEDED + + def test_single_task_successful_execution(self, workflow_context, executor): + node, _, operation_name = self._create_interface(workflow_context, mock_success_task) + + @workflow + def mock_workflow(ctx, graph): + graph.add_tasks(self._op(node, operation_name)) + self._execute( + workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'success'] + assert workflow_context.exception is None + assert global_test_holder.get('sent_task_signal_calls') == 1 + + def test_single_task_failed_execution(self, workflow_context, executor): + node, _, operation_name = self._create_interface(workflow_context, mock_failed_task) + + @workflow + def mock_workflow(ctx, graph): + graph.add_tasks(self._op(node, operation_name)) + with pytest.raises(exceptions.ExecutorException): + self._execute( + workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'failure'] + assert isinstance(workflow_context.exception, exceptions.ExecutorException) + assert global_test_holder.get('sent_task_signal_calls') == 1 + execution = workflow_context.execution + assert execution.started_at <= execution.ended_at <= datetime.utcnow() + assert execution.error is not None + assert execution.status == models.Execution.FAILED + + def test_two_tasks_execution_order(self, workflow_context, executor): + node, _, operation_name = self._create_interface( + workflow_context, mock_ordered_task, {'counter': 1}) + + @workflow + def mock_workflow(ctx, graph): + op1 = self._op(node, operation_name, arguments={'counter': 1}) + op2 = self._op(node, operation_name, arguments={'counter': 2}) + graph.sequence(op1, op2) + self._execute( + workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'success'] + assert workflow_context.exception is None + assert global_test_holder.get('invocations') == [1, 2] + assert global_test_holder.get('sent_task_signal_calls') == 2 + + def test_stub_and_subworkflow_execution(self, workflow_context, executor): + node, _, operation_name = self._create_interface( + workflow_context, mock_ordered_task, {'counter': 1}) + + @workflow + def sub_workflow(ctx, graph): + op1 = self._op(node, operation_name, arguments={'counter': 1}) + op2 = api.task.StubTask() + op3 = self._op(node, operation_name, arguments={'counter': 2}) + graph.sequence(op1, op2, op3) + + @workflow + def mock_workflow(ctx, graph): + graph.add_tasks(api.task.WorkflowTask(sub_workflow, ctx=ctx)) + self._execute(workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'success'] + assert workflow_context.exception is None + assert global_test_holder.get('invocations') == [1, 2] + assert global_test_holder.get('sent_task_signal_calls') == 2 + + +class TestCancel(BaseTest): + + def test_cancel_started_execution(self, workflow_context, executor): + number_of_tasks = 100 + node, _, operation_name = self._create_interface( + workflow_context, mock_sleep_task, {'seconds': 0.1}) + + @workflow + def mock_workflow(ctx, graph): + operations = ( + self._op(node, operation_name, arguments=dict(seconds=0.1)) + for _ in range(number_of_tasks) + ) + return graph.sequence(*operations) + + eng = self._engine(workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + t = threading.Thread(target=eng.execute, kwargs=dict(ctx=workflow_context)) + t.daemon = True + t.start() + time.sleep(10) + eng.cancel_execution(workflow_context) + t.join(timeout=60) # we need to give this a *lot* of time because Travis can be *very* slow + assert not t.is_alive() # if join is timed out it will not raise an exception + assert workflow_context.states == ['start', 'cancel'] + assert workflow_context.exception is None + invocations = global_test_holder.get('invocations', []) + assert 0 < len(invocations) < number_of_tasks + execution = workflow_context.execution + assert execution.started_at <= execution.ended_at <= datetime.utcnow() + assert execution.error is None + assert execution.status == models.Execution.CANCELLED + + def test_cancel_pending_execution(self, workflow_context, executor): + @workflow + def mock_workflow(graph, **_): + return graph + eng = self._engine(workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + eng.cancel_execution(workflow_context) + execution = workflow_context.execution + assert execution.status == models.Execution.CANCELLED + + +class TestRetries(BaseTest): + + def test_two_max_attempts_and_success_on_retry(self, workflow_context, executor): + node, _, operation_name = self._create_interface( + workflow_context, mock_conditional_failure_task, {'failure_count': 1}) + + @workflow + def mock_workflow(ctx, graph): + op = self._op(node, operation_name, + arguments={'failure_count': 1}, + max_attempts=2) + graph.add_tasks(op) + self._execute( + workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'success'] + assert workflow_context.exception is None + assert len(global_test_holder.get('invocations', [])) == 2 + assert global_test_holder.get('sent_task_signal_calls') == 2 + + def test_two_max_attempts_and_failure_on_retry(self, workflow_context, executor): + node, _, operation_name = self._create_interface( + workflow_context, mock_conditional_failure_task, {'failure_count': 1}) + + @workflow + def mock_workflow(ctx, graph): + op = self._op(node, operation_name, + arguments={'failure_count': 2}, + max_attempts=2) + graph.add_tasks(op) + with pytest.raises(exceptions.ExecutorException): + self._execute( + workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'failure'] + assert isinstance(workflow_context.exception, exceptions.ExecutorException) + assert len(global_test_holder.get('invocations', [])) == 2 + assert global_test_holder.get('sent_task_signal_calls') == 2 + + def test_three_max_attempts_and_success_on_first_retry(self, workflow_context, executor): + node, _, operation_name = self._create_interface( + workflow_context, mock_conditional_failure_task, {'failure_count': 1}) + @workflow + def mock_workflow(ctx, graph): + op = self._op(node, operation_name, + arguments={'failure_count': 1}, + max_attempts=3) + graph.add_tasks(op) + self._execute( + workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'success'] + assert workflow_context.exception is None + assert len(global_test_holder.get('invocations', [])) == 2 + assert global_test_holder.get('sent_task_signal_calls') == 2 + + def test_three_max_attempts_and_success_on_second_retry(self, workflow_context, executor): + node, _, operation_name = self._create_interface( + workflow_context, mock_conditional_failure_task, {'failure_count': 1}) + + @workflow + def mock_workflow(ctx, graph): + op = self._op(node, operation_name, + arguments={'failure_count': 2}, + max_attempts=3) + graph.add_tasks(op) + self._execute( + workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'success'] + assert workflow_context.exception is None + assert len(global_test_holder.get('invocations', [])) == 3 + assert global_test_holder.get('sent_task_signal_calls') == 3 + + def test_infinite_retries(self, workflow_context, executor): + node, _, operation_name = self._create_interface( + workflow_context, mock_conditional_failure_task, {'failure_count': 1}) + @workflow + def mock_workflow(ctx, graph): + op = self._op(node, operation_name, + arguments={'failure_count': 1}, + max_attempts=-1) + graph.add_tasks(op) + self._execute( + workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'success'] + assert workflow_context.exception is None + assert len(global_test_holder.get('invocations', [])) == 2 + assert global_test_holder.get('sent_task_signal_calls') == 2 + + def test_retry_interval_float(self, workflow_context, executor): + self._test_retry_interval(retry_interval=0.3, + workflow_context=workflow_context, + executor=executor) + + def test_retry_interval_int(self, workflow_context, executor): + self._test_retry_interval(retry_interval=1, + workflow_context=workflow_context, + executor=executor) + + def _test_retry_interval(self, retry_interval, workflow_context, executor): + node, _, operation_name = self._create_interface( + workflow_context, mock_conditional_failure_task, {'failure_count': 1}) + @workflow + def mock_workflow(ctx, graph): + op = self._op(node, operation_name, + arguments={'failure_count': 1}, + max_attempts=2, + retry_interval=retry_interval) + graph.add_tasks(op) + self._execute( + workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'success'] + assert workflow_context.exception is None + invocations = global_test_holder.get('invocations', []) + assert len(invocations) == 2 + invocation1, invocation2 = invocations + assert invocation2 - invocation1 >= retry_interval + assert global_test_holder.get('sent_task_signal_calls') == 2 + + def test_ignore_failure(self, workflow_context, executor): + node, _, operation_name = self._create_interface( + workflow_context, mock_conditional_failure_task, {'failure_count': 1}) + @workflow + def mock_workflow(ctx, graph): + op = self._op(node, operation_name, + ignore_failure=True, + arguments={'failure_count': 100}, + max_attempts=100) + graph.add_tasks(op) + self._execute( + workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'success'] + assert workflow_context.exception is None + invocations = global_test_holder.get('invocations', []) + assert len(invocations) == 1 + assert global_test_holder.get('sent_task_signal_calls') == 1 + + +class TestTaskRetryAndAbort(BaseTest): + message = 'EXPECTED_ERROR' + + def test_task_retry_default_interval(self, workflow_context, executor): + default_retry_interval = 0.1 + node, _, operation_name = self._create_interface( + workflow_context, mock_task_retry, {'message': self.message}) + + @workflow + def mock_workflow(ctx, graph): + op = self._op(node, operation_name, + arguments={'message': self.message}, + retry_interval=default_retry_interval, + max_attempts=2) + graph.add_tasks(op) + with pytest.raises(exceptions.ExecutorException): + self._execute( + workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'failure'] + assert isinstance(workflow_context.exception, exceptions.ExecutorException) + invocations = global_test_holder.get('invocations', []) + assert len(invocations) == 2 + invocation1, invocation2 = invocations + assert invocation2 - invocation1 >= default_retry_interval + assert global_test_holder.get('sent_task_signal_calls') == 2 + + def test_task_retry_custom_interval(self, workflow_context, executor): + default_retry_interval = 100 + custom_retry_interval = 0.1 + node, _, operation_name = self._create_interface( + workflow_context, mock_task_retry, {'message': self.message, + 'retry_interval': custom_retry_interval}) + + @workflow + def mock_workflow(ctx, graph): + op = self._op(node, operation_name, + arguments={'message': self.message, + 'retry_interval': custom_retry_interval}, + retry_interval=default_retry_interval, + max_attempts=2) + graph.add_tasks(op) + execution_start = time.time() + with pytest.raises(exceptions.ExecutorException): + self._execute( + workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + execution_end = time.time() + assert workflow_context.states == ['start', 'failure'] + assert isinstance(workflow_context.exception, exceptions.ExecutorException) + invocations = global_test_holder.get('invocations', []) + assert len(invocations) == 2 + assert (execution_end - execution_start) < default_retry_interval + assert global_test_holder.get('sent_task_signal_calls') == 2 + + def test_task_abort(self, workflow_context, executor): + node, _, operation_name = self._create_interface( + workflow_context, mock_task_abort, {'message': self.message}) + @workflow + def mock_workflow(ctx, graph): + op = self._op(node, operation_name, + arguments={'message': self.message}, + retry_interval=100, + max_attempts=100) + graph.add_tasks(op) + with pytest.raises(exceptions.ExecutorException): + self._execute( + workflow_func=mock_workflow, + workflow_context=workflow_context, + executor=executor) + assert workflow_context.states == ['start', 'failure'] + assert isinstance(workflow_context.exception, exceptions.ExecutorException) + invocations = global_test_holder.get('invocations', []) + assert len(invocations) == 1 + assert global_test_holder.get('sent_task_signal_calls') == 1 + + +@operation +def mock_success_task(**_): + pass + + +@operation +def mock_failed_task(**_): + raise RuntimeError + + +@operation +def mock_ordered_task(counter, **_): + invocations = global_test_holder.setdefault('invocations', []) + invocations.append(counter) + + +@operation +def mock_conditional_failure_task(failure_count, **_): + invocations = global_test_holder.setdefault('invocations', []) + try: + if len(invocations) < failure_count: + raise RuntimeError + finally: + invocations.append(time.time()) + + +@operation +def mock_sleep_task(seconds, **_): + _add_invocation_timestamp() + time.sleep(seconds) + + +@operation +def mock_task_retry(ctx, message, retry_interval=None, **_): + _add_invocation_timestamp() + retry_kwargs = {} + if retry_interval is not None: + retry_kwargs['retry_interval'] = retry_interval + ctx.task.retry(message, **retry_kwargs) + + +@operation +def mock_task_abort(ctx, message, **_): + _add_invocation_timestamp() + ctx.task.abort(message) + + +def _add_invocation_timestamp(): + invocations = global_test_holder.setdefault('invocations', []) + invocations.append(time.time()) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_events.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_events.py new file mode 100644 index 0000000..d804de5 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_events.py @@ -0,0 +1,171 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.orchestrator.decorators import operation, workflow +from aria.orchestrator.workflows.core import engine, graph_compiler +from aria.orchestrator.workflows.executor.thread import ThreadExecutor +from aria.orchestrator.workflows import api +from aria.modeling.service_instance import NodeBase + +from tests import mock, storage + +global_test_dict = {} # used to capture transitional node state changes + + +@pytest.fixture +def ctx(tmpdir): + context = mock.context.simple(str(tmpdir)) + yield context + storage.release_sqlite_storage(context.model) + +# TODO another possible approach of writing these tests: +# Don't create a ctx for every test. +# Problem is, that if for every test we create a workflow that contains just one standard +# lifecycle operation, then by the time we try to run the second test, the workflow failes since +# the execution tries to go from 'terminated' to 'pending'. +# And if we write a workflow that contains all the lifecycle operations, then first we need to +# change the api of `mock.models.create_interface`, which a lot of other tests use, and second how +# do we check all the state transition during the workflow execution in a convenient way. + +TYPE_URI_NAME = 'tosca.interfaces.node.lifecycle.Standard' +SHORTHAND_NAME = 'Standard' + + +def test_node_state_changes_as_a_result_of_standard_lifecycle_create(ctx, executor): + node = run_operation_on_node( + ctx, interface_name=TYPE_URI_NAME, op_name='create', executor=executor) + _assert_node_state_changed_as_a_result_of_standard_lifecycle_operation(node, 'create') + + +def test_node_state_changes_as_a_result_of_standard_lifecycle_configure(ctx, executor): + node = run_operation_on_node( + ctx, interface_name=TYPE_URI_NAME, op_name='configure', executor=executor) + _assert_node_state_changed_as_a_result_of_standard_lifecycle_operation(node, 'configure') + + +def test_node_state_changes_as_a_result_of_standard_lifecycle_start(ctx, executor): + node = run_operation_on_node( + ctx, interface_name=TYPE_URI_NAME, op_name='start', executor=executor) + _assert_node_state_changed_as_a_result_of_standard_lifecycle_operation(node, 'start') + + +def test_node_state_changes_as_a_result_of_standard_lifecycle_stop(ctx, executor): + node = run_operation_on_node( + ctx, interface_name=TYPE_URI_NAME, op_name='stop', executor=executor) + _assert_node_state_changed_as_a_result_of_standard_lifecycle_operation(node, 'stop') + + +def test_node_state_changes_as_a_result_of_standard_lifecycle_delete(ctx, executor): + node = run_operation_on_node( + ctx, interface_name=TYPE_URI_NAME, op_name='delete', executor=executor) + _assert_node_state_changed_as_a_result_of_standard_lifecycle_operation(node, 'delete') + + +def test_node_state_changes_as_a_result_of_standard_lifecycle_create_shorthand_name(ctx, executor): + node = run_operation_on_node( + ctx, interface_name=SHORTHAND_NAME, op_name='create', executor=executor) + _assert_node_state_changed_as_a_result_of_standard_lifecycle_operation(node, 'create') + + +def test_node_state_changes_as_a_result_of_standard_lifecycle_configure_shorthand_name( + ctx, executor): + node = run_operation_on_node( + ctx, interface_name=SHORTHAND_NAME, op_name='configure', executor=executor) + _assert_node_state_changed_as_a_result_of_standard_lifecycle_operation(node, 'configure') + + +def test_node_state_changes_as_a_result_of_standard_lifecycle_start_shorthand_name(ctx, executor): + node = run_operation_on_node( + ctx, interface_name=SHORTHAND_NAME, op_name='start', executor=executor) + _assert_node_state_changed_as_a_result_of_standard_lifecycle_operation(node, 'start') + + +def test_node_state_changes_as_a_result_of_standard_lifecycle_stop_shorthand_name(ctx, executor): + node = run_operation_on_node( + ctx, interface_name=SHORTHAND_NAME, op_name='stop', executor=executor) + _assert_node_state_changed_as_a_result_of_standard_lifecycle_operation(node, 'stop') + + +def test_node_state_changes_as_a_result_of_standard_lifecycle_delete_shorthand_name(ctx, executor): + node = run_operation_on_node( + ctx, interface_name=SHORTHAND_NAME, op_name='delete', executor=executor) + _assert_node_state_changed_as_a_result_of_standard_lifecycle_operation(node, 'delete') + + +def test_node_state_doesnt_change_as_a_result_of_an_operation_that_is_not_standard_lifecycle1( + ctx, executor): + node = run_operation_on_node( + ctx, interface_name='interface_name', op_name='op_name', executor=executor) + assert node.state == node.INITIAL + + +def test_node_state_doesnt_change_as_a_result_of_an_operation_that_is_not_standard_lifecycle2( + ctx, executor): + node = run_operation_on_node( + ctx, interface_name='interface_name', op_name='create', executor=executor) + assert node.state == node.INITIAL + + +def run_operation_on_node(ctx, op_name, interface_name, executor): + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface = mock.models.create_interface( + service=node.service, + interface_name=interface_name, + operation_name=op_name, + operation_kwargs=dict(function='{name}.{func.__name__}'.format(name=__name__, func=func))) + node.interfaces[interface.name] = interface + graph_compiler.GraphCompiler(ctx, ThreadExecutor).compile( + single_operation_workflow(ctx, node=node, interface_name=interface_name, op_name=op_name) + ) + + eng = engine.Engine(executors={executor.__class__: executor}) + eng.execute(ctx) + return node + + +def run_standard_lifecycle_operation_on_node(ctx, op_name, executor): + return run_operation_on_node(ctx, + interface_name='aria.interfaces.lifecycle.Standard', + op_name=op_name, + executor=executor) + + +def _assert_node_state_changed_as_a_result_of_standard_lifecycle_operation(node, op_name): + assert global_test_dict['transitional_state'] == NodeBase._OP_TO_STATE[op_name]['transitional'] + assert node.state == NodeBase._OP_TO_STATE[op_name]['finished'] + + +@workflow +def single_operation_workflow(graph, node, interface_name, op_name, **_): + graph.add_tasks(api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=op_name)) + + +@operation +def func(ctx): + global_test_dict['transitional_state'] = ctx.node.state + + +@pytest.fixture +def executor(): + result = ThreadExecutor() + try: + yield result + finally: + result.close() diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_task.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_task.py new file mode 100644 index 0000000..2b3f7d7 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_task.py @@ -0,0 +1,153 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 datetime import ( + datetime, + timedelta +) + +import pytest + +from aria.orchestrator.context import workflow as workflow_context +from aria.orchestrator.workflows import ( + api, + exceptions, +) +from aria.modeling import models + +from tests import mock, storage + +NODE_INTERFACE_NAME = 'Standard' +NODE_OPERATION_NAME = 'create' +RELATIONSHIP_INTERFACE_NAME = 'Configure' +RELATIONSHIP_OPERATION_NAME = 'pre_configure' + + +@pytest.fixture +def ctx(tmpdir): + context = mock.context.simple(str(tmpdir)) + + relationship = context.model.relationship.list()[0] + interface = mock.models.create_interface( + relationship.source_node.service, + RELATIONSHIP_INTERFACE_NAME, + RELATIONSHIP_OPERATION_NAME, + operation_kwargs=dict(function='test') + ) + relationship.interfaces[interface.name] = interface + context.model.relationship.update(relationship) + + node = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface = mock.models.create_interface( + node.service, + NODE_INTERFACE_NAME, + NODE_OPERATION_NAME, + operation_kwargs=dict(function='test') + ) + node.interfaces[interface.name] = interface + context.model.node.update(node) + + yield context + storage.release_sqlite_storage(context.model) + + +class TestOperationTask(object): + + def _create_node_operation_task(self, ctx, node): + with workflow_context.current.push(ctx): + api_task = api.task.OperationTask( + node, + interface_name=NODE_INTERFACE_NAME, + operation_name=NODE_OPERATION_NAME) + model_task = models.Task.from_api_task(api_task, None) + return api_task, model_task + + def _create_relationship_operation_task(self, ctx, relationship): + with workflow_context.current.push(ctx): + api_task = api.task.OperationTask( + relationship, + interface_name=RELATIONSHIP_INTERFACE_NAME, + operation_name=RELATIONSHIP_OPERATION_NAME) + core_task = models.Task.from_api_task(api_task, None) + return api_task, core_task + + def test_node_operation_task_creation(self, ctx): + storage_plugin = mock.models.create_plugin('p1', '0.1') + storage_plugin_other = mock.models.create_plugin('p0', '0.0') + ctx.model.plugin.put(storage_plugin) + ctx.model.plugin.put(storage_plugin_other) + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface = mock.models.create_interface( + node.service, + NODE_INTERFACE_NAME, + NODE_OPERATION_NAME, + operation_kwargs=dict(plugin=storage_plugin, function='test') + ) + node.interfaces[interface.name] = interface + ctx.model.node.update(node) + api_task, model_task = self._create_node_operation_task(ctx, node) + assert model_task.name == api_task.name + assert model_task.function == api_task.function + assert model_task.actor == api_task.actor == node + assert model_task.arguments == api_task.arguments + assert model_task.plugin == storage_plugin + + def test_relationship_operation_task_creation(self, ctx): + relationship = ctx.model.relationship.list()[0] + ctx.model.relationship.update(relationship) + _, model_task = self._create_relationship_operation_task( + ctx, relationship) + assert model_task.actor == relationship + + @pytest.mark.skip("Currently not supported for model tasks") + def test_operation_task_edit_locked_attribute(self, ctx): + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + + _, core_task = self._create_node_operation_task(ctx, node) + now = datetime.utcnow() + with pytest.raises(exceptions.TaskException): + core_task.status = core_task.STARTED + with pytest.raises(exceptions.TaskException): + core_task.started_at = now + with pytest.raises(exceptions.TaskException): + core_task.ended_at = now + with pytest.raises(exceptions.TaskException): + core_task.attempts_count = 2 + with pytest.raises(exceptions.TaskException): + core_task.due_at = now + + @pytest.mark.skip("Currently not supported for model tasks") + def test_operation_task_edit_attributes(self, ctx): + node = ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + + _, core_task = self._create_node_operation_task(ctx, node) + future_time = datetime.utcnow() + timedelta(seconds=3) + + with core_task._update(): + core_task.status = core_task.STARTED + core_task.started_at = future_time + core_task.ended_at = future_time + core_task.attempts_count = 2 + core_task.due_at = future_time + assert core_task.status != core_task.STARTED + assert core_task.started_at != future_time + assert core_task.ended_at != future_time + assert core_task.attempts_count != 2 + assert core_task.due_at != future_time + + assert core_task.status == core_task.STARTED + assert core_task.started_at == future_time + assert core_task.ended_at == future_time + assert core_task.attempts_count == 2 + assert core_task.due_at == future_time diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_task_graph_into_execution_graph.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_task_graph_into_execution_graph.py new file mode 100644 index 0000000..e24c901 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/core/test_task_graph_into_execution_graph.py @@ -0,0 +1,172 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 networkx import topological_sort, DiGraph + +from aria.modeling import models +from aria.orchestrator import context +from aria.orchestrator.workflows import api +from aria.orchestrator.workflows.core import graph_compiler +from aria.orchestrator.workflows.executor import base +from tests import mock +from tests import storage + + +def test_task_graph_into_execution_graph(tmpdir): + interface_name = 'Standard' + op1_name, op2_name, op3_name = 'create', 'configure', 'start' + workflow_context = mock.context.simple(str(tmpdir)) + node = workflow_context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface = mock.models.create_interface( + node.service, + interface_name, + op1_name, + operation_kwargs=dict(function='test') + ) + interface.operations[op2_name] = mock.models.create_operation(op2_name) # pylint: disable=unsubscriptable-object + interface.operations[op3_name] = mock.models.create_operation(op3_name) # pylint: disable=unsubscriptable-object + node.interfaces[interface.name] = interface + workflow_context.model.node.update(node) + + def sub_workflow(name, **_): + return api.task_graph.TaskGraph(name) + + with context.workflow.current.push(workflow_context): + test_task_graph = api.task.WorkflowTask(sub_workflow, name='test_task_graph') + simple_before_task = api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=op1_name) + simple_after_task = api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=op1_name) + + inner_task_graph = api.task.WorkflowTask(sub_workflow, name='test_inner_task_graph') + inner_task_1 = api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=op1_name) + inner_task_2 = api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=op2_name) + inner_task_3 = api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=op3_name) + inner_task_graph.add_tasks(inner_task_1) + inner_task_graph.add_tasks(inner_task_2) + inner_task_graph.add_tasks(inner_task_3) + inner_task_graph.add_dependency(inner_task_2, inner_task_1) + inner_task_graph.add_dependency(inner_task_3, inner_task_1) + inner_task_graph.add_dependency(inner_task_3, inner_task_2) + + test_task_graph.add_tasks(simple_before_task) + test_task_graph.add_tasks(simple_after_task) + test_task_graph.add_tasks(inner_task_graph) + test_task_graph.add_dependency(inner_task_graph, simple_before_task) + test_task_graph.add_dependency(simple_after_task, inner_task_graph) + + compiler = graph_compiler.GraphCompiler(workflow_context, base.StubTaskExecutor) + compiler.compile(test_task_graph) + + execution_tasks = topological_sort(_graph(workflow_context.execution.tasks)) + + assert len(execution_tasks) == 9 + + expected_tasks_names = [ + '{0}-Start'.format(test_task_graph.id), + simple_before_task.id, + '{0}-Start'.format(inner_task_graph.id), + inner_task_1.id, + inner_task_2.id, + inner_task_3.id, + '{0}-End'.format(inner_task_graph.id), + simple_after_task.id, + '{0}-End'.format(test_task_graph.id) + ] + + assert expected_tasks_names == [compiler._model_to_api_id[t.id] for t in execution_tasks] + assert all(isinstance(task, models.Task) for task in execution_tasks) + execution_tasks = iter(execution_tasks) + + _assert_tasks( + iter(execution_tasks), + iter([simple_after_task, inner_task_1, inner_task_2, inner_task_3, simple_after_task]) + ) + storage.release_sqlite_storage(workflow_context.model) + + +def _assert_tasks(execution_tasks, api_tasks): + start_workflow_exec_task = next(execution_tasks) + assert start_workflow_exec_task._stub_type == models.Task.START_WORKFLOW + + before_exec_task = next(execution_tasks) + simple_before_task = next(api_tasks) + _assert_execution_is_api_task(before_exec_task, simple_before_task) + assert before_exec_task.dependencies == [start_workflow_exec_task] + + start_subworkflow_exec_task = next(execution_tasks) + assert start_subworkflow_exec_task._stub_type == models.Task.START_SUBWROFKLOW + assert start_subworkflow_exec_task.dependencies == [before_exec_task] + + inner_exec_task_1 = next(execution_tasks) + inner_task_1 = next(api_tasks) + _assert_execution_is_api_task(inner_exec_task_1, inner_task_1) + assert inner_exec_task_1.dependencies == [start_subworkflow_exec_task] + + inner_exec_task_2 = next(execution_tasks) + inner_task_2 = next(api_tasks) + _assert_execution_is_api_task(inner_exec_task_2, inner_task_2) + assert inner_exec_task_2.dependencies == [inner_exec_task_1] + + inner_exec_task_3 = next(execution_tasks) + inner_task_3 = next(api_tasks) + _assert_execution_is_api_task(inner_exec_task_3, inner_task_3) + assert sorted(inner_exec_task_3.dependencies) == sorted([inner_exec_task_1, inner_exec_task_2]) + + end_subworkflow_exec_task = next(execution_tasks) + assert end_subworkflow_exec_task._stub_type == models.Task.END_SUBWORKFLOW + assert end_subworkflow_exec_task.dependencies == [inner_exec_task_3] + + after_exec_task = next(execution_tasks) + simple_after_task = next(api_tasks) + _assert_execution_is_api_task(after_exec_task, simple_after_task) + assert after_exec_task.dependencies == [end_subworkflow_exec_task] + + end_workflow_exec_task = next(execution_tasks) + assert end_workflow_exec_task._stub_type == models.Task.END_WORKFLOW + assert end_workflow_exec_task.dependencies == [after_exec_task] + + +def _assert_execution_is_api_task(execution_task, api_task): + assert execution_task.name == api_task.name + assert execution_task.function == api_task.function + assert execution_task.actor == api_task.actor + assert execution_task.arguments == api_task.arguments + + +def _get_task_by_name(task_name, graph): + return graph.node[task_name]['task'] + + +def _graph(tasks): + graph = DiGraph() + for task in tasks: + for dependency in task.dependencies: + graph.add_edge(dependency, task) + + return graph diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/__init__.py new file mode 100644 index 0000000..99d0b39 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/__init__.py @@ -0,0 +1,98 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 uuid +from contextlib import contextmanager + +import aria +from aria.modeling import models +from aria.orchestrator.context.common import BaseContext + + +class MockContext(object): + + INSTRUMENTATION_FIELDS = BaseContext.INSTRUMENTATION_FIELDS + + def __init__(self, storage, task_kwargs=None): + self.logger = logging.getLogger('mock_logger') + self._task_kwargs = task_kwargs or {} + self._storage = storage + self.task = MockTask(storage, **task_kwargs) + self.states = [] + self.exception = None + + @property + def serialization_dict(self): + return { + 'context_cls': self.__class__, + 'context': { + 'storage_kwargs': self._storage.serialization_dict, + 'task_kwargs': self._task_kwargs + } + } + + def __getattr__(self, item): + return None + + def close(self): + pass + + @property + def model(self): + return self._storage + + @classmethod + def instantiate_from_dict(cls, storage_kwargs=None, task_kwargs=None): + return cls(storage=aria.application_model_storage(**(storage_kwargs or {})), + task_kwargs=(task_kwargs or {})) + + @property + @contextmanager + def persist_changes(self): + yield + + +class MockActor(object): + def __init__(self): + self.name = 'actor_name' + + +class MockTask(object): + + INFINITE_RETRIES = models.Task.INFINITE_RETRIES + + def __init__(self, model, function, arguments=None, plugin_fk=None): + self.function = self.name = function + self.plugin_fk = plugin_fk + self.arguments = arguments or {} + self.states = [] + self.exception = None + self.id = str(uuid.uuid4()) + self.logger = logging.getLogger() + self.attempts_count = 1 + self.max_attempts = 1 + self.ignore_failure = False + self.interface_name = 'interface_name' + self.operation_name = 'operation_name' + self.actor = MockActor() + self.node = self.actor + self.model = model + + for state in models.Task.STATES: + setattr(self, state.upper(), state) + + @property + def plugin(self): + return self.model.plugin.get(self.plugin_fk) if self.plugin_fk else None diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_executor.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_executor.py new file mode 100644 index 0000000..32a68e0 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_executor.py @@ -0,0 +1,149 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest +import retrying + +try: + import celery as _celery + app = _celery.Celery() + app.conf.update(CELERY_RESULT_BACKEND='amqp://') +except ImportError: + _celery = None + app = None + +import aria +from aria.modeling import models +from aria.orchestrator import events +from aria.orchestrator.workflows.executor import ( + thread, + process, + # celery +) + +import tests +from . import MockContext + + +def _get_function(func): + return '{module}.{func.__name__}'.format(module=__name__, func=func) + + +def execute_and_assert(executor, storage=None): + expected_value = 'value' + successful_task = MockContext( + storage, task_kwargs=dict(function=_get_function(mock_successful_task)) + ) + failing_task = MockContext( + storage, task_kwargs=dict(function=_get_function(mock_failing_task)) + ) + task_with_inputs = MockContext( + storage, + task_kwargs=dict(function=_get_function(mock_task_with_input), + arguments={'input': models.Argument.wrap('input', 'value')}) + ) + + for task in [successful_task, failing_task, task_with_inputs]: + executor.execute(task) + + @retrying.retry(stop_max_delay=10000, wait_fixed=100) + def assertion(): + assert successful_task.states == ['start', 'success'] + assert failing_task.states == ['start', 'failure'] + assert task_with_inputs.states == ['start', 'failure'] + assert isinstance(failing_task.exception, MockException) + assert isinstance(task_with_inputs.exception, MockException) + assert task_with_inputs.exception.message == expected_value + assertion() + + +def test_thread_execute(thread_executor): + execute_and_assert(thread_executor) + + +def test_process_execute(process_executor, storage): + execute_and_assert(process_executor, storage) + + +def mock_successful_task(**_): + pass + + +def mock_failing_task(**_): + raise MockException + + +def mock_task_with_input(input, **_): + raise MockException(input) + +if app: + mock_successful_task = app.task(mock_successful_task) + mock_failing_task = app.task(mock_failing_task) + mock_task_with_input = app.task(mock_task_with_input) + + +class MockException(Exception): + pass + + +@pytest.fixture +def storage(tmpdir): + _storage = aria.application_model_storage(aria.storage.sql_mapi.SQLAlchemyModelAPI, + initiator_kwargs=dict(base_dir=str(tmpdir))) + yield _storage + tests.storage.release_sqlite_storage(_storage) + + +@pytest.fixture(params=[ + (thread.ThreadExecutor, {'pool_size': 1}), + (thread.ThreadExecutor, {'pool_size': 2}), + # subprocess needs to load a tests module so we explicitly add the root directory as if + # the project has been installed in editable mode + # (celery.CeleryExecutor, {'app': app}) +]) +def thread_executor(request): + executor_cls, executor_kwargs = request.param + result = executor_cls(**executor_kwargs) + yield result + result.close() + + +@pytest.fixture +def process_executor(): + result = process.ProcessExecutor(python_path=tests.ROOT_DIR) + yield result + result.close() + + +@pytest.fixture(autouse=True) +def register_signals(): + def start_handler(task, *args, **kwargs): + task.states.append('start') + + def success_handler(task, *args, **kwargs): + task.states.append('success') + + def failure_handler(task, exception, *args, **kwargs): + task.states.append('failure') + task.exception = exception + + events.start_task_signal.connect(start_handler) + events.on_success_task_signal.connect(success_handler) + events.on_failure_task_signal.connect(failure_handler) + yield + events.start_task_signal.disconnect(start_handler) + events.on_success_task_signal.disconnect(success_handler) + events.on_failure_task_signal.disconnect(failure_handler) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor.py new file mode 100644 index 0000000..e050d18 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor.py @@ -0,0 +1,172 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 sys +import time +import Queue +import subprocess + +import pytest +import psutil +import retrying + +import aria + +from aria import operation +from aria.modeling import models +from aria.orchestrator import events +from aria.utils.plugin import create as create_plugin +from aria.orchestrator.workflows.executor import process + +import tests.storage +import tests.resources +from tests.helpers import FilesystemDataHolder +from tests.fixtures import ( # pylint: disable=unused-import + plugins_dir, + plugin_manager, +) +from . import MockContext + + +class TestProcessExecutor(object): + + def test_plugin_execution(self, executor, mock_plugin, model, queue): + ctx = MockContext( + model, + task_kwargs=dict(function='mock_plugin1.operation', plugin_fk=mock_plugin.id) + ) + + executor.execute(ctx) + error = queue.get(timeout=60) + # tests/resources/plugins/mock-plugin1 is the plugin installed + # during this tests setup. The module mock_plugin1 contains a single + # operation named "operation" which calls an entry point defined in the plugin's + # setup.py. This entry points simply prints 'mock-plugin-output' to stdout. + # The "operation" operation that called this subprocess, then raises a RuntimeError + # with that subprocess output as the error message. + # This is what we assert here. This tests checks that both the PYTHONPATH (operation) + # and PATH (entry point) are properly updated in the subprocess in which the task is + # running. + assert isinstance(error, RuntimeError) + assert error.message == 'mock-plugin-output' + + def test_closed(self, executor, model): + executor.close() + with pytest.raises(RuntimeError) as exc_info: + executor.execute(MockContext(model, task_kwargs=dict(function='some.function'))) + assert 'closed' in exc_info.value.message + + def test_process_termination(self, executor, model, fs_test_holder, tmpdir): + freeze_script_path = str(tmpdir.join('freeze_script')) + with open(freeze_script_path, 'w+b') as f: + f.write( + '''import time +while True: + time.sleep(5) + ''' + ) + holder_path_argument = models.Argument.wrap('holder_path', fs_test_holder._path) + script_path_argument = models.Argument.wrap('freezing_script_path', + str(tmpdir.join('freeze_script'))) + + model.argument.put(holder_path_argument) + model.argument.put(script_path_argument) + ctx = MockContext( + model, + task_kwargs=dict( + function='{0}.{1}'.format(__name__, freezing_task.__name__), + arguments=dict(holder_path=holder_path_argument, + freezing_script_path=script_path_argument)), + ) + + executor.execute(ctx) + + @retrying.retry(retry_on_result=lambda r: r is False, stop_max_delay=60000, wait_fixed=500) + def wait_for_extra_process_id(): + return fs_test_holder.get('subproc', False) + + task_pid = executor._tasks[ctx.task.id].proc.pid + extra_process_pid = wait_for_extra_process_id() + + assert set([task_pid, extra_process_pid]).issubset(set(psutil.pids())) + executor.terminate(ctx.task.id) + + # Give a chance to the processes to terminate + time.sleep(2) + + # all processes should be either zombies or non existent + pids = [task_pid, extra_process_pid] + for pid in pids: + if pid in psutil.pids(): + assert psutil.Process(pid).status() == psutil.STATUS_ZOMBIE + else: + # making the test more readable + assert pid not in psutil.pids() + + +@pytest.fixture +def queue(): + _queue = Queue.Queue() + + def handler(_, exception=None, **kwargs): + _queue.put(exception) + + events.on_success_task_signal.connect(handler) + events.on_failure_task_signal.connect(handler) + try: + yield _queue + finally: + events.on_success_task_signal.disconnect(handler) + events.on_failure_task_signal.disconnect(handler) + + +@pytest.fixture +def fs_test_holder(tmpdir): + dataholder_path = str(tmpdir.join('dataholder')) + holder = FilesystemDataHolder(dataholder_path) + return holder + + +@pytest.fixture +def executor(plugin_manager): + result = process.ProcessExecutor(plugin_manager=plugin_manager, python_path=[tests.ROOT_DIR]) + try: + yield result + finally: + result.close() + + +@pytest.fixture +def mock_plugin(plugin_manager, tmpdir): + source = os.path.join(tests.resources.DIR, 'plugins', 'mock-plugin1') + plugin_path = create_plugin(source=source, destination_dir=str(tmpdir)) + return plugin_manager.install(source=plugin_path) + + +@pytest.fixture +def model(tmpdir): + _storage = aria.application_model_storage(aria.storage.sql_mapi.SQLAlchemyModelAPI, + initiator_kwargs=dict(base_dir=str(tmpdir))) + yield _storage + tests.storage.release_sqlite_storage(_storage) + + +@operation +def freezing_task(holder_path, freezing_script_path, **_): + holder = FilesystemDataHolder(holder_path) + holder['subproc'] = subprocess.Popen([sys.executable, freezing_script_path], shell=True).pid + while True: + time.sleep(5) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor_concurrent_modifications.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor_concurrent_modifications.py new file mode 100644 index 0000000..86a2edf --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor_concurrent_modifications.py @@ -0,0 +1,167 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 + +import fasteners +import pytest + +from aria.orchestrator import events +from aria.orchestrator.workflows.exceptions import ExecutorException +from aria.orchestrator.workflows import api +from aria.orchestrator.workflows.executor import process +from aria.orchestrator import workflow, operation + +import tests +from tests.orchestrator.context import execute as execute_workflow +from tests.orchestrator.workflows.helpers import events_collector +from tests import mock +from tests import storage +from tests import helpers + + +@pytest.fixture +def dataholder(tmpdir): + dataholder_path = str(tmpdir.join('dataholder')) + holder = helpers.FilesystemDataHolder(dataholder_path) + return holder + + +def test_concurrent_modification_on_task_succeeded(context, executor, lock_files, dataholder): + _test(context, executor, lock_files, _test_task_succeeded, dataholder, expected_failure=False) + + +@operation +def _test_task_succeeded(ctx, lock_files, key, first_value, second_value, holder_path): + _concurrent_update(lock_files, ctx.node, key, first_value, second_value, holder_path) + + +def test_concurrent_modification_on_task_failed(context, executor, lock_files, dataholder): + _test(context, executor, lock_files, _test_task_failed, dataholder, expected_failure=True) + + +@operation +def _test_task_failed(ctx, lock_files, key, first_value, second_value, holder_path): + first = _concurrent_update(lock_files, ctx.node, key, first_value, second_value, holder_path) + if not first: + raise RuntimeError('MESSAGE') + + +def _test(context, executor, lock_files, func, dataholder, expected_failure): + def _node(ctx): + return ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + + interface_name, operation_name = mock.operations.NODE_OPERATIONS_INSTALL[0] + + key = 'key' + first_value = 'value1' + second_value = 'value2' + arguments = { + 'lock_files': lock_files, + 'key': key, + 'first_value': first_value, + 'second_value': second_value, + 'holder_path': dataholder.path + } + + node = _node(context) + interface = mock.models.create_interface( + node.service, + interface_name, + operation_name, + operation_kwargs=dict(function='{0}.{1}'.format(__name__, func.__name__), + arguments=arguments) + ) + node.interfaces[interface.name] = interface + context.model.node.update(node) + + @workflow + def mock_workflow(graph, **_): + graph.add_tasks( + api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=operation_name, + arguments=arguments), + api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=operation_name, + arguments=arguments) + ) + + signal = events.on_failure_task_signal + with events_collector(signal) as collected: + try: + execute_workflow(mock_workflow, context, executor) + except ExecutorException: + pass + + props = _node(context).attributes + assert dataholder['invocations'] == 2 + assert props[key].value == dataholder[key] + + exceptions = [event['kwargs']['exception'] for event in collected.get(signal, [])] + if expected_failure: + assert exceptions + + +@pytest.fixture +def executor(): + result = process.ProcessExecutor(python_path=[tests.ROOT_DIR]) + try: + yield result + finally: + result.close() + + +@pytest.fixture +def context(tmpdir): + result = mock.context.simple(str(tmpdir)) + yield result + storage.release_sqlite_storage(result.model) + + +@pytest.fixture +def lock_files(tmpdir): + return str(tmpdir.join('first_lock_file')), str(tmpdir.join('second_lock_file')) + + +def _concurrent_update(lock_files, node, key, first_value, second_value, holder_path): + holder = helpers.FilesystemDataHolder(holder_path) + locker1 = fasteners.InterProcessLock(lock_files[0]) + locker2 = fasteners.InterProcessLock(lock_files[1]) + + first = locker1.acquire(blocking=False) + + if first: + # Give chance for both processes to acquire locks + while locker2.acquire(blocking=False): + locker2.release() + time.sleep(0.1) + else: + locker2.acquire() + + node.attributes[key] = first_value if first else second_value + holder['key'] = first_value if first else second_value + holder.setdefault('invocations', 0) + holder['invocations'] += 1 + + if first: + locker1.release() + else: + with locker1: + locker2.release() + + return first diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor_extension.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor_extension.py new file mode 100644 index 0000000..b26fa43 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor_extension.py @@ -0,0 +1,99 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria import extension +from aria.orchestrator.workflows import api +from aria.orchestrator.workflows.core import engine, graph_compiler +from aria.orchestrator.workflows.executor import process +from aria.orchestrator import workflow, operation + +import tests +from tests import mock +from tests import storage + + +def test_decorate_extension(context, executor): + arguments = {'arg1': 1, 'arg2': 2} + + def get_node(ctx): + return ctx.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + + node = get_node(context) + interface_name = 'test_interface' + operation_name = 'operation' + interface = mock.models.create_interface( + context.service, + interface_name, + operation_name, + operation_kwargs=dict(function='{0}.{1}'.format(__name__, _mock_operation.__name__), + arguments=arguments) + ) + node.interfaces[interface.name] = interface + context.model.node.update(node) + + + @workflow + def mock_workflow(ctx, graph): + node = get_node(ctx) + task = api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=operation_name, + arguments=arguments) + graph.add_tasks(task) + return graph + graph = mock_workflow(ctx=context) # pylint: disable=no-value-for-parameter + graph_compiler.GraphCompiler(context, executor.__class__).compile(graph) + eng = engine.Engine({executor.__class__: executor}) + eng.execute(context) + out = get_node(context).attributes.get('out').value + assert out['wrapper_arguments'] == arguments + assert out['function_arguments'] == arguments + + +@extension.process_executor +class MockProcessExecutorExtension(object): + + def decorate(self): + def decorator(function): + def wrapper(ctx, **operation_arguments): + with ctx.model.instrument(ctx.model.node.model_cls.attributes): + ctx.node.attributes['out'] = {'wrapper_arguments': operation_arguments} + function(ctx=ctx, **operation_arguments) + return wrapper + return decorator + + +@operation +def _mock_operation(ctx, **operation_arguments): + ctx.node.attributes['out']['function_arguments'] = operation_arguments + + +@pytest.fixture +def executor(): + result = process.ProcessExecutor(python_path=[tests.ROOT_DIR]) + try: + yield result + finally: + result.close() + + +@pytest.fixture +def context(tmpdir): + result = mock.context.simple(str(tmpdir)) + yield result + storage.release_sqlite_storage(result.model) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py new file mode 100644 index 0000000..47ee2f7 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py @@ -0,0 +1,168 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.orchestrator.workflows import api +from aria.orchestrator.workflows.core import engine, graph_compiler +from aria.orchestrator.workflows.executor import process +from aria.orchestrator import workflow, operation +from aria.orchestrator.workflows import exceptions + +import tests +from tests import mock +from tests import storage + + +_TEST_ATTRIBUTES = { + 'some': 'values', 'that': 'are', 'most': 'likely', 'only': 'set', 'here': 'yo' +} + + +def test_track_changes_of_successful_operation(context, executor): + _run_workflow(context=context, executor=executor, op_func=_mock_success_operation) + _assert_tracked_changes_are_applied(context) + + +def test_track_changes_of_failed_operation(context, executor): + with pytest.raises(exceptions.ExecutorException): + _run_workflow(context=context, executor=executor, op_func=_mock_fail_operation) + _assert_tracked_changes_are_applied(context) + + +def _assert_tracked_changes_are_applied(context): + instance = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + assert all(instance.attributes[key].value == value + for key, value in _TEST_ATTRIBUTES.items()) + + +def _update_attributes(context): + context.node.attributes.clear() + context.node.attributes.update(_TEST_ATTRIBUTES) + + +def test_refresh_state_of_tracked_attributes(context, executor): + out = _run_workflow(context=context, executor=executor, op_func=_mock_refreshing_operation) + assert out['after_refresh'] == out['after_change'] + assert out['initial'] != out['after_change'] + + +def test_apply_tracked_changes_during_an_operation(context, executor): + arguments = { + 'committed': {'some': 'new', 'properties': 'right here'}, + 'changed_but_refreshed': {'some': 'newer', 'properties': 'right there'} + } + + expected_initial = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME).attributes + out = _run_workflow( + context=context, executor=executor, op_func=_mock_updating_operation, arguments=arguments) + + expected_after_update = expected_initial.copy() + expected_after_update.update(arguments['committed']) # pylint: disable=no-member + expected_after_change = expected_after_update.copy() + expected_after_change.update(arguments['changed_but_refreshed']) # pylint: disable=no-member + + assert out['initial'] == expected_initial + assert out['after_update'] == expected_after_update + assert out['after_change'] == expected_after_change + assert out['after_refresh'] == expected_after_change + + +def _run_workflow(context, executor, op_func, arguments=None): + node = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME) + interface_name = 'test_interface' + operation_name = 'operation' + wf_arguments = arguments or {} + interface = mock.models.create_interface( + context.service, + interface_name, + operation_name, + operation_kwargs=dict(function=_operation_mapping(op_func), + arguments=wf_arguments) + ) + node.interfaces[interface.name] = interface + context.model.node.update(node) + + @workflow + def mock_workflow(ctx, graph): + task = api.task.OperationTask( + node, + interface_name=interface_name, + operation_name=operation_name, + arguments=wf_arguments) + graph.add_tasks(task) + return graph + graph = mock_workflow(ctx=context) # pylint: disable=no-value-for-parameter + graph_compiler.GraphCompiler(context, executor.__class__).compile(graph) + eng = engine.Engine({executor.__class__: executor}) + eng.execute(context) + out = context.model.node.get_by_name(mock.models.DEPENDENCY_NODE_NAME).attributes.get('out') + return out.value if out else None + + +@operation +def _mock_success_operation(ctx): + _update_attributes(ctx) + + +@operation +def _mock_fail_operation(ctx): + _update_attributes(ctx) + raise RuntimeError + + +@operation +def _mock_refreshing_operation(ctx): + out = {'initial': copy.deepcopy(ctx.node.attributes)} + ctx.node.attributes.update({'some': 'new', 'properties': 'right here'}) + out['after_change'] = copy.deepcopy(ctx.node.attributes) + ctx.model.node.refresh(ctx.node) + out['after_refresh'] = copy.deepcopy(ctx.node.attributes) + ctx.node.attributes['out'] = out + + +@operation +def _mock_updating_operation(ctx, committed, changed_but_refreshed): + out = {'initial': copy.deepcopy(ctx.node.attributes)} + ctx.node.attributes.update(committed) + ctx.model.node.update(ctx.node) + out['after_update'] = copy.deepcopy(ctx.node.attributes) + ctx.node.attributes.update(changed_but_refreshed) + out['after_change'] = copy.deepcopy(ctx.node.attributes) + ctx.model.node.refresh(ctx.node) + out['after_refresh'] = copy.deepcopy(ctx.node.attributes) + ctx.node.attributes['out'] = out + + +def _operation_mapping(func): + return '{name}.{func.__name__}'.format(name=__name__, func=func) + + +@pytest.fixture +def executor(): + result = process.ProcessExecutor(python_path=[tests.ROOT_DIR]) + try: + yield result + finally: + result.close() + + +@pytest.fixture +def context(tmpdir): + result = mock.context.simple(str(tmpdir)) + yield result + storage.release_sqlite_storage(result.model) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/helpers.py b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/helpers.py new file mode 100644 index 0000000..8e3f9b1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/orchestrator/workflows/helpers.py @@ -0,0 +1,37 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 contextlib import contextmanager + + +@contextmanager +def events_collector(*signals): + handlers = {} + collected = {} + + def handler_factory(key): + def handler(*args, **kwargs): + signal_events = collected.setdefault(key, []) + signal_events.append({'args': args, 'kwargs': kwargs}) + handlers[signal] = handler + return handler + + for signal in signals: + signal.connect(handler_factory(signal)) + try: + yield collected + finally: + for signal in signals: + signal.disconnect(handlers[signal]) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/parser/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/__init__.py new file mode 100644 index 0000000..ae1e83e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/__init__.py @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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/azure/aria/aria-extension-cloudify/src/aria/tests/parser/service_templates.py b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/service_templates.py new file mode 100644 index 0000000..9e8fcae --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/service_templates.py @@ -0,0 +1,86 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.caching import cachedmethod +from aria.parser.loading import LiteralLocation + +from .utils import (create_context, create_consumer) +from ..helpers import (get_example_uri, get_service_template_uri) + + +def consume_literal(literal, consumer_class_name='instance', cache=True, no_issues=True): + cachedmethod.ENABLED = cache + context = create_context(LiteralLocation(literal)) + consumer, dumper = create_consumer(context, consumer_class_name) + consumer.consume() + if no_issues: + context.validation.dump_issues() + assert not context.validation.has_issues + return context, dumper + + +def consume_use_case(use_case_name, consumer_class_name='instance', cache=True): + cachedmethod.ENABLED = cache + uri = get_example_uri('tosca-simple-1.0', 'use-cases', use_case_name, + '{0}.yaml'.format(use_case_name)) + context = create_context(uri) + inputs_file = get_example_uri('tosca-simple-1.0', 'use-cases', use_case_name, 'inputs.yaml') + if os.path.isfile(inputs_file): + context.args.append('--inputs={0}'.format(inputs_file)) + consumer, dumper = create_consumer(context, consumer_class_name) + consumer.consume() + context.validation.dump_issues() + assert not context.validation.has_issues + return context, dumper + + +def consume_types_use_case(use_case_name, consumer_class_name='instance', cache=True): + cachedmethod.ENABLED = cache + uri = get_service_template_uri('tosca-simple-1.0', 'types', use_case_name, + '{0}.yaml'.format(use_case_name)) + context = create_context(uri) + inputs_file = get_example_uri('tosca-simple-1.0', 'types', use_case_name, 'inputs.yaml') + if os.path.isfile(inputs_file): + context.args.append('--inputs={0}'.format(inputs_file)) + consumer, dumper = create_consumer(context, consumer_class_name) + consumer.consume() + context.validation.dump_issues() + assert not context.validation.has_issues + return context, dumper + + +def consume_node_cellar(consumer_class_name='instance', cache=True): + consume_test_case( + get_service_template_uri('tosca-simple-1.0', 'node-cellar', 'node-cellar.yaml'), + consumer_class_name=consumer_class_name, + inputs_uri=get_service_template_uri('tosca-simple-1.0', 'node-cellar', 'inputs.yaml'), + cache=cache + + ) + + +def consume_test_case(uri, inputs_uri=None, consumer_class_name='instance', cache=True): + cachedmethod.ENABLED = cache + uri = get_service_template_uri(uri) + context = create_context(uri) + if inputs_uri: + context.args.append('--inputs=' + get_service_template_uri(inputs_uri)) + consumer, dumper = create_consumer(context, consumer_class_name) + consumer.consume() + context.validation.dump_issues() + assert not context.validation.has_issues + return context, dumper diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_reqs_caps.py b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_reqs_caps.py new file mode 100644 index 0000000..e92aec4 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_reqs_caps.py @@ -0,0 +1,29 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 .service_templates import consume_test_case +from ..helpers import get_service_template_uri + + +def test_satisfy_capability_type(): + consume_reqs_caps_template1('instance') + + +def consume_reqs_caps_template1(consumer_class_name, cache=True): + consume_test_case( + get_service_template_uri('tosca-simple-1.0', 'reqs_caps', 'reqs_caps1.yaml'), + consumer_class_name=consumer_class_name, + cache=cache + ) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/__init__.py new file mode 100644 index 0000000..ae1e83e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/__init__.py @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/presentation/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/presentation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/presentation/test_types.py b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/presentation/test_types.py new file mode 100644 index 0000000..cfd4d3c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/presentation/test_types.py @@ -0,0 +1,23 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 tests.parser.service_templates import consume_types_use_case + + +def test_use_case_shorthand_1_name(): + consume_types_use_case('shorthand-1', 'types') + +def test_use_case_typequalified_1_name(): + consume_types_use_case('typequalified-1', 'types') diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/test_end2end.py b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/test_end2end.py new file mode 100644 index 0000000..474d90e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/test_tosca_simple_v1_0/test_end2end.py @@ -0,0 +1,112 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 ..service_templates import (consume_use_case, consume_node_cellar) + + +# Use Cases + +def test_use_case_compute_1(): + consume_use_case('compute-1', 'instance') + + +def test_use_case_software_component_1(): + consume_use_case('software-component-1', 'instance') + + +def test_use_case_block_storage_1(): + consume_use_case('block-storage-1', 'instance') + + +def test_use_case_block_storage_2(): + consume_use_case('block-storage-2', 'instance') + + +def test_use_case_block_storage_3(): + consume_use_case('block-storage-3', 'instance') + + +def test_use_case_block_storage_4(): + consume_use_case('block-storage-4', 'instance') + + +def test_use_case_block_storage_5(): + consume_use_case('block-storage-5', 'instance') + + +def test_use_case_block_storage_6(): + consume_use_case('block-storage-6', 'instance') + + +def test_use_case_object_storage_1(): + consume_use_case('object-storage-1', 'instance') + + +def test_use_case_network_1(): + consume_use_case('network-1', 'instance') + + +def test_use_case_network_2(): + consume_use_case('network-2', 'instance') + + +def test_use_case_network_3(): + consume_use_case('network-3', 'instance') + + +def test_use_case_network_4(): + consume_use_case('network-4', 'instance') + + +def test_use_case_webserver_dbms_1(): + consume_use_case('webserver-dbms-1', 'template') + + +def test_use_case_webserver_dbms_2(): + consume_use_case('webserver-dbms-2', 'instance') + + +def test_use_case_multi_tier_1(): + consume_use_case('multi-tier-1', 'instance') + + +def test_use_case_container_1(): + consume_use_case('container-1', 'template') + + +# NodeCellar + +def test_node_cellar_validation(): + consume_node_cellar('validate') + + +def test_node_cellar_validation_no_cache(): + consume_node_cellar('validate', False) + + +def test_node_cellar_presentation(): + consume_node_cellar('presentation') + + +def test_node_cellar_model(): + consume_node_cellar('template') + + +def test_node_cellar_types(): + consume_node_cellar('types') + + +def test_node_cellar_instance(): + consume_node_cellar('instance') diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/parser/utils.py b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/utils.py new file mode 100644 index 0000000..f0e890f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/parser/utils.py @@ -0,0 +1,67 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.parser.loading import UriLocation +from aria.parser.consumption import ( + ConsumptionContext, + ConsumerChain, + Read, + Validate, + ServiceTemplate, + Types, + Inputs, + ServiceInstance +) +from aria.utils.imports import import_fullname + + +def create_context(uri, + loader_source='aria.parser.loading.DefaultLoaderSource', + reader_source='aria.parser.reading.DefaultReaderSource', + presenter_source='aria.parser.presentation.DefaultPresenterSource', + presenter=None, + debug=False): + context = ConsumptionContext() + context.loading.loader_source = import_fullname(loader_source)() + context.reading.reader_source = import_fullname(reader_source)() + context.presentation.location = UriLocation(uri) if isinstance(uri, basestring) else uri + context.presentation.presenter_source = import_fullname(presenter_source)() + context.presentation.presenter_class = import_fullname(presenter) + context.presentation.print_exceptions = debug + return context + + +def create_consumer(context, consumer_class_name): + consumer = ConsumerChain(context, (Read, Validate)) + dumper = None + if consumer_class_name == 'validate': + dumper = None + elif consumer_class_name == 'presentation': + dumper = consumer.consumers[0] + elif consumer_class_name == 'template': + consumer.append(ServiceTemplate) + elif consumer_class_name == 'types': + consumer.append(ServiceTemplate, Types) + elif consumer_class_name == 'instance': + consumer.append(ServiceTemplate, Inputs, ServiceInstance) + else: + consumer.append(ServiceTemplate, Inputs, ServiceInstance) + consumer.append(import_fullname(consumer_class_name)) + + if dumper is None: + # Default to last consumer + dumper = consumer.consumers[-1] + + return consumer, dumper diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/requirements.txt b/azure/aria/aria-extension-cloudify/src/aria/tests/requirements.txt new file mode 100644 index 0000000..56a7bf5 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/requirements.txt @@ -0,0 +1,22 @@ +# 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. + +testtools==2.3.0 +fasteners==0.14.1 +sh==1.12.14 +psutil==5.2.2 +mock==2.0.0 +pylint==1.6.5 +pytest==3.2.0 +pytest-cov==2.5.1 +pytest-mock==1.6.2 +pytest-xdist==1.18.2 diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/__init__.py new file mode 100644 index 0000000..3ed601f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/__init__.py @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 + + +DIR = os.path.dirname(__file__) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/plugins/mock-plugin1/mock_plugin1.py b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/plugins/mock-plugin1/mock_plugin1.py new file mode 100644 index 0000000..25a00d1 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/plugins/mock-plugin1/mock_plugin1.py @@ -0,0 +1,27 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 subprocess + + +def operation(**_): + process = subprocess.Popen(['mock-plugin1'], stdout=subprocess.PIPE) + output, _ = process.communicate() + assert not process.poll() + raise RuntimeError(output.strip()) + + +def console_script_entry_point(): + print 'mock-plugin-output' diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/plugins/mock-plugin1/setup.py b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/plugins/mock-plugin1/setup.py new file mode 100644 index 0000000..88d354d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/plugins/mock-plugin1/setup.py @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 setuptools import setup + + +setup( + name='mock-plugin1', + version='0.1', + py_modules=['mock_plugin1'], + entry_points={ + 'console_scripts': [ + 'mock-plugin1 = mock_plugin1:console_script_entry_point' + ] + } +) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/scripts/test_ssh.sh b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/scripts/test_ssh.sh new file mode 100644 index 0000000..1c35370 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/scripts/test_ssh.sh @@ -0,0 +1,96 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + + +set -u +set -e + +test_run_script_basic() { + ctx node attributes test_value = "$test_value" +} + +test_run_script_as_sudo() { + mkdir -p /opt/test_dir +} + +test_run_script_default_base_dir() { + ctx node attributes work_dir = "$PWD" +} + +test_run_script_with_hide() { + true +} + +test_run_script_process_config() { + ctx node attributes env_value = "$test_value_env" + ctx node attributes bash_version = "$BASH_VERSION" + ctx node attributes arg1_value = "$1" + ctx node attributes arg2_value = "$2" + ctx node attributes cwd = "$PWD" + ctx node attributes ctx_path = "$(which ctx)" +} + +test_run_script_command_prefix() { + ctx node attributes dollar_dash = $- +} + +test_run_script_reuse_existing_ctx_1() { + ctx node attributes test_value1 = "$test_value1" +} + +test_run_script_reuse_existing_ctx_2() { + ctx node attributes test_value2 = "$test_value2" +} + +test_run_script_download_resource_plain() { + local DESTINATION=$(mktemp) + ctx download-resource [ "$DESTINATION" test_resource ] + ctx node attributes test_value = "$(cat "$DESTINATION")" +} + +test_run_script_download_resource_and_render() { + local DESTINATION=$(mktemp) + ctx download-resource-and-render [ "$DESTINATION" test_resource ] + ctx node attributes test_value = "$(cat "$DESTINATION")" +} + +test_run_script_inputs_as_env_variables_no_override() { + ctx node attributes test_value = "$custom_env_var" +} + +test_run_script_inputs_as_env_variables_process_env_override() { + ctx node attributes test_value = "$custom_env_var" +} + +test_run_script_error_in_script() { + ctx property-that-does-not-exist +} + +test_run_script_abort_immediate() { + ctx task abort [ abort-message ] +} + +test_run_script_retry() { + ctx task retry [ retry-message ] +} + +test_run_script_abort_error_ignored_by_script() { + set +e + ctx task abort [ abort-message ] +} + +# Injected by test +"$test_operation" "$@" diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/inputs.yaml b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/inputs.yaml new file mode 100644 index 0000000..37ab9ea --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/inputs.yaml @@ -0,0 +1,3 @@ +openstack_credential: + user: username + token: password diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml new file mode 100644 index 0000000..260f0bf --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml @@ -0,0 +1,357 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +# NFV is not used here, but we are using it just to validate the imports +tosca_definitions_version: tosca_simple_profile_for_nfv_1_0 +#tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + Node Cellar TOSCA blueprint. + Here is some Unicode: 中國. + +metadata: + template_name: node-cellar + template_author: ARIA + template_version: '1.0.0' + aria_version: '0.0' + +imports: + - types/openstack.yaml + - types/nodejs.yaml + - types/mongodb.yaml + - types/nginx.yaml + - aria-1.0 + +dsl_definitions: + + default_openstack_credential: &DEFAULT_OPENSTACK_CREDENTIAL + user: openstackadmin + token: { concat: [ openstack, 123 ] } + +repositories: + + node_cellar: + description: >- + The repository for the Node Cellar application and its dependencies. + url: https://github.com/ccoenraets/nodecellar/archive/ + credential: + user: guest + token: '' + +interface_types: + + Maintenance: + derived_from: tosca.interfaces.Root + inputs: + mode: + type: string + default: immediate + constraints: + - valid_values: [ immediate, eventual ] + description: >- + The mode in which maintenance mode is enabled/disabled. + enable: + description: >- + Enable maintenance mode. + disable: + description: >- + Disable maintenance mode. + +node_types: + + NodeMongoApplication: + derived_from: nodejs.Application + interfaces: + Maintenance: + type: Maintenance + requirements: + - database: + capability: tosca.capabilities.Endpoint.Database + node: mongodb.Database + +topology_template: + + inputs: + openstack_credential: + type: openstack.Credential + value: *DEFAULT_OPENSTACK_CREDENTIAL + + node_templates: + + # Application + + node_cellar: + description: >- + Node Cellar Node.js web application. + type: NodeMongoApplication + artifacts: + node_cellar: + description: >- + The Node Cellar application package. + type: os.Archive + file: master.zip + repository: node_cellar + deploy_path: /opt/nodejs/applications/node-cellar + properties: + unpack_credential: + user: gigaspaces + token: { get_attribute: [ SELF, tosca_id ] } + #token: { get_property: [ SELF, app_endpoint, protocol ] } + #token: { get_property: [ HOST, flavor_name ] } + #token: { token: [ { get_property: [ HOST, flavor_name ] }, '.', 1 ] } + #token: { token: [ 'zero.one|two-three', '.|-', 3 ] } + interfaces: + Maintenance: + inputs: + mode: eventual + enable: maintenance_node_cellar.sh + disable: maintenance_node_cellar.sh + Standard: + create: + implementation: + primary: create_node_cellar.sh + dependencies: + - "process.args.1 > { get_attribute: [ SELF, tosca_id ] }" + - "process.args.2 > { get_property: [ HOST, flavor_name ] }" + - ssh.user > admin + - ssh.password > '1234' + - ssh.use_sudo > true + requirements: + - database: node_cellar_database + capabilities: + app_endpoint: + properties: + protocol: udp + url_path: /nodecellar + + node_cellar_database: + description: >- + Node Cellar MongoDB database. + type: mongodb.Database + properties: + name: node_cellar + artifacts: + initial: + description: >- + The Node Cellar initial database. + type: mongodb.DatabaseDump + file: node-cellar.json + repository: node_cellar + + # Server software + + nodejs: + description: >- + Node.js instance. + type: nodejs.Server + requirements: + - host: application_host + capabilities: + data_endpoint: + properties: + url_path: /app + node_filter: # cannot be validated + properties: + #- flavor_name: { valid_values: [ {concat:[m1,.,small]} ] } # won't work because not validated :/ + - flavor_name: { valid_values: [ m1.small ] } + capabilities: + - scalable: + properties: + - max_instances: { greater_or_equal: 5 } + + mongodb: + description: >- + MongoDB instance. + type: mongodb.Server + requirements: + - host: + node: openstack.Instance + node_filter: + properties: + - flavor_name: { valid_values: [ m1.medium, { concat: [ { concat: [ m1, . ] }, large ] } ] } + #- flavor_name: { valid_values: [ m1.medium, m1.large ] } + capabilities: + - scalable: + properties: + - max_instances: { greater_or_equal: 5 } + relationship: + interfaces: + Configure: + target_changed: changed.sh + + nginx: + type: nginx.Nginx + requirements: + - host: loadbalancer_host + - feature: loadbalancer + + # Features + + loadbalancer: + type: nginx.LoadBalancer + properties: + algorithm: round-robin + + # Hosts + + loadbalancer_host: + description: >- + Host for the loadbalancer. + type: openstack.Instance + properties: + flavor_name: m1.small + os_users: # map of os.UserInfo + root: + password: admin123 + interfaces: + Standard: + inputs: + openstack_credential: { get_input: openstack_credential } + configure: + implementation: + primary: juju > run_charm + dependencies: + - charm > loadbalancer + + application_host: + copy: loadbalancer_host + description: >- + Host for applications. + properties: + flavor_name: m1.small + os_users: # map of os.UserInfo + nodejs: + password: nodejs123 + groups: + - www-data + capabilities: + scalable: + properties: + max_instances: 5 # overrides the policy + + data_host: + copy: loadbalancer_host + description: >- + Host for data. + properties: + flavor_name: m1.large + flavor_id: 5d62e82c-924e-4fa9-b1e4-c133867596f7 + os_users: # map of os.UserInfo + mongodb: + password: mongo123 + requirements: + - local_storage: + node: data_volume + relationship: + properties: + location: /mnt/volume + capabilities: + scalable: + properties: + max_instances: 6 # overrides the policy + + data_volume: + type: openstack.Volume + properties: + size: 10 GB + interfaces: + Standard: + inputs: + openstack_credential: { get_input: openstack_credential } + create: create_data_volume.sh + + groups: + + node_cellar_group: + type: openstack.Secured + members: + - loadbalancer + - application_host + - data_host + interfaces: + Standard: + inputs: + openstack_credential: { get_input: openstack_credential } + + policies: + + app_scaling: + type: aria.Scaling + properties: + max_instances: 10 + default_instances: 2 + targets: + - node_cellar + - nodejs + + host_scaling: + type: openstack.Scaling + properties: + bandwidth_threshold: 2 GB + max_instances: 10 + default_instances: 2 + targets: # node templates or groups + - node_cellar_group + + juju: + description: >- + Juju plugin executes charms. + type: aria.Plugin + properties: + version: 1.0 + enabled: false + + maintenance_on: + type: MaintenanceWorkflow + properties: + enabled: true + + maintenance_off: + type: MaintenanceWorkflow + properties: + enabled: false + + substitution_mappings: + + node_type: tosca.nodes.WebApplication + requirements: + host: [ node_cellar, host ] # doesn't really make sense; just for testing + capabilities: + app_endpoint: [ loadbalancer, client ] + + outputs: + + endpoint: + description: >- + The application endpoint. + type: string + value: { get_property: [ nodejs, data_endpoint, url_path ] } + +policy_types: + + MaintenanceWorkflow: + description: >- + Workflow to put all nodes in/out of maintenance mode. For web servers, this will show a "this + site is under maintenance and we'll be back soon" web page. Database nodes will then close all + client connections cleanly and shut down services. + derived_from: aria.Workflow + properties: + implementation: + type: string + default: workflows.maintenance + enabled: + description: >- + Whether to turn maintenance mode on or off. + type: boolean diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/mongodb.yaml b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/mongodb.yaml new file mode 100644 index 0000000..7031252 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/mongodb.yaml @@ -0,0 +1,72 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +imports: + - os.yaml + +node_types: + + mongodb.Server: + description: >- + MongoDB server application. + derived_from: tosca.nodes.DBMS + properties: + root_password: # @override + type: string + default: admin + port: # @override + type: integer + default: 27017 + artifacts: + mongodb: + description: >- + MongoDB application package. + type: os.Archive + file: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.2.8.tgz + deploy_path: /opt/mongodb + capabilities: + host: # @override + type: tosca.capabilities.Container + valid_source_types: [ mongodb.Database ] + + mongodb.Database: + description: >- + MongoDB database. + + Supports importing database data if a mongodb.DatabaseDump is provided. + derived_from: tosca.nodes.Database + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + create: + implementation: + primary: mongodb/create_and_import_database.sh + dependencies: + - mongodb/utils/api.sh + - utils/os.sh + requirements: + - host: # @override + capability: tosca.capabilities.Container + node: mongodb.Server + relationship: tosca.relationships.HostedOn + +artifact_types: + + mongodb.DatabaseDump: + description: >- + Dump of a MongoDB database. + derived_from: tosca.artifacts.Root + file_ext: + - json diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/nginx.yaml b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/nginx.yaml new file mode 100644 index 0000000..3621360 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/nginx.yaml @@ -0,0 +1,29 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +node_types: + + nginx.Nginx: + description: >- + Nginx instance. + derived_from: tosca.nodes.SoftwareComponent + requirements: + - feature: + capability: tosca.capabilities.Node + + nginx.LoadBalancer: + description: >- + Nginx loadbalancer feature. + derived_from: tosca.nodes.LoadBalancer diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/nodejs.yaml b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/nodejs.yaml new file mode 100644 index 0000000..2b4d451 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/nodejs.yaml @@ -0,0 +1,69 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +imports: + - os.yaml + +node_types: + + nodejs.Server: + description: >- + Node.js server application. + derived_from: tosca.nodes.WebServer + artifacts: + nodejs: + description: >- + Node.js application package. + type: os.Archive + file: https://nodejs.org/dist/v4.4.7/node-v4.4.7-linux-x64.tar.xz + deploy_path: /opt/nodejs + capabilities: + data_endpoint: # @override + type: tosca.capabilities.Endpoint + properties: + port: + type: tosca.datatypes.network.PortDef + default: 8080 + url_path: + type: string + default: / + admin_endpoint: # @override + type: tosca.capabilities.Endpoint.Admin + properties: + port: + type: tosca.datatypes.network.PortDef + default: 8080 + url_path: + type: string + default: /admin + host: # @override + type: tosca.capabilities.Container + valid_source_types: [ nodejs.Application ] + occurrences: [ 0, 1 ] + + nodejs.Application: + derived_from: tosca.nodes.WebApplication + capabilities: + app_endpoint: # @override + type: tosca.capabilities.Endpoint + properties: + port: + type: tosca.datatypes.network.PortDef + default: 8080 + requirements: + - host: # @override + capability: tosca.capabilities.Container + node: nodejs.Server + relationship: tosca.relationships.HostedOn diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/openstack.yaml b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/openstack.yaml new file mode 100644 index 0000000..6941c1a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/openstack.yaml @@ -0,0 +1,201 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +imports: + - os.yaml + - aria-1.0 + +dsl_definitions: + + openstack: + uuid_constraints: &OPENSTACK_UUID_CONSTRAINTS + - pattern: '^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$' + +node_types: + + openstack.Instance: + description: >- + OpenStack instance. + + You may assign an image_id or attach an openstack.Image artifact (the artifact + will take precedence). + + You may assign either flavor_id or flavor_name (flavor_id will take precedence). + If neither are assigned, flavor_name has a default value. + derived_from: tosca.nodes.Compute + properties: + image_id: + description: >- + See: https://s3itwiki.uzh.ch/display/clouddoc/Supported+Images + type: openstack.UUID + default: 5d62e82c-924e-4fa9-b1e4-c133867596f7 + flavor_id: + type: openstack.UUID + required: false + flavor_name: + type: string + default: m1.medium + required: false + availability_zone: + description: >- + OpenStack availability zone. + type: string + required: false + os_users: + type: map + entry_schema: os.UserInfo + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + inputs: + openstack_credential: + description: The OpenStack API credential for all operations. + type: openstack.Credential + create: + implementation: + primary: openstack/create_instance.sh + dependencies: + - openstack/utils/api.sh + - utils/os.sh + requirements: + - local_storage: # @override + capability: tosca.capabilities.Attachment + node: openstack.Volume + relationship: tosca.relationships.AttachesTo +# relationship: +# type: tosca.relationships.AttachesTo +# interfaces: +# Standard: +# inputs: +# xxx: +# type: string +# default: { concat: [ a, b ] } + occurrences: [ 0, UNBOUNDED ] + + openstack.Volume: + description: >- + OpenStack volume. + + See: http://developer.openstack.org/api-ref-blockstorage-v2.html + derived_from: tosca.nodes.BlockStorage + properties: + tenant_id: + type: openstack.UUID + required: false + availability_zone: + type: string + required: false + source_volid: + type: openstack.UUID + required: false + description: + type: string + required: false + multiattach: + type: boolean + default: false + #snapshot_id: # @override + # type: openstack.UUID + # required: false + name: + type: string + required: false + volume_type: + type: string + required: false + metadata: + type: map + entry_schema: string + required: false + source_replica: + type: openstack.UUID + required: false + consistencygroup_id: + type: openstack.UUID + required: false + scheduler_hints: + type: map + entry_schema: string + required: false + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + inputs: + openstack_credential: + description: The OpenStack API credential for all operations. + type: openstack.Credential + create: + implementation: + primary: openstack/create_volume.sh + dependencies: + - openstack/utils/api.sh + - utils/os.sh + +group_types: + + openstack.Secured: + description: >- + OpenStack secured group. + derived_from: tosca.groups.Root + members: + - openstack.Instance + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + inputs: + openstack_credential: + description: The OpenStack API credential for all operations. + type: openstack.Credential + create: + implementation: + primary: openstack/create_secured_group.sh + dependencies: + - openstack/utils/api.sh + - utils/os.sh + +policy_types: + + openstack.Scaling: + description: >- + OpenStack scaling policy. + derived_from: aria.Scaling + properties: + bandwidth_threshold: + type: scalar-unit.size + default: 1 GB + targets: + - openstack.Instance + - openstack.Secured + +data_types: + + openstack.Credential: + derived_from: tosca.datatypes.Credential + + openstack.UUID: + description: >- + OpenStack UUID (in GUID format). + derived_from: string + constraints: *OPENSTACK_UUID_CONSTRAINTS + +artifact_types: + + openstack.Image: + description: >- + OpenStack image artifact. + derived_from: tosca.artifacts.Deployment.Image.VM + file_ext: + - img + - iso diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/os.yaml b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/os.yaml new file mode 100644 index 0000000..adc6363 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/os.yaml @@ -0,0 +1,74 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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_definitions: + + os: + user_and_group_name_constraints: &OS_USER_AND_GROUP_NAME_CONSTRAINTS + - pattern: '^[a-z0-9_-]{3,16}$' + password_constraints: &OS_PASSWORD_CONSTRAINTS + - pattern: '^[a-z0-9_-]{6,18}$' + +artifact_types: + + os.Package: + description: >- + Generic application package. + derived_from: tosca.artifacts.Root + + os.Archive: + description: >- + Application package in an archive. + derived_from: os.Package + file_ext: + - zip + - tar + - tar.gz + - tar.xz + properties: + unpack_credential: + type: tosca.datatypes.Credential + required: false + + os.Deb: + description: >- + Debian application package. + derived_from: os.Package + file_ext: + - deb + + os.RPM: + description: >- + RPM application package. + derived_from: os.Package + file_ext: + - rpm + +data_types: + + os.UserInfo: + description: >- + Information about an operating system user. + derived_from: tosca.datatypes.Root + properties: + password: + type: string + constraints: *OS_PASSWORD_CONSTRAINTS + groups: + type: list + entry_schema: + type: string + constraints: *OS_USER_AND_GROUP_NAME_CONSTRAINTS + required: false diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/workflows.py b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/workflows.py new file mode 100644 index 0000000..fdca65d --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/node-cellar/workflows.py @@ -0,0 +1,40 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria import workflow +from aria.orchestrator.workflows.api import task +from aria.orchestrator.workflows.exceptions import TaskException + + +INTERFACE_NAME = 'Maintenance' +ENABLE_OPERATION_NAME = 'enable' +DISABLE_OPERATION_NAME = 'disable' + + +@workflow +def maintenance(ctx, graph, enabled): + """ + Custom workflow to call the operations on the Maintenance interface. + """ + + for node in ctx.model.node.iter(): + try: + graph.add_tasks(task.OperationTask(node, + interface_name=INTERFACE_NAME, + operation_name=ENABLE_OPERATION_NAME if enabled + else DISABLE_OPERATION_NAME)) + except TaskException: + pass diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/reqs_caps/reqs_caps1.yaml b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/reqs_caps/reqs_caps1.yaml new file mode 100644 index 0000000..466a78e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/reqs_caps/reqs_caps1.yaml @@ -0,0 +1,40 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +tosca_definitions_version: tosca_simple_yaml_1_0 + +capability_types: + Socket: + derived_from: tosca.capabilities.Root + +node_types: + Socket: + derived_from: tosca.nodes.Root + capabilities: + socket: Socket + + Plug: + derived_from: tosca.nodes.Root + requirements: + - plug: + capability: Socket + +topology_template: + node_templates: + socket: + type: Socket + + plug: + type: Plug \ No newline at end of file diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/types/shorthand-1/shorthand-1.yaml b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/types/shorthand-1/shorthand-1.yaml new file mode 100644 index 0000000..bb5a84e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/types/shorthand-1/shorthand-1.yaml @@ -0,0 +1,23 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile that defines a compute instance and a block storage with the "shorthand type" + +topology_template: + + node_templates: + + my_server: + type: Compute + requirements: + - local_storage: + node: my_block_storage + relationship: + type: AttachesTo + properties: + location: /path1/path2 + + my_block_storage: + type: BlockStorage + properties: + size: 10 GB diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/types/typequalified-1/typequalified-1.yaml b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/types/typequalified-1/typequalified-1.yaml new file mode 100644 index 0000000..b54604f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/resources/service-templates/tosca-simple-1.0/types/typequalified-1/typequalified-1.yaml @@ -0,0 +1,23 @@ +tosca_definitions_version: tosca_simple_yaml_1_0 + +description: >- + TOSCA simple profile that defines a compute instance and a block storage with the "typequalified type" + +topology_template: + + node_templates: + + my_server: + type: tosca:Compute + requirements: + - local_storage: + node: my_block_storage + relationship: + type: AttachesTo + properties: + location: /path1/path2 + + my_block_storage: + type: tosca:BlockStorage + properties: + size: 10 GB diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/storage/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/storage/__init__.py new file mode 100644 index 0000000..8a4d613 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/storage/__init__.py @@ -0,0 +1,53 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 shutil import rmtree +from tempfile import mkdtemp + +from sqlalchemy import ( + create_engine, + orm, + pool, + MetaData +) + + +class TestFileSystem(object): + + def setup_method(self): + self.path = mkdtemp('{0}'.format(self.__class__.__name__)) + + def teardown_method(self): + rmtree(self.path, ignore_errors=True) + + +def release_sqlite_storage(storage): + """ + Drops the tables and clears the session + :param storage: + :return: + """ + storage._all_api_kwargs['session'].close() + MetaData(bind=storage._all_api_kwargs['engine']).drop_all() + + +def init_inmemory_model_storage(): + uri = 'sqlite:///:memory:' + engine_kwargs = dict(connect_args={'check_same_thread': False}, poolclass=pool.StaticPool) + + engine = create_engine(uri, **engine_kwargs) + session_factory = orm.sessionmaker(bind=engine) + + return dict(engine=engine, session=session_factory()) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/storage/test_collection_instrumentation.py b/azure/aria/aria-extension-cloudify/src/aria/tests/storage/test_collection_instrumentation.py new file mode 100644 index 0000000..e915421 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/storage/test_collection_instrumentation.py @@ -0,0 +1,257 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.modeling import models +from aria.storage import collection_instrumentation + + +class MockActor(object): + def __init__(self): + self.dict_ = {} + self.list_ = [] + + +class MockMAPI(object): + + def __init__(self): + pass + + def put(self, *args, **kwargs): + pass + + def update(self, *args, **kwargs): + pass + + +class CollectionInstrumentation(object): + + @pytest.fixture + def actor(self): + return MockActor() + + @pytest.fixture + def model(self): + return MockMAPI() + + @pytest.fixture + def dict_(self, actor, model): + return collection_instrumentation._InstrumentedDict(model, actor, 'dict_', models.Attribute) + + @pytest.fixture + def list_(self, actor, model): + return collection_instrumentation._InstrumentedList(model, actor, 'list_', models.Attribute) + + +class TestDict(CollectionInstrumentation): + + def test_keys(self, actor, dict_): + dict_.update( + { + 'key1': models.Attribute.wrap('key1', 'value1'), + 'key2': models.Attribute.wrap('key2', 'value2') + } + ) + assert sorted(dict_.keys()) == sorted(['key1', 'key2']) == sorted(actor.dict_.keys()) + + def test_values(self, actor, dict_): + dict_.update({ + 'key1': models.Attribute.wrap('key1', 'value1'), + 'key2': models.Attribute.wrap('key1', 'value2') + }) + assert (sorted(dict_.values()) == + sorted(['value1', 'value2']) == + sorted(v.value for v in actor.dict_.values())) + + def test_items(self, dict_): + dict_.update({ + 'key1': models.Attribute.wrap('key1', 'value1'), + 'key2': models.Attribute.wrap('key1', 'value2') + }) + assert sorted(dict_.items()) == sorted([('key1', 'value1'), ('key2', 'value2')]) + + def test_iter(self, actor, dict_): + dict_.update({ + 'key1': models.Attribute.wrap('key1', 'value1'), + 'key2': models.Attribute.wrap('key1', 'value2') + }) + assert sorted(list(dict_)) == sorted(['key1', 'key2']) == sorted(actor.dict_.keys()) + + def test_bool(self, dict_): + assert not dict_ + dict_.update({ + 'key1': models.Attribute.wrap('key1', 'value1'), + 'key2': models.Attribute.wrap('key1', 'value2') + }) + assert dict_ + + def test_set_item(self, actor, dict_): + dict_['key1'] = models.Attribute.wrap('key1', 'value1') + assert dict_['key1'] == 'value1' == actor.dict_['key1'].value + assert isinstance(actor.dict_['key1'], models.Attribute) + + def test_nested(self, actor, dict_): + dict_['key'] = {} + assert isinstance(actor.dict_['key'], models.Attribute) + assert dict_['key'] == actor.dict_['key'].value == {} + + dict_['key']['inner_key'] = 'value' + + assert len(dict_) == 1 + assert 'inner_key' in dict_['key'] + assert dict_['key']['inner_key'] == 'value' + assert dict_['key'].keys() == ['inner_key'] + assert dict_['key'].values() == ['value'] + assert dict_['key'].items() == [('inner_key', 'value')] + assert isinstance(actor.dict_['key'], models.Attribute) + assert isinstance(dict_['key'], collection_instrumentation._InstrumentedDict) + + dict_['key'].update({'updated_key': 'updated_value'}) + assert len(dict_) == 1 + assert 'updated_key' in dict_['key'] + assert dict_['key']['updated_key'] == 'updated_value' + assert sorted(dict_['key'].keys()) == sorted(['inner_key', 'updated_key']) + assert sorted(dict_['key'].values()) == sorted(['value', 'updated_value']) + assert sorted(dict_['key'].items()) == sorted([('inner_key', 'value'), + ('updated_key', 'updated_value')]) + assert isinstance(actor.dict_['key'], models.Attribute) + assert isinstance(dict_['key'], collection_instrumentation._InstrumentedDict) + + dict_.update({'key': 'override_value'}) + assert len(dict_) == 1 + assert 'key' in dict_ + assert dict_['key'] == 'override_value' + assert len(actor.dict_) == 1 + assert isinstance(actor.dict_['key'], models.Attribute) + assert actor.dict_['key'].value == 'override_value' + + def test_get_item(self, actor, dict_): + dict_['key1'] = models.Attribute.wrap('key1', 'value1') + assert isinstance(actor.dict_['key1'], models.Attribute) + + def test_update(self, actor, dict_): + dict_['key1'] = 'value1' + + new_dict = {'key2': 'value2'} + dict_.update(new_dict) + assert len(dict_) == 2 + assert dict_['key2'] == 'value2' + assert isinstance(actor.dict_['key2'], models.Attribute) + + new_dict = {} + new_dict.update(dict_) + assert new_dict['key1'] == dict_['key1'] + + def test_copy(self, dict_): + dict_['key1'] = 'value1' + + new_dict = dict_.copy() + assert new_dict is not dict_ + assert new_dict == dict_ + + dict_['key1'] = 'value2' + assert new_dict['key1'] == 'value1' + assert dict_['key1'] == 'value2' + + def test_clear(self, dict_): + dict_['key1'] = 'value1' + dict_.clear() + + assert len(dict_) == 0 + + +class TestList(CollectionInstrumentation): + + def test_append(self, actor, list_): + list_.append(models.Attribute.wrap('name', 'value1')) + list_.append('value2') + assert len(actor.list_) == 2 + assert len(list_) == 2 + assert isinstance(actor.list_[0], models.Attribute) + assert list_[0] == 'value1' + + assert isinstance(actor.list_[1], models.Attribute) + assert list_[1] == 'value2' + + list_[0] = 'new_value1' + list_[1] = 'new_value2' + assert isinstance(actor.list_[1], models.Attribute) + assert isinstance(actor.list_[1], models.Attribute) + assert list_[0] == 'new_value1' + assert list_[1] == 'new_value2' + + def test_iter(self, list_): + list_.append('value1') + list_.append('value2') + assert sorted(list_) == sorted(['value1', 'value2']) + + def test_insert(self, actor, list_): + list_.append('value1') + list_.insert(0, 'value2') + list_.insert(2, 'value3') + list_.insert(10, 'value4') + assert sorted(list_) == sorted(['value1', 'value2', 'value3', 'value4']) + assert len(actor.list_) == 4 + + def test_set(self, list_): + list_.append('value1') + list_.append('value2') + + list_[1] = 'value3' + assert len(list_) == 2 + assert sorted(list_) == sorted(['value1', 'value3']) + + def test_insert_into_nested(self, actor, list_): + list_.append([]) + + list_[0].append('inner_item') + assert isinstance(actor.list_[0], models.Attribute) + assert len(list_) == 1 + assert list_[0][0] == 'inner_item' + + list_[0].append('new_item') + assert isinstance(actor.list_[0], models.Attribute) + assert len(list_) == 1 + assert list_[0][1] == 'new_item' + + assert list_[0] == ['inner_item', 'new_item'] + assert ['inner_item', 'new_item'] == list_[0] + + +class TestDictList(CollectionInstrumentation): + def test_dict_in_list(self, actor, list_): + list_.append({}) + assert len(list_) == 1 + assert isinstance(actor.list_[0], models.Attribute) + assert actor.list_[0].value == {} + + list_[0]['key'] = 'value' + assert list_[0]['key'] == 'value' + assert len(actor.list_) == 1 + assert isinstance(actor.list_[0], models.Attribute) + assert actor.list_[0].value['key'] == 'value' + + def test_list_in_dict(self, actor, dict_): + dict_['key'] = [] + assert len(dict_) == 1 + assert isinstance(actor.dict_['key'], models.Attribute) + assert actor.dict_['key'].value == [] + + dict_['key'].append('value') + assert dict_['key'][0] == 'value' + assert len(actor.dict_) == 1 + assert isinstance(actor.dict_['key'], models.Attribute) + assert actor.dict_['key'].value[0] == 'value' diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/storage/test_model_storage.py b/azure/aria/aria-extension-cloudify/src/aria/tests/storage/test_model_storage.py new file mode 100644 index 0000000..518d624 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/storage/test_model_storage.py @@ -0,0 +1,213 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from sqlalchemy import ( + Column, + Integer, + Text +) + +from aria import ( + application_model_storage, + modeling +) +from aria.storage import ( + ModelStorage, + exceptions, + sql_mapi, +) + +from tests import ( + mock, + storage as tests_storage, + modeling as tests_modeling +) + + +@pytest.fixture +def storage(): + base_storage = ModelStorage(sql_mapi.SQLAlchemyModelAPI, + initiator=tests_storage.init_inmemory_model_storage) + base_storage.register(tests_modeling.MockModel) + yield base_storage + tests_storage.release_sqlite_storage(base_storage) + + +@pytest.fixture(scope='module', autouse=True) +def module_cleanup(): + modeling.models.aria_declarative_base.metadata.remove(tests_modeling.MockModel.__table__) #pylint: disable=no-member + + +def test_storage_base(storage): + with pytest.raises(AttributeError): + storage.non_existent_attribute() + + +def test_model_storage(storage): + mock_model = tests_modeling.MockModel(value=0, name='model_name') + storage.mock_model.put(mock_model) + + assert storage.mock_model.get_by_name('model_name') == mock_model + + assert [mm_from_storage for mm_from_storage in storage.mock_model.iter()] == [mock_model] + assert [mm_from_storage for mm_from_storage in storage.mock_model] == [mock_model] + + storage.mock_model.delete(mock_model) + with pytest.raises(exceptions.StorageError): + storage.mock_model.get(mock_model.id) + + +def test_application_storage_factory(): + storage = application_model_storage(sql_mapi.SQLAlchemyModelAPI, + initiator=tests_storage.init_inmemory_model_storage) + + assert storage.service_template + assert storage.node_template + assert storage.group_template + assert storage.policy_template + assert storage.substitution_template + assert storage.substitution_template_mapping + assert storage.requirement_template + assert storage.relationship_template + assert storage.capability_template + assert storage.interface_template + assert storage.operation_template + assert storage.artifact_template + + assert storage.service + assert storage.node + assert storage.group + assert storage.policy + assert storage.substitution + assert storage.substitution_mapping + assert storage.relationship + assert storage.capability + assert storage.interface + assert storage.operation + assert storage.artifact + + assert storage.execution + assert storage.service_update + assert storage.service_update_step + assert storage.service_modification + assert storage.plugin + assert storage.task + + assert storage.input + assert storage.output + assert storage.property + assert storage.attribute + + assert storage.type + assert storage.metadata + + tests_storage.release_sqlite_storage(storage) + + +def test_cascade_deletion(context): + service = context.model.service.list()[0] + + assert len(context.model.service_template.list()) == 1 + assert len(service.nodes) == len(context.model.node.list()) == 2 + + context.model.service.delete(service) + + assert len(context.model.service_template.list()) == 1 + assert len(context.model.service.list()) == 0 + assert len(context.model.node.list()) == 0 + + +@pytest.fixture +def context(tmpdir): + result = mock.context.simple(str(tmpdir)) + yield result + tests_storage.release_sqlite_storage(result.model) + + +def test_mapi_include(context): + service1 = context.model.service.list()[0] + service1.name = 'service1' + service1.service_template.name = 'service_template1' + context.model.service.update(service1) + + service_template2 = mock.models.create_service_template('service_template2') + service2 = mock.models.create_service(service_template2, 'service2') + context.model.service.put(service2) + + assert service1 != service2 + assert service1.service_template != service2.service_template + + def assert_include(service): + st_name = context.model.service.get(service.id, include=('service_template_name',)) + st_name_list = context.model.service.list(filters={'id': service.id}, + include=('service_template_name', )) + assert len(st_name) == len(st_name_list) == 1 + assert st_name[0] == st_name_list[0][0] == service.service_template.name + + assert_include(service1) + assert_include(service2) + + +class MockModel(modeling.models.aria_declarative_base, modeling.mixins.ModelMixin): #pylint: disable=abstract-method + __tablename__ = 'op_mock_model' + + name = Column(Text) + value = Column(Integer) + + +class TestFilterOperands(object): + + @pytest.fixture() + def storage(self): + model_storage = application_model_storage( + sql_mapi.SQLAlchemyModelAPI, initiator=tests_storage.init_inmemory_model_storage) + model_storage.register(MockModel) + for value in (1, 2, 3, 4): + model_storage.op_mock_model.put(MockModel(value=value)) + yield model_storage + tests_storage.release_sqlite_storage(model_storage) + + def test_gt(self, storage): + assert len(storage.op_mock_model.list(filters=dict(value=dict(gt=3)))) == 1 + assert len(storage.op_mock_model.list(filters=dict(value=dict(gt=4)))) == 0 + + def test_ge(self, storage): + assert len(storage.op_mock_model.list(filters=dict(value=dict(ge=3)))) == 2 + assert len(storage.op_mock_model.list(filters=dict(value=dict(ge=5)))) == 0 + + def test_lt(self, storage): + assert len(storage.op_mock_model.list(filters=dict(value=dict(lt=2)))) == 1 + assert len(storage.op_mock_model.list(filters=dict(value=dict(lt=1)))) == 0 + + def test_le(self, storage): + assert len(storage.op_mock_model.list(filters=dict(value=dict(le=2)))) == 2 + assert len(storage.op_mock_model.list(filters=dict(value=dict(le=0)))) == 0 + + def test_eq(self, storage): + assert len(storage.op_mock_model.list(filters=dict(value=dict(eq=2)))) == 1 + assert len(storage.op_mock_model.list(filters=dict(value=dict(eq=0)))) == 0 + + def test_neq(self, storage): + assert len(storage.op_mock_model.list(filters=dict(value=dict(ne=2)))) == 3 + + def test_gt_and_lt(self, storage): + assert len(storage.op_mock_model.list(filters=dict(value=dict(gt=1, lt=3)))) == 1 + assert len(storage.op_mock_model.list(filters=dict(value=dict(gt=2, lt=2)))) == 0 + + def test_eq_and_ne(self, storage): + assert len(storage.op_mock_model.list(filters=dict(value=dict(eq=1, ne=3)))) == 1 + assert len(storage.op_mock_model.list(filters=dict(value=dict(eq=1, ne=1)))) == 0 diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/storage/test_resource_storage.py b/azure/aria/aria-extension-cloudify/src/aria/tests/storage/test_resource_storage.py new file mode 100644 index 0000000..efacb2e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/storage/test_resource_storage.py @@ -0,0 +1,280 @@ +# Licensed to the Apache ftware Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 tempfile + +import pytest + +from aria.storage.filesystem_rapi import FileSystemResourceAPI +from aria.storage import ( + exceptions, + ResourceStorage +) +from . import TestFileSystem + + +class TestResourceStorage(TestFileSystem): + def _create(self, storage): + storage.register('service_template') + + def _upload(self, storage, tmp_path, id): + with open(tmp_path, 'w') as f: + f.write('fake context') + + storage.service_template.upload(entry_id=id, source=tmp_path) + + def _upload_dir(self, storage, tmp_dir, tmp_file_name, id): + file_source = os.path.join(tmp_dir, tmp_file_name) + with open(file_source, 'w') as f: + f.write('fake context') + + storage.service_template.upload(entry_id=id, source=tmp_dir) + + def _create_storage(self): + return ResourceStorage(FileSystemResourceAPI, + api_kwargs=dict(directory=self.path)) + + def test_name(self): + api = FileSystemResourceAPI + storage = ResourceStorage(FileSystemResourceAPI, + items=['service_template'], + api_kwargs=dict(directory=self.path)) + assert repr(storage) == 'ResourceStorage(api={api})'.format(api=api) + assert 'directory={resource_dir}'.format(resource_dir=self.path) in \ + repr(storage.registered['service_template']) + + def test_create(self): + storage = self._create_storage() + self._create(storage) + assert os.path.exists(os.path.join(self.path, 'service_template')) + + def test_upload_file(self): + storage = ResourceStorage(FileSystemResourceAPI, api_kwargs=dict(directory=self.path)) + self._create(storage) + tmpfile_path = tempfile.mkstemp(suffix=self.__class__.__name__, dir=self.path)[1] + self._upload(storage, tmpfile_path, id='service_template_id') + + storage_path = os.path.join( + self.path, + 'service_template', + 'service_template_id', + os.path.basename(tmpfile_path)) + assert os.path.exists(storage_path) + + with open(storage_path, 'rb') as f: + assert f.read() == 'fake context' + + def test_download_file(self): + storage = self._create_storage() + self._create(storage) + tmpfile_path = tempfile.mkstemp(suffix=self.__class__.__name__, dir=self.path)[1] + tmpfile_name = os.path.basename(tmpfile_path) + self._upload(storage, tmpfile_path, 'service_template_id') + + temp_dir = tempfile.mkdtemp(dir=self.path) + storage.service_template.download( + entry_id='service_template_id', + destination=temp_dir, + path=tmpfile_name) + + with open(os.path.join(self.path, os.path.join(temp_dir, tmpfile_name))) as f: + assert f.read() == 'fake context' + + def test_download_non_existing_file(self): + storage = self._create_storage() + self._create(storage) + with pytest.raises(exceptions.StorageError): + storage.service_template.download(entry_id='service_template_id', destination='', + path='fake_path') + + def test_data_non_existing_file(self): + storage = self._create_storage() + self._create(storage) + with pytest.raises(exceptions.StorageError): + storage.service_template.read(entry_id='service_template_id', path='fake_path') + + def test_data_file(self): + storage = self._create_storage() + self._create(storage) + tmpfile_path = tempfile.mkstemp(suffix=self.__class__.__name__, dir=self.path)[1] + self._upload(storage, tmpfile_path, 'service_template_id') + + assert storage.service_template.read(entry_id='service_template_id', + path=os.path.basename(tmpfile_path)) == 'fake context' + + def test_upload_dir(self): + storage = self._create_storage() + self._create(storage) + tmp_dir = tempfile.mkdtemp(suffix=self.__class__.__name__, dir=self.path) + second_level_tmp_dir = tempfile.mkdtemp(dir=tmp_dir) + tmp_filename = tempfile.mkstemp(dir=second_level_tmp_dir)[1] + self._upload_dir(storage, tmp_dir, tmp_filename, id='service_template_id') + + destination = os.path.join( + self.path, + 'service_template', + 'service_template_id', + os.path.basename(second_level_tmp_dir), + os.path.basename(tmp_filename)) + + assert os.path.isfile(destination) + + def test_upload_path_in_dir(self): + storage = self._create_storage() + self._create(storage) + tmp_dir = tempfile.mkdtemp(suffix=self.__class__.__name__, dir=self.path) + second_level_tmp_dir = tempfile.mkdtemp(dir=tmp_dir) + tmp_filename = tempfile.mkstemp(dir=second_level_tmp_dir)[1] + self._upload_dir(storage, tmp_dir, tmp_filename, id='service_template_id') + + second_update_file = tempfile.mkstemp(dir=self.path)[1] + with open(second_update_file, 'w') as f: + f.write('fake context2') + + storage.service_template.upload( + entry_id='service_template_id', + source=second_update_file, + path=os.path.basename(second_level_tmp_dir)) + + assert os.path.isfile(os.path.join( + self.path, + 'service_template', + 'service_template_id', + os.path.basename(second_level_tmp_dir), + os.path.basename(second_update_file))) + + def test_download_dir(self): + storage = self._create_storage() + self._create(storage) + tmp_dir = tempfile.mkdtemp(suffix=self.__class__.__name__, dir=self.path) + second_level_tmp_dir = tempfile.mkdtemp(dir=tmp_dir) + tmp_filename = tempfile.mkstemp(dir=second_level_tmp_dir)[1] + self._upload_dir(storage, tmp_dir, tmp_filename, id='service_template_id') + + temp_destination_dir = tempfile.mkdtemp(dir=self.path) + storage.service_template.download( + entry_id='service_template_id', + destination=temp_destination_dir) + + destination_file_path = os.path.join( + temp_destination_dir, + os.path.basename(second_level_tmp_dir), + os.path.basename(tmp_filename)) + + assert os.path.isfile(destination_file_path) + + with open(destination_file_path) as f: + assert f.read() == 'fake context' + + def test_data_dir(self): + storage = self._create_storage() + self._create(storage) + + tmp_dir = tempfile.mkdtemp(suffix=self.__class__.__name__, dir=self.path) + tempfile.mkstemp(dir=tmp_dir) + tempfile.mkstemp(dir=tmp_dir) + + storage.service_template.upload(entry_id='service_template_id', source=tmp_dir) + + with pytest.raises(exceptions.StorageError): + storage.service_template.read(entry_id='service_template_id', path='') + + def test_delete_resource(self): + storage = self._create_storage() + self._create(storage) + tmpfile_path = tempfile.mkstemp(suffix=self.__class__.__name__, dir=self.path)[1] + self._upload(storage, tmpfile_path, 'service_template_id') + tmpfile2_path = tempfile.mkstemp(suffix=self.__class__.__name__, dir=self.path)[1] + self._upload(storage, tmpfile2_path, 'service_template_id') + + # deleting the first resource and expecting an error on read + storage.service_template.delete(entry_id='service_template_id', + path=os.path.basename(tmpfile_path)) + with pytest.raises(exceptions.StorageError): + storage.service_template.read(entry_id='service_template_id', + path=os.path.basename(tmpfile_path)) + # the second resource should still be available for reading + assert storage.service_template.read( + entry_id='service_template_id', + path=os.path.basename(tmpfile2_path)) == 'fake context' + + def test_delete_directory(self): + storage = self._create_storage() + self._create(storage) + temp_destination_dir = tempfile.mkdtemp(dir=self.path) + + tmp_dir = tempfile.mkdtemp(suffix=self.__class__.__name__, dir=self.path) + second_level_tmp_dir = tempfile.mkdtemp(dir=tmp_dir) + tmp_filename = tempfile.mkstemp(dir=second_level_tmp_dir)[1] + self._upload_dir(storage, tmp_dir, tmp_filename, id='service_template_id') + file_path_in_dir = os.path.join( + os.path.basename(second_level_tmp_dir), + os.path.basename(tmp_filename)) + + # should be able to read the file and download the directory.. + assert storage.service_template.read( + entry_id='service_template_id', + path=file_path_in_dir) == 'fake context' + storage.service_template.download( + entry_id='service_template_id', + path=os.path.basename(second_level_tmp_dir), + destination=temp_destination_dir) + + # after deletion, the file and directory should both be gone + storage.service_template.delete( + entry_id='service_template_id', + path=os.path.basename(second_level_tmp_dir)) + with pytest.raises(exceptions.StorageError): + assert storage.service_template.read( + entry_id='service_template_id', + path=file_path_in_dir) == 'fake context' + with pytest.raises(exceptions.StorageError): + storage.service_template.download( + entry_id='service_template_id', + path=os.path.basename(second_level_tmp_dir), + destination=temp_destination_dir) + + def test_delete_all_resources(self): + storage = self._create_storage() + self._create(storage) + temp_destination_dir = tempfile.mkdtemp(dir=self.path) + + tmp_dir = tempfile.mkdtemp(suffix=self.__class__.__name__, dir=self.path) + second_level_tmp_dir = tempfile.mkdtemp(dir=tmp_dir) + tmp_filename = tempfile.mkstemp(dir=second_level_tmp_dir)[1] + self._upload_dir(storage, tmp_dir, tmp_filename, id='service_template_id') + file_path_in_dir = os.path.join( + os.path.basename(second_level_tmp_dir), + os.path.basename(tmp_filename)) + + # deleting without specifying a path - delete all resources of this entry + storage.service_template.delete(entry_id='service_template_id') + with pytest.raises(exceptions.StorageError): + assert storage.service_template.read( + entry_id='service_template_id', + path=file_path_in_dir) == 'fake context' + with pytest.raises(exceptions.StorageError): + storage.service_template.download( + entry_id='service_template_id', + path=os.path.basename(second_level_tmp_dir), + destination=temp_destination_dir) + + def test_delete_nonexisting_resource(self): + storage = self._create_storage() + self._create(storage) + # deleting a nonexisting resource - no effect is expected to happen + assert storage.service_template.delete(entry_id='service_template_id', + path='fake-file') is False diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/test_extension.py b/azure/aria/aria-extension-cloudify/src/aria/tests/test_extension.py new file mode 100644 index 0000000..f0378fd --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/test_extension.py @@ -0,0 +1,156 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria import extension + +# #pylint: disable=no-member,no-method-argument,unused-variable + + +class TestRegistrar(object): + + def test_list_based_registrar_with_single_element_registration(self): + class ExtensionRegistration(extension._ExtensionRegistration): + @extension._registrar + def list_based_registrar(*_): + return [] + extension_registration = ExtensionRegistration() + + @extension_registration + class Extension(object): + def list_based_registrar(self): + return True + + assert extension_registration.list_based_registrar() == [] + extension_registration.init() + assert extension_registration.list_based_registrar() == [True] + + def test_list_based_registrar_with_sequence_element_registration(self): + class ExtensionRegistration(extension._ExtensionRegistration): + @extension._registrar + def list_based_registrar1(*_): + return [] + + @extension._registrar + def list_based_registrar2(*_): + return [] + + @extension._registrar + def list_based_registrar3(*_): + return [] + extension_registration = ExtensionRegistration() + + @extension_registration + class Extension(object): + def list_based_registrar1(*_): + return [True, True] + + def list_based_registrar2(*_): + return True, True + + def list_based_registrar3(*_): + return set([True]) + + extension_registration.init() + assert extension_registration.list_based_registrar1() == [True, True] + assert extension_registration.list_based_registrar2() == [True, True] + assert extension_registration.list_based_registrar3() == [True] + + def test_dict_based_registrar(self): + class ExtensionRegistration(extension._ExtensionRegistration): + @extension._registrar + def dict_based_registrar(*_): + return {} + extension_registration = ExtensionRegistration() + + @extension_registration + class Extension1(object): + def dict_based_registrar(self): + return { + 'a': 'a', + 'b': 'b' + } + + @extension_registration + class Extension2(object): + def dict_based_registrar(self): + return { + 'c': 'c', + 'd': 'd' + } + + assert extension_registration.dict_based_registrar() == {} + extension_registration.init() + assert extension_registration.dict_based_registrar() == { + 'a': 'a', + 'b': 'b', + 'c': 'c', + 'd': 'd' + } + + def test_invalid_duplicate_key_dict_based_registrar(self): + class ExtensionRegistration(extension._ExtensionRegistration): + @extension._registrar + def dict_based_registrar(*_): + return {} + extension_registration = ExtensionRegistration() + + @extension_registration + class Extension1(object): + def dict_based_registrar(self): + return { + 'a': 'val1', + } + + @extension_registration + class Extension2(object): + def dict_based_registrar(self): + return { + 'a': 'val2', + } + + with pytest.raises(RuntimeError): + extension_registration.init() + + def test_unsupported_registrar(self): + with pytest.raises(RuntimeError): + class ExtensionRegistration(extension._ExtensionRegistration): + @extension._registrar + def unsupported_registrar(*_): + return set() + extension_registration = ExtensionRegistration() + + @extension_registration + class Extension(object): + def unsupported_registrar(self): + return True + + extension_registration.init() + + def test_unimplemented_registration(self): + class ExtensionRegistration(extension._ExtensionRegistration): + @extension._registrar + def list_based_registrar(*_): + return [] + extension_registration = ExtensionRegistration() + + @extension_registration + class Extension(object): + pass + + assert extension_registration.list_based_registrar() == [] + extension_registration.init() + assert extension_registration.list_based_registrar() == [] diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/test_logger.py b/azure/aria/aria-extension-cloudify/src/aria/tests/test_logger.py new file mode 100644 index 0000000..d6999fd --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/test_logger.py @@ -0,0 +1,129 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.logger import (create_logger, + create_console_log_handler, + create_file_log_handler, + _default_file_formatter, + LoggerMixin, + _DefaultConsoleFormat) + + +def test_create_logger(): + + logger = create_logger() + assert logger.name == 'aria' + assert len(logger.handlers) == 0 + assert logger.level == logging.DEBUG + + custom_logger = logging.getLogger('custom_logger') + handlers = [logging.FileHandler, logging.StreamHandler] + logger = create_logger(logger=custom_logger, handlers=handlers, level=logging.INFO) + assert custom_logger.name == 'custom_logger' + assert logger.handlers == handlers + assert logger.level == logging.INFO + + +def test_create_console_log_handler(capsys): + + debug_test_string = 'debug_create_console_test_string' + info_test_string = 'info_create_console_test_string' + + # Default handler + handler = create_console_log_handler() + assert isinstance(handler, logging.StreamHandler) + assert isinstance(handler.formatter, _DefaultConsoleFormat) + assert handler.level == logging.DEBUG + + logger = create_logger(handlers=[handler]) + + logger.info(info_test_string) + logger.debug(debug_test_string) + _, err = capsys.readouterr() + + assert '[DEBUG]> {test_string}'.format(test_string=debug_test_string) in err + assert err.count(info_test_string) == 1 + + # Custom handler + custom_handler = create_console_log_handler(level=logging.INFO, formatter=logging.Formatter()) + assert isinstance(custom_handler.formatter, logging.Formatter) + assert custom_handler.level == logging.INFO + + logger = create_logger(handlers=[custom_handler]) + + logger.info(info_test_string) + _, err = capsys.readouterr() + + assert err.count(info_test_string) == 1 + + +def test_create_file_log_handler(tmpdir): + + test_string = 'create_file_log_test_string' + + debug_log = tmpdir.join('debug.log') + handler = create_file_log_handler(file_path=str(debug_log)) + assert handler.baseFilename == str(debug_log) + assert handler.maxBytes == 5 * 1000 * 1024 + assert handler.backupCount == 10 + assert handler.stream is None + assert handler.level == logging.DEBUG + assert handler.formatter == _default_file_formatter + + logger = create_logger(handlers=[handler]) + logger.debug(test_string) + assert test_string in debug_log.read() + + info_log = tmpdir.join('info.log') + handler = create_file_log_handler( + file_path=str(info_log), + level=logging.INFO, + max_bytes=1000, + backup_count=2, + formatter=logging.Formatter() + ) + assert handler.baseFilename == str(info_log) + assert handler.level == logging.INFO + assert handler.maxBytes == 1000 + assert handler.backupCount == 2 + assert isinstance(handler.formatter, logging.Formatter) + + logger = create_logger(handlers=[handler]) + logger.info(test_string) + assert test_string in info_log.read() + + +def test_loggermixin(capsys): + + test_string = 'loggermixing_test_string' + + logger = create_logger(handlers=[create_console_log_handler()]) + + custom_class = type('CustomClass', (LoggerMixin,), {}).with_logger() + custom_class.logger.debug(test_string) + + _, err = capsys.readouterr() + assert test_string in err + + for handler in logger.handlers: + logger.removeHandler(handler) + + # TODO: figure out what up with pickle + # class_pickled = pickle.dumps(custom_class) + # class_unpickled = pickle.loads(class_pickled) + # + # assert vars(class_unpickled) == vars(custom_class) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/utils/__init__.py b/azure/aria/aria-extension-cloudify/src/aria/tests/utils/__init__.py new file mode 100644 index 0000000..ae1e83e --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/utils/__init__.py @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_exceptions.py b/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_exceptions.py new file mode 100644 index 0000000..5d030e2 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_exceptions.py @@ -0,0 +1,73 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 jsonpickle + +from aria.utils import exceptions + +_ARG1 = 'arg-1' +_ARG2 = 'arg-2' + + +class TestWrapIfNeeded(object): + + def test_no_wrapping_required1(self): + e = JsonPickleableException1(_ARG1, _ARG2) + assert exceptions.wrap_if_needed(e) is e + + def test_no_wrapping_required2(self): + e = JsonPickleableException1(arg1=_ARG1, arg2=_ARG2) + assert exceptions.wrap_if_needed(e) is e + + def test_no_wrapping_required3(self): + e = JsonPickleableException2(arg1=_ARG1, arg2=_ARG2) + assert exceptions.wrap_if_needed(e) is e + + def test_wrapping_required1(self): + e = NonJsonPickleableException(_ARG1, _ARG2) + wrapped_e = exceptions.wrap_if_needed(e) + wrapped_e = jsonpickle.loads(jsonpickle.dumps(wrapped_e)) + assert isinstance(wrapped_e, exceptions._WrappedException) + assert wrapped_e.exception_type == type(e).__name__ + assert wrapped_e.exception_str == str(e) + + def test_wrapping_required2(self): + e = NonJsonPickleableException(arg1=_ARG1, arg2=_ARG2) + wrapped_e = exceptions.wrap_if_needed(e) + wrapped_e = jsonpickle.loads(jsonpickle.dumps(wrapped_e)) + assert isinstance(wrapped_e, exceptions._WrappedException) + assert wrapped_e.exception_type == type(e).__name__ + assert wrapped_e.exception_str == str(e) + + +class JsonPickleableException1(Exception): + def __init__(self, arg1, arg2): + super(JsonPickleableException1, self).__init__(arg1, arg2) + self.arg1 = arg1 + self.arg2 = arg2 + + +class JsonPickleableException2(Exception): + def __init__(self, arg1=None, arg2=None): + super(JsonPickleableException2, self).__init__() + self.arg1 = arg1 + self.arg2 = arg2 + + +class NonJsonPickleableException(Exception): + def __init__(self, arg1, arg2): + super(NonJsonPickleableException, self).__init__() + self.arg1 = arg1 + self.arg2 = arg2 diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_plugin.py b/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_plugin.py new file mode 100644 index 0000000..c91d0c9 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_plugin.py @@ -0,0 +1,58 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.orchestrator import exceptions +from aria.utils.plugin import create as create_plugin + +from ..fixtures import ( # pylint: disable=unused-import + plugins_dir, + plugin_manager, + inmemory_model as model +) + + +PACKAGE_NAME = 'mock-plugin' +PACKAGE_VERSION = '100' + + +class TestPluginManager(object): + + def test_install(self, plugin_manager, mock_plugin, model, plugins_dir): + plugin = plugin_manager.install(mock_plugin) + assert plugin.package_name == PACKAGE_NAME + assert plugin.package_version == PACKAGE_VERSION + assert plugin == model.plugin.get(plugin.id) + plugin_dir = os.path.join(plugins_dir, '{0}-{1}'.format(PACKAGE_NAME, PACKAGE_VERSION)) + assert os.path.isdir(plugin_dir) + assert plugin_dir == plugin_manager.get_plugin_dir(plugin) + + def test_install_already_exits(self, plugin_manager, mock_plugin): + plugin_manager.install(mock_plugin) + with pytest.raises(exceptions.PluginAlreadyExistsError): + plugin_manager.install(mock_plugin) + + +@pytest.fixture +def mock_plugin(tmpdir): + source_dir = tmpdir.join('mock_plugin') + source_dir.mkdir() + setup_py = source_dir.join('setup.py') + setup_py.write('from setuptools import setup; setup(name="{0}", version="{1}")' + .format(PACKAGE_NAME, PACKAGE_VERSION)) + return create_plugin(source=str(source_dir), destination_dir=str(tmpdir)) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_threading.py b/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_threading.py new file mode 100644 index 0000000..d24661f --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_threading.py @@ -0,0 +1,33 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.utils import threading + + +def test_exception_raised_from_thread(): + + def error_raising_func(): + raise ValueError('This is an error') + + thread = threading.ExceptionThread(target=error_raising_func) + thread.start() + thread.join() + + assert thread.is_error() + with pytest.raises(ValueError): + thread.raise_error_if_exists() diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_validation.py b/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_validation.py new file mode 100644 index 0000000..8e35f22 --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_validation.py @@ -0,0 +1,35 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 pytest + +from aria.utils import validation + + +def test_function_kwargs_validation(): + + def mock_function(arg1, arg2=1, arg3=1): + pass + + with pytest.raises(ValueError): + validation.validate_function_arguments(mock_function, dict(arg2=1)) + with pytest.raises(ValueError): + validation.validate_function_arguments(mock_function, dict(arg3=3)) + with pytest.raises(ValueError): + validation.validate_function_arguments(mock_function, dict(arg2=2, arg3=3)) + + validation.validate_function_arguments(mock_function, dict(arg1=1, arg3=3)) + validation.validate_function_arguments(mock_function, dict(arg1=1, arg2=2)) + validation.validate_function_arguments(mock_function, dict(arg1=1, arg2=2, arg3=3)) diff --git a/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_versions.py b/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_versions.py new file mode 100644 index 0000000..222949c --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tests/utils/test_versions.py @@ -0,0 +1,85 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 aria.utils.versions import (VersionString, parse_version_string) + + +def test_version_string(): + # No qualifiers + assert VersionString('20') == VersionString('20') + assert VersionString('20') == VersionString('20.0') + assert VersionString('20') == VersionString('20.0.0') + assert VersionString('20') < VersionString('20.0.1') + + # With numeric qualifiers + assert VersionString('20.0.1-1') < VersionString('20.0.1-2') + assert VersionString('20.0.1-0') < VersionString('20.0.1') + assert VersionString('20.0.1-1') < VersionString('20.0.1') + + # With prefixed qualifiers + assert VersionString('20.0.1-beta1') < VersionString('20.0.1-beta2') + assert VersionString('20.0.1-beta1') < VersionString('20.0.1-1') + assert VersionString('20.0.1-beta1') < VersionString('20.0.1') + assert VersionString('20.0.1-beta2') < VersionString('20.0.1-rc2') + assert VersionString('20.0.1-alpha2') < VersionString('20.0.1-beta1') + assert VersionString('20.0.1-dev2') < VersionString('20.0.1-alpha1') + assert VersionString('20.0.1-DEV2') < VersionString('20.0.1-ALPHA1') + + # Coercive comparisons + assert VersionString('20.0.0') == VersionString(10 * 2) + assert VersionString('20.0.0') == VersionString(20.0) + + # Non-VersionString comparisons + assert VersionString('20.0.0') == 20 + assert VersionString('20.0.0') < '20.0.1' + + # Nulls + assert VersionString() == VersionString() + assert VersionString() == VersionString.NULL + assert VersionString(None) == VersionString.NULL + assert VersionString.NULL == None # pylint: disable=singleton-comparison + assert VersionString.NULL == 0 + + # Invalid version strings + assert VersionString('maxim is maxim') == VersionString.NULL + assert VersionString('20.maxim.0') == VersionString.NULL + assert VersionString('20.0.0-maxim1') == VersionString.NULL + assert VersionString('20.0.1-1.1') == VersionString.NULL + + # Sorts + v1 = VersionString('20.0.0') + v2 = VersionString('20.0.1-beta1') + v3 = VersionString('20.0.1') + v4 = VersionString('20.0.2') + assert [v1, v2, v3, v4] == sorted([v4, v3, v2, v1], key=lambda v: v.key) + + # Sets + v1 = VersionString('20.0.0') + v2 = VersionString('20.0') + v3 = VersionString('20') + assert set([v1]) == set([v1, v2, v3]) + + # Dicts + the_dict = {v1: 'test'} + assert the_dict.get(v2) == 'test' + +def test_parse_version_string(): + # One test of each type from the groups above should be enough + assert parse_version_string('20') < parse_version_string('20.0.1') + assert parse_version_string('20.0.1-1') < parse_version_string('20.0.1-2') + assert parse_version_string('20.0.1-beta1') < parse_version_string('20.0.1-beta2') + assert parse_version_string('20.0.0') == parse_version_string(10 * 2) + assert parse_version_string(None) == parse_version_string(0) + assert parse_version_string(None) == parse_version_string('maxim is maxim') diff --git a/azure/aria/aria-extension-cloudify/src/aria/tox.ini.bkp b/azure/aria/aria-extension-cloudify/src/aria/tox.ini.bkp new file mode 100644 index 0000000..765435a --- /dev/null +++ b/azure/aria/aria-extension-cloudify/src/aria/tox.ini.bkp @@ -0,0 +1,116 @@ +# 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. + +[tox] +envlist=py27,py26,py27e2e,py26e2e,pywin,py27ssh,pylint_code,pylint_tests,docs +processes={env:PYTEST_PROCESSES:auto} +py26={env:PY26:python2.6} + +[testenv] +whitelist_externals= + rm +passenv= + TRAVIS + PYTHON + PYTHON_VERSION + PYTHON_ARCH +deps= + --requirement + requirements.txt + --requirement + tests/requirements.txt +basepython= + py26: {[tox]py26} + py27: python2.7 + py26e2e: {[tox]py26} + py27e2e: python2.7 + py26ssh: {[tox]py26} + py27ssh: python2.7 + pywin: {env:PYTHON:}\python.exe + pylint_code: python2.7 + pylint_tests: python2.7 + docs: python2.7 + +[testenv:py27] +commands= + pytest tests \ + --numprocesses={[tox]processes} \ + --ignore=tests/end2end \ + --ignore=tests/orchestrator/execution_plugin/test_ssh.py \ + --cov-report term-missing \ + --cov aria + +[testenv:py26] +commands= + pytest tests \ + --numprocesses={[tox]processes} \ + --ignore=tests/end2end \ + --ignore=tests/orchestrator/execution_plugin/test_ssh.py \ + --cov-report term-missing \ + --cov aria + +[testenv:py27e2e] +commands= + pytest tests/end2end \ + --numprocesses={[tox]processes} \ + --cov-report term-missing \ + --cov aria + +[testenv:py26e2e] +commands= + pytest tests/end2end \ + --numprocesses={[tox]processes} \ + --cov-report term-missing \ + --cov aria + +[testenv:pywin] +commands= + pytest tests \ + --numprocesses={[tox]processes} \ + --ignore=tests/end2end \ + --ignore=tests/orchestrator/execution_plugin/test_ssh.py \ + --cov-report term-missing \ + --cov aria + +[testenv:py27ssh] +install_command= + pip install {opts} {packages} .[ssh] +commands= + pytest tests/orchestrator/execution_plugin/test_ssh.py \ + --numprocesses={[tox]processes} + +[testenv:py26ssh] +install_command= + pip install {opts} {packages} .[ssh] +commands= + pytest tests/orchestrator/execution_plugin/test_ssh.py \ + --numprocesses={[tox]processes} + +[testenv:pylint_code] +commands= + pylint aria extensions/aria_extension_tosca/ \ + --rcfile=aria/.pylintrc \ + --disable=fixme,missing-docstring + +[testenv:pylint_tests] +commands= + pylint tests \ + --rcfile=tests/.pylintrc \ + --disable=fixme,missing-docstring + +[testenv:docs] +install_command= + pip install {opts} {packages} \ + --requirement docs/requirements.txt +commands= + rm --recursive --force docs/html + sphinx-build -W -T -b html docs docs/html diff --git a/azure/aria/aria-extension-cloudify/tox.ini.bkp b/azure/aria/aria-extension-cloudify/tox.ini.bkp new file mode 100644 index 0000000..271ddca --- /dev/null +++ b/azure/aria/aria-extension-cloudify/tox.ini.bkp @@ -0,0 +1,56 @@ +# Copyright (c) 2016 GigaSpaces Technologies Ltd. All rights reserved. +# +# 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. + +[tox] +envlist=py27,py26,pywin,flake8code,flake8tests +processes={env:PYTEST_PROCESSES:auto} + +[testenv] +deps = + --requirement + requirements.txt + --requirement + aria_extension_tests/requirements.txt +basepython = + py26: python2.6 + py27: python2.7 + flake8: python2.7 + pywin: {env:PYTHON:}\python.exe + +[testenv:py27] +commands= + pytest aria_extension_tests \ + --numprocesses={[tox]processes} \ + --cov-report term-missing \ + --cov adapters + +[testenv:py26] +commands= + pytest aria_extension_tests \ + --numprocesses={[tox]processes} \ + --cov-report term-missing \ + --cov adapters + +[testenv:pywin] +commands= + pytest aria_extension_tests \ + --numprocesses={[tox]processes} \ + --cov-report term-missing \ + --cov adapters + +[testenv:flake8code] +commands=flake8 adapters + +[testenv:flake8tests] +commands=flake8 aria_extension_tests diff --git a/azure/assembly.xml b/azure/assembly.xml index 48255fd..6833caa 100644 --- a/azure/assembly.xml +++ b/azure/assembly.xml @@ -46,6 +46,7 @@ *.sh Dockerfile + *.wgn diff --git a/azure/docker/Dockerfile b/azure/docker/Dockerfile index 8099aed..70924e3 100644 --- a/azure/docker/Dockerfile +++ b/azure/docker/Dockerfile @@ -16,6 +16,22 @@ RUN apt-get update && \ apt-get install -y unzip && \ apt-get install -y curl && \ apt-get install -y wget +RUN apt-get install -y python-dev gcc libffi-dev libssl-dev make + +# ARIA orchestrator addition +RUN pip install -U pip setuptools +COPY /aria/ /tmp/ +WORKDIR /tmp/aria-extension-cloudify/src/aria +RUN pip install . + +WORKDIR /tmp/aria-extension-cloudify +RUN pip install . + +RUN pip install --force-reinstall pip==9.0.1 +WORKDIR /tmp +ADD docker/cloudify_azure_plugin-1.4.2-py27-none-linux_x86_64.wgn /tmp/ +RUN aria plugins install cloudify_azure_plugin-1.4.2-py27-none-linux_x86_64.wgn +RUN rm cloudify_azure_plugin-1.4.2-py27-none-linux_x86_64.wgn RUN cd /opt/ && \ @@ -26,4 +42,5 @@ RUN cd /opt/ && \ WORKDIR /opt +RUN chmod +x multicloud_azure/docker/*.sh && chmod +x multicloud_azure/*.sh ENTRYPOINT multicloud_azure/docker/docker-entrypoint.sh diff --git a/azure/docker/build_image.sh b/azure/docker/build_image.sh index 24ba356..2865c60 100644 --- a/azure/docker/build_image.sh +++ b/azure/docker/build_image.sh @@ -14,7 +14,7 @@ # limitations under the License. DIRNAME=`dirname $0` -DOCKER_BUILD_DIR=`cd $DIRNAME/; pwd` +DOCKER_BUILD_DIR=`cd $DIRNAME/../; pwd` echo "DOCKER_BUILD_DIR=${DOCKER_BUILD_DIR}" cd ${DOCKER_BUILD_DIR} @@ -36,7 +36,7 @@ fi function build_image { echo "Start build docker image: ${IMAGE_NAME}" - docker build ${BUILD_ARGS} -t ${IMAGE_NAME}:${VERSION} -t ${IMAGE_NAME}:latest -t ${IMAGE_NAME}:${STAGING} . + docker build ${BUILD_ARGS} -f docker/Dockerfile -t ${IMAGE_NAME}:${VERSION} -t ${IMAGE_NAME}:latest -t ${IMAGE_NAME}:${STAGING} . } function push_image { diff --git a/azure/docker/cloudify_azure_plugin-1.4.2-py27-none-linux_x86_64.wgn b/azure/docker/cloudify_azure_plugin-1.4.2-py27-none-linux_x86_64.wgn new file mode 100644 index 0000000000000000000000000000000000000000..aef426912a24e4d752f506a54e5e68b27ebf90e5 GIT binary patch literal 4357947 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�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�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%0DBYmD#$=r?;fqYu)tS*oN)9|9 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

Yw5t9s#jIg+j!(^eP47nF+#r+FZZ7 zi`D%Phl@0-mK1#)&(bgS&gY)gXkyW+3>ug+Pwl@|qQ{g9D7sDbtnA#~^#n+ojks{4 z2J6Yp<0J0bVzeBHN+(54OYBmXw<&|bwHtkRt-@U+ZL2f?1=Cxzl#LAn1^_VlEAb`% z|L>ipt%HrJt*M=h;eX_u{D=Bi|FTCGNBG+I9~oCX;y%=Yu%v8BmQoBriy%V;i-cOz z+Pxmpp6x2zc8&g6eVMt*@r?ymu?-T*{z{Kyx8I5V`1-!=C=R)M^WkEjwQh))lsZ;A z)x(r6VTJD0`{3luGkawxI?rCxi-=TnuCP2$?k$)&GF`cS@$LccWYLQ~f70QkQYD4# zOY4kJ<>Aql&s8pQs>mVPA5^k~`nD(3eH^uRy@N2GMNi2z6=8Yl#ly!(Cv(@_nvL$^ z2!ZV8l>(SGLJUtWAs+0QtDdcHd z+dQbLOuaJVzU(Df;aom>h0s`PS&Xg80INtAh%XJY0{P^XQLCbM)Q50$TiOA~>c24z z5kG9L1@e0e*X8QZA0~jwd>Ex0=qb!ewfU->V%~ zLauQazkeIQN~aXZlnIS_ypBorHD~5VO-`KM2GssZqak`mTw5e=Tha5uV<)H5dFsl?Y1WE0N@xP~ymt6hV56{>uTKT6Ssb~rlmY8-7FMA^D=scDzG zK^|mij3#Lp_tmT&X}bgdIM`8A9F&Cb=kwqobFfk#2vs3yEM6)?dPVCY(!>fxMO=ms zMzf)H=Ugyh(Qz-%8c0{uu9=T7@YmT%+M9aSMxKk_EXB!L(?w>!=}VRY>2AU)DFR>m9|RZtc+L4{ux+YfU>`66}LON)WlFOala zg@S-VV@8$lwng;@g(DA|+9^(1qN5dHeL#lPtdS@vi7hekmVrMGsBg$^MW~^Km&AhO zOzD9=Rld4GC=xayJ#dm+Gllp>Fr2r2*}`+yLN??cRi)k7YG`l9sm87K{?Jt7hWcjs1^(>KV&r_P4z0#o9oX@p0M(2*t4x zSrkwkr;Q3aC>Ot#)k@31QeB$2@Ic`zVeCk$uaL_SLqjN7NB(LxvxVcrR7q&_4WTO& z^fKzwNvJE#5GQ-7O7@arZgWCT51pp0Xtk>4yF9Py`O=he(&XnM2LNy#>+r+UI1xpV z`oh`9+7=T>g0+~?@xQTD!QLei3!~Q!if8xifd|kv#@PW@#&O)>#sFjPdC z5h=pM*a|91=ZmRh)Pf1al$`UgHC6{!8rX9c8*?NJ5glh+i+1-j)?+0l`7aPZtrvYI z-y6JUrk5}!ak#E&vQ2oB0D}+YCB{6D=^YVpBr?$ss`)3L!tK_vn-J975(s#%z+^{? zmKB%H{>`?dMPJ<)ejpF5Y1$Rpd*VeG>$+?pA97Qz{^E8SJGF#!Nhnl?J=ekCl%ly& z(~xJg=A+%V83)gA2%6T7b?TRUx40?9UfrC#z{iel_`iU?UT(I(lP7s%ry=Drzyh+V zWzZb~)*@`Itr~_kVd$mj88d7SMy`2`FOJdTPP%-jPGdFxw?~Wkjk9a8olx zvJrr^3Wmd+3rn>OZYn~UuP9SE+8g;~l^sGMW)q!xWi2?P!nKVn72YJ6Dvg&Ayvx(Z zj=`2-Lrxf|e*FeGS6#j&1|6~I{aTrWPpR0^OC5|PsIv5JClG%w2wxz>GGn1zM3H&E z?lzU{SU`jxkD=bQ2-b<4IMR41$4?;J7I#8s24lsf`-dMzGiTdIwY$>rqJzS4U+>

f;+i?A}xNo9)K_xzM#^pq5ee7NUn; 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

sg~|IqeXj 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

OS+n=E;RoJsDm--z@29mHRC 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

    7ikx%jvNm)c485``2tu!<0 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

    jUp8;l{`zUBHq073*zVX}SW*%-+hPt!gm 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 r_HZ>k z7KPw!rorE_apvkZlS@y@w$2K$PV&wQh4xwXR?2dxJXE|9piFgO$8^xPO9+4GK`0pq6?HpnHVScY4emed}u>^?X+;ju8 zQ2}gSNT=cPGjY+kF&FVf!Uz7>063N@5OV)QnJ@AIX}4Ox`*>}TA%EqtV@rKTo!mdH znH5!>suBQQqyZDNv1BCGCvYIMF!PetN&ayyETkMzLZe+m3$eR8oxw1S2jssN(O?qc zAg@9yfr^o2IK#{613Nb$=7*$Ec?k)ZN4uG62#@q~^saq9??I(691Na^qhT7`uNnbA z%;N5T)fZMk9M@hs0xTi#|Ar(8*)$_jf(-nWB;`MIi5{mAFWX4jL!2A2KWM;&SOEiL zFSXU7Ze*XNFgOQZGni*=V?9TfM!pL8e4P53A`xy&rRqoO zFoK1jokn!DYTJoJ=D8gCMENDB`s6|H_GA1l1rIPS6Hew{O}4js)*MKuCVX19{l`_Q zZEn92>5Hr|mW_@af0E;ScHrEI2%{2B;2I8I{Hi)q?MkW;xZPM-RUqj>lU8Iyp0LQ< zXRfhuB7+g8xDTS@VYW}erbQ|J>r1+L&1aPRMrX5UHW&sR9VJOdUkMP z>JQGdFtRu%MLtT18$6VEi0Cu;buj#m{IpzO%X1DFX>>nhwEZ>hqfVebDn#)fgyS=i zAoW9_PrD?#Dtaq;06I!EUNl{z`b5(Y3d0b_H?>B-8T=?;g)CkQk_{`&$f&~Lq#-3) z%UVmBaus5nmTf{PU z-Fz~F+8WFC=-({?(_jZYiT13vuK2?zO^9swNy(Z8e`-HxXJ-!<5uR0d^>emc;X29B z!HvK)#FQ+L9pV&?fv5b3GyCj1#B4>QrYX5A>V)PeR#wpINMNiW1i?N<-aW;(X9$-lnFN3G;u7grasahRjm9>h%V0#0bjBGu}=+sLAvHx--W!j1c`ny+sn zI|8skO%Yi@fHFYdgsJAH%LUZ@PG;E1F2#vDaS$lk`}WT;y*NJve1fYKxty zg&s_11lvy-m18mEjC@WITof75?3_&DRFqXQZqub*M{4TmW$cpl@DSOkYSnJHjn;1@ zds}wa%ST|~CHS%^Iy+ZJ;`vVh<8+3cR zKn;aNWv{J-=Nh|zD@6a|K1x$ofVt|z7{?jF$xX)doZ@VwA^**%sIO}^^s#U9*K|fm z;_zDP3Z^&eLxlvI%jjVKGLrIb4-ZL{q_i~S{zGZ|=6me&Iy!8p6~B#4(hY z4EZPP!l+&wcqKQiJ1m;~#VPpIbRTJ&AZDPl)wgVV4APA_~u`4X>o`25!uFufTF!P<)(r zAR&qarN6|coPLo62-J+97DGV#d?9zDz&g0+_4bR1GG)jzxc!)fD+$~eK&MM)c&Aw9 zl>>m(LmKYM`cZHi5&Y!>8;GILW_BXc+ZII%yA>rK4nd+2sXURg$VCs%gcwH16!L@X z^od1#S~ic`)k{T6>c&Rhhq2qfBf(^Pe9i99%q}uF6#zoG_aiw?s3}epmlol43OfqP z&we}$8Sgi|2)PTW#|Q~I?q4YmJwu%oI=LG$g$*&Q5wwb&l^6JYBtf?LctPKM4HyYS zAKD?xjdmkp1QsW{FgF}3DxNH|VjJ*fa5(IlA)GCt>S09<$l+HM5KEgr8rnb?R4q4V z_x*Z#?Bp3jIhsMBaumj}gaGoD65FG*$0G+<2_q>3T?7RyB#c>@pAwq9fsDI)XrP(N z=ICR@n4;C=qnmB^0~v{RQwIvBt8AS!pz*Z>q|>keGF;Fym1e?ZAa3 zXf?w{&LfgCiHjJNKyu7OGHIQK{EIqN0c2>bcaDt712SI4DB!6@ZIYMr3JTopbl10 z4A4(a4-o{qPT-;ZfSd0;*Ee4Eg-gz}RJqQ$yD~IiHX?ugwf4Pr-0pe`A5YhJ_Tj6` z=->F}TCOo+L_^D|*J0(`a;^m`ccd*AQlP)3 z%rMOP1FC|W6uF!`twSY>zTH&~bbV^nHc1j%NzH|*UCDsvik?x(s(aAWMs3xlYi}7r zlMhH99bJuAdH-GfBb92ed_u6cLllM*lTymDhJ$y`#NE(`n;aI1TuIQ6Mw)jr0I;1HgyHy$NF!*-KJ}O1rzQC^|PXtI|k5J}%6(kY1jKco4HBZ#t-h{W9>7wL{FNIW9 zqGo!wQoshe(sy$Gq7&J&N^fK$jai`Q0gYqpNwP3i^4=WP@9fMWKg&}FUrn5yA8|qh0Tgvuwi=YHg_pBD*sU*>ah&XHW$v6E&`L}`7z*YN2~{|@e;4F`0cB5 zMM}DI%&gx@$13obs&nUyMs0dOc1?gQd&k^ybTgl|e+ihO{*o2h(OSwqRMihaw`Sej zL80+(n*FdrJq`mrRF6A}0e{NZZF+Vb8^XUG(5cjU@auW<>uGuRG@S`0Hy#d{&%cav z)OiduuEvFOOvjy(CW6(B6_^>(ZkxNjo&IKxQJU!nvE(jo4>QxLz?? zx~yFYlcD2m)LrUUKA}OttBosx)gy6&;NDNviTuTMIjyn3s9I#iQSJX!KS%ok*CCy~ zysF_>iBO@0x+79g$>jcVf2>r>#ryDREHXm3#E*H^-07XXN87m368(h{umb9I8G)Z2 zHJ7K+83~seg%_Nhi#kauK9`@nKu*<7fuO8-P9>o@6%(iaMaHX*EWBa#_ktx8iA2I< zkH`)4FCv$a9|#fbbqr$(xKy7rG41n%!`g5RYzQwc#*3{ZWuzPDL#AKg#&R4V^>9{R z%Yf#-9r{M?&wer#IUfDYzT5l>2eV_FwY5ukU}_4ydFg8+GRBOEq|CpAJ3C;svW$*C zC%*Qh#Zu~T@>2l;w0ohtPbos$pm$DglH^G8)v$X=(IR+BahdtXfG=8TA(*ffJ2?buA$u-X@!ugCO6=#&e>~cEzy_V{DpP+%0=(d*VBYwXjDB(xf#>dAaBGBbWi75*HuGx*CF2jRv(IC5X zdQ77O%gt)-LL3WA{wCN}##ic1M>tKU02_gNSKvh2`1Ks&KE`Lb-}!~%^8>K0eJz8# zCNdHS;eTT(@F>V93+n{gnKCti0Cd}kaA}9yY!BVDk!<^GEt?$z9&NkBNu+2DFkY9B-CFMzP z@uy!zKZj_FM;+{0iL=9;b=JxcJf?u*A^YY{^E3)Pt?NJ{m&hh-SI~i0_oa!Fx?BT& zUP^m0`VuSD{lj>YYIXI(-M=uYm$h`V%NEYrvQIgtZA%!eo0A8{YXvd45 zwwQHXgiidA^D|Z3Vi9P~_3H}Fq%${khMq|h!yVgjQFpFKYj)omZ&lTRQOB6HxQRf+ z#TVgNstgxnInK)~tq^b}in>WpVqrg+lETqiUWHWv-YOq*5}F6Bm&wbfX9VN9SDX{W zJn*2t-tu27e_frW!yL<{?L=qCktU+9P2jiYSc-d>%Zqz0qkXHJv9}&v`rEf0+?H{I zQ@DQI4Njmxq4j{H^1!^$8&NK7g)vmbS@Rx_sbmAE`yEH;ryDn~JKuM@vD5LmpS!H3 zZ3cjj#!KLBWe^%?TbFAKN|n2e(9Gk%K;7HQG4|hJ%t&j{<-c_*s#p0%cHF9j({7Iy zCIf~2g>w0Hj(S%7D1*Zw(gQi^=FFBKs_DBAmMD44zN*{W-fcQEryVJt=n7dD6xo98 zBik;;N$?!YS-#31FiX3LUje+8hgzw~u2Wn%=PO5NgT0nWiY|G3gsg09q#>t}kT z3X0T+0@7cEaZpaTHNKn5K6~~8I~G4kB6<{Szh>rZ;o371@=DY>_PcJK;jixhI=oL- zvjFG+CTrfIe%sgo_jujH(bh)yKae_ujjfTfu9dmXzpR=z)i=K<_=vtwy1k7E$6g* zcPzE%$CWo4uAXJ`y?vg{vpjoDp%3>O^7_UdRQEI7}8|*D7+1!D+7jC|7Y)?ZazW-C(pyYr7E!RGMW* z#y5G994@8xdQIUpFPZS08a^J+=1=DW3(TsgAqd;X0^YNA z*PDXEB>ovaLsN2ecuYsv=z!<}W5N!uP&*-lSqqc5}=-jEt$2`4g-?*0}h}&{rPQ|^0y?yU%RzIW;9;_2d@;$EZ z)@Brxa&sFMxx_@#>ilfISF&qyU>|3z+6MjpM#h7VD;Om&`@%N2koi0e>$((unMr#+ z)|h3Xwt0%jF%8mU4CF0R68p~9!S4{5JA4Bm#J0wUKjuALWZ214DbzlrmCs@CgDjyU^R>3_#UqQaqxQ z!W#Ld(^P`$2xbqEC^TyW$p{+j2wV##nX0x}omRqkhGMx{;?Y zDYv*#NVO(*VR-^+=DMLSKW48_-VxD3tsgBETwJWL6EVyyJQGxeJYAT((jMc*dvni6 z#2_AhonfQ7ZEp=@Mm+tdJ1Ms!1 z1cNu5)beNd2}LFq$_QMzoV#~TW*6URcOw{06|a)~^=_M=LDn#4ke^(?D9!KU&6qah zjN*qhkW_s-|*J%ukhIj@zw|rst6c+V?Ng^`7(1w-0dDK)zK( z6VAL^{p~0w4|jnDu<9}{smXT&V)<-PG*|8g8~9lwOGN)NZ8_5$hQ%b3HUyV~oB^`% zyn!IGzuRxF+u_Kp@mJQ-yRrGMwi;hHfuL}seb69sQ@g?-Rg;J%dX}iO3_N2ah8Wgs z=ZqY8)o1oz5D{G~ACotzfP@OgfbM@Vb^qmblcSjAefrHyAVm3}RH1LFmA;{|jiLL$ z_Q>krmeuU2-^?dB;PWM{9j?($T-a8a8gd#4cgdeFxjs$o;U4nH5`d%5`rLGtnDR=1Bt6I1E zBC@`2>P+hBn@%tL0(4lQmJh1R={iax-)`!ZACfh6uFGIbp8U0{c08t8cVRyqX^-ow zdNm9M9s3{fs-eFQi_eySM#M|^M~sS>gM&iXOD%$n&QqgmT&BjdP^wT|kY-BSJV|YD zfv^x>QIw;doy(mpLLXl5k0#W*!sdh@?>6b@(Mv7M2dr?+~>^um0LG3PjF=8%#1|RCH8-(2$Z0*j;ksony z`0HxJL-$*daNiD&U5aDEe{&~=QIA`Hwe8Re{;JBi9Z;Z9qxn8q@pCTBu+D$VF8(fh zlS#>9R4nCEtxbz|_uI!W#r<^#|S6W2@sjUQ12e59R6m zUM)>(b0$sjpMW?6zi0boE)VGEn!V7uRPf69q}X+xHN0{jo7}}yIc3}f`(l*}o^heP z$ssP=iaEE+=35yFC-FM&RGdMiLLF^HE0?lz8g<9xg6H}@u#Q6<@zD#QqmN0){`AN9 zJwv2V%+P{q1{}t+9np6F{uY=~8ru*Asvr8}-^pq)hj$=E=f?Anie=G(yoV zk1d*m$LSJdgMNsx!PC}{;MMK0}E-v zE{hs)V{EesKITHWH4=y{z81ZHcYpQNPlxp^Mj}x;bR7xi5j53#th2cRMJ_#5cDtW= z=V=2~aoj(G0uO@2@XIIT_PvVakatCs6br$CEl_r`;RfYsn^T!k?N*#pLr7Z>CphgU z5(ux;9j)HQv%o(~sy(7rMPnjnVJi+dJ|eB>KGtJlx>^ovC<8U%DAMGC6%-g;RT)Zc zY&TAnumvryv=HM0x=O@b&RwC7H$}n2XsUrlmh{w}9N3p*rYy1&_;ZGIf1Ttc&r6x<zSp0x$G8ixD2jgv#kj8@u~W94#=yDl{M-F-#;I7LcQNG?MmjSD>%Mty?Y1U$E}m)x*IO`_qb(j?+u;J zwA^ve5u)NsQ2Os_I(0~K##&q{Mop$K$yx%YQp_OStYMG$NGZ+oA zaVeA=^Mn3e@qW-V#_lo`k$MODE;WbH5_FO}kQAAzNC#L8f_mGBBQX=8L>ntq9`nLP z@N%~ha~yWAbTlgm0#A^Aj#j1}td91`6xAwZ(U11%4JyLIKugx&_=1()fHupJc+Oge za6fwaAsO`KFeA=cHqat)5>6*n1 zp4)Fp+!cME^I#cEvsa2zToOHb0ge*C1{f{)xcKL{m+>P~$q6e>laHIO-_T$Lms=x9 z`G~pYdV=tvwX}#@=jR-k+~L?Op22XVqmFN25JP|9OPO-mN=3Il5`jiQcg)Dj#CsJ8 z8d4Y4QiiP&KDpO9qSoH9BjH-};wRgu5B zICW<`>Z^jLnn0I6F1gt@ol6M#|U)1Ntv6;NL!ddqs_f4RE@ z3Qr+Ylh2AoFcV*PAmXE;tPBB71iUa4*$SK1pJHev zZBRZy|MmOA9B?3-eOF}gZ_fAsg)R7x@9X4X{4W{Sg_^7_4hLfAnVL*ifQy1V(h;So z_y*_C^Z=X%epJLjxXuDnaT-Ok)}}?>?X(>qsbEV~zWwj3OWVPO^V=o@?g{SiRsJSH zrj9Lult9Vt>2ViuiIC6H;C$c&oHO{U)5_MdJrIIW$Y|Wugpi_etclq|$F73)xAXq} z`cKV)CTJ3s#-gHbBlKABMZO*7(aCo0pYl3Tmw^B!omL34`j)%#3%10zpF`zV4Gu04 z*im4X(g+^S&1Q8gkk;fsSH=PrI!%<_8f@M``vTmCDTNJV*sI4l- z9aDQ(S66|4?_>UE6+@b%l2%oZ3{av@Ar8F(-5p;G`=)*1MmZq)-%*k|BO%k78qz70 ztsESoVhfZP<%*%y4>m6&$f<$D0 z{^5C@1i#z0@BHlWwhl+wrB)ITHP0h zM>c?~#qUHv#UOZb6e{R_z4V+h3tH?&}ii4Iy=l^>; z%WlA7Or3qsZm=3N$}R-cO<%UB?b;8%R~3&J@fg<(!d3jJK^*$5=Jjz&!g}eNa7@a5 zh374|(17CD%v%=>4BY-2wgdq)R-;)Q8+3{d{3Mc+1T~Y0zl!OcqludAw<6YuX(4lq zD$Q@Yg>-{nDw)oei{kCiR+p|t^Ste9nroM0%F;_*8Yvvnj=R8wD5977+!{l5f5wc4 z$DfaWoeqS)o%Bor2fzjOZ+wl^5rc}jiQoeDjrv{SCmsv>{jCBFjjKzG(qMhDi%mg~ zWwss*!>b0&Gy=x z$*;mQSr1pfb4=Tp95v<8M+f({+ho?ghxC``CtkJX2Kn11@-1DPE)>vih$rK;p{|0s)@TG(6QV6~GRCYuozJu2*-3u4$or#j#3^py1} ziUJf0k+Xv`6ieZ@h-Gz>wz3bq3@@QDjOD~eCAocUDO0};_wOc@d2o?iwGT*75>S28 z;gYG;H9xWFi>y1j%dA^?&e4|b9oQ+B$YDV}6S4{?ks3Is8>S0g%6jl6=ayH@3q}=L z$;?fd{9twy$g0_8=Byhx>a2M6CN*e0yttRXa;Xw-7MVI>wd{X+ii*ffq;UkJWFFt? z*d1m=9DC^}UtqT>#gp0;?k}v%W%7mR+s{(54!P^Ojw>&8hz*J?1-lrrw7lfS>G3nQ z!lyS9D|~dOuA2wuRNUehzi9%=I=p-+Ytr>qxILnyo=>GiLwmN*r6zp$A(48 z7@5{accWoBTfP4h6csGKnX$luKY`E08bGb4a+auSPr0vV-B6c2FT!A8wO3|>y2}dQ zjE=l78y{g2fw*iNSHP6%PdQrttD{u^_N5lLtS#mm%M!K7&zoguomV_)dR4 zU&5I=m7jV7tbWp6_<0275hG(GobuT*yrdj8Ng>%TVALehQa?grSgCcx1JA#{? zgfES~>X;MZSt&eML6k%%Z|0KgEY&(~{~%~=7JEB)v{>*`BGWWdfIziZJ4n$NfLCGu zxc`@gquJ?qZX}Z0_4pmUlU*E5)NtZxCT=<#d{O6BrQz{g{|(r;c1B$nX-~mwbNJfc zj3O)|Puu$uLa89>-@(&4-=F5w?@|c!&B0~+e~$3}!M^z?jv7?ywb=V6dcV;)C3Ikl ztOp7A*1*tB89y!b3sVZ+MB+3y4JR4Je||{SWpSFPlNCyPhqKDFT*29rm)S^aJsOpS zNy)NVj_6s0QTHnoBn;&?!FZh*B}G!uB?;B@u{%N5wDku*)R>Jd3kVLNdtgpQ-Af5r?8YWQAMAK6Up zCKMz0u%Z0?MGB@;z*2?uOa$1OC81Af1hkJ;72m`a)C zsrrVd$p6%TX?!hN=gOshsvZz|m=W0WGd+E_dOTk<${cQ-I5+}J8R{bqq@gIeCaDw$ zz2C-GtKEU4mOQoY<=1^uowgKQcnR!T4oMeAdHX_uM)vw+|J|EYSKV9)%&9w)({dtY zbbb^h=6#?2LV-+qb?v_S+Ax>p-m=BEfwrp5JLDyKcDBR?DC-CLN4_!bLBUi)byKW> zY)XD{M}PhsBSV#2Qq21M@SuGgoiP6Y9G?GO@;4R7<@y;BJC10)A_6K({zynj#Butq z!DM;}mX(bRWGwwP>R(g1d*O`XKMnx-;Z^5qVmjPjK8`(Fix8pm6EV3$7^YT)HTeWM zVF}O*+l6gDa4Dv!Rr6*VR1Eq94w8MwU!fGxEcR-}7ou{ZZW}oWs%S0A6UxJ~nr_s& zs?h@Fzu~6e1ayWDdW{G=K>!Bk$j@5S3Z^8Az&Dqrq1kwoko}x^4 zy}XWM@eMXWQKRZp{oP*O`*Qu0yW)AB1xfMV(PrlGCr{MkYEK7A&f6Sjv2O;Bz^Oim z&)Hq#6y7p59FH)ide^KtlCt67Si22)cBBA7RIh*Yr|D`#vM~Q{e=Gif|NDPV@f%ep z!`B(V&1$Fy9tl0|0qv+wps;)mvhWw#9+b2Z3KjNwL$y}sqIHS;v*c`NWkw#d74o|t;x{huQZc|s`ir;75h;OX<5y!Wh{TD z3R|lqxzY>NH(r&!BRb4xL<531Ml&WAr{HWv?*3-x*}Hv z5Yo^xy+C7Mk%dg>ZA|$4t;C4P&De0@{|P3JG1=Pf;*va9m=E7+1M7%_9|~g8Y-*@+ zs%+JD45rQe!MAY>nFUSPtf*oc7j)-_l!X$i|67D)Zq zDH5p5A#~l1g0m{2{m*6s{{}C)a5b7YYCn9&yam-4_xGQLO2ujyF=kEjS~ zx-X%L&WFJZeoUkCO&5L)Xl77+%^8WYB~&+sNel=~7;NV|@NDFCn8KTv=qF6LG+M3; zaU+dX{kd;P42F~fG{y=enq5x1BGfdV)iVB8sGocfFi(rBu4jlkt#_cGpU!AXz8VO- z0p8$f@t#dVF;bGwV{@J{<91zuizpGFh5A=h+l3!tRw%ADQUOUqFjy0Ryb*I3#D&J3 z$VG3%(6Bu)e#~;Q?k&gus>-^1J(F0BVJcm}@3z&+ni=xk?x5fH%FEl^Wpzib>sY8O zR@%RGNx`CLh6R%^smYRPV5JTSUmj>(%Pi2HBGMj{|KZ`Z1Ae z&F=1w%UX#qYdS&BWQthiyi?;PW74Dd_W}hdRq?_`}W#WwL6@3;B=Eqvsw6ANTBcm_?G+@(fBzLfB_X z4>)35Iu(|M8Cu;IR%7?REA92xF-D{#4YV-W8Q%UVO=)1hEB9ZM$Uux$%*)R9ZkuNh zT@$w!!G5Oae}>BjJIBx(^hvsxfJS{}$_cxfjnzAF;{r& zKERa`JG=xw4YUzuCOdFk+E}%Fo?_ueUyYqzv*$cTb+Us;xIfdLy5*8W(ng$vI(x7O zE+;F_2uO|&(WJ$Q+lLAe;kz0N_kb@~Wn|s1i$ER{Fy6j%$PN&z>wT`rm<~R-@ZwX_ z1d*js07jRZ-#)NZ5CitaFrJkawRyvP2hwdvwgSpNM_t0tXk<)>#9Br^0m7%x&&gMw z`?$(S?&7R;hqBDpo)#WtqD~7~mcR^g*7%+VXsMbSXZL9uiAkeDRxb{r{HiKTZ6rIkfx0ndVT*e6FdE*yT<~HL>-vtryVTSh%F8L zW;uc=_s8DiC^_)E_s7?ss23!%^C8UorCnO}GNRY&%K?Iw7k16`%3nH$1*U$# ztPW1BtPVH*;xojk9ZIQwN*yJ?XrWTdLq?s7uXrGF@@cu496kZ~o3nedX$Kdt$*wA+ z4;}T5ob6ENxnl%ExfHfg4hyTESKC0Qz#ke>1~tM-T$C8@6x3u^7g>>@4SP&D>H;vx zgF%gXSiC6RG;UNg2hvZRe%fR`T6vLr?Bbv5xx0YJC*I1Pchll&z$0Ed2o6NFs6IOq zFh%d;FQa2-v5j+negI^)sRmrTFGO6?1T0;Od(jTC&moeQ@Y3Du?ZcT`;)`EjwEW6h z%h)Vj{vG5>2IR%w^TF|py>!^9He?$ySaeL^&Fu62$y-ghaVU()yRFw;$>l2B8~Fl! zNNg!y^uY)DOZhrRzH!G`E=ttY~?; zoESMdU2uY)`|;~z&{TeAq^z#D9!FSM<2yxth$z@kVA48atDZ?%)!1wO1=;7ieJ_b| zKNUNHRU_7-ao803&l~x+Tw^DZTMNcO64e?ePO&a}pfRIdYD_>$y`LO70xMkpzBeeA zQAd_go(jCvrO;c(=JoJQJD$Nn=$KI~+fy8?1f)`SBYJ2M_FEt046goa%UG3ur7^%~ zFNH&%A(-gBPJ}nf>nhkKfj>2{hZ2mxyA0-FMMyBbJ6H$mr<6Sq`X1s3E?Z!!hGe!q znQ0>=$m0I#8WaXg+BCX?xy|G1IyA~V8#xrF-SOpxl%Ib(i4aSJO23?njrZ28-j3GT z6sd%Vf<7o1=^%&ijTmEXd$5=eEVl7=J0^g- zgfhpjQOkk;Y;( z{Y_jr(;~gIxl4@YmFKK5J~Y=x`>D63SP^=%Vo4OBU{ecyWe6tk!LKNS;0>DbJ z!dk+Hv+f6nVzZEdy7pN^Og3jR)(UlEZdPp{dGsDn^F7=<&Qh3`=0u_Tw8J1p@orNj_cwxvXw5(a$DmM5MWXY|jOS^#x z>X2i%(u|scr633;n4l5k`&A{i_B0N0#AtU zL?#DHrXyHU3^ymYSXT@CR4o0Bi>P=-cnFr^5Ni&aC_IHi zO6ab`8<-;e14uOKZiBjSKigxCLR!x%@JF(sQ4F4+AikkdID$!N8$u^4+c8WO-t^Wb zA!vrV`{B4Bb2vgU8MiI#IACe{Zn6oTU?ywTrgw_oVPBL**xnY5nzt!@Vu9PB3CPk0 zsswZ73cya0QrjRi8?&&j?3yb!E4$}QVm)6kYW$SpAikst>>)1Dg>KZ6(;1zYsn@8| zwfX7N&QO0bVL>or_GD7;$)eG@(+MV(gI|l@ng}2uQSUB1iv>ep=ZQ$9_PYGI5Fmc? ze&n!Ql^TDh%%os@=6Hxj;R`I&(F@!bv;32wEcMgv zwnxTgouRS_TFH2=OFY~>FZardEj1Jl3?Nc-@rN_3;l5W6qKIbiu~spqOXA9g;6R@^ z`#B0JCD(;w!4*!G`8OHYj0aTek;%2;y0Hx!-$IboQNnvKYiO?lHGer7XwE1NFJZua znhzTrYxb&Y zF(HSB2%>d3v{t!bk1n(fGAa|djm=3VTA_V10EqI!iLn5G63hx->N9$31fGVG(hCqe zN`=4F+dQhqL%?Ks3Omx9qJ6kQB}01VWeA95mA%u_b`_$V?MTW!Mn+Q^ibv+ykkeCb z7Wl2hcYT|E-p7ts4l+^_a3cLPYf776W$IbI!zT_(AX@-`F#E#L4@Rk47!zpG|JJQan*% z{)3h0LM8_?RzYJ-E>$s7pDQpD>Aa&dPcP$1wak?CO+o;bRg7eBh%_Ks}LAIB+CsyAl3FFczXt!F0 zPQxI3;wA_Tm1Ji19PaGqfhjz^G8O2hL9<}Y0hcZ0`2%Jp&aR9X0I73KOj1^+=(lQ5 zIlBkV6wW}ZvhL5b$lCJ~Y`ciXE=ceTF$`jbh{r7j0|M4xC=G*b&Ae^#2!y4CdYKqN zDBehMMFy%`idVqC4l1vGP#PY|C?l<*BC-<#D5M91g0(gzd9JKA$=s&=Uv#}=mngut zWLvIXwr$(CZQHhO+qP}nyKLLG)%)~&AI`mF^pD8Q$XF|4?o@cX>4}G77SuU=Yw0Y=KEYHJb=! zx^%q%sqeTA2M6O94EJK%LX9s{QKpFGw2r}IxVQ!r+jsE)`j~b`1oUFGI5H1~I7{9w zyJ?NJ8i@&-o-3=cNuWv8A3fnsq*=xyd^eH5N~~rvsi1{k?)7rhQ^3~do=NLdu;MnW z#eM}H^1+V+6eGaDf8cR`yhsxDcRV}85w3ve*U&N(EWLaA@djAVAF(0YI-Fvj=3dsh$`j$VEnSU$&r$ zm!S!5iR!|%4)heCwA6G#v8zo8|45oR*_gyBa090y5&O#z-APL=viPg!T+rrX z&^SNi1KjtSRz_>xcJ>&n zF{x6dfFu19xY2uL3NY^>jf>;nmGX6EHbqX;2@SU=Q=skU5NpyDl!6bcM8s@6$juu1 zG^u2cYklGwuU`3sdw1^*9uxN=`KfDxmLK_9Lsh3qoM$oXa!|FizsnrvB<27FvZ$>_)HOIub zUyq=rIAEF?D5#+ahBi?Hx-OjnI^KDLjUv;M{4v^u&U+kMwN!_(=O``ySvk+HbhK)`PH5&>3iC(% z;D;mAZ9u7Kss%;X{5YoP=teXv#O8}ugEVz8J}<+FiIxuuY{l33hUt^-9bC)7C`G+_ z;?edsnDu1lxGpv>qXUJia{4M==E}kHeB{~TwRrWq_syxu0puPdPGkRMBYLb@F7~G) z_RNe%nbBI;Uu*TeJ3f{;VWmqFdCSMAe_Pyzr2Q~ddzT*AdF9tmZ7w4jq^80CCp8OY)_m># z{UcC3!O?`{*&z)vh}Zh#3#-Zy!j)xndStEdFet}~VknWKnu@K(@QyuXN>p(Zn*|dn z5zJbVK+6`QNqCzT6C*D%^UZk9GXx>5=r^WokX%}W+Mhq5VqAlhEM7i#SJ1FXt%cFR zc*1rhQNl0^LN$>N2wV}_xV^DK8Q)E)ARZJjLuxN}koUTLIPpnZx3f)*k?C+H0VN5v z(JRoL{~x#}q*1=zfSgcl(+K^3n_I~W#7o+Ma!tUqS6$rKiL)D zNgP`Ka25e4Jl~`v8?nO0wkM7wSVEE(Vitcv;l9MxrRNwkU@OskB83azRVyB?M*(@H zcQeX@-6UF28iBr-8T)`yfLO$|fHUC;1CTv}&ZJnueo7eb~InuO}SJHs>)Ow{@IH z9)O%hD<WTyw)j zHmgN26} zhm;8)_Spvv4$J|nY)yS8ZW4h}xM9OX{wXkP$gK7dE1#(IMBx`!e|0|IMGQBAapCg& zVL7>}Kl&K1Vt_bMMxz1kyCW!io`pSujilI#0ENfyfu0xOO0KY6+A*?Lf~|0dS`^1^ zu~pOsoZ)e9^SoQXR^awI zzKohBYvv8Njn>+Ek`4!y#RP7!|M4LD<1`Zvk^999kl*1xqbyq)E3bi5F*ZAxwb!!x1kUCRh%vF-~Z`2H1mo<_707iJxXX#1GXH zgMOJv?wtah38ZO=%@nMSy5`7}X?ko5Vhq!fl3%?Y{e4zySD{1L1X>Z=TDp>pAEPuo z+Q^|V%pPL|hkT}GsmZ0=DitGPnW1wk!>au$!O1kW5N1}9j^#b1rda+i)ADp&FGS-A z`b!Eh=T{ft&LcO)zP1zOgT0&OXXsEnowcKryNmQl2r$eqP!CxbXj)Rp<)xF3TTt-< zJJqviCvH3T_cjWry|1IApu-RqVK>e_{?Ayy*VorEgX6pf!SOHq!z*6+*W2;azEI2Q zhS*O%b^>4Es;PS9zt&OdbtRv8Z%Ti$-QETYPpT`usN3az9+cjqDa*tvim74bQ(-h; znumajdBH2dgi&X{*}>4X{$G_p<@m@5dk80g6iq4~FElvxeC__kVJ`N$1^+6Foju_$ z{?Xm-La^?w1#lLi!iWF;^wYj4+VCa%bNSj0yfr0q(HB}LXmF>M%E`Vc!f}LR8g@A0 zJ5|{d%Q<}G>jJooy9V)NRD%!lQ{@%FD%k|i5+phJJ7#CLiwhuR80siNs>yZ9uM%~% zRjk=Kr_4k6=Dw5K=VaIGnJ09LM8R*#dnzf^kHJ~8M_cmE7zUfosYP&&LDHwhIJcnD z3lv;>l$Z!5UYnsCLNfakkm&YyOQa^hg7UiTZA0PSQg}q;0kO9AeP5>ACWhF5mRD(a zj1XJ^N=-fq{Krfa0ANwK&dc$t#6P<2=@)Q{ZXO=?|vQ6EU^u3gGoI?j}N7s$tfjG zp@>h>_cY}D8Jk>Ptn(~Fmhif@{kXLamHx#DXy8~8MZ)aM!~x?6HneYlC!2xOoo3#F zavU(?N9UglrG!^aEeSUv0vWabF9phwHEZBwK08~3e3y%6)ePEAt92;tP@`_p+Sisw z+Y!p8!1{OSa!ce;8ePRc4*IdQ%Y|ybD5MLg&3QItHIDyOQebK{KqSmHio;57XGbS6 z5vWCoHD1N$k5JJr#-|J1R=^HiV>DYY^NI;ZcfdZM=QwW6(!}=}jb-~^3jG^=4I`_Z zf9Fmo1Y~hu2y-hXvi7wIWVWa|l+b(att{)S2Ut2V#R?p zo>VmLT$lekK$x~BGVY_%k2O5cu8*GzXMVckBF~P225mPpXTH8JK8g+Zl5i1n<4LY@ z9KT`^`yY{0V;(3qb=@?3KELtK@V2c7O7nw*(_+7aQ^-_%3bpwO^*8atzc*aD;2pjI zb_QCCpcM2Ri9rMb&*E`BH?#APM1=D|0ZP2f6lqmdETX6$o%&z? z8AgF9g)ou2aj}6xBQbD*TcTdtozW_Sa><`+wrzpn7~P8%33tNzBx_c`ieIC_uV8b5 z6-}aBUwA$J4U4Adp`I3?pnwvv(#IjTb|yZXEGw4m^G`!bY+cH|%h(jF6}yR8(CvZI zBn0x?h>Qkp+!rz$y#xP*;e7ydfJVCl4kE6ua`sk!P5jUZRsh(-Y=Hrb5zU_hUBIcF z9$pKydZ)>DAv!bP6?u-Omm^di*D)#rL!JlWd0D_4y-QPoL1E);rA4bMejZh|=4Al29_)mSzvrFw0HRhAs;dXPz}!La%d|3s*G za>ORR0U>vY3r|44U$)5JzyHxhb-u^98^tdd{_O}Pq5Z#qIZkc{_Wxg+BJMxK z($zY4bt3o-@uwS7P{;x2o(32e5o>f8yhvNr!EkJeq!QC~j96jN?|U9IQ};y^xA{Ui zP)T&EM5mk8IA733yR!HS?eS-5>z2%)gq`Tx+S=Y54G3;MCtyLKpcd0((t@OUs{YF! zN;u7GHWcAoqxPQO9|KP>A1A2EAilmu!XUn;=fq2v?)A4UH_#-JM%Avi+%w>$JC@D0 z!a%kT2ew;Am1>Ox;p z8!6=#(%Hpb`QDO-{?3L3Hp{RR;_Y>b2LS7$7|{W0re$3Hz~yD&WWhH~(+mWoR)?Rd zjjm-~=LW2gnD;o1ue4D0Si-&&3|QmPzr%h%#ksO@K8cundn4b?K(z7|u9-P##mW{7 z5Y_xm55RYt=+%zLJjh^@wQ7=f9y^@<#g2yRD)%-T2=l21OOzpiMNagp%Fsr~Ey>bn z@WXV{O*ATP4snYwj&V-u@7>I@I}-JbXd5ab?2cx%r{XlmBdf}dmDRzC)#>^-s?bn; zJrP(GdDo~}a7!1&L7~?FX6*wuFgZv&l3&A?4J}&nHAnDJWOL0y^OIjxb=9fBakE{Y zZLPHHk)-}?Xq-+$$b3}Qd9vAEpZRm9($Mx1JI2^e!7XQ8l2^jVxY8vUp3CFsPt!Vx z4u9)Fz%aFnsntUd>6_y}QK-_%2B|Z>g$qW`1RKDrI%Ii2@84eIG^udD8Ov9yl5S#h zM$#Dw6lgYJhK#e0C~cj)lKX5PAFFSwXs>yf?Yzz(C`KoWU)J_=5(6jAafh(p_C4O6 z&^lml0s^rt&9Zx`Oj@uAYL4sn$e_7eQ7cB)^Py!hsX&*pW1&{4(bX-!f~=CIYB56k zk9+!Evq2=5MdRnKN*dzYbTcPAuZ}nu+M00gq)50(kC@wFYSwB{BX^E8zYwmarKWlKzCv9#Ghv{eWx7xvmuF0 zI&rmv3SE_GL}MTkSyJ*78Mv2TEey6=pYw;WQY(sHtd`K!HzMroU7qxZtWa2&%r9Nx zTuo3@mSMQ(OI+u#tK`wr7tkax5(?^Y-bS`jI<^Ma+E8*SJEhh;hHQkj(~{A%2VhW3 zd`L*35duQ!{klL|Lf^sMYwvMfb@~$F&ERr89rW+CW5)fNYvQwp60|B;COM>Pu?3B3 z(8*;;|K1hmm>y8(UvSh_NQ#q zwu3^USKC+kS$WagBX;6k)y&cTfcS~H_udVU!H2Es_Ho&Zw}o|EM|R#v`$B_l9v5vq zr#7E^9nVEK*}+ZZ8EBbKcgz?$wv0{PYtE?N0pBB+QIA+7!>^d&TQJ5^saOiqVPkv8 zQ-h^OYa(_+>#secZ$_2d%#M>Ws@rjs!z9-zSXLb=F zU~TqazO%=CxYOVyp)KkvYO4OYU3m(VH6^eu%Z;X>0JaLahu=R(UXZy3jlAraE)moA zxmhVR-Aj}G(Qm=S-+={I{VOYm?P=Xq`w>*Ykc_@I1ys$N+zg>DC6c<~8-ZF>wH7+r zF4-h4L)CRQt`(zRh;O}tSBX4FC6(i=XRED+H=4-2V)Ysc z3u>RGUfs4AJ-v^|zi>rB30=!SU}Bp19Un8AI5L=W8dc^BxN6A3A_b@#I~hVaY973K0V0|)yX z6L?yC;icq95UxsKJ-{iP9Qdb5IieqE04@>^K!e;P#xE{Tz5svckQ?!{x+$VYBf-cS zrCfgA&ZGONZw+I2k2ep})nFe|U3A~A&>#u+g5?@>vT>J1xsnsEf@+8da}6aY!-jV> zp`2?r+|WH{AshMyQppm^A~Q#O)|l(}5NuegeQV55Vl<|6AU+=1Fg!bof~as;#Y6`M z;VQuf%7?J~%gy+Ee-AB#qWQl6+MN1N&axk5FJK)K03eS4e-TmsOZxvO-mhoxXku(( zM5I%i3E;tQ3aIKts zV3&#q0aSmphgkx&&E_u9fEdxfCjreUOj3mBk2>QV8-d(t!kaxPb?6;sQUV{-!tkTf z(6KDBI${Jn+PhSV;pWt;#W`uj) zDF-fGQU&UiNxta*_j0i=On!yK-#keG1KxoV(^ zQ1yaqwCjtxA_Q9NVHtyN6k`0@jF4IVFDax)579GX`(Bs=y)+W+g#YD@yfgSZP9ZK&5WOP@bcUD} zI%R;U$lnhmjory7MD?@5<1@r=ba@rJBU(RWj7m#Uvi5YqF_Oq*8zsM^YXoQhOx-GP06WIGU$}g-@|MXB@`#Lq`l2vJjnz{} zXPZSZVWCE>$AVB&!}d;ebjO}2{HST}7yE!t>}+cR9ey;x*jk#9Lvc;87<8dsEQbp! znglB2{w{&uLBJ0(h$+lQ^;bKVBxD|jP|Xd01)U7e6e@0@(A_44=talmkrbS9S|Lk+#=G}HawW~aZbRg=BwaGQ zTplm5MT9brPKEyTS3-Lu3_3m_Se{ zPQ@l^C-d97rGx%S11{G6RKU4Iu_3OE(>_>o!;G$xmNuIQ6FhRqq4GLV9W-Iwqb?`h+qlHEB2mtBQR;bqf z2!-}~_OTv{wTJ1d^p9x(BNxKrxcDR$2+8T1z2V0L7aK&7(&c^v(pkW-RR!x+)kMjh zwf;s>o+b(1V6hUxof;qpY1L=+_eQ*J5HP70+G5c(!M;9M*%ZNQLNmbYH4$hHj^Au;vpuUmr@l*Jb_H)<0R7o5 zcaioP1$z5$R{bS{e`t(k+L!1xDnHgW_0KFGz% zcld^gQOx!it5cNRRDL8{>sKwO-T#~iD^mFs4`rCu`jbqh= zhu)Tob?>nGz%@``((u&p-bzg2&7th1Hppy+I$13SofTxDgkN|MasEv=vi%MGH*nQc z$$ud~7+IetP5V~udG!Khrugg|SH4S3D?MRNTc-w91~>K z*%hfV;P8;~Nj~=pEJgTGqNO+*V_9674N^&&@knGP$1==gGH#I9B3)Q9ei(l^J#o}p zkOJ6O?CXFT7@W*+TOAOptW9Kp6@_X5_aTeXRd*psYVTJn120JA#*?F0xrx6^IO;h~ z(UE>EBMaU@i{ZtP7OxIyQgQUP8A^)7L1vgP7t@p%jdTjigdOIsFn?BL?q)f|)(J3IDt`4*{>FW;LVxQ_gnrZ{$PQU3yyu(;kEnYGF#M)iWh#@SR*q&&xF*S`h9# zd2LF#XlJ<7(LB)uAR%c-^a2IxR8`P;Ov{_mL^O6R%=l#kk%Xnj*~`O|%(ybL5r1XJ z#PFCPN9+zY*FTv!NCAeM{Xn}UD<@ZA*|JA(r^U9nclQcbdcn{w);4H&i* zYl<0r!m4dHhHEAod38wMc2o6B>BdgVf|16O;J5(60LABdD%zTon3sV|SKOJ&MprcThFL} zwI#RKYmr{sk_{u5WB>^i8DpJX3a!SWtOUa%#8#5NsYgXyFxbv&Z3^d_3PqdWFsy~u z$N?rK8+-gY?v0p~DF@$I@tOhlMMaiauF6Qn5Y=mPl8*2utJM-^Kk6|sdW1op61oI6 zvs@Efd5loA(<{kQHWrrtrk+i>pa|L8=OC!H@H*413Z?mKEGKH*oNjk#90zU0>^K{z z&bV93I0{wtlVvR5uP=+4fcoyYmhT0F*AZ@9Y22WUOBSgFQAB7$=VEi+?}3hWm+EwG z+N`P>8I>;g>zkFEuKb)(@5dJ0lP%p#YQu(NBSvmT^+8*g<@_zk>>FA{x7nZ@Fj_@= zy`26-D4o`7zDqY?XLfrV!(*IfO2s$tBL)gJ+VBkDX$exiJ>sEn-x0X~?81B`@=gCuW=OZ$^7yWDbI;(+(9p^M=|LGXGsz_7aSozkwnpR_FmxqU^&r{fBqHCm$p=^3Y z5^8Z{eRX}s%9gcxt?JaYy|ZCuySXBrlRz-HODY=)C5mNphQcAiKK?8Bt@!7ln$DOE zrZ14GQG~JI0|7)uh2^0rnZbF^w`JS!!?>WhGe)gO??!WA92dEUJzlZ7A~aWRbxzms zg$n1iZocM9hK`^ZYRk?>7^>5F-nqhYIElhuZ9YkXTe3s+rrX&liLG2YTX%dcqCJ;G zJd=fHJ|Ox)m%}@~-|kDZ^BL#sSB5#yH~;V#?|=Ga^e_Xj8~;3U0+jz%UHxC;*x16! z*}&GwM91VNpq^6EQBAPa>$5nbx8lJ8aC1Ebg)_KG`VH$}^clX5cbELY! zdLQr(djuVNg+X!Vd?_0>4f}C^BAcLx(j-R_`7ERQ@L{IMhRH55?2+C{qIzp7b)1I) zl~)aDJ@rb}g*g+t++eSx*vpzL_E_vhX8^Bk17atGJk#hPwwwNCOm*f^S+d?j;v^yh zU3khh1BlLFZ&|96I@3D0+NqgL!`?j&ZTZ|1tL|iijm{N1m^f5;!YKCHXmQO=_JD-` zCPfH(*qB7@)^ZIQwa@D|ndT?wc8@1#&H^`?M9gK?lo3HoKDg*$PH!DoBemQz7g5}3 zYo$ead-g`rulLAlG>TnTIk|rqy2XVl6`2NIdvs+yxMutFkbYC#_R#vO)zt#<_eVbm zWc&Cl%XL|ojMuvDluufkj@I)T3}UTIma8AZQh_D#-)tK3g=zD}5nl`e?1SoPYm2ijs*;&2*X}L;H^0DE=+dsx6L?cB^P8N4h@G0^c z_l^nMmIQ~K7mVmxUx~IHD`G|$UJ7aLMFJdm3X}k`7o-Fj(7* zpmm6AbCebfN{cd>zBy@X`QO@v;+SeEyUMn8UO|>K7oxw#B1QD@tRn6Z{SV>+i1HFp zl$GQHCVbHOT z6VYS2)Jvh43~x-hY}c||pLj`C4BQ~vauVt>o!xY7YPn~l0u!e1_@G65W7g4|7)*`y zydZlA4WmcUqZ)3l)C3N6U9#W>jLS=6V7$=1Bf}17XH)jb*%_kX&#Zi%nCkhlhrq|| zbG&3&b-Dl^GLAmxumLqL%kP$h{Lvy<3mO&C0bh`9Db8%$b>@T@G5W)H3QXy6qYD{o zhr&s?Q^!4ki)ms9aYdZGCMXC?c7T@mI~kmFSsD}io)EEzF3U?wbMHR&2fSNhO z^&FSyP{BrR|1wcA&p>Bjc_Jl+AUGA7Vl#%(C`0MTfIX86hWR!Jzh0JD?TL?fC+zD> zyLhb*E!)>v6^+LD4G%(Q;4}mfR52*h_}z+3nNGoGSYpWJxsh|dY;dcLgG<6%cwwRc z#HC{mS9@&_v9Hs?zMp=)0BeXh1=|Q@^zye-~y-;{*BtKzmUyt>@MTS){nFU zCVaZ9;CqvlelNLvVe*;qBa%P2WQ=sqDyCcTiZ|&qxITdFe5|lcIaSe&+$ajZNYDIP z7hb}2-XIA@?OBwqnQ;jM?W*R@)L($P!QRC`b63f*+1T~!Rk|#LL$!g5Gn2`?dXj<0 zL-4d#>fVIc-|uSab%C-EA{7q#(P>zsUqNe(QpzyE-wWq-sqXK^)u%hGT43BX6*?ct z)l?hTZ`Bm*cQU=@N~QhRW9xozK+@UNB!O1NC-q~Zxt1!S~Mm4Ea2V0Q#K9g92LRUS&kEixrqvPW1vzuRw zf4FECoR9Yc*Wcb@^Y3x0F_u&)X=r`U)YQ7Et}v^5-gU>7>>MliwmY{|SeE&%^R~(K zN#P<@$-G+ovaBcjt_m_!{09ovhdNDj(}r744gXW7?ADvsQjl?wPkG-O^as41w)joY zVCY@|Ymlya-+dRXzo(a;t523ZB&8QJO=}pwQgJ-vegW|eTg5~KGJ4RJWvOc4SMjT? z{#sb({64sjlXxR`#FVJeR>;@`XHm2?G}tlG_${-Ql@H;4bM3Tcj2m}%qD-^;ziGPv z@s6mBFSVZkjg1>1001!mA7f)13#WfCVvXv6?IG)bvgBZYX;pVxK+T#gpp1}+uTd@L z@c&$(l3!qg(ZrCnB2vUBCw&*^ejt1r;lPq;wIVf#J>h8oN2f4M?e%oP7E zn`?i5!}^`v1JT_!RVp7&suuRBVysT!{X0EJ@@&Tb`$6T-$H9XmH#3@~l%6d&OSaeq z*C(JsXbDpXrhp7nJE@Iz9toKp+MmxoZw^2geJ1Po&K0tr*7qP2qazwcfJ818 z%j>tO>bqX`oM`!N%78vzxsqIsK)I;Wrg(*zL3?Eh{+O_ z^rWaMw`U`m(Q2{4I8$b2LwQ!5CF1ko;o#vR@u(+X zDPw66MG6)x53Vh%`TjrxXAt6E5=WCQ#H|U>4sXro#{eV=p4vmf=Cw9-e z!D`X#I+kiyhN$&csFWcawrUc_k!G`P|4cdovRG*ub%GCRi^Iy*tfzFdi)q|#|NFqB zJt(m`e-rUAE12zY-yY#2v}ELz$Agy}GD%$ORigZSCV}Lsh3lr~?MyaKck@OQ9=^X* z6%ynN2W7zOOhH~8ZdNiYRcC?RGWYE|JA!y~+novfV>BqnPVYs}+Ud?$@jVMzY1iw1 zrKV@>H!e7~Zpf_hJns#PSN+>D3Z}>O$5!*@c}*hC*s(`6C=z75bWWAHA0&HBFx5T0 zm5$ZmmhF!dhrPuTRtvuCfdI|lux7F@o` z!}y-VsEl#6tIv|3d!a!SMCzq!DxPzev@1$&Rf&n-ILMECq4GpfIuZQBzf&KGQHn=b zmLpE-YJ01!1x>^T!!iSo3gKU(!U4D(eV)^a?8uGq0|MEmkmlkFwaUIelkNjY*8|*Y z6<(;yCfUeSQ(rx}Ai0PLsSSy?#E4F?SE3H;xY*KV+!CcqtcHh0@Ftu&_k^^uUqwKr zLo__YpW4AHy2Jl~V;qbEm?|C090})NDz1Tg%G5pg^Kp`mvk-j-evx(SuYKedwg;DZ zs1$KY_{!&1M8E#m9kIBGcRp5lb9?i}UiNoE%E!sDiI5tR=A3FBZpb6{((POqHyQCj zc=v>->xiZP#2P~8J0*EkDzUs26rDnbaM7_oC?+XEZye@LV`b7p}x z{b`Z}77St=A}OqItWn`*{ta$~XzWDCrbcYMp|@=)IoAFmT^Zt)JIGVQV*x{ z_U0WcP9BQ_efFvb#h;;OJtBW9PI0@UZ0XkHeHIMgnYx5S7LAnYqs37m@+zP)_99w_ ztE7YPy{97)v2ol+ErxSbQ+8I@gq)O$j$uCYxsq?OU_GnwENnI_+Ji_{w2)#i-*pR> zS42WIlsug#=Zo3mq}l3pdkoWvJh0{rdThVx_Y{hIwy|Endin0;NWH@3zRG@@M(tC_ z8lU{HN{gO4J^#9UA2gNmdYv@w44WPH&VuoB4Rl4Eyd_a)T`knvNx=jCB{;xnCoPgc zO$6v-?|K{0&3y^jGQKG01?NgBFkg0s-_xd#P?X5~My_XC&kw_Nt_Yo`!f=R&*s~5H zuSr{u744N^0E*Tup^yjm{jjf9I?;)!HvV2bEz@Cl{yo2M`jHyiPl1nzfo!SDjPbWR zg!G{k|0U8N>ViINGXtq2iyK90YpM#I@xe;yFd<-MjXG*;*Ca1Ft#^L4?=x-jJOW~09SEHVxozRKMSQ=3&09&-VVdChIllP z&k*+rG$1Do*iQ|Jh%Ap^2+rA7tvvYyBC!Vmdh}c`JR7QFAK6N>w7XY|rmc81MH$21W2p2X@~Vd6f|U$E{F6T0A~HQAGIcpkk!$8LOUHdEKf zQ&Bs$svMF*n9cd%fx2?Wc;lb*qjR<)C}|D)ux17g`X|;gvMFqgpS0WqU>m)`-Kg## z>&%hM_jURepzrgval2{vWFEL*g8uXdvu?IP zSH3FHM5A9f8@KPuK-(ICOj~i(oD&jlXY?4e=C$c`;#PPSs_)XRixb6?AaK`0SZ)v| zLNtm`<09PwsaZ9-vqm}DX@e!I|BOLZXdmDQGqU@rVLeh1)V9QG03On-RaK={Ch#Rp z86*S&IffrvaBPKBp4~oHH-R|+y`KV5;@_7K_-h$ph#CHf5cG2~Hcp+3xYW)gkddy=t?3#x@QQU0pPM%LN*PS(guRe#r zO;h9rHo%=CD75s~NYr7P{VJc&{ZxWRstK$2192w|AqqI99{2fcpzrU|NYYOJYxAm? z!(KYB^ct2%2|7SE8LNOxvD7WWaxYb|Bs?xZnDPktltV(V`eJt@b>6{&s@TL0%`(&3NPQ~hFEQ2xoaG0=R4KM1hF=#5Bd-@l!g zP%Y3;qdNk9H8-k!mN*J!q#!$g1Ko%%v(wwY206d4x0B1ys3y3p!}T^dyS>Bjk(5hM zfTr(L&8y*yJ#=GS)=CKJ=S9gGL=;^wl41%=D>~d2vp&t+*SDV2y!R+2I~C+I`%Arxts)Ymy)YO z73u0$Q>dzJ&^*v$Z^o0la4k>sAo|GI;K6@9LKUTKa9o^5(@k^{SBbQnh3=(r{x*|R zY1GF;Ea3n=pj(C9xUjF86Bz2405jvpZ0oux7;1yFjS*t82A7ny<8&evRs(P0Z7~M5 zU#f5hjXsEyn49g@Y=Y*vC{`LpPSGsbJVMk4FwvgVq9CqJ#Spe8W#%7NyoZ^A-K@ESWUZ(VyK z)VKuKK!H$FLMSGH(7Su z883skt-kT7c;9Br@XhC%Zhc!`_-X+&EPtp;AE1FkHa}A(F@36+??{rC zE_4)H)-X-k29rETxM7Lx%94}k5!>@oaAF1CX%3525;b3EhUfR1XCuk7(}f}PCi+OM z{#bw9lGV2?vyjsPbG*AMkNNZIDb8=*XO__$ctiH4-V8T28{h*hMgzWS>8^}3!5zKO z;%7C0w*6bEy7a3rb(~O#{M~~CSRHoxYybAK%h;1P*0cBx6C|1iFz(&r8a^O2OKfw7 zY+4CX$vty9jJx)IA1H3FKh!(b#{~WJlnR`?mR^$Z{qA!&kW(@Nb!=`l{uBpSbBejN z#J*lv6&Z@G4I#okkHuQ;w%*o_=-wF$qp$&(v;)*Fv(^bEy%8JNyba>acG zSyM4uQXg=yI0nW+Ib*+gjU{4J51tD2Q(zrf8mr&o`yD7&_kdkxD^_AF&HM?(RFWvh zLNU{ZY8d&W#s#^dNpqWgg+Ll+kfIvl8-ahpE?3v&m({w@7VJs!O_5-YgA5rBe1KT` zYnmCU-TH*gg5bqQNU=47@q-gH8FGh6aQ~ff?wF90Pk0r$aRygz(3wgb-A*+l(;q*z24J>@OHH{edcUlDNcn+G@p4l z)VT0a$yGSsqjh_Dp6wx52Bjc4kRV&OyDYHtH zrG<%6!qSm0FX*5kmK@~wzm}OYG?|*X|Cv#_c>ixh%Gki{KO-6qFDI-vgx|b8Ln0Z` zu~2RaiLn-pMI#YMWwMsbhOO0dOt4PiTX-Bm)cyoRuJ4;|PeMN%@g(Q?-IBJelDk_#O!#)- zUS3{gBBjms?}Po?7UCf%5yuqu#!1M80n$w-w)mV}9Bf1A5MZDFvlW`Q&Et+x^XKrr z+?<|_KM!Yb=(TKnXxZk(KRlDQ9W#3#H+s6L(x?uls&rq4Or-mS6O)63k4x=oX%Uo+ zrXEv^jMbiG?Z=q3E6^G9ZL3tdqrN9uQB3?i?abV`Q>N9;9Scnu z(ts}SUBkZzcq#Go#{z1Gp?VG^uC4lo;Ycm+4)mD)JhK8)Mdo3mLt$rq`-r+F<%W^0 zeJ4NHCWZ%!wA?{e1QiO%vSE`!$ymy?CJULgx4@)Gw$%%phpIFx1&j&xhNkr7u%h<2 zU(iH_OQO|ps6+;)D(zE(?Ni$APpb_it3X369POCUio9W|YxD1aqA6Vl!;r+ncs*uq zDoFA(@lk3;>Kcj7Rzbnh4*A>z@%Y8rvFB$xn)Y?!N?zv3TT1@li()W&Gfj(#FJZj2O8vNJHQ(Os0w z#Fz}&P0h3;J|(S6ig-3gCf+zqTOF+9dqxz@p4{Ph>#o$HI9&n>>4FsO7_d#HOdmA{ zOiUj~?-u#dcJE>$LWR(|I;Hr$kKZkBk&G{O)W=rk9Q9{Z)vNshAplgr*>u#UdM6X6 zkIME%lTQuUG)tLm@eW0eFSp&zP{mGp+na@VwYzEU>aRmJmoo1r@8QsTjW{SF8lUGZmAI`N% zJeqon&QGadq>Ly&d`=XdS+N7y3#F85g%)z3%5ro{5=)SO`L&Gh^^#K&$O&3mjs4xy zD3GebIhxQD`xmK|-x4i{Bk`pPYc(F*@swi-BlRZWx4K zEDvl$vfIfKOC>i;iw~2v3=p;ut7s^6y)0ih;(Pe0=1-YUATgkgFG4_IxT^ghy3Vml zu%KJBW!tuG+qP}nwr$(4F59+k+g8`~I}niNKVfn<}hc zI7#`FPobpb5>#O%bkB&dAlGCQsr269U)Y%^2snIjEGx9hK6AEOKM+i~N z!>oBviTb%TAuvf8cI_YrJ5kbO$RzSn4^MxF;M!}TAsSW8m8gdv5-;$qL2NzkQXdHuNq?>F-*$ds7F@AdkE!S3G7?#9WSuobb<4Pa*p$A8J1q7w`#=*Gf81+ytMkAbfr$#92Loik~|Dq7~vZ zh_ifc6}=dSl*%49?a({Q%|6wVi~(RxyP{HERuVHHJ&PF5=N`v#7?U;+S0>nR2rRBH z>2V1)E~*IO6c>0yjxtPwTXnSodQ}p(UF9&k)DA$kGwf=I13|t88SbdH$-x-?7)JOw z#Ypp%AstIAb+9kt1UCr9c_;NbUsWi1q{~sO=vSGQENn=U0&|Dx9t1x9N~2(;d$krP zyO||cZTLV5bea8mzbtcZ>6b&+({Y#mP2(%A{#-X9r45&I z-1x_}lP~Lqq%5HF!0aXqH}G_AiCt(=@q^s2+h@4?{f4=Fo`JXK3d)4V+`vnfuF{&L zl~U)mk!m%%@>IGdN%&T8ZMsYjrTk*EDM}2@U1t~1qKmV#+7Uzz z2#V%;Z6gI+3!=BSDl#FC*Ard=2&nsXTkxE8qLE)RY^;D3mwd-MX{9z$3VD^U4>0nz+ zJP^?A%-`h)qVSO|e}Ga%L9NneWt**TH1!YK2fLu8FA4>;zE;~etzuENDk8slAIx9d z{<6Wl>6b5dif&evdx+bQR5#BQFlGhG9}G_(vl zm`CdvY*gGFT!Cl7%#9OwY3|2ZDRr4YieE5-P^0mwefx1fa0ueR8@8(kAizS^CARod zRVaTPg^~p<>~+^XF{@sv*Vv?b16#ubEy3qMeEz{*qBaz}*M+$|tUn+^*NNY!343D{ z@#yqps`2-Byu~dRWvHcz49)d74(VDOos7ba0(bQ-R!cZmX|xhr?wxtFeuu^b>p&sB z{o=*@I6};!f#fY62l${z2v9un3(nM^r%ysHM)pufQ!5!H0a}v|V-u9B)kuopfBvED zUh=q&Pg^3R-D=mX9h_TA<{6+430 z!|cWPg!18bv;T{;MPt7rwOwbpfU}d6!#D6HvJ#YPuXl3moSXfkB)^?08pm&8^Hsly z3tlMoNF!NngEF4*#L<0V`2)>yn=kdfVS#^pwr#O-DbR(+)+JjgScc2Z-hKH2)LTIl z>t*aBmN)0XRSHkD`^R7D_gzFx)Ur)mkS!N)Z->HSm5?o_#m+oJ*7L@nsL;%l4`(U= z4}aL~f33Mj@%o~U{xLFS|C;*$?GVt}<$q!^S9Zj#D1YQxB2t0hYrTV z6)Kd*H!z#syxuWqo?l;Iz35eTn$xf=LQ!0`gDo>sBp}qB;jExw(sZUz)6yB1YBJAw z+Z^%lJqxo^%S0vgN*ug=zCR8w9wr!N)ck&QqJesinjqJhJ-FV2&rp+9`IMv0^Ug_= z9Wy8+!s~#{u9b6r1wVh|G z9Br=!SA%Dq5o*}uRlc8{0)ofOEjrqDYM*a|vM-fzC#8W+_UQL&nYj zNs`_|q_S`xV5z2ziv8lz;lFhTFu%`rzm{hxuS%}$Wkz?Oroxry49|o|M_HTA3>B+xq)l+c<;5+x&E}1l346k@k#Q~=YZ2aJ zLzN@3Z5>aeq&dS$Pdk=9JcC6v@pB!rBD!rK^yTq>g#q*ROh&IRIy62TI8JtHN^5F# z*+|4Omv2nKEvLLT=EGu4UH~mWMl+XN%X?4SD@vPWR{R);wXKy1e0G( zY}<05w8Nf>^<%Jjw)b)55%5=GE@hOtG`Os9ds^zMQ6WHGrEJ}|4gfS`93+nr<3KHD zrzu1tCoFETljjii#$4|cGsuQY_aQ90AUgDd-!v3e)xTIqDW(V+w%(_xADsjesjk}K*pPDY2P$Kr9nLOs0jo{ zn2CCoDH2@x(jUcDGRF6PF4G)s4yIhlNJrLfAVQ?mqV3QFL`*@-UMwqYOo3IVTl1&BS&eHWOmE$r z_7Yb^*fDB>f@D(qg|+eR!RE1NIh=4XF+B9ISRKhuRj@C_2iv%BoxK4|G0|?l1~278 zthqtGocKq~775ok$uSw^yxAWC7&2u}K5W_rAjPO^HxT?6_WbAtO>s?<(xa~A=l99{ z5aGpHuCb!${Wv;L9v*iBEQs3<8-#o|zg%YAhYSX?jwCt;(~8>Q?qlXh*{q|V7Bij&A5Kce8(t-<}=bp3(nbeAN7mgn#m1ivG#JvG>0`ss9sc{eO+Toh@x0 zY)thX3|%b#Gx)wy+xibE!kt!Kj zlJlPY3HTHA(*S4Rcuf-8WwDTcIdE!vdhT#Ktx(SJ=>*b2fl*I3f9dobtBIKd#K&H= zA*EK!BErt7lM_$B?|0Q|rlKa(kDIEU(a=%=MVG33)c$PSLRKT^+|cWEy5uU(*! zVH#zp>EnW*9%0DPs6afzY*?fw>4Ydte0!W7MBs7kJRgEOppmke>nuf0fr=I~w3Xa9 ze1x%i&_)F;7uGQ-rA&II4ruG!_`HfjvL2ye>6-wgNJbRS)trjOqu+Mr-iQpwz)Und zwjnqJ?JzWS?$Q!~7Um@sn>ni*%%ry7-kLIjz7??QBnIaDOV(ci+~W(&mQAh;@Pt3Y-fw>4`&IE zCm@hv_0@db@L2MDUWMeBmYs*1#YXwyu3r7)=#D_>kUV7UKe=V+eI{465408Pe{ zuce-h+_lD*j~5qJ8@96Chm&w4hnY3nIrboT;2Uv&+L=@})rE|x*5;|KqFiEQ+f6jm zLld7XOq49?&5G}+p24P_%cVe{9*iVE#JL>l)vJ3UM1HK>Z5}w2M)}utU5#8 zl~PnFx7ZjM8v$rMWL7^u)}OKzqXeXQYC)+nyZso#HzUDFm-54BZGSZ}CsUzq&*jK< z^OHg-tyC~R&udeJ#D-=8v-hY`aclv?>$lBt`h9^p@VcEn;I?hu_IslXm}YXDhhDET zFA5g^4O4=LSWK-t?5t;W+#|ewY=}co3`bsO^m~za@`=T)MdSN<(H8aQ{P%j?rSFJb zA&-R3+&T@TGOtkk5O8v=#iWwIi#3O3F=dDJuHEp}V4~+XpM~P1LD68mHgZ2Ky4Uwu zVq^I(DKyB~JRQwV*0s9GEpI4FV=an2?053_4Z>Ha^@n@QejP77C6~lgH~FcqEsXi0H%*MUl&w13qkQ1M^v`}1XY=Qxp1yfD z&fYZ(8Hp3=^O(O3QIwF!Dp?~w-=sZYkj*?K2C1<$hu-yRj*06<&- z0KmWI?Em*Dv^8`wwy?DOPkVNT*V-MsEp_jQTH&ji2sx@DUg}C&l zPJIm5Nx-t?0EQVp?&Rk0TMvA9AR%SBd6%=6_%Xmg4dYuZ^!>$BxjdiZTr#_6TQ_YL z_ScNE$B#_^Q{yfV%gBr^IT?NV;q%86ecVC5e)I@%pZ@}i^h4LR8DTc|!wK#0LpD?O z^|JCprI{2tBKBiYrl&S{U;OSzC+BVxMn>c1P-FEWsqVp`B2 zOHpF&4I5LwGxoloZ>^LOCAHdPd!b=@IhNTy)Tyn`X{`sc>NH>NX!>d+Pk#NU^1bbv zrlK7BE7o{Ut`hdcs>-z@fak7GI&H-oc2=39MC?pg`Q4tW&)ZhJ-5z9gAc`-2)Nkg# z>S(LS*Yh`5to70d3rM0FpfS9q+63f#namy@;LhBnqF(YbI95-D!P!*x-GAXlIAr8?i4>|JL(B zH?i=mc`l5bg5SS`_IwDs`6_$b&4yo`+}VhKtGI4xQlMJE_Z&QWpLDAsQSM7 zn%L9-@%?09K(!Y2Uq;%!rgLyhZtHh{XQi+B-Knw@;olbzdUWNbI#GAXWHMWC9u?8 zRnj`EeAU57U8FT=WCf82DzY5F3*ysc!3h3Q~6rA%9uS;V1=+;1boC(HzoJ`~p$=N_WPau?De`N+@ z3^oM_3m9SlgzNL`>On(CHxdvemfIkr=o!y7$~TM)S=~ESuN{BL4HShLCEl9?HxUSd zQGg;Wsq%SFhiFkm3Ij@!?b50kG6j5E{oV zso?Si?&dB&sHFtZ3EZlF6l^1)nAR=1+~fq*O=a~73Ed9BU-T?+>;%*REunX=4G{oO zSqF`k>k|-rtC8K6){-Fr@rYRV1y)jS=J4ELab4B#i5prH)oiov z@vFiv_|OPE3KTZ^`KJQRO^cLW-DxZ;%gY8sczkq%d4YM%_jm z1)4^KKYZJG)a#xUT;CtrO1^RzD^N2i5tt)Io%D&b9a&PZR&AgGz-Uj4>ZCP%jUBv> zMY?2b1z9kxcWo@b=j>qV@YX}B?k$GZe}7@6q%`PBEN{)zd8)d5$@ z?2ksp9tmzx{)5Cp6p9zT%k09$=X7vWM6H0|_q^LkZSjTXf4lG!>H*247p$nU;zH@+@xs&El`rg)P{>t&w3B@ zPJ!_Krxf&9XIMjDAYn0x>Mxw0hC1Z>!sx?siSCC2hsD*$RKhjc$w;31b9z9k0m=}uQ`O;_3wnIp)R z+9_?AlnEz=nU}_R>rwpS<|_!-YzHT&6oX%K@flR1k@W85VTJ1$sGmP!dD|!X?n>ScY0jDKE;4 zY|@5MT5DkhCEIF5=;t#^Z>S(ymH0%(9V#Dr3D~)8YyjcF*-AT_+ISL&KOW2!y8@M| z)7e6_e>dILS03bi-Qaw*oyRN-3QHpa&IjDd;M?&!2{Si75*57^b4aZ^UZa{Xb~>$X z-$(*fI@2$sBS`fP7x2jjukD98hy_vIQJIrEO6(9 zYYjK_=Vq`WdlDj<>B4TnVQ-sC-<X;n~87`rllO@v&L$O?VqWT1Ul{KwMG8Qcb zh4Z1C@fOmcDN47ShOi=0D7Hs!;^&e8&cxj~{+NcsNA)_RUdII3JOzWB^dB1&b(kbb zSTsV&!8Fc=EWk1Y+14za=!yH8$C*CVq(+v@=5I^t+h#`bEzyHj~gw5d1( zWlu$_+(uHW>j4+!R*{y`);pQVKf|Xny_>BI%()nISnk|0&s19_?~ug`movFV8B>WB z@-yJ`o?|Sx*6(_=LyW$DQE)xS7w)CLCANr zyas-UMh(=C13i@fS@LLPj)>RwWXVX|tXnn})zad;V@nU5K@0I^=Z{aMa`3ol*ri$w z$vaicTwId`3$t+W=mJF`;ElWp1(hE3VzWOR)OTZV<=tp?1`7Rgv32H$CStju%9t&ZULY=EYXNAyX#74nsvq=#njWzVZ$VL;^G2eRL&`2v#AC=uCXll5$fr?7 z(AaAELkKTmK9+hun|A~y#0pk*g5yP1VhTk?cv~6N_mb9B=_yuP_W8)7np!=EM=cv* zo%o-lS8dVaLO9D#d1Mk;r=_!zKHUZ?=uC}P;rkyjQy}bO8_g|~Sq1nqm+(T{q1RwC z2TOc(wkTrTjMqurgTT)~WNPMYeX)O0RM9!H`hmnKNf(9zk;yVRKZX}rq*ges?8GW0 zQ_GnfSovaYYgiwquxgB#=(+X#8hP6T4KlLlVysPg#bo*Ei_xq!mhIBdG~z`@BY5nN z8iUis;nlc%Voj36Ve79M<}Z`PgqGm<*C2!C^)&OWL#HXgtvnB!$TG>koVZ8Zq7A3> zfiDM$+ytGXJ_XQYqg5pWRrK$LK5fO2&?<3<-m`u$ENY{|v=2wd5~MYo)D9)s^aZ^31$58|4ZQ%ZdN-_8 z-!P~er1}in_zvzLVMf@hFs)s>$IY(mea-mPj&$@YM?v@0%heFqAH-0t-?%c20eW0qaQ>_dheeXGC)3WGyBHacc0m^6`&Ji&yT9RlAdrOR#HwD50xFU z{CV$>)%c3IY<_*sW~jJg+`hb@^QyJ#@UdujmCUx9MceUI$jXT@eRv?65lH;tM$EIE zKk3wi3=uYcL5-QQBus6uP>pTgPh4X*K*1nnuRh$2i1U6#iR^--|_2@I9 zl!_=3GT0GtLLx^+r7^-vjwuPKY{Z3>NpiCrmRZ;^2DQB^u`QSjM&~wP`dYPb*wx2e z+T|CR+TR-`y|kXYV04!j!`L!L>(gGsV_z%=Abk^j7zq0q$(=NT;wY*WtDhJ z6aq+aO8^ux)W|LWvNz(0iKiQ&W)VDOLt<1mt?slB>82uBrAns!C&1Fmku0P9yY%xp z^5)&m5gg5}#BAIiP4PPOz05A*tqJtjR%A<_3fzR0_MS+l*9n_@KQQJO}J8N#)#HAOHZ#75u5n=ub?UfzK|YCO zjv1de;t_0xHPEhH0>_dy-Nnk@LCyuYa>O;C`{5FF*~b`7m{DxJ7PL&(opv-x=Bq;j zvm+ERkdZ>{m~rGm69efw56!TCZ_nq>8^507rrA*%ri&|p#NAVrq;@sXGb!2whYT|; z&g#H|HDTyc7U1U>i(Sh0mb=xgSk7@XM#9<(s%oElrGnO3>+!J?PpO>Vn{OTQ_)6pOK%;E zBE}`E1G}zxnq)^MJBF(gZR2m$wZmh}YR*MlN37@!ox!E42G>EiQl=BG{1RImm*kVC zzGpfi1XbOD5qis+ZIx~_5<@BsRMsxi8mQxGdvntl54wLsJ7;0n>dOzWPvD=6Ntg`( z6;AI~9g8E82W@(vU)od4l5_S|Gp^Q>p+l>BF?k1}U6m^C0-eYqCfKgL42X_&@ zI9$yPf}7P1BebRIBTDS7GbUURN1Xk(AWNCH^2?9xybL22cmZg_J+b)0n~yYknfuG*j4cLVmY8bZ$XyQ90k zqqpE{+ezSK-=y4skI{`i0inGUwT%SES#YzOI3`MYBtmC#x3CYkH_XW0bY(Je)18n4MP^ zfMVEa2KUGM6s1R<#AfLF3w(7B3-So_*W0KC8(_DHyWI(cm*QMW(@hcyYQFJmybGT8 zx{-rCl8+CukbH-yj96;}aW;kIz%{dT63rJ$OS4C{cKG(L#iHfv;OQBy-D{WoX&7uX zbn1Lv+p$g3Qg4ipJAA8~-jc%OTDX@*yfvxg{1tbW?qU}U{8MEbybhAJoM+3yI?JZ= zaupqT!nwiCQqI!4eP?iX*Lor9`Jq^kb6SW;9~4!Y700j@U$prU-0)e{tPzBe2sOn^ z$YsHuyl}#iIkyLk=8l2~M1T4f>>s+kS_ZMyxk%YP`H;u1in1z#W!%g?)-bX0W3yzFabN5>uCZ@cH z>}Us=9hub8=Q>)sIS$R%?j6-l_nV$NVMYupos?iKv%WQ$%h7Sa-Oe zcZkD!w|Jj-;tFY39cwG$xqkAt>qHrmq20RghpPfPn|8#b*3Z>aMT5leCAI&c5hLh$ z(+exVM^}o}zmQ7CN|84txI-t6aPxsy^&Tze7(G{jUz{CgaTj@;puCC}NsaG29!Nh^ zMw{;wasySlAX9+oOHpED?=~I9h>Z2r+MnVAzn~Pw&z;4@BO*xE+FZ6WK!@oI|<4t*Uj8dO+zApYAv^@oC_H@ z1n!!rlsl~amR5~^iHFM4YI~`HD~egmR~vVRgGmb><}F|E4xJ{ok>(Q%tUCuFZD!hea_v`7t^!{m*p?SPX!2yW2u3xnW}Xh z9c^HLg)@4F%D%TVcf&RIa^*=daQG{?WqhExk~;8u{f6dABf>Vrpr{Mf;ES7Ol!^;P zD173Qt!68>@5k%)Ca+H2>BtLBjdoG0@y02z09A0qD*1UZ)kQ88IJH-+AH#Y2bNd$N z(!)L3x)aBOq>q280F})6&g)d^u{JU;;63J+z!@0Rn@+z5foBeINTYs;(}b=*#1B;c z`@XW;HHx?q*5|B%B$qauvOAYs+vz1N_2BMz(V$|QH6EUH&8e04^!7bs0YkK#LO$eK zp4=IbM(k*rzCFRAhP69#M~5D1!hO%Br-V^cvTaG++Dcbmc+<6o^*46qcH;C1kRn-B z4Tarc)mD)bCMp`G>Wg6q$vy<$6_hCgJoq|obU2Pt% zDJyfC>NTYw^We?miql=5) zi+U>^#K{@lV6|TRWOlJ(Q)IrBdHmX7Z8EoH*&TBPU66(*WT~Fc1mm@d2aGj)i>_5+ zdLEWEs##fJ=e83|Wc>KhVvkHT%@L#^s4HpgLXTJPHf3G zHy6K3-yC7@M0|Ad;Dh8@oOAMo_94}&elp@-Ip>8X)I=9yThYSZf}mz6mS+8 z`fKS|k7hhyG6f^c@;g0sy3Rm~Q;nZ_x*GbILQ?w!Y;qhbI^3;Gt)b+>$+I zt+V_Nt{k&)iNU5Z{o(dxv)3rGG$L&GCr#*m8-!Fx!u7VO%b;bMfua4wdsa+1?WBW! zRL4w?n15DIl1uqd8i>HU(IIY)NE~(@gU+NklPnne5(r}XA8K|N=VC6{Zl7YWLeAoj>LV+|IE4{J`i$IzHP&K_2MO z-8<>Ts|p62Den+T)9so5K~azQyYG&t{qvsDG-4{|9;d6E7hIjIuSP!)sViS3P=D!1 zE|<AoI6#I#Kg|*&3I-a2?QtIC9IwKlzPT=J3a=qIYUOM=}rQ;a^t~ONr|j`R4z2 z_YjQ{Z``@${E$ITf^jQFO)oLJEvvvy4!$LRML(deBGD456ZEsY{ypt_-c8>1;1WkZ z{@Kl`!jcSFR3$#NmIw_-Q=;C1rl> zfhDD!W^G?I0T$dNOFTMw5&VOtr&;T*Tv&`32@nXt-03Be+*`W#R``pSn{0!OP0!J)aN}Y)l=^Z!N5{(-&o$|8JhuU< zx2p4vZ3a<4%al-O8^clY;aZ}ONJ6*+ga9%>`&)QQ-08|zho7TzQ9#7quOk%E-3c(( zOMBM%c5L(1BnNi7W@P#hUq({|VZXmj39^Mb)sswn@&Yfnie4tw>k4{Yg}!&pr60M= z4+pA!)gH2PpMBwD3o)Uh0?IV;7JgHj{NMk=W%b^*xfg>10DS)AvT*(z7{S!l#`Hf~ zeyM8zTXiGNph1N)BBy4Ki?Mb^?U=d{)U=9%@BCSKJL`q3M@aMPpD0=t0MD}F> zZN&S?*?sN-AubPBkcw&a36#al`8oQ7iIamPLx+ttHO4_AQwF;X6(LWMPExmGUFuI2 z+JC?*wedOke_&PD1c{_XF*IQ^$SlCg-_v*GUt$b+wIymbL=So>B~=n*1P7flnah=t za#uY>wb9CoK}(jvdY&cd38nYoV|JC(`yvN=dg;L_4)m?33$7d-tO50+-gFvz7La-& zj?5Wz2j{!iUc*7ip3x)ya#3X~k3`C^M6(L`^GDMlJx8XD6&O8~W&cHy8KQQQM z93bDsE3wD-l58mJU}+TLkRf!{Y>9~9a#Es#=RuR&X2O3CZlSbnf4!z$7@1ChA3O0Q zNKyesHck}Z)=!YoW@WPXq1&Bap3rG-+`Ak-#j83?jFH_O{ruuo(ctA{r`D#az<+1a zs+U|ro<=S~e&x0=T^h0u+Ftw(Eo?CqdW~SH5qzz))&+vk>$GAZA*^d=6kW?e|1 z?*(Sf0{fYc>WXxbXF$e)J{B2jkorqJ##;igqkJbhWm#uxtO!UbXhG+uzWkus-Z_O` zyBv0~Mr{?>{gq+K-qon?MUC@>+qacG;dM+CcQ#{a!77m+f+Vak%0qD77n`!X%J z^>HR{jfn+JWe72`=yjh%F2}w{@Z%Vwx2XGVUbpqXsM;vp0RP$*i5R~=V!&)a68iFK zagrooYnd+2qv(YJ9Ne|=2)~!hMhOE3B?!av)(Tt?7-x!4#sX}KWdcv#@`0&_@e4r) zUa)~r`M2<48G3<%H4>Oji9c}%P_%{qdQ0UsR{uAAiBY~Rbt z#(6pku#_lMgp8Nfsu^uy0eXllN4XGqTobdUb{J+=0v9VR4i&I4vB>jkAIY0mGs*y% z&n3%)Z;R}CwsBD;Gb`pV%m zTpX!<#5qdcqtpofrF15Agi%FIh*?g1E2%JG)hCa;PJ3MsYeE>AM5OLu%rPw%60rDR1=g1P8iqp@omBPOL=?9 zttnjS+QY$D#?xz>uPMtcW<>a8+{9(Kl$gQhHJPECcLP7P^k<7MbJ6VnMmaFww;G`Q z7BUPg$DsYxA8&w0hkromxWi;OGwZF)>~s(2Ij~aIc&jwBwX6(3&dPRt0gjCLsE_-J zOu<6uCw+5rjf7S25Ruc0)FJ2dOg#FQ~|C+QBv_&wIYX@SJayw)6N| z4*bKyDjZ&hpZIcGMyvY6SRK+|m4g}SrumKy_v@Xv>yKWSuLuXDaLR6>0=y@KH$_!o zx%iGxczj3r;>|&BU`hT=sLxduFf#Kzv%={(Kqxbr~BYH_4m&0RvOF^4rl8-8T~P28UE{dA@~V5Az{84U z8p*c&`N(}A?D$PH>v1(rs+_Vr{5(5mJs62;SInO(7rI?ptGF4=&->5M)m=+Pi4`X3 zCjzN6dSO-f7g~|dijb3ZrE)M^XNW|`Gq^ER_K8M+CF`zEP=n4^Gjgkse>KUhI&*=z zzK)I$5)*qrIiCQZ0tIZVNc&nhrQwj-?!hNc%v-@u7*uSZ&fts>_~1wil{mxAE}{Ds zZUvB=z8hbXWm6K81GI<04@!ZOCc>g{uK(YD<|5DTH)GF8&^6i-GY#lFyiYSIOK=r(RH{Ei+afA`@H>6j;-s=2Cm~JC+@M$SWVZqz*lE zsx9xrn87X^*vj`w(gUQy@luPnH5?FMAZx&sVX@zDlwEbknSyHBX@rcwnfR9XVpx;ulZfci?%-ku2F83_0cbEUpA+5(^kE;yq=t3`q40YweXR{PhbLr zafm%jzy9@ad4+klPBr`YNQ81i{&m#9jU`O5bjJ!eU$B=+!g5h~O|8D#)1RI<#)To~ zoo`-o8jh>Nr73ly9gr%;F~ezbC&B;V!TBAaKAzBv(~qceR@VRbL#~bE>%Y`pKDJBi z?=S!WD^vggc>m4TG`4YdcKM%`*NxVN)0P<0-}>_N#%dygp#C9sHS3B)RV1_I*fmsd zYHd-*V+4#O;y{34%!DLWpN!hcd|$Y}b+j} zBuN*P$5u{{q`aIS&*ux(9$98WGp9%@PzN!lG%7sEcbpZN;UxL-o?sUsDr6c=u^k|Z z0Kt}{Xw3MSI5Leca6n@fEU^zaK8a>f;R9UB^m?PT;lC`p zyWH(Z1FlU_Zg9HwjJGq_F2h9rMaIgn%5x>alo@p#5Ykf;Pg#w8XFV`Egj1yP5 zRh@_IJVeMVQc)WjW4&c-`g=M}A3zgWmkaFX=H~OzN!CtAB?>+js)szzQ)|%M?k5D2 zzH?i3gdTq6nWUYz`Gd~zT%TRlefj5i3)*G*hLr;MV z2UjX9>E-@EJV%hA65EK)+p)Za*+U2fOm;B<9MI;Zu;;#$$e~gz-ODsb?X^aA|MvX? zLMo;Z)EnULqX&><79B~!SU?7urC6TUdvI?QHe(a(-8gA63w|-*bKF!`;W&!jBF^bGm>P{@N+)ql(z)Te zrS6e|{Q@0~|28oS+NF0HdnB98IZW-IIL;1#nzxK`+<_) z;0*FvrB4iRhCl~go7_~FYC!g&F+|LkLYE#Z7P^J?t0?8D(}mnHZRr%e48(!L4m`ga zN_+VV+boas`aTJ3R8T?{$!~o#FSFahR{%(F2*0vpEWvqvmE`G-7FEOfhb?ZHKVl4# z%4Ik{`yzi)*w_9ka&n+!Wp_UlN;<+1#xrUXNsOXE?;3N^El>D|O+(z%hahG$Y`RVv zi_A{8UJ;vrCf!NSBJpn7wl9)Sk!LDd*c~yS6a0Uj{!~7xwXnt#vH(|6IMHR-xob-8 z3fqxznq7>6Vd*-?eJG>Tyd=bsZ5aqA>7^$5IsOmA-YH1bXloKI+qP}nwr$(CZQHhO z+qQMeJf%}rQ@8u!@9Bs;6Y;%%Z)@+JD_5?}PTKmk_eZJ%$`5t;G)?$!B(q9Ke)6ge?Ao3~@4V6_job*+GbL?0%^LV*yKB2wUFFTX@~d=7z$50X6D?%!aQTC?(Ua8ehs{H_cGO`mPe zeX=X)%=z$k=?(&QO<@k5w9v@DIx`%@H402rWED`6NMEtuMR7HVdj*i=gNfNl|!ii&++Q?Vh;fjkj_qqGE`ROA%*&}S?ytQd53ZON} z#u{t6tLl|XfA{y1H02aA^XR6>?X8%3UE-TZg=}?-#+zDI78ukPSf{~;t^^xN=sBe- z-M2eL$N`-zpBclUh*nBzr7eNll&(NSJwoQfb&R0|N>o*_oFy|Vw^4VB$2p`kaz4TE z;UV*K@IvlaZr}^Y7DKe?*D}IV>6I@>pi=5V$wpzZ(RI;KI!FuuyJ79eefWM|NO-^J zL-59vhwyzKALqxhaDH;g_)PW3H$ch^5-lypxbHyo%i;Y~Z}`0#yArnV{5Pe0RG;I) zX!GBR!$nJe;IeJIehLK?KXWNsdF|RM(JJ%8ce|R;uXz(fFNAa`+GlQm1X(Fm1JOsK zsUe*rfQW1+_&u>WPP;bXqlz`TG~;|>S%{3W+Ir{%sFv`|X2=JgtC;hgN#3TF+8iTH zZowEsE=tuCd)i==b>s80&6bhzrj`HZ?Z>Wpt{pH`m>_X$MuE9=RHurn2WXlKFOW(k z$4JDUKGr|^I&7pDq`3m#iuD+bi`)fUObzi!2AZk?@X}6R$(y*H5=>NBil7il%P_DZ zuWTF#cbiYkl=zu0S(Z|tQeId}w91qq2I=0wP&l64OpKcGEB$|1yNlb&5W|LgWaQv`q!D5KQ>nWzeQ5!#YYJn77MP!nC=zu^m@nM9de2`gMby0{{4HB8>CrrZ>gPX@jU^jM+90 ziqv1lu7aeqQ@E=DX_AXA*d0E-k}$S5QmW`+^K9?QyMi8&yZ-ze@A_bz?(UYZ&yNDH zCv2as=iS1HQZ(p1D9C|Bma4cuVgySOxi?rKoykpW4We4RO{?p5y?l-9!&#M$mm`ZHRaM5$`<|P1YmbJRchzNZ4>oQRDka;PgTo(&t{#omp-N8O z{q{D{h|T{PI&{~)#~oK8@w^_`NSOY#$(`8(VnE$;3&fnY7Br8GWR9iE zGH;h`trByoEeg(>jX)({JjF=xG4bHC=;GSh4u-eR!*GiHb(pUu9qKx;@ca}2>KS(V z7zqf89xv6g_C}t3DKD7-7x`vlT|MzpU=jDk_j+5~I5gv-KN7874@Z06$x*)%3Td+` z7h_8zvUQJUD-kFq20%)s_PFf~mmfaerEy+*W39Oxd>7dct9z9P5(WxuW@5wzzqu454T`&hgm@5n6dQ zPLXWZga(a9Imqkcg27X1Zw*Tao}PT~oXZUCta z!hIDrSP@iad5o&jW^@wvB$l0#*ShZu-tkV=S7~YTiZ^T`z%7E`D}9|)-Lq%$b9#|T1pLvbQ|7D~En?A#A)#9+yGiU%q~r9;vOz+mD|n*;TC0F) zHx>Qq*u7Eq&izi5gVdg&K!0=-Qvv|oqPZ%RLJ~%>gNjmsYJUJp9&CD@RfYQQrC)I@C(m*C~BILRi;X*TT)tW2k4a+qZ}KX6TM2d z%d<%RB&Ja?s_D!Icb=U#CJI5f2?0SjVRFU+kaG&JI$J`3zFQHa*7O4^(pbg#ZAJ6z zSqo_iT(kqHpw=&S?m`2VCtnP&wV_pfQXr9EHDm5@Sq;oXn83ykntS~z-oPMSq} zMM3M?rI+CLz+~5w%})C8#gRo@_#u7)^wSsNqeqKfqQU0a?Hl5bX<>ATj!N$RzR~h% z0=GzXY2JU;un9Y(Hu5>=Pvo%vf-&_XzUz*3Ol_oAUGti=3($2gx|$NN(RF`A;o5& zNl{dMT5@Pb1iTN$zzP$Yhhu1G)bWshCP=`wOKK+n8p5-XuJF%t%o4N|$tJ!B<{GIA z+Omo9%^_{>P=k+ZaAvETJ2kp(MV}nkgl{3H6wOG~sHwu8X_4+FJGXUMswpz_s}aDL zr#2BXyaI$Z2+#+?H$P;A^!eF*|EL7dKIHG2 z$K>LS#;x%=wTYP|_QW)BMt)(Ybc+d`xa~1* zOP^4DE4eslXb;HmO_0Oy{NQ`E=e49i_6eiK2lqODcxv9cJ$S(XKfL;X9-=ftN7nY= zfoUHT006;%A@9tc3>_>ijSX%7<7A=b?Yzx~^s}E2bUu?SseL3Nbwt89jlAx-^!zcA z<9s8Fs~#vR5hNN&CHS$(f`7!f;##{i<^s3?BJ$*!z zXw@`6WwhfPBhSXh&aMxw%RuW#6B-q2c1&ZQoI_ux1X)Xr)94sK*k5epm^?k%Vlb#U z0oJ=0d|R;IKR;(b^Es?DcJ0i^iT)mPBR@O3oKnq_Ws(kVw!mDsA<09#9CSmTMVB|G z$#obSA)>UUSYJXRGACE(0e8&uZHde!qb#;#kp@lsD4i&BHfv5kuR*b>1u=E(-$ zxU4b~I+J4N)He}eK{ST5CTF5!vmvfLh|aIZE`_45$=7YB!|dA2i1pBvVfJn@5@z!h zyA?ynR2j5PD}PZy>(a5hY0&;}`!NK@hwv_EW5KXNDEx5kM!A1NWU4QzAT9?K-2r)Y zF~^R0g=qfx&+=rBv`60T9no{9!ZinA9t%B+H{HA82>?@XBX5fkd2 zVoQV$e{|8z;N|`~>A{l?QBDNI97Nz5h66oOY?k+iFP!oWND1<6=wuQN7_d3eo;S!a z6t}2CwLMZNMnyrDgqT%LBeN~xhLT-Z!jh5p&0>BRWyic zqP>P_tXKd=*+xy1erDOrf69synTTO2GEtQqYeKDv5Tl!MhKv&{MUG{1 z9CFBizSD2}2*M3`a!opE%AVkktJ<)d6lC9Uatl8>IfZ%msAjOLDrvjeu=b75HPhCb zG^~kMS!tqh8qaxFStLzU6XWXNeG;MeMO>U690v3RaH_5>2BRw<+7ART^thIU{}M4x zgBpTVrwf6j2AF7*BV1xV2#UWa<$@dKJfk3*@+~zGXD*7eI3(ottAm&mgU$+d4ROceiE5r; zM$y)o1cVGnKS8dqxj8=f(SUjT!_G%!MqHkS1`7DDXYl_%#WGRr%dwWs7fC zPGc_NmAyw+l`=^Re1K=bMH7jkKr|KnjxJC&&cAh49TT*@A5VeHz-r)D+zPuNVxM8K z5X2A=0YKIAqgB)=Rv@oX?=$KuZ)c2E(+CUgEM$Q{3ivh!3Kg4F0ila(LJ$^h0@+X$ z&ZS|wLr#Z5;F@%2Wqf|=r(G9gI4Ftf2ewXedmZC_kS-H-WeMY%VxY;`MO|N6t!Nte zAxr^#ESMx1Fv?9jY3hag0k9t!s*m6`HYlX%?(UDH&W1R8( zp!O6ULT$r)3MPlD{QnH^zjuReKTmoOq0tm2dI*I=at4E`BM5kB>rgJQTOA?VqS?#8 zniX5*aKZTuX}mFU#jm{~`mdFOMioT&z2b@5JV7ED($7mb`!pFu?L3qrA;(%|);>38 z;k?OQVGJoY)C-URy%HO58~pAFO?E^_z~sSpKYKrE0+je6Xt%A0fPVej-eqg=w1M%M zwz*R0RII5Qs+*_rs+|)i8BbK%&T+?Bnj>Er4=Zcr=FnJ;t+X9#ZFN|_W>;qp6QD+d zZBZ<=3yBr2_69$5{U+MJK6}}$S?jXRBk87|s)({IzZ$BpOk+wxq%cyFaM&6jkVwX1 zz~aE{44;q?5}YTf%y1C9vZN&J2gtA9Ns)OZbfQp~7p&6{go0D5X&7!`0ym?O#<~=o zzqd5*NKZK@gn7_GctWP8CQ~p$1E7P;P}9nYt}+Cy1>eDFbM%18(rd=dOb0f0{i@yA zbBC0HE`9~o0kHT7prNlwRrGa~5W( zw5Pk5O@N6|8pb)}%~h$2k;YbKaSPUD8Fuvx(G%C%y#U3;Tazp@)6yn-hO^{7+q971 z+G=6E+Lr4b)6i$!kJ0S&pY%s)71EMqBEf7P*e}r9SF}g>0et@DH4I*gC)~p37n$%*zrAny9F! zrH}y@Zka)AERF-7sjKJ#13>^Qhi`u118EAwt;zi6WUukPK}<50aBl#q*xhNv|7W;+ z(>pDO#5*|(f0HJlgRDaYm@cdt7pG`X`yWeEuI9x!Zwb&ARRbM#K&X`wJf-{RT_%?9 zKy~Rj`ZG~YmwhY65fQRlUBSB1uK3URuJ|xsG#Jlbufr3JjBoiP2kmW7_cuR^ui^!_ z-q)$NDT+=0gGZGS=CixLboZocXV8;Fn6u7sf_Njn9PQ1qa+K>Z~FU=LWsKsr1Y#iA9q z#Ifh-!u|%khes+u4J+gc3k#85DVE6YAd4mH(#nc^*3!fcQ?Zd$rgPmUR*e}mUCh$A z44nmIwW7)GN)2qnB$p7jz=ZY)SyxSMYOD-8VEto{618LV-09}j($B9Q;uE>`s>4?m@k`;3M6xovtApdmAnmQO^`Dp*$61WFmE;Swk zHR%x2k{uPef&z@KFjpAri(H?a9;$1!*|7RHZToI)*IIyX;5Ui3R>|eHh0pLOIc9z< z&yj4=*j@Blh`5TCw~f>j zbEJf}RrrXd8^KYyUObd^ci_K(7Xlw<-c{3D$WMcQ)`cA41JDn3 zL%8M~@~Wca$VY5heoQc%Z(XB^A6=Pw;fbGAeC zgiFBVt#&+0TYc09rwv;`J4+_B3hpH#i0Hi9iN|M|L)T7}#kZh+@an#?`;+nJhbH*v zg~K0B@KF3O^)SvyBP_P6?g?oPC{ka60Q*x6R;%P4Jqg*XeIqs+G(9rUxg%g!$8W+Y z_OmcBARg}@K0g^kKmKPToEZ9>j_sQIo9O>lo4 z3gy^7UIiPwpwvwbZMkfVx~5&e$MfPgFBk10W!JSVnpFPvnh5;Uif*&4_A_n7?g_1p zM$=lU;%ATYq_v*iMweeF=S19YyN;QuN3^~r-w|}^4Q+72_Wm1*p;l7WdMXp63UJIFtq?~pwK?*xO??D`=F?0htY1UO^5dhmJ3&}!_79u*?MO?EpT*1 z=5s4l@7d$!bssaQU*$(41Miud^)AWU7`TA!(i=U-Fz!2`oYC|4R`MCLGJRA*LhL6XrO*{0o%@d&3gtVVw+yV8WRGp+P{TJvnzmQ zsO_k3$6O)?U9gOl+6G8pLR{q*7LfUaxvGgxEPbxP`clFowoohIrA*+6rNRlu&FKo{e|+&)S5utT>t zqG{UP11`>oi)E=Uo?5;o+m8h9W!E_4-Uu2gada#yyQ%vpq%rzV8Aywdy_LsYd5-l~ zEP?x$eyL;F=2S1N6;kN>Ay%J4(Sk(O%wh#MK!*Or@6eZ6u`2T5o|05e5Ws}p`9f8nnVC;#sTVC_q}syS1@QHJ ziQ&q#F3YS@L*z@oK^7JtSjGRryZCqm*al~^ba((Zf=MCB%$A(r>PR$yxvTOX)wfwt zheU6(4=8Rf zFe1x5KZrRex=#WK76e)f7NG~1glB4>lVEaXgruxU<@O8kDxCoR)KL<-0gxWv`1}&+Sm{EHX~g(dztUPzUe?;>#W-?;G?sc+Mp~?5qN&3Mby5nzH_GZPHJLJc4`ozs@l8y zY1!}Rt8PNuk~oCFhNaD_?$(TzwI$NZ?NcouuH>=lW(E5YosV$bq`dLB!o_UAdNkav zQH9k%*=%6Kh}XmF@^n4<4>c=yBqc#5_cLB)<)9WHt?)zjvisgjqma~%V`v*~BS*F- zJB?ghZP&pfhxsyK`m}rX6BPN!>{iN#&K5m$mYTckA)_@Xrsn3b%c0K2O3`m!-_Ze&rnv61Z2p!Lx4Yz!V;nUKlq?;JxGR^X*SnOJ3o+_z*x+_%isvRf zoFLn@g7bk;R~b|bLorK2DgyBW7V(NqhPK|+x{zvtbvcVs6KEUnLl!Sw*d{>_)Th4~ zA)t3&9n;QruoMVTWW&Kb)@M~ZMO3=1N>?*bs!}txb~1v{j#mp^{}NG2%e}x67$eY$ zrKo*PGI$v_3uL_)u}Z({4;>y%4RZ~}4|z1DSM8}0(*2Pe1=lfFvB(=|%7Hw(HdZW- z+qSx?8+wtN%ej=r!LA-EA^!x6(kf8uiZY-olX^}4+ina2`b}&JQWf2I(47cF&UMM{ zblBng8G+IM;EN@ocbE6b9YBy8zNFfOnwz%9SOHA|TOAHA)AqfM=qsf_1^i_29hso? zI-Br0)3l^<+8;$^2#$Y(=wy}sTM9KCh&k1(vi0_k0LLHxhy#NAH&7!gA(|+}giX8V zY8M@X7nPPW0@Thz^p}sYEq(1$%<=T&6}eFj z40FPO>6>pONOgX>U#-qugO(1~P_{Q`K{*c32f^Rn+f!LSjmP(6#~c@bVIF8x!Bf)-~Y-5G$-n$si3c}*G4q7z zR(a{2U#z`surJMZ4M&b&2>Q2!fiS(r9ilVb7turQoj-^V=hh#2`v-3k&ml=Ps92Vd z-77QfX75A=)ctY~I{f76vHk>kdV<4#_@VWca3BU1x;~PF?6olA53^&7f7-G_(*JFu zX}`vSq5tbAO!7Mmr1&ostcj(wi=mydslKhLp|h*g|4P%{RhPBLW=H6~tIv=Emke!j z2*v{<)EOv z*=%Q?FdZCqgKOQK(cAiw1Pc~yQmEMy9Nff%t)iq*yVsHje8LG;0p0#;DJJ@sul{+{Z$KR-+KWj`7KyO+o0yvTXgfFXF*~w{qwCAp_2{a*x`RK6 z{X*m~l@W&Dqv(v)^D*N%c!}G7Kd=j|Y*Kzxes|GDGZ2*CocLz5VGM;*gCc3i0Zz)ugdZen`S`PkNGz1@!Jum{JfGGiT!MN+?@t%a4F zLeWN6E|}O)4s^FBZm}?X@#Vw$`vR9`H=`jg&_j22OgA2PP6r69&k%8`7^^|EH1W1x z1l&gruU_517<-;%HR2~fQMkzstBN%eV8affcpr-9v27yPeMbrfnqKXqt~+N7cy0ud zEH9-J~1!tuZAZ-cXYl%*Qe|z?iqjY`!(UTt(JsaT;t>qA4wp{=k%z zck@*$G;D2zY_VdQJ^eRO3BpBkaL1~vB<3c9jO*9ivyI(ZLM|F}kv5jgJ_T7$Z^jao z`oigYzRY@Z3%m}rz*$x`-_&8fswRqRwcWp)rx?iIrL%6xtH%1$_oJ&?{Z!@WFH{=& zvcE$4#pRy!KhbZhLk1O2W<1 z%r_~IR=2-Qzuo_T;hM!v<6ZS%$lUgOQT;cOx3jIOi<71CFRZau-nZUnK=6CjcPxQV z4lgbVhC{m;*4SE5l-iu)q9Cn!;6zL&bxvAt@&A%@I^wYLY9QU+Ex+^g>9WHCZNSjO z{n`wCG;rV46s^0ZKgFU=f{N>TZruvJ4T{klJ9d(-+BDIOM13=j4SbfOfoh1eGJWPw zONU=E;+qaww_y1QEF^_C3_cjoD5c8s}sWleaVLO>}LoJ%t zYIz@j+dhLVaRTWO^#Z0@hbW?L?Gf0# zP-M3iSU3#6Q>IOdjN`<8x)m^}mWkHYdyPT~CwzCod8Nihe_+1ClR^JPtzK-j;6;Y5 zGiRzPlp!2n$NV$O2|UCq$XzYNH`2rXMj9jHsQ+2VOAhkN_~~P&fLSiYR>E#$!m)4z zNKMj0{m*_$X=wSKd8ZA{&K1ykbT^>>SBlE1J>cHncrQD&(~Eg+^;H3*j)2$7xK)=J zm8{jNE?NqXYRP%ai~P~41U9}N0ueniJs*bn#G%cVRuSOs1go@g(OrH}W*4JZY4Ji( z=LTq-ld3-xSN{maCtHs01knyzm?=vZ<>p0=TT6a9D(}%Ig;&OqsV6f(&+pGELHOm$ zda;#=MS0_y<@Q*&e0WDqByQw#p+hv9NO-wu5X)x3In~?@JU}FOcUmbEy2uw1YLe-| zDMF`w-aGLmc;J@-ZiHv?u7w%@eqv#A?SF%d@#wZDKZnN#8*cy^U7iOH-M-%}QS1cn z6#MuhJu8d;&Wt?!4fH=<+)iBL8!to^TOq?xhMMz6Wo8y|N8(s+LL{5Di~h*6206> z$8_irVTtKH16**fQ_m)5#<`h0o`8ez&r_5y&#*1PaKXU2Y5K^C(K?jdgIL#e>A?5L zsZM4t3Wx_68jLoJwQSho@$?o5ic{P)k%hQ7%7`nM2dAlNxeEdgJiO-4?FU7alCHpb zr5`IGE7dA5{!)~wvk)p`98sLe)^0JC>;yuav;|X%vSCtx9W}VB#M~+N(lyjGFa%M0 zZQ|o*@$bVYHHNU+2-Pb$5;RJexvgJc$a-q}rJae6#1$CB`V{0Pw({VCmLf!@Y=x-V z5*XPXFulH8z{o!@z#3eA*+3V9+SiFzxy};mCBayDTwyMq#ifU$BQ6+_pzGY}PgbV< zD7Bj_?EWRfR<;5AmSMIIFU`>!Q$!Yy%j^%EP(8OmbbFJsmcyZ|iOsP_RZHov!{5c# zl>R#y!qmUvX;Cdt3z~l}Yoyn3fK9uFWP1ByBy|-f+A%@sO7tM4d|PR3 zwe_W=!=ME@0FCRX0C$}6w9K7*bx=D*P%mk9%FqxivUe|;b@{8;uH;y`^Jht=u zKAh80!k{ z$48~{7#`Wfp2wl?(*#+3(fCyN|e{pk#V`R)O;8e zsKZ?-K!6tEp*f90;86A|k{H{%YRBn;WtTY!A|=|ks_e-ZHYkP-WiW2$@r#Dsr_ z%^ZtF&bZSfZ3je6c{TT~$Z8SeDqy;rh=J^?D_M%%LEJh<8E&N=!FA7fn+zv)p%pauXt*um^>P{weJ)hVqn-_IF2xTqLh`7@Kw2 zx@GNROl{Hg-AhaHHPy4W#zS{sY=eAi_wUi}lKK;cVpZ%8gF%#4NR&)>Se>Y z(jvefwXx?XZ=ER3o+k|K?d`P=i2qABA?o0Ii-pQCVHYv|Ah;Za=L08?D!u2{q^-~z zoZj(&PemR)PSwH3pBc()9qnXxaSa%M@|?OF!UHq zh&7}@U1V2rOp*k&WQTFs0Lh=5_`qJ{nt*cca-qEzc3W_`KL8tEgCN!8eQ0wV zN~f@yByGgDMFis^X=R5KskK@@9nKOgI_m*e(zv9lu_Gvo8l<6xuJs;0%sgSzd(dLv z4EzzM!es@(@yYhX7b-K*Ld{4b7h5?3Me3385^@H z1Io7rl;{>`&OvySihavcm<+*S;NCofEZbgn!1X zs$@-qPr7lt?$JpMRgtpqS+D%Gq>5u$q;LL?MVhszc&rWY4VZf(nlQ&Iw)7uQP_mb* zHE{9Zf#%NC*_g_4F>#UICRdu3s|eah#bZ<)*gV+qVzeOoj|Esd2FEc6@|>}Uv`gHf z2wRh~v;G7t^DAP`C_|)e*xVmk%Xa=zhoRC9kuOPxZ5{(rP*-9x4U;Ug=2%WeXfu>e zm^`)6GXHhBs@{pQC+UA41eGY7_?V6?9!xl}V)NUMfA(x5gA@LEM#d&^Rts8Ko}y_B zfz8IaeuXgD$R%&5bn#*F@J(xbF-PMBSz<-~91uA!Xf>bZa@U#pkR1g#xTY&3${0&~ zPk(e$hY-LVVu1aGr*BW#tm+--OC@)fTH9Xeln%B$c`etn$=x1v&{OCb<;$D8njem9 z%dyY}O(C)3YL1kOrqDj8i(!^O~zguCZSb1QLyb4^NL*Dr5q!F4@=BkT0UeEDQe zn`ZCX;bS+wj^51F(hr)tIC4ZvIdQW?Su+jlhY!z6jFuS4aC>&{*mRAVXD3LF_kP`| z7_a60N;kGa*RMuSi%WP9lJD;Psczn*Pw0^J{P43z?_k*1nK{FYDB1Y4b1CQy;@SPE z-gi576C@&=LboJ>(R)B#birZ;HZZ;yORq3s!6Lc_uh6pu1w-Ch;7g|I|F7?b*=$ zYFxevNBc7A81<7r01i^~^&-eSy9XPNHDXZ$u$QB4V+wD-qT*|vzQq&pG)FQcMjBm>GI1+ zaiID7JSwdtOVlOF>5^s0(+|C`IEpUAaO(Yu!0#Vk>|{ILKR>5%Hn2I;{wArZ2Fm$J zFkC}{LG61G8;L_!r{pmaY)~i1qxO#TIUunh{|cj!+O#+ofT=KG)DSF$zFL`v9zD3( zaE>!hRseQzTy#{5JBw=TWN<<{qOf3`GDB94?QcV{kD*J)AJ&f1KYd`uk$KZqGz-w- zB10fA1FX$L(xmp%Z37+XNIX*&XAB96_GOWR9#KV|_n_r;iE|;CpveXp6Y5Vvl_QGb z)?FqiNwSuzSWfcOQL)6)Z@G}qi(A>R4mSSddmuf#Zs3i$`~VSkX%n#*P**_^jhm>7 zeao1L0nwBpjzzlL)QMuf`Z&tpntF~F**-|`>Crt(76UiMuqr&pN(@SYj~y0LREXd= z?R?grV^4n5>=@Q76#F_npNidtjQ=jA92MWM_| zbr<-+#=PoNR2&oU9!eTi=hDJ}EeFvJSO(19p*oqT6Y3GhGgEP0v!I0lgdRH6^6fmJ18D4IV%RtZl})k*h*d;VQC~5pYoInL;?tjLa3t z!^|01niAu3eMnEWBU-B36r0JiLAh>=2;-_Zr3U-=7rn{0AMPWvBl?(?j{qm)faN3h zRN3$Mk?yh@d3b|{=4hDmsl$i8M8}|wf;bNs$bU*6dfZoeD<#TV%?j!{3Vdn5QKKc2 z$9_CLLpJiDa$85>;<`;AN~zUTxUVF5FVm*AkHldcMLGs{?7T12l-4h*hjk7 z4yvUcB%L1=HUM1;Wv}R|ZCZ5d zUJkYrxefpPYq-znvv(7Wzx|5fAC3nESy>zoaWkyHPKFc8MhGjXLu%5N&Fz zar`FImOHqJJh8F}=n$2C>Zb)i7?`Ct#KcQU;=GeGujvPlQ%*x;f}vM1D7k8q4n=Je z$3ip*9FELg+5?k=$XxeHSS&_Sa)F)hVQUHYQZJ33l{w!=wYQGZJ71Z$q44MA@6l8C zZM3}1tQgkC)Y^P}yy+V-3S;L1%+$gNC!?^pXj)8JJ(u_mL&{7Xfa;aUfD7RM%9^JMzSpm4bqBU{#+wDmGmB zA(Y8300{@|L;IgI<92Vjt|oJj0EuB>^w;IF#c$qrEKOa0#Uj&ECvoLAbLV8koM>+L zr6ZmS2dLbNa|or$P|-%-8bG|HE<}$21Jv{Wk)r3PV{TqIwsaJzI*z;K7sca?jz4A2 zAEe7+(ApI46W80DzTDmR=07cNe=~V=%Xt^$6q-uP%rHut1x(q11-x8IP2_fYHEjfx zv0PL%&1Y5MWqkc*gWtosB`3m1O|(+o1y+@=lX7&0JoU^wg~=}-8SLf`yZ~%bT10*- zGfiaT3)QZw+&sQyg->n8^4nA`Hheln@j~X;+izT<9C|Y z*MI-nBXYQHw^S|=DA-+Tggb|XUtE_MtSh~vq8B`V(gHK9W#52|$#!@0Q`*NQ7!1A2 zsQKPc$^3L2*Ij3s_f7eN&|=kZeF04E{l;gOc3Stf20SbKo=vvmmIQb8`qwp0%WrfE zavex}pNyU{GH0&?co%_<8 ztt_KvGyCeJ%hH30xxM1kuS$tX>E^A;UV}7ST!Wv7pNm{n_#IpL|z z=2hHNyCw^W;;ad5-0iy!U~hxYkSzD8b*n+ulv~5}GH}Jq{FzZm8keamKt8?wD7XSu zk>$$K;ZkgN+J`3Lw_jDOYaW)yVWw6|D+955@79cr%G7=y>peI}_w|f)K08eyQ+d6m zs+}?bx-=i<%FO7sKwJUtwrXn7r1RLMLudHU&5A{+x_mO^y?<`yabQ~Q8QnsdZZM(T zd?wpH8PaJ?sHpiWq%wpxvi0-9>UXmg`3$7vgMd1*VZ9z7&$CzY3G@ck@1YOC{b;TV zYDFbVn&A~rr;!tjdHE9GbJo2GPw+-$b@nlkuyt=3gssrB`TE$416jHxuU^k2pduZwG0Q8 zwPqy|vTK8(V&D~eOD35ei7J6KDf8jpmt@4dNpZJ`#st(UcN*5%o(2#VKu!~^Hci5$}H#9Xc*VO^s#!snseo`_j0 z)MMdWL#FuRx81)k@ps5%q@x5+w*4h_jDd_NJ79Q}^H>o43-byWrook3EVi*dfqBt2 zC#AA0n^~PSf@~+kFe?57EnsL4E@n~?FM>fcrzVQ^3Js~V0ESuYTF&+EOaE*DhiuVb z4G+8XiA&WYX-xSC^{55wCpJH2A)zWglnau(hDuhtcmDt_8-8t}Vs{_J;TuBMv+0ed zRKph-=70yU=T}He+}UO(+Sh?t)Y1%OG+lIO7Kc7yi!Vtc^jvjcOpq`rH-kHZ^qTEf zP@Lsam+E#y_5#Bqm7uzaL^So`XZ6}m)a9m}=jLjF@I_T2Vk;^S!CCxBEs5z9UWcGo zN+7!+k`-zaP#4rW6uxvZlr>Zg(y46u@Ej0F3||s+DGw9s$a3Hg`N}Q=;QN614`U=; zkCD3%5;hv}H9R~BMJnigSnj;&>VnS($sOc`m@1vA7$+fp0@i4pbqED79cl9h+~AgQ z%bXa1CNnp(2m~t%S}R!k1217aqPTFyC)G-`(5lGYd=r}>S}s#anvFCy_p4BEsA(!> z_Q5Z)lEF>$%!d#71>&Rdz!y5r@y32j5>^~^Ij|J+KsO-OP%R=3wNg^Yha9>|yGbY6_! zhNumFwa6r+ykWhP-@z_2A+vIm(UDso33KRCw=dD3+1|KK$5p$YGgr^Oe@&{B31Kd{ ziW(f3A{p9IP!{H#U4J#%d|4}VLTlA|I zP18$LzLvFZP+10DA7Mw73$bph8Nk!0tp3(+3#IFT#i-~#jC}Xl-rB*txA!%6Ead^) zME?{(%8Soc5%1S zvaOTUN0p6z*(^ecrrmHX^wAkU@Pxn2ll(N1va@e^>q|>ebJGkA#LV*C39~kpF`PN1 zCPDAY1)3XBe1jmzK#7ABA=IFid8+gkbU5HVqZ~cT7CsDpTE#PTcNwL#bIgCtDB*jw zz)R*BGy{fj$DAhs@mmaFTL7l$S+ZN)xCVtO&kGyP!O5utvx1g$Ew92>Mb$?k(c&Y8 zrWkkoXr_+e1E{PQbk81!jQE=u=K4Aw3LK7gkoSUHTQ3jxevMGP zdO=XxU&v7j2-J{mJ#kT;2VX8AVBnB048ic$Qr^VoWYRY2L&6N(<#qgRwp%U>XSd&N zaAX*t)oZ5qkddX$nE4j@(`*xY!=BA2n@pJx)-kBRXfIc<6H5K#VnsTiT{l0;0O$|W z4+g%*DT#?MVCEAi8KjqYwKX0%uK?4L8{Z=%JkXuJxt8!|7I#S710!k5+Ph>Q9LWm* zlST^)%ND!NmCLaYJ9k_d*Ro$-EEi&&i#}#d!OAAK+P$=oV_AHw8DdYtmlkEtQZ}WY zRd%(U556dO&DH-?^yv=3szG=V_U>Y|CpcL{#Tfu)u0~`dy&z1y z@F%15k~94=B_OZoQdE5iafnS!RZDj5HyQgtu{H-#+9p2lxlDp9H7}f8YpiJHNV$Cy z$ja>nuZT*-L>$vRa9QF@>_Px%!L(R+B7yp}xPo!-m1)C~TvIfIQ%E9l436P31hKy< zgOiABKb8vnVJG5TtcTr*GjSgF{dUBu7|-t`VV*UYG2Or1@g;&+%MMszGffWRH+gved!m`5(Sb+t`t`2uF zZ60_)|8zi5`+Wm?m&K9B0Z4FzikBOF_!zui+#3+_W8W-B#EJQ^?iV8B{TScQZsEj- zxXpo+8eVK99yq&v6_8f*V5NsPn*${^yxCaZw>SAXEKQd%@@_eN@;N^`Ejw~@3~23%lq5m_TT(b3vp$T9Z~5c@O(D+De|plwWyF6$C=)_GO{%D){|NMV=`t ze`Ubd271=if~_Ae3m4pdY6?~(`?`-UWrmViMyj)evflG5&`2G^%7K~t2}sErtrd;y zbsII(tB>?IgCc0Fpae~lJpWf^VW6D&q$%7neH1MMuM+dLtgPuZ8ZZm2u#(=45x zdA+3O#Fr#CWwfnXv$tVtzw^)L&J~yF2@Eogqe%v^+%z38#xpbGxxi~bH^GkLh$T5c zd_}Naupu{S@gJW2SzG#eDmPm7bW51OcV}r&09PfC`2r;5Egp-ovk3~! zTfxjJH#!AwKQH?H{Y~vMHZkASg$!X65<46!A6rZ+lb1%EWxQ_T%udLEm~wR}}}SCBGW zD7CllQQgw^)%vWAD(g%X1Y}T20AWKa<{rWZ1Pl@^+1;uU4!QsC0H%Zte^bS^!sD!X zvUWW*p{$f`%-SIZ8|rNkp|rs>`#gKi(si>WH!i+J^@fk3H=()+$JlpJbGP|TIX(`( z#qn#HRD>TxNUtBG=pN-F*B- z=A(P9V{p@E?kMuSnQ~&6C8mEie8)!_`{}9wbHsk)D=NbC13mKiL%%ok^S_wl-CD4> zKYuNVhwK0VziQ?GvCI2^NR`Hh4u;0R_GRbaMEL(?t=3{&+i!_Ibo-66{Ue}C)!3TU zy$#{8$SSdOus~S9IRF?|P&<|)npU4EHDR6TKfArK@5VY^)_QC zw|Vgx3!;fxe9lpIV*Nz#!{qgPvUo~5<%u}XO9hNS;Fd08k*We2ke*a?Y%}K3GZ!Uc zkCewK9t~1=N=A(a?KZeG(-&(pnmfzSuTnxO%{L33IO^>OYq2^9*L=WHlwY5s*+XCO zBF=nu8k&`#%WFEC2YeO9VIHE@Bm}Ud7Q)y2@%fG#RU}wcdK=NfK{jtc61cT3d}Zsy zj#U#)YmkT%GSk#)qL^$JYBCruR`HeY*v?pUY{NU(S0;4Vbo?3cm|O%0wc348jj_^- z7cW+%P_sdVq6F%!STt2DErd{3Oxs;C;WN4m;LuxeM=Pa9=tN;2rkmGw#2c2X8TRJzKQ1A!T2~H>GY#8#B zKAw6|O2HGxI_MuOw|6Vm7br;m7pqb??r=VVNT{bWfDy7+tHPZDn~oPqEry0EXf;5F zZskt4`xYhg)9?5HCs4~9s@#^#fLIrMHr*_| znlL)1eSD<%NcfRSAX$@9A#3F`PDkf(PgkG`>GABQETXg>cS}}`Hi-Kv=e$f>>=M>p z04w{PNAITP8UW|TRwfhx-GqL-c+j`6NQrP)+qClYZCA5kUBlsLZ439E2hn+Gs@6j- z^19Ix`41bSJ`MwNuesD<_2B^C<2slzMvT8SQzxK$gb1+`{SKez@m6~pjqyoqU2vwes)s4-m zSa7sLE)(9MG;+r{CEXUy;MEpGhD7>HBVjG2zs_yhTn-D8-cumXrt3|R_6r;wW3+Y= z+bk>+;qn}lvqXI^WP{r`TfD3p{}^Mxi>H4?B;8trZ`vo&NeV);$rDT>A*(U)b%Q-L zlKL{Uf^Y#T7qqK52? z_N{zck%wHbnzw8l-t?N4Q%ys3q=aksiK210t%z^6ADDyeR?BRf^^syeTV$kPEnr^-&k)G~ko3LViGJprphAgQ!uy+A9A%A}B%l%moYA3&owK@sUp zlE8JCk;+0_)(1qz(7aehh4jB;m<>wkp+@esljZ1kCR$J>56W#GM=2hy)x4}5m#CeD z8R1VTMuiHZ#&(eK6Av_I66DQkJybPEB!@i%DwxYzmWPgN72?j=h*x+HD^zN&vrZ6% zN2@0j0Aq=Ox;gF)L4PffG0uYHtTbu-PsQ%C4>a8X_d?Fp;Cp%oG;K-c5yQ zA}X1&fmiRE!AeiuL`^Le((|PasexipP=2oN0^QIEpddw~Q6FEXN|k0Ba#D&N~$s z=XV_`y;G+fv(j%&?zFbk0((%Vj(4Wc7IccvFOEUrAF6*z@c~Uj7m>DefSMtsQul&! zTS(Moi*CcDVu&zQ1a+*!YIvZc4q`^8rUs}+Vj_`U6YxZVS--kIaCnL%E;gGY18)?O zrWvZ#Salu1z5?I6NxW~_9vK9i8dW8*eOKG?ZFdaqA5{rsC6^~fvnK`UQNUU;2I81b zsxU;7Q0Bm4F%RvKtZOI&VcByIXY|3_(xC)Nd?rBX5D1lZic!HhtOm;HVtJGGh6g}Ph!4Oq|_2cjIo z@i}eZHKA02Gja%V*)keEzZZ!bZd0}OASV-}RMq%MK%BF_(*MKggr%!!t_s}p(vAT% z@Gpn1m}UYDO{Afw#+RPua&yWHL@_lQc6qD8)7!Ilq-Y{G64W9Qdh}uel>_(`Zzffj zX4)YHX^~dEm2|1d*fWPg_yL{;fxdS;2l|ghzWicFC@W z%uGX5m6}W16h-7e0H;=3hd(U^ZZ^4uJH09`Wcy8~acWRofV|ONP)8?xlcr?F0jR23 zMXCUr3Lo_0oR#Uf_oZyuw=cIZ$(BEHgf_OsFsssprNbIIywGxqVBL0d1(Dn`i*ZtSyIspeq#yFD!&- z)zt5^8th((PDVx$KuMU@HCn4k#vR~ke%LoULEi}TET;Dv%p?`IwvQj6#>eaO&eWCV zdg!3al?yhJ#^sC`DC-$_dskeiz`nr7?@Z6}Yz5jWdZ$chd>5=Un*m z&eW6cV7yds_9T;B_o1S25-{0T!nERTU<*49+}1|KOe>w zrAB~nmGEe&%pw9NAOwC~gD>Lema7YUU$Q6Vz&*mixd-}*$b=RCmvDfF^9(R#)Vijb zY&8JbhXJj!aW-2680QaKcx@{ew|kB(TpjBGA(Ob!l7@WTP!erTxok~yy(0@bRIFmK zSJ%lWANPl2j;{^o2bK_9P>f^vQ6RzH@wgoV2M(yoaKB)Pv)jMOmK_K%&hJS2xydV* zl$QEAiGNsL<;I|NCcl!E+sN8B-21d@7`mW~^CxY#($!}3_*X*}Cb{%SkY$LZMj zuwnFG9-=TWi5=>lt}~zCvMHoDNSHedl*Hr*7^=TSg}B39<}>0t9N&eqW*5Tg&TPO> zcc5m?S`XaH;Z@ZSgkRC=hR1uPT5!aAM@FEyTkWt6&0+z8jqaHf`8;6fL8G{Rmrr?v zRQlGH&b?J&vYuCXe+Hl~4W}6H%Nyg1o?cEZuZbVjz0|c?d!$hzpkTTAja%J}=7_%k z?3H1jbNTS5CgBiOz;xN);RHy}hRBgsUKdcL{_Op1S4(VF_$Gz=iUGsX#0A`EiQZLL=$a6{N;L9*jUGyG;z? zyaKm%7qI3_FaoT+AY3(W+mY(5Q%j;cMZ(=VFbDh14vbqTzvdO$C@>F;w;)I`Fu6GgV zH@0a}W6}|JLFgRyW7<-(|172f+JqmmP`6wxien8!tQUr?CkAbwtqyiAWa+LjvV{gRZkizYwDs^hZ^!58r~@O&>Wc%#mNYcij|_ zdz6lJaz(!@jbIqIeQQCZYoACe@FKv6OGgsE)Mnc+xVM8Z#~q04ItX0~y~|2+-fsyHFD>G;YX;7Wo9FibD=BVS%q!gxm?_yq-aKoQ*)a9r z!ZxDv)qfa@r~qD|D4gKsA{bwj)&1%kEgsT8wd$IoQbXjhbdKK?_@kz~Qd$jYTAgqK z6twsm!G~SPtm1lB`KR=Z8anYVVVbc(2e{eD0{6)t}3j46-zthoGDex>XZK@fT zBbJ4Mb&YO{T7r<>ivpKr4; z`XrjIjiPrY|Mk?$0|&i4PmYrO=J#mMDObW3x4|6RQ~#mFg=X_PvD+xE>Y?eMp={ox z6*cz78!NSou$3>tRk%EA-?^9AU6mp>%o(g&we5{uJ2h&zQG??JiOY5Ck5_YZ5o4xO z?8bV$W?BlDY?`%a?3|CB?~>Q}*zFsd>@OD6dOg2SUhhqpj89=z#w=?MVu2fiD3~z+ zueUT+CiFiMHY`ccdhBVGhPSTHp939+7ltZqU2?{nPAev7`hRO`V4#`x6M|JmcXwh! z;}VXEXYM9^Hdx&F!Gk zW?gmefJzS!@xQV2UH2?nO>qb_iXpO0TbVWA#5{fF^rEVXov@D8|S%y$Lg+t~*9DQnnmpJorA?tV5f zU~mnNW6E}5ibId*Z}7kzT;88r+OussS0Ntg3UlqRA`&Y%f zRUwR)kca2rgR4q`?v`sPLYVsjqLVZAEr2J+mgf%SPiRdGyrc$i#ah82e14o;7cGf8Q8en$1bx?}zR7zzwlhsYmW?V`^yptJpbYyOYcG7})_{C2b1cN4;r@9> zgsP|t$r^A{e)*u{**Z50z60XhMAZKpu12;Y5%(#6GPb>bCxtV>tep|PW_*$SNU}>L&!Co>e>%D3c z%OP+?PPP<{h8y=0-;B0VC>r>dXQW6@-q8BoMG7A|OLuZ2_Z&Jeua53zvPydtdrJjdFNm{>6|NF6yKDki&_9yp*hHnKXod<0n30izWUrH7;AobEY`G8Y zVxFY_fPN3oW~z=y3Rf-(v@x%vh2Glcq~;O!5(b=*W|%rKvm?jCqxZ%cIJ8az+EXs zxeNR##up{X7GyJMgEr*EBPj%J$J6Cl3)dlk{!cNzu?gVUc@vJJSan-MufXQ|6CB?-B*iP|5fm$C72Czc^m-ZNLpHaPce<-6+{P#_8?j)G;VaC5MuY zyogI}ofso%a-XE(TKA}ZXJsr(5(AH#B((9>@Kwk!4i2!jR)qAGh#Lm`APJ!q6M}Q} zJeJCbej0OUs4aXfrxOM__%gPVP%%3ex}>EIaCz%M@B)>EFj}YG!3o=ZfvY9_Fl7r^9$Qq{6*Gsg_RjJ znrlS~4Kgc-9TIE8IQ04yMg{juMrnD~-7qKP-34CM_4LCR5r4udp`#6{7j>)0*O${v zSoxlbv@H%EQK1sPVc8R{=VAp0o>(&?*RNC97SS?L-vAE^3`R8SoPy9thzei=0Mij{NW=&|s!v?e^uMVMA`N)t*cNUE8#4gvHb?#=BmJjBPwA*f%l<|+u#~k+oB5;L;eJ$qs@=spkJPB=37&o)4~jGU9y^j z9-h25u76QgBtw@a#=^elSuL$^cM0P(CtY|+yb;FUD;napFh%e{N_i30&iJ!mgC5>`F?q~RT{ zn0S{TAVZi%bISnc5xD0{uNG$N3O9U%1#ugbAsy2fEyx7_`HM%8Gg>9}VR)b++xOmU zPT2%PcLmj^@S;^UgsSE!@n1jJGsWdgCYHy zpu$`2)sF$tk(U>gJo~;hjYUP!f>XBRtR(G+L<#t)hP6IDjXCO(l|%p8K7F~&;r`l| zdE1g0*#oJjEdUHTU{-YmIkL7rqILjbtLXeNa*>4&1o~-50gK}+?eksr=fpJFE4%Dg|wfS9P(rAJ=w)Bj`YVv zvgu69&tDFyWUPq#{UV2?hR4q*se~i#%Cm*1>*lxb9R@v^vsUF+5A9*`n&|5-{qF)o zjgQjF%6T>h{3F;c>^UY4Px1XbI;5i7=H(Nx;MV_=0os#H2`uBJ!qMAxb)R*zyjIB6uW{=q6-)l8; z=tOi#xcarDHgC}UM^lr3-3U28+vusPV^ErVrc~_$L{gToLS^ovrPqAO-9<>5KFgZ0 z{^g^=6xBxARnsCP2PVB~t)Og|ts0OTo=lsohuR;v_N|Jkkq<>mrXMIffWuzcqoQt+ z+IvyA(GQi2?%vd8dvhbB8}Dm}u3Lt;?v_**^@yoJUBOaB8vj1W@kOePQ?XHVbFQk0 zf~(6bqiX4#h+Wi%VnvJiRxU<-CsTbXsy@XDV<+%E>%x zRy*3_1eF#gvXZ#$$i^r=cBnjJq4Ku#a&kzl$j2a72l#XKWr#YkNi3#2Q~*J%Cm)K?W{%{>+^8bS9P*Cn0$7V#mBsVy^Ov)0(;k1Vy-#A?)n z{AA)*URJFMnMO8r@uN2>)nH@-cH*#R;?+jcCKrxo zYcn}ev5IqJ^L{J1WYu*ftt0*#u1!sqvVi?@ur7-;)*9ybc+|cpTvMA;`6=5q%+TnH zP2ZLr6&sbPSBzY%<>@H1h+W@XZeI{AYh_y6XgYGeFbg_k=mdqF{RoflJ=AcG3sYzG zv3WEh<=ZOd_{>G)A5@20JfA_?{;_eJ+Von#REdxpXt$nkq5b4Qk3$Pw%2bRXidbKhU{TaCax473;A8SkAKBcG7HNy_RjOc&9 z;1gw{S;dnn2R}1vRy&?a%(=

    {VdL>15{~Q8c-1#8^bF;)d}&T97(JKSnr+d&Toq?=P)dCw^EJcacXSx zZ7rOq{(;Ryd@w+$R%_Q~6PCHmZ|MlI)Ld8o{HdQ(2f~Ml){o2}Y&Y1g+NvYEDC!30 ztc_o~&NjRuna^e>%hW0;R9E>RTEiAcm6H;1jhQijfiO62rY0ryzmQ*eY;7tK*d|q- zextmbc5Iwu!Ou9auaWw&s4;9^t~v7;J6vG3fX;WPakO{!{EvhKK+)V^=_lbZ1^@Rx z(f^EM{{n#dXF%&pl8RZUg$urZMN+U6BZmqV@U045#3qMHa<6XWj}wD#g>YVWehSdp zfq>~CtX0odatN=wy`Szph}kaTGkVY^JM^6pA=UXSEM`-*gj`79X_G__9coq97&N1O zPtfKi&+Y?i%*)+jtJh{NRAL^XY8(__jE9}f^v5k8c|UI-BG{UOta5kwp1vD!B1&qJ zUEiZ$auH0{nRHbE^h#U`wi8E zZ=X1)z3n*)18G_#nf%)C6_QFs1K$qZ4(`s_>eYB;Ye7W5(U z7mduA6u~5VEU`1B;6ObT3OEd8ZsAj19LLgty*@4L;3 zp@a9M9u~M3d%7*E9B-U`sML}VLpClR(>N$zo{(eVu6ud@*|PsfvvH|^EV~&B00530 z0O05P|0L}h{7Bmy>RHnK=UwNA&-WjUJrA3M;XmITZ-@#QVPlEKIM0n3Xl*am>|kxV zqgb=Z(Rh_(NsT7qhOLE`AfE+0c{{Z^g$xZHo}q~|E_@5fQN9au@2OcQHpa=@L7z0w zc;os>(=vJFChs$5hK&sk4DNB04g5(FMZs#yyp5ybs)V#Og59%wrVss`{_~HS>3*7H z`oHJc#R&}=L=D+#P;kXP;oAd8YT?iW*XZs9A?dRvTyx40)qL-m0~jNUhOglTKePqu zsrZUysSESYLkfh{j!VG6=zrTRMU5L(3Z^361HC!fTDzvvJ5YwIAFIjnlgGK+Ie?Aw zx}OL`#SO2`f6iNQp-YwIlgEW;OY1>%@Dy|4-JWP&c~LkO?P((OD21nfkk`lPPy}%b zste^Uns}&unWEe{WFKAdPoWUGo^WI0U}N<^qEBuDnWYWU!~>_s2J@S%RT^TZr`c?G z2MXpTH$ta966!V6JSS$Wcl-q*Fy;1ONE%l7P!Xcfu5W$@Jgp2}XU`N4dn?Nqdafjc zBC}D_q-Iw3vPt|(ak2i&s1!d?af$memwm1lE+GA*KJaAoW39sIY z&2K?YWzecMikMYt3|Sq9-m%>@Sk^hJTzZB&`;sf3t*g&TaanfA!N`g}WDgp}-X-Sn z@X9aDk`5yXMy1O?hudD~Z>)##b!Ur5pMy%@`7DzUC!sdZe?Rm2Ho!w-Yp&)veUr}| zkre32hrlyhPd*QWugD~LFG`>F`_)+%KhJr;_pu-yEQP2!sp>^ORZ&led9Gd5 zj%YTxJTCtQi-Q0CcSIfx*Bl>9*sRBHrdGQbw&rS(UdC{R_~YR3U+CbziK+41A{Ru= z_g~&T{nrNXpQt@JYu6+npNKs;_xA?g-u^o(Oj%>71d&d=Vm;VHbuMDIzKhvu*E^$na6zs4RM-7JDIZ+Cewch}Uxxs}1}w6`~4u1lEY{LmEQL!j;l; z`JeJs9ANAzyh?e(5-3E4pbxYO4nPbPKk|@hKl7$lFOxRfF3Ok z9VeGV5iB=Wp>5`2-PoYE58#~z2`8tVOjVq)dt(bF-yiQh*_<2@SWjqK`nm}zgXO&k zaOG6Y^C4SU>#I_JyO&*!7FC*;tV5Z*E~nIF+-_R}qz;THq;`o#XHN|M$8dt0Hsfe@ za<32VvHQZvr*~hjo~!K1T(vO2VoyW6)SP7!7~ayBGl1Di1K1g)*chVfuE6Pl8{gEJ z+lKNhoi5@lt<2PVTTpYLB+(l1H2_1@(fURDyna8yq;=%l48W-@lr~jqKAOGHGkCTjb)K~Sv zqDM!AHtX$jA>SmYtR)nN?XQ@QmC#%4)+6DEQ^5*k0=J$BMj`#yFkm6rFuCTQk7wk5 z{T2(+$|fMpDMFoCVNE{?ymk50cmn^Ts_=_YS4p|iuOmC{C=DlJe%*J?V*VQWQEz41Bd}~ zh3{Pe$OgIL^i8OkTmH-CXA~qB?8q%!?gp;S-3p(WP%Tw{SO()dt1&2h+FH+18#^rL zCPPbK7ZWL3Y7sk}fC!R0O?NT4=(7|>mAvAV&jJ@ZNhzm0XiZs-_R~^M>Vp53jWy1S zq5|tbj-Wx*2(=ob2(y!i-P?yPq@LYWde+&`;_xZjHOgX(1N%F#j#=t6YTpua)6&)%0y01?sD}gf-6&*)T^!bh1uzRgf0$`9_7` z+`&rN5%TWN{nv--i9gzc=?m-E!|fca2((tCpZIk*jSV+}ox^ zrtdwFge7bb7dB#B^chRgt8!~ddRYdsD6Vbo%xWxU?iD~Lna3vd+B}Yfog=Z= z72obC*8E7f$6o~YdLVP!=#V%1bvRYg>RA$G-b#O@+okiN6aWtY-9VoI{%Sl>wYT1y zrUWR`@UuPn{XxnM33gYDWp|5tMKey=VEHI(1 z?2z7(dir3QnxV1@IVCr<^@Fa`C5P%ytKd;qONa%3$QLCQ1AP6q`ZDPtfcQ3RJ@b>~ zaCcoQh-n4re6B)FdRS1UXE(i~biN?}UIAj9TtU{9Re2X-%4NcHhP`6ebR6Ah}u#-?AR(K`iipPqzR(w zlX#Bt{N8OXkR+tDUS1c}ee)}tN1tF=U~g=MKxo=e(Z@W&!s;h1yD?QSvP_h z(QITfn@xPBYN6#A>2%FOzPAESdfkiCEQtKNE<3a_&q>=@xCE$7T(w?1qn)weyaYDV zF%LIE*hm1tQqcux(56cBSsg7*0zuf+&+>q20o4wX}sqX1!&QU!m$Tt9G$i9nZ0u z8nXRS9B+4o^^oswAUA>)LcIjUMO?)B7rygpV_k`^2${&EycOd-&$VQvVl>8TBb)AC?Yv2E7k=pZ`o z7E3j+sDUCJItnA-23#HOHgsT+rZL5t8C3ArK61)A&467i%j>~gUi5i~9*pr0O^kGaIeF?PsD#W!F&+zxUtEL)FzzeCOwZlAE^e*Uk~S0f%R& z>^aJH^MfY4+PZx2I3`ajY$7E~edQSrjz0)5)ONTw1wk!@g8XsJ02}RovZJ|IA@1Ya zevf+?b;sHj4lK<@clASXN~9uD^w+Yoz?(T|*NL?B{2k?g7RCqQ>`fHZRZTwMY#x~B7;h+@Cjw3EAXIstS zrcdv6MH{g1;Z!&JSK+>s$%Qs!Nlgx<4jyF8DNA1ihc&Lj+Vm!1ZRggOLeSql-94Vk zHlM2#gbV&>Q(Si%=Hwr4-2cG&k^KK;|Nm!AzEK)+u}QzVTVArD$xZ){e0UHlYHI3# zff)Xy=y-L|Y_k6;jm3U?@&C>+{=bTje<_Ur^U+W3(WE40vq1~ZwbH{cK=XvlDuLi4 z;irv^$OpS&ghiVR4n32PU{IYXZl8X&5|e!SCLtF2``#}Wkvm+*(~x>c%ASaXM}hlS zH%W&|7t*F!p)0;7=}i+{8vfaWw5ZfJ$C7`5_n*5JKf&;ufP+D`LPR%!q8`egEmoMm z7(RZ)(`ybDzGPRH0}dAE(pPl)Pkrbs%WI4< zb407u^0$(1Rk;;hr&Pf-K$L|mH)osMPHyRmO~`kQQCZP~-qr}AIU98T1-q+BjNhJ7 z4GN?i4G+3}zc0F2P28Z1k`=$_D8ej#10ow^$60`gqdv6?Ta_o_LXMu+tChfN$n2>^ig zujl4J;IDd)HugVKH#P=ldX_&Q>y)~c!bUs%*Og9P!hPSE=E@*MO_qHLuZFw2DcWu( zhXb3Wa9xsM6~2)nM*7!Vhx2~y>Nt9ecPky-#ye-lmPmLfyjhd_G#K-e8FU>CNJ6gb zUFp>Gs*AcQ!a^FenB6^CE$Sky39YUf{hTqauL18W59IgDPNVE4$8!R6oUeuzw2BzC zO*hfRLW=@klC+oOlg)~QuWMV58hwZY6@lx$SE!ARiEwEwiTW$2xWyTXaNtc`RLExJ z-tPelpZZpJj%<3oA21xpmDk9ad>sAE!Sv@ew8RT;;+ZWivn8_~7mGeDKK3B`{gLo* z?8n54{#NV&j(GM7c~Wjvx=F%&zG?)_EC(Swh>rSl}6H||Z4=OB!i7+9fD639SwGX|ruSxDMdk<{~0iQWu2 zbEbHFN#8PXVf<)@NLe@;IZR8P5(Z3I36&hi;BX+Jm{|*YI``rt>`I9-UMe`N84F7B%a~#U9;N-H zkK+-2lVli|@V+(#Jg<`)xFzZOmdOkrvErcY*Z0@Dx4j&iMD5KRHN@YD#aOWQ${WFD zbT-c}96?%jWIWbN?R(H2c}?KoC;h>fI3_?lXZ*74?G`3mALnN+o`=tw{teDGj@?@$ zchLxzs}q+t9L%!Q>=hk$!mq2WnO1Wwtma;v133-Vfn4_|FW~8i-AvIskF}U6(+mei zoJ;4oo0{6LlwO^R3n@<%{0k|VeKyax6KHHSm_M@fJ8=^e2QOUdUp=R{6qS!|Uq;;F z_r-0AOYcZHNZgJXGX~Ato@bhxMOK~zn2{Y9o zUTp8Qq4jo&4Epz2!4eKs60?aWrTZYd}wdAR-CHr|E$+69xj$nSAJIY|Fw$j@s9HT z4EHAT__zOc>En$gH@hc8-D_kL{_;VE9*Rs8-0g3< zT^0xRMEs?^eXvyEEmo3r-Soi>R${g|9E_x_X!1GCouX?l4DH-v$& zsSYIV(Y0%9yWgAy^|bAaY>8WZ@$4$k;Og9OJOf;*U*oi9QoIa`r0P~GS!^83U-%aV z_Yo=l@qv@SyByU}%ou@|h7*716p|tUU2%`>y{u*M^cBz2&Cv|LelTdndi|9XwkkGb z`qp(Qx!3S8kvV!8ZZL4;MCsOiz(NqavKq0P$3i;eJiEgR$!3_EzDs>V`WO_7Pu&v0 z-C(H-rBt&srO6HcHwG-qT!HIZ$e;sfHM3xOLk@>c8PgW;F>~}Wi^Th0w#y*;4Ds{FDeCB|1ybXN1#2Bfgb)y!Vf{XqC=y&8a}0^RbX{>(`dD~mid|4$ z`u+3vN@7b4zsN1&T!dPBbdx`^2-!(|)9Xo2W>dS3yJC7&uJS5S*~v>kyJ`9(DrW^O zzc5AQIpwJansA=dSD0u-TV((um8|-+2R9I@^Pg?$+x!h&998L$2Wkl{8lnggyByb* zXP>~9mfBSYWs@b(;F-F09KOg9cAA!0oxJ_jM>sRXVBZMbe)DQM$9@PwLWDG}Ysma{ z&oi^G)x8`(22SnSyRWeeoZ+K)Y3@&L!T@^h)v7NRZ>C-7k}Rz-29J&8u`Mit-2#TwOR7<@acfANSu6Am^DmKWJ_J;#gSBU&Rl4etj^ zj41}U?-PH%HXu7EpngKHk}(J%n;8I6AGi^pstc+|i;h+?hyPZn5?u_#g!DM182vqw zjTrX3fj&=u@~T)i7XA#vfqb9VV|im;eZK54hc>X_M?QBhea>M<0lBUYNrf~NH}CIO zGw9lt2@+kHdK%}mzfn$DAVC!`w-oU=(0|VxD!%oE{$ccR13ra@Y`#|EkuZBT*6e1?eX=;s~2j9Kv9$Z>ZZ3e~RyjcVZNT78AtfJqU{b zdzbQQ^WM{}V+7^ z->WO^2|;5%ydg@cDRf~BIr~{5VvdogH1%VSI7^58WvZdySgc5;;5{cVLlIb-PL3|dv zQ26LhrqAGqAORI*d{^~}p>WGKjQQY;p+2eNhLqB^v?Fj)#+VjndtQzHC~4aE+$IgO zjoD^`MHo@KI1eA>QXZQzV@JfTdL{gQ>nV}j&%9h3!s=zwnec1|&tDC3!@6?g(4X4b z7RIwVcg=u#UUvDUOR9548lr>#cyM{ym-ztkdX$UcV@|Uf`-C_Jet8k2=9SwwgI@sa zxPR;R8N)w)^U6e~C#@M;fcm(SS$w{ZC#6vZKcObWjTU<|@kn4y6KOn?}+FR9!RyXr?kJS`aIm{%>w7N=dD zo%z|2un-(_L(HzE=pmA6sU2)33KAIOw5g3mb2dpBv0oB(4CRa=S_!ceJ`p?0^r<_r zl6nNXzCmX!B*FFhClhBTD9R@^ll8_Mv&_Nq8=&cBDIXH{px+7cpb=$$aGVpHLM_9B z`xvU7Zj2JT?B!N*@F2EO2^(u(zYi#Fi;f#P$1rt?6U;>9R}{m?*MGvcTTC+5Q32KTEEY$QxSvZ$uAQCYyCKi12gbq;b#3-Lh|1p?1k0_Q?iCplK<~7xY zNJF%<#WOI4M3{s`)RYbF4$p^>UtMF3g9`jhOXe^> z2~Z5k92YT;O4F!C1ML{?f5AYNmx z8?lFZI%{$#46%?zfbl0lz~UO~0i1kQX)7PBoJqr&K3-A_B$0cOCjIZxC|lL0D?f4m z3%Ep?C|-P;UQA{B``OoAx4ytiY{5cqRw*u3|C>20(0wQLBQ{e4U@%B!&3JP~dFbGG zZDX_!S9DseOh8y$2KsrfL6I!VGxl*gR+E;-eb!F!1bm%n}ZOlD()a|j8*E1#H0e` zo_NH`(VoSQ>Ie=3wd?mXdhWUbS$`Iv=U~HBz8tmC5RFn5qaCG4il~>i|I}ZqO1bFXQJi7e$Ga#Hz%I$JVnh|eOD3f>_lgJx8{*13vS_F#x+D2TXV#v8}Vk)!pfT@z&cqTiJ|BTp2@!Bys6=~$t7%2(n_KW2yPW%(l}hg!A4Nj7k%Y@0Cdq^cZHT@sLfNJG zlpL9L%l%x!{U{UC%9qsP?mBa^{w@3&K^FN6htmJzO}A7Kl_K!<26Jt?yv)wrjgnCX z#RxIv@P&2^1jSN*PZuOMIv!NnnI=KvFi7L1yywA$yA3WQYHrPsB^BNtZh_kL-D;xa8w$%1M+@*tK0vg)y1GD2z}QTQ-7 z@IW#Yz#lf^reAd31{xR&4vb9N(6Mr=1d5qNK&o89O-AjGo9An`pA7~)-~#r)rRi_t z^U^2la(D|dE}dU!ZM)4+~ES4)9Or1SYRVkPmuds86@}PgrSL0ZwV?9+RFq z4IIOO_#Dgf+D)mt_@9dSn8$iQjL~v^JM24xqniccOHudymcF)C#=v#wlwe4G<_G=` z*5$IveS~5A#u#wQWEV*xE9R*W$&(*FLtK8V{&mm>y8pmvq;`K^nfrnTmlmvF<9WM@ z;yWd4Tq2Y_?Z4keBK>Rm-lhjc=vUdoA7*;(DM+`s7xIqKa7uua@?-M=w`Fi!Ory|u zF%`$ag43?-9p7^AI11figcuz6d>&6uR8Im-Uq>Jp3{jUrvAR2*>9mDs(CQQ3W$^F7 z&N(g@x*euEMu2FFDLo%s4uVLy={TGI)Ppx)gKR@|M&mK&rcb7l*4T+o%{8Dll$WRxsBL6$u?5# z<2;qyOX zM*V`U#YGRK0|_icS7{*0171S&=3kp@ELl&i?1^M@YiG4nDs?1^T8)AerXUoe#OqT>N)cP{p|LzPPctHV>Iu2-U&jtBkl|&^^)sA zhpxD1)+grODk47WN->(#s^Tl55`X#~5kzCNlUwx*{`2Nugk(*p)n+LS8J#u9tZs@~ z8hlQyOY4*vNkNI@9TkF2ujdaPy09ujim0gu6dzDUr+*!TDwiI_1Y0d9pE|NKWTooM zFU3(fNdgRRVuEVM+J!~%m9hkBdx}h`s)|K~eWG1e|H@{{MvcC$cwCjf-wkLPB!B7p z?pK*lz!fbJoV%Q`_g~SVj}x!h*dZPuag_Ie8`2$#9C50XJ&NXHxFJlK?eR9xR(MKm z)pX{G^Pqf6SOEzqw#{Q(+XwLp+W`s+sb=rm&(0DulG6FZB#k*MPy1fWRBVMe9)+ zonw<=(Y9sNwr$(CZQHhO+p2U{+O}=mw(YJP(b3(nBksrZ1NMo%_L^f%{>8q%tkoF` z^#XEv9%&@}Gbck*nkUGwmo=LN`t%+Q82o22c>MXqi#c{4xY2j?4I+7gWRXB=DmQGzSx*s4jSxsFP$CSJCX4yx_xOmhz&w)nF3$yk zIqv9=r^_nFTm{rI(_)VnCXi8R^AW_72OP=t+J)*Qj1SS9qN1o^OHaUFVpa30t+c$B zl5(9f;(+_$C2^}Rn})}bv7g0&fte<#@(+oj`Kk=68i2a3DV;Wb6~seT2ps;Bki6ei z@u0sd8lIdh@oMDko`$^;Ob!a>u(Z@rFe_;A%6ja+)a?pr3J83GyOjOPkO8}-Fy8ml z&?x)?JKGfuzc>_O{=q0^CU?fqm<`@paNRzcqrO)mxlY`z&Z%8~)pg!+yA@QAA2Bhw za)(dbW}&Gnnu2dSIFGM9CqVB;9}-R7+ir(>8K)Jk+Yq!-1f&nD==d+7kZGW{}t~UAKLux`mn&7JlU*J{3qUzb(8p)ypg0D1%deC^@Iaq z1GiEX>N}3;lOd|r$q)8GO71TF+Akj?`A}-Me;i=R8`KcmrhbnGV-d;d)H*C&|9 z-*+!cYoj!Xm&E&0s`+x{iSyXWs_O(%lpA@g0mBX$z4OvXzmm$X{9(uI8;j4fxNmZV zj{ChiiLU-AqgwT|ePw5S!AOIBWwX(o3MV{4%9|+UXr+j!>vsMZw!N;Mi#q9*;QrM3 zh-JQbVlS(Fq78LXpvI6net{<^^mL`Be!FlS7jbJwPgi1^i4RFGmc=q-N=px&2i7~^>LD7(B_MkA%PDdUnoGr?SP=wr7VGA(aAtZ= zmdQuA*@=xDan(&M=YjsGh|n1^WT)l=9)OA`q}P=Ig4cC+B7uW2g!D@{T}Nu$%jJO| zn$Q{?SvuFa>M1k($w5$qsKG)o?E@HD@bj#Fj>( z#X=3e0-PoM6X&6iAMFu3b?{cXm-{O1kERq_ug-8`oTs5l;WRla^}((6{NYE?Fq{KZ z8#YIQNv{|fvR~mdxcPTp?h|kd2+mOkwm^dZAr@BYB4bru*ZE)yd{?!)^L9s`Ug{Es zL`9Mg_oHEXpa?n;P25hWKr|otIfnG%0+@5YgM2_C!kRM6-~=@4+8xORpFv0yn-tF% zI?sJw%~%l@S#plLDi7KMnp&tbu&h8$L9)59O!;vJxvem)&2}K0K+4-+?qIbd5mlrR zK&0V=d6#=+vXz6aL4ORFM2&r{2<`c-(^Jd%suR1?)bT~HX4D_m>OV;w(lgjOMI&TX z@ng$4*j^8drM{|^Bl;~;HroBJ!n(ON9mqN`xJgi*9BxnP~Vf7CZV1OW00VPca&8YHVm2hU!g9W2l+pLEZ+2w&D&r!Rr`|yi<-h_ zf5UWdnAq4@XIzc6z7D-QLs}qf9)1IEz;y*t=*<;BM$(~cFeiTljsm1fF@x;sgHy5j zau>HlQm`jDnbxzJsd+*O9d!wS^xe8JxHhy><`Jl|RL716iuDV zr6TWIWge$i+l<+kIyZXbW-Fm3cuaIZe z21(Nl5Ac;F7%xJ5kx;B3IE8u<_57Y*; zcXU;MeE7N`0RO&J-gk<_$`QlecedU zlJ~;nJ(!iJ{HLgy3I+bReij$o&pujK>4N8AC(E5+_Bj-(6c8=wMD4GKAxV2Z?B3dH zYtGhSnxMu?{w-nwD(5#He#5z`S=>FbTQ@r%b6>@+yQ)_u^HpbWwaj%r%M9&Km~oZ1 zZ4OpMD?fMi?>B?T-Cfb=N;Wma0{bUvg#b#l1tlhRas+^Tw;p^1F(V)`A*HXn0P2dG zYUB2B!yk9tRxjgBL96qoxP#uM9OIYiG8O{xLH7iY;vqfRq|HM>I9hh+UL{+)>Rqs} zbl>g_TOsY#_%C&)R6#u5A=CuT$2dk*oGM*`KXTU0imUvUb`x^v`Ataj!l-#44NSLo zt3{6RYZ!6OX>D*ivW*}`;M6DXjI2=|w@-A1ETgHP>3d)vk3;`zxTm`Trhizq9DL81 zhptKuKs8mCld0MdWvQcubpSd>P%E{rM0aWo0cbrBR$1uKm3TfzkjZJT!*kzG9D84{ z^X!zDQjL87@3GMM0e&MUQA-h6b zQi*HmYAXh2s1R6cx?92)u*<|td-o!;e=JT1UnAl>v;9* zn@$7-e}0x`tpXP9>9ISNSgx=}(E#I|bjMx#10-RXoV~nr5j`bjCYycZI}CGsB}4Fa zf*sPgqc(k&yLZBN?Y8{dfeucMWJ<>luB|E$$mq#4G6{dkn7ZIyf>Zg9grfDTz1-LL zy2&O))z0nR`rg`&rKY8iIt}cqDt3r3C#OljQoko^H(U{_TKQlG2YG^0ef!=M BM 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Ȍr{+1AC6MO?e9YZN#cbx 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 z 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 z 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ⅈ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

      gAjSc?R`IW8G_s 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

      pPofoWOff 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

      0lr6NSm=V{Kp2*b_YGGGtZgQ% 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 z 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 gc~z_I6RJ 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 bo1SwYTQl*oAFrTky4UEJ7{f^r^AJ-bq5cf z!)L4%`Vy#lE=~{_!VVx;e5j0f52e|T2_=(%Di|tCD$$*wZ3op!TPX90kRE%Rl?_zJ zAhKW*x=#)jb&;g=MPa+}p75abg%^=51ZUt^u%%Y zso~(^ABeBnfa*RQ%1$?G!W5mo(O3|6WpIW{NyWpNcBVSbqJT9-4h6D{tU6Dxmsvo)0jq|n#Z*+Y1f)2=Cnu~)XD$?GHnJqsujFYZP1N4H zkDpsCSp%^&5?(ZXgm(P>BBLjrWN92q7A0`yE<=?W^tBB!ja`X%4pwwMwnrMkVsRl?K~2#(|*+jq6C+(;237k`T=5^ z(AtVK0``~sn5hs*RhUC{9m^^-TX{kKUHvz%2k69y_xXy|BDJ?zq0I+S&aiRBKm!iq zxMUC*;Y+U&tsy?h7PL;uY@I_~uyLXmyhMr$akL|YyE9JCulk^*P+tp=-7?sVBYYLG z$dgW&5{MLQK4EDZw@cg-b|?Cwqs|{N2tK6|JtWI-EkvnUQmW{*pu*OA*Q&%%|X+%s;fzLSg!}_f_-pL~tx_tpyFo9pq zWtN<l&Vt9eP2aIAcdmD<0-y&7!BnsmaRyYGJU4CEQQ(pKy-q~Ru8 zHjQfHx3<{-Ao_eR6)tDV z67oBCq;oR-^61{|XtC13vh~BLk*1H^fZFtHA8G*^1XeVjI3 zN5ri8-L-Ym@Q2i`U+>a87Kt;&uVbHY2;5~U-d7Ie_q(acZ^@d!vRMs8_A;eNU4%q> zJFQJH(Cel-aV9PUR+W1UDAFA54^oca<3S)dgb#>Ou{Y{)<9l-w~xxJo)0qp(g5d3|>tKmf45@n0+;VI73%c#@4y3g~4 z@?fCuyVkJZr<`xL(Ad*`jGtP=ixJTFv4596)h|`gx0&a2n3gS_?tE(#Hs%O%54Ysc@TOXapCi-M8# zpn)A~L*#WmdQTy#yyx6fOZY{rxepU}AO*2}Ob)D+?j!h&GcvY`@Cb|qNvW`;`qAvB zWi&y2xn)*PsUuHD-Vb}dZ(+zVr=ZyOe_f-#oEwDU;2W}ox z&s^E)wwGj3iWdTzC=rX&EACyXTf)E#9r9CwMUK@CvXqvRL%L~7P^W|xKk<)s@xeG! z{hlbqnE9^FoblykgxmMCM!0WaBh70c=~Ta%QD4|TYo+9*#O@W8^(82&Ao8Rc1;TXe z3bI1#v$K#EczDfTvMk+YNl57=^80((%Ve5eKaB2G7f zJnLCUKF68+#c0;gw!fyI;-yG36xOMaur#V62q5a7zSkJ~7O3x;rs|ohc=^j!n7Gji zC!z!R$jcLJkH24vFK)4wvqEnVsI6-q{2jA_r>6|ucFWhL|MS~=nUmG%Gvb}2_~Mn+ zz~9K0erY!3haDh7;SGMNVk%baE#;0ljmpgVDF$OO%uGAWvliNCM@>} z-C}Fj?cTfOC-k)ITI8QK#Yg7HiqUz4Q{X(7z0e`~8!Q=7h>F1_f;{y|f3MdEFDHIu zt?~%Xj`H4(ZqUmt>9z~Z%-96kakojotk3L*p+5d4dxwvF@NO>xX6i(LfVxe844Aq-tCo|=Q*&>(0C*K z^XXS7ef+70UnC*(x;sMCs4qqz@%{&v8(x!~1xte-9MvVQ=m`E`D1zMFi zt=_r57yWV$P zB%|HwVnuYLcEg-f51!hP^B2lMW7kvlwnb3j;wAevr}{nM=MseX$w$Vou?i^IjU59? zAxjzfuBT-7#ZUdzqX8+FM2pN=x%9m=@>juiZ4?S8c51ALs{53_@Bg9eDxfM!vL#OA z?(Xi=xVyW%yE`=QZcXFvH16*1?v1;u{BMnuP6i8nDlh5B;(r`PKlK;Q^{vc3{#EAGuF`EY_v!6>p(>;_ zPYSOryhgcKO;ke01c67B8FO{uZt+4+tZrH);-(Rg$9sY<$uvs_4NY=Qn5k%Q z>nhFR7iMBr^mV$5(!M*jZ~5$((p*||=ZuU+l>C)a&rO$6GrtA_L|V-NefZKD=yd?J zx{9$Z;za?U)Uo-zBn}IZ-F1s(jRy>RhXv)ri7r_1v0>K1jq2)Q)U&b0B_V6TgZa@6 zWSnc`Ur7uR@2}3%V#;1+?q*Wl!lHCjjFlUlm&4vcZK0`PS6FHN zQfOH{IqfnGph9?TXYaz>CnJWCn2ftFwY8bCgeLbJ5qzx#6tq%Kc1Kme5E(~P5{nnF z)}!}f&O)@KQ_mEC7cYXjDCK7E=*qwjk$GZ@xM@&lh3k;5+stUE!?90q+P7w&2z$O0t_2MBJ*Kc6 z&6Ua%Vk{d>_d)zwm1ib*v6ziKrW|c>w2RC!(be#aZEn9>&yTG zjCVm$6)BhV!Eecf;pJqoBaKKQe4R}YY(Ok9BXeigcqAVegqmA;>V`W{QY61_hOS3S zh@gLz;*cdDnDLow2bgYrNzVA;v~A9q8T0#-%>R;rwZ$b+z7qDm9ny=S|8&lXB!cK?vXemJ!8`n77^li|>XHwi(Vwf;1EwiQ=&(`c~VpK~| z?~uEL4`Q`MuM|ZbBSE7KZw(zPLri8&=>-Y85tUJ|gEVzuKq5%Z5tAe%2RCLuHaU{D ze=SVZ8Q1P`4nfMM?2b)}Heqa7ssGw4kA8weM534OWZchhw|{?i{7}9s@lw|6YVu}U zcxjs!0MsW828403(Ti{Q(~|PGW7ZVi!E^2>zghf&U2-YntyDOq3@1f!cKFUf z^$mDN#Q=q@^=MM?v8!gDRZXa|Y{)JXbsWK@6ueXCH8I zShW$R5eKa2sfZQeCS=sjB*96=_EH=;4rk>{r^dh{iP3JSURJQuQM;wZG~*zfVed*w z4&frFDftu%q-gHT%i2vkGIcc=@*?CHSLR`%Zzt8rNRK`=?`YUw*?2UEG0k~AOZ_Lb zlw04q@aEVdq%{tW`NM9{p&8^qq&)@|@51P2NF?!^EFA?&w5gZewCgCnT&Ws30z)`059VcniOAjsd zzyk^w3pRw%LOlhv>=Z{rGtG*njwsd==J_m9la{-F^z|k* zoe)~wg!wX`OXS)aZkEvygy43`QBRXI5|<4VqNT8X4QmhqXu!TZ?)HnF4jr71 zrg5Ub6)JNrN&*;rC2N7(X^S>J{0gCxG3_{e>~tY7j%@27;4h-qT?nUP_Ang$+E%b* zT+a}U7d}4MykeH)o2NYhl#09T^)TdjsZt-pk7V-V?+@hOJ6O>x&^7t8w8Cf8S->fLU>QpW^WiL!%{^aW()6#WT(LLW!`D>f~C2bF*8e1%=AN6gzU!6IIFJDsDXex z0c!v8*Tf;uhjh9ew6_P)iT!S9%hA!GVHCFsTxq_*c2)@210r9P%ED!?KS9{=2goNVoMtv-zgtZ1FwoFXcv#>TgRkp4DF z{NwTGGUMDb`D8KwJg`2G|Nrq<6%!Vgf|?YQ9-oGhq@kP`o2*r!pJUo|kR6w#k)R%? zt5Fb>7^bETqXRFIpQ4{)Vx3}|+JzjMq?^8@UVtH|kr*GA`h1V%7=_Fpq_|Y0f*375 z<02?Rb3qGxihBXd6$+}!l?kbq)^C?r6J5%l`1!1ag8=~G{^R9I3oG#p@hkCvSC+P2 z;rpD=Rwm=YONphbT$dEHBcr4i6My%>KJB(zraOx!n5ew?X+I;kC$}*+(dK^hq=sM^ z6`7EQoN!+eShlV3O;nO(&9!sCtiYpQ3$0eN-ln{N>3gg-JUwZ+Zv|LQs(MEw4`jUS zuae4NGsJpC)h=T>=`w(`a-5d)22gX@({8_2nQCv(SWm|GGIlqWo-n&wTuMUZ(Jh~ zWt4lRG&&+NSV-7z|1`RTDR=41^A8_7Y!H`)V4fR7U4HSEZx z#zV!hkZ7^5c~_TlDHjHh6Dna{F*{d6#ikiVsqW-vv-rhdnhX2Jo}6>2)Rk>O*6}s9 z;Md|$ffB$fl4eH)Y(M2+V1iO)uRoJv7-%=Ak46?jN?^K0I{-?&=?E{MTYF-a0rRmO zI@sr*-nMhm#uD*7G$VU#3*=2HIzhx^)m|AE$h-$g?*MD~%*^LvpNT(@^}Um9sq0VS7l!Jp>Xb5Fg9!^1u08 z-@2GhCX}|V9v4RS;@6*w6!L(6n2vpWe~KYlREd-O_^t2fdxzp@{_OXAKHD?)KelHD zVL@31A?LZ_=u!=2u+1m&i8MZ(RG6VnSa|t35f1Zo_{6fZyWP7m^0j@n&(n9nGp2z2(;om$zglnd)pQu|4G=M? z`0{2<8;t=<^mr`d<5$VHtnvVI#4cZc+;_GRs;x!WHla~9PTjXD*i{cLT@Liy7e!`Z zyy0Wjh~jA`D}|{#T*aLrq?>pg3QjGRCHb`VFBQ!s`Z!XD&*2Ag1XReZNxhFck>Nx_`v8V#w>&9{-76A5Ure z^0}|vsi{}^ML;`GO4RQ4p^~I{gtsHB*X!~v#^ebyg#ju^^BCnU+!*?h*wQ${X}iq1 z{(dx1HD#(Q<~F+tEzlVKSrPK2wB)7fg*GFC3Wc~l6&s?*9xWkLGGhaAW&HGBgCOTj zhZBlWkPHb(4d^3YkJrhNZEk~Mc5xsjXPUZvW(zs%wA<_O6sU|J9wv9wB$v90V=Nyk z7#Mp)Ip_J|l?<=S!M7RBy^P%*jhu510YvKiVIjl$ zHW*hG7Fq6noJ6X+Jt}6y7YND;k8!=^A6H&w!sEsB+nUBEM)x{W= zJF5|a+t-&5hiuAO-(kiZf7Rk2Q%w;C3x15}&~LOnlw?BbSxqUFe!~h{1;uGHwaqP@ z#GOB942y|D67a3e9OVf8wU6l~+9A!B%E=K+?epn>GAm}VrPG$ZC$eWdR$jcWXg#~; zh$p^1>*tK@6O&*OuVIB57Q;vgWG-5mOI9k!34ZVto6#hBZVV1=(F2Ch22gop;eY-O z<7Ez}hD!AOJmRR^7o5`vMzV$&byFU!>v{?!_o(ARdCQi2^LtUm2a_skRIU3cQ5)0f z=VJP|BsuGBX%}X&*RVXW5hGbc;T!A_E;^FuQS+82AD6da25rck0cgNkX^6^2#ldA_ zntDVvShrG*Fa_hKUmWzsA)C-|G|IX^V!nnqx)Y7GG$&XmxT;0To{1{$Sa*Wjo!>Jd zB-=j`M`*`bsqK^8=>u$el4{Ql8e$FR0E*~w`5wTo9VhssRuq-h)Nqp^+F(tkr4t~b% zy|9$iXlY8luaj4B@c;-HE+^zYVc=f2`~@bm+!ENS-x}=kZi6iN{(eU%CkY6I4E&c3 z$6THXBiW}&DLv_*JMurfoPT}g`~C69UEkV@PFL65#@tC)_tQz`ck}`g0y5WUZ^e%E zJ6idZ^IvE~TWdSpKTSRUj{ZX+bU#BT7XB-@{71^~$S>-?Oz{2OiK=;YvR z==3jxu)h=hu}ROtdj7QcGc;L&{?qm4FM`w0zVlClKYsr|SKek8X>9ok&H8u5{1%>hdXO_eaeCJN9>@pue!eeE-J&*EZ;P?C<6}e_^Bf|Bd~R z)z0tG-(6n*g7OLe8~R_*m%n5GKmFXlu!IW##{O4L_wU&MPwnq7Y?b|DKlp3*4LdAMoFkw7=tjPX_&k zk4pYG{=ccAzhnQuVE-@dQR+X<{eKJnf2aICn*EDXGyR_^|0lNno$&YA<}bp`%zq;M zpGfC-!rw!jzX%Wik?>yu&+kOP2P1zGg=GEHmHj6)`JL4(){_{V?$i4Oq){`j0Bt7&b6ZUF%PI7B{QHMFvIHZnJHr_uLtb}*)~ zvvM{yx1n=2Gd8wzr2Ef{x}QodPP&Fx=AV5G4Kpnhjh#Cqjg761F^#^BJFTmk)ql?M z1%SftQ^5xOD{9|o7rXiyp5g!P9Dk?z``}_6FKfF>58Z$9jx6M0#%Uy@dRnIsPB+eK z=m*?)6rKq!Txbo{uq)xT?)5U`15}qx3)Fv5w2{}QB}1jwGtgivYTR#EZo7GYKdSmD zT_B-ZFx`vbY;0vM8E-J?{zYE9xAQa z?`v@hbwx~{D#>*m5N72bRj^7&avoOTyT1?;C{#DCyW1VeY1!RfoQ@xR+h~0eU)uRd z3!$lVk++=ydGnZMRFOW&+#+Lq?%_n;B4I*X}zr1;RVFZ(aH9=`ssvUeHE4<#v6-E@M$2VmrD?H>gWz5K>|><1-;$W>9U{t zOACY5uH0UA2k5`lNI7e%|1iD;t{_(}tXAcRN1kBKwp`s)N@oJxlY+|IvReT&IYDQw zHDb!>QSeSTMQQt6FtaJBC4~mMb>;Or!19xS4wnDa0t~F2KUG-G{~Wf~HBSDeik{i& zFUC7`-ZG+NpVdZhXa3A)SUXG@LxXCaQ$Vt^uZ*f3AAUmf+_?cwAu%`VQsdgSbxRN@ zG-1aUvoR*;eLto{HaQeDSbh~K|)cw2?LR4#iB_{y!aPtZ#wnRphEhz zo>%P5q<1cXdW5F71&xE*+S)T0ECnK4^4(+VddK-Q+YqweS1C6T6}QbeR~=of0|!^9j9sTAV6DGtvqnOIiYg% zkesOWCgYu~)RFxH{JmS_)RNX737tRCm8m~#u8-M%k`LZVp?`_s@+%N!A!}XYb)fK# z`K2s*(?@+=?&RU2u`Ww88#Gq93kyAov_#tk|HzLKgYr`KV+B#uPem#QC=(>WzfX@i z^n2*>4#+lE72x_Vxg<%*9uTZ&KHpt#2&m?1^n#Me*PnSrqhdp%;SEbL5ecKP@BH9z7|6PYY|mH zqOC>eZ8cK=$&JR6%OoG$1_O#SN&Z-)YevmbHP!=K2*dx%!UNLY z*G;DOYAEWJmfcGi8(Wt|9C-W?loDCB0v~Zx6Op$}zVj3a1FZ#GDNOH&f{w|0Q~o zwT0Ug!k3@V3&$#Y1gO8%c($NV)b}pKjq`dDHjs=mzGj*}ZGNdj*$=|?s|3Qz8%?QP z3XAgy_Gzg;)0OiEb`Wp~h7>}pqBSbPVAk2e98{?K29XC)YOg^|GQo#L;OsuC9H=(l zMNvC{N+Vr8=<)u_bc;^K602!57CeRD1X38<6pQ%EwvGV02kOF%^7<@3b6SmPVlkpg z9O6$aooMYm2Cp%P(yO0_TaXo>wLHO$`WOfUGJqC7oAPUkfS65vDLUU9f*aZi70JNG zcAyyR*seA_CEhY&)hv7u3aoWqK+QjN7V29z7mIWTj%}LK_l%kGv{g?3Z}iNpeuP-` zq)q1E)2MeF)tpW!<`sNxYauVsz`Xhxo~^|8{keJwkmkB0d|&lU2!#a;NWI5nFRm9{ z_|%)*OQ1ZeTA*fk-YQ~L_omMG>BTXu?>CxoGQ5lC1AXB#YV`X6g9ZlVFDG0V-~c=1 zyNhI{{f@6-W|4b2AC;sp4Or<=^?K`p=lwAIv_mWrT+b@STWaBvACO7UJp}x=D*}Qb z-7YFsu%L4aX(zO80Ghg%n#nm04oMkX3~Hd*tXZUoE0g)VydD^xt*}+s+{uo=-ANB~ z*&A0&^Yi>VBXH)Z7j|jJ72$N@zq@yFGL#Eq@yw0aF1H^o^gd5KMnV)ctkom-9R#lu zulgzmbf|7t2s|fQCDHF+$Zz@-J_gxnd2%P#cZ>79+WHST*D>J*|^wo9Kf|8Y2cNx~681 zA9^cHrsl1TH_i_@o9-APGeB+iDF|TvD|g&5WXo_2-dbb9427KsN0ja2dw!DNR?{7n z2vjZ_D|#{Q&XKn~Y^Y1zPTi~619Hrnd5+siZXt55VA(qfNEe;3<^H%~e;B(Xr1_n@a+DieQewAb0c4 z>2w{zuq}jH=*C!qSaeSO7SV+kUu5x z5K#o~TXN@D+sE89UcxjOqF%mjv(9x-JJv*wOAn>zssU^S7MVmqA#2%%|j|equv%l>r!>kDb4Nd!n7CoH3Z(aK(7*Q8r)~1kc_}sQt zHW>MYSiqWatnckaeDPGu0#f>1@9gre9QT@kMy=L{dQDFQU_5fuh7HK#xfBs#?-{#? z(s(F~6;`IQo-t&lQnkJ2SaAAwOgrzmlsWzdll2^_oVY<;a9opDu!$HKZbW0h(9JqAs`F zKYM&qG4Xq8X>7V(J$?E4Pu2^u#3G9w?^CvL(@sa+u4tykXjg{a&F+~gme=y`*W>*6 zdVcgGpw?9zurq-K?&8cXihVa|0@V&Z@m(#?6{*Ec{b#t|t0I!0xh{qp=<&F5D<{q< zyEIRI>8n4SxGS75DGP}-XK>+aANE5aXp)0sZzyfXe1lK&kc!^sduJVVpSpAJ#4Fa3 z+FRSaoxPvh(N4w=K&6nRTVYzc4=;imHR!f6%i!{CX8Yz3B06TJ>r~n`=r$L6WgC9! zHZFHZ|0GOxBV(_aTmeUaqgm3ukL#Fh_;~TYvi;xaCFapBDDgA3W|b*zlvteHY>9CWF?yct}ksuv)K2QI<6|FG1}uVls!)M+EIiF z=^(BF87mWvb;mvz)q=@<$!B6OQ(Pd}cs>W5u2~t%F|J@=YnCW8%b{<#d9-wOzQJ9% z4fOc;7wh|7NepS3q@zBNUg;+uZ0@p<&lPv*ZL6ny;^s{y^HCrw>8X4n>dDSpp8)U{ zENDiyJJS`IgmiMz%y^d#toly!a~U;|SIpTTiR0u@r)qmK7^j7JEmB(z3A5@NvY;@VFah^ki5q z=N-Po+`=udWW~_R9;zCDqCo?3F8ivlQWs-TooRkSoBWzx91P#+oK>=bfOr#YIGv>9 zW@RdV$~rQB3{Fj6(U|Z2GVr-??&H%WC{+H!mAfCwmn`tKoj1c;?-f=4rPIW00 zMUC}tvu6bF6e(M9-(AL;AlaZA5qL$L^{_DAouE)~B?Wc)S+5c~K?xg!#4o+`F^ic8B*`sba#-bipd+kM zg?HtRPRIqP9Z&pI=DPwuJd%u4bHkZGphC#%I)HNI7;9l;43Z8cQGIY_3c9>EWn4IL z99l)sLts%H*WW*qXscl@|=mmp%5XZ<85z(gLX91R)g~ zE-zih%^)wE)+!77P|5~&@N#9HxdJN+8?>GHfHJv2l$irWoiyQ`^UimloA#RbP1E{Ftuc*F`(vnUT+Tk6i>!$9U4@BCWGqnxxn z<`EOxyQoH>jLgGl*Z@@3E7@<(l-~r@;i8W{Yz$p;6A6?Zr0;apxvDa1ucOMl>&x*h zWoscdJ0SG*N54ZAHngr6diBx(N*x(#Z_bNAeSBDb0jJFasde=w{rJXac0o1UgPRw( zdY#yrOFnhBQ`~@2gz%LvXv-3tibS~*<^CK736+K4a4@}U5nOOFkVTsKfS*4c=<($m zuh>ZqcAXVkS^?8PNo(Aktg@8{W|@V_di~ygdFkEp!rU!9bs}QH=UOM^_0WecM)!$9DB09Kmkzs(CDOu0t^)G}ff@O;|3bLQQ=_&np zXpi|;&KU2s@eZ5M-owtA>F!D&#%J^IyVERW+OyA3dW}Nt4Kkas?fTcHWG{68>f8Q^ z%kin!6BXeA0Nw@uTr~gx5vgL)=tK%^fl5xspp(bB-9ECW zIJ2{L7D?lxI1{vR4kmzd`j9XjKgEmFZ<@ zI>`|$lNDggM^`TQ&y8LZXx}*lTDi!&8undvf1y$v1)EFLuPG(IUJ+LDmZKQH><_3bBku ze1v1e+UW8EywA)uV(3V`%lYz${X8Ua`qd`mUkF)aAEjf(l7hgeaJz~wor`)AD)pcv zOtq1Zj;^kHdjrlGyw8X=aYV6Mc{`Fbr0EW32fLVhTcU_k4HrK&gE4Mhnn`pZsh@r! zqDQrX#~bx&8Y3TvgQ$BC^$Dq2DFJ2(&o?z-OQ%6-{7I z8IKu?81`btbA0b4>6}2Vth7PfT^t@C-*sR}n;4#lVQ+2W%Azq*{c(90FGcG^#5+zq zIT+|aluh%@FkXe!Wgfbn??-bqPQjwqEXii+F7b9rdz%w-ReGzE_%q%!wSS5se#Q!E zpRI=~ zJ4LwJRdjvtVbc7R3~-MRu|K%_6~OCr?GBkX3x+KjkHi@Mm$f#$(AG14KvQh2)@tm< zdeuE6rFm+QeGaBuj>H7I7`Owjr+J4ARaebnh>b$1d+Wst~=A7BCHU>@DP54qhn3C(5H6pBF}P{NgJ z;&fKPw!GnZ-`(X)7BD{6B2YnfDD7!C+e2udG3HNUK9J3@CzHPGpn3#!Ki%%_-hZxR z>aJ6V3VO3)j1`$Sew}qxzkYqHEj`?~uy=NG2JAAu2uf_16)7(SYu*7%sJFT{_f7FQMS!Ywo*?TsRePJNQmgdyqFy~zGK-`65(yKI7PflhDVkh z&q;08BI7ZQ(DD-S6R&f8TSFiy`v&LF4~(^DsHh9UhlWwkc`<_Upa9L!btyl1mg1gO z2|ph{FN7G1mvIN%6_B5MO#hO&>%Z0Z)YIb$i0RH zN14AwU#A(}Rm39$Smb4ihAHM)jfC~E)f>S+8X(v~`)Oq+o@aC-5|$DWCl0~_BDNW$ zo^uOoG2aRS#FS^(j2*n5lr6j}CDGM#(w+WeH=kC;g6%jP5XjDcy-=%BlzZv4idSIK zQ+^sIFCC4j;>QP&HJEDq5@jBsNcb|8bcUWXd2O;5=c{#i=lN}>;6$cdkeWevEB%FO;0T9<(a!0gY*lo7m<>8xIkwuKWb5h+cvAwIJmt_ay=ZwfAc|?*`ao#Sf>u8<*fn`kmPMW~ZI~D?)K&C7qWOOF zuoccz<|lWs)N8OqYlJsmErE}t)pbYXO}@)hiHV2)Jd8YF4Pd5X&8-sx#lhx(v;m%d zD^pTYVwA>kjzKx*0W=C)r36?`7mtKVLFHdD?YX=P`Zkj2>UtwxeU24c>Mj_beP~N9 zZ_utxucZ$PpsPmNPcK!?9?O#M;k+LDuxL=y?%*b6UEG^<=_=s)bF>QE0Vt;4MJXJ8Ojtzs!A9$ivKl{HYB^hgJdQb06s z-KGw(B(t0cp9$HSK~m5#?pO^8aO}j~z8JD$r%RgXL+b={P<^{4xrCh5r+)B5wGTVg z!h^JVW8;d*GN%y?iO<*X$~;PwH$;rpnAs2ujBd@_1Ni0scw&IrRZ2^mOq_ zYAHyQd2#5(VQ zF&PeDL{5Xb<#L?M@YUJM>WAG4;0OZuPKY6w5M+S5gpR4I|D4}aie3Yv%8$rnn-`5UYc^8qB{drTNm@D&_w98mGNGCjRSP|LdCKDCv`h+ z&M8v)EJ_<&#x$@?-*g_9sH!W$6bnDmn-l3l?*S_~7WyBk9g_?snu=A(CtF>}>05Z&3M4s?I^ z`PfmHbIXyM#&%V*w01C}}FVtD|I ztd>^G7YX#Z5>3I%!eQ4FEaRCPg!TQkls<;yxnns8)(hIQxZbKsQb*vS9=6F%qrG!@ ztRhz3YvArntb;k4*l#eKJQ5++iOHpgUT6K*=n5iQgHFFP}1ES6`%h52Qe%vU3Np6 zt-`wUvy3;>O2M0z7jV#6%6+-C;z5s1kMkjqqf31(fZ^%18!kY!Uy0Z}VafFpT!8R50)O-ef0| ze|_txkfF|uQV4uKRYZk7>4>hY_7(8^j^&yrO>o^&wl+~K2q{49qbCTU0sSbrOho=zDz2S@z83T=;d z8#-OCDb_JYI$Ov#2+moO&B2-GU^wDN#N|BVSNr~+>YEWG*Bdc1ecztm!1%w?>ih{kRow#&`*Nh4tVzPqU z*$EubvO`_X|C6IfXy+rE;-R%#yzFeP>IwRe^y!&@rm%?RK<4(kb zF@A7Ur_r;f;tgBH*ei{bt1O4C&ptCa_0BP3Du;awJu;rd2T*moT<`GZ<+d+_n4Ib_ zT4#Cr0RJl-Z*ta`(8T}%!273EqoI|vX5!!=q2jv;EgcM03k$Er=9mmd_jPs%B?*G&vZhiBpzJ%mto= zC^=Z5O(yxu?v+hj227+H72}zde8>a!@~<3US$u>+r%y`(JR%_-m^I^{u0vlrG$(!- zR(=RxTX;WhzaGc8rD|)9q5iljl63IqpO`?C-T!fO1N!bMViK{q`|z|qoD9$cJ?RgZ zQX`UGxYmNSM7&J{Xi@sJKvmi__L4<*N}zi92y95?moK6j`Y_*FQ$yT*F?oa>#fH6L zl;>KFJtI2wg2cI4{7CxM-5DecV;RVI1QY*GCi8XMyM&QVT5H-K!L^ipm~K!LO6e!wE{{0Mns!!FHF9(nhJ$_Xx%VCQ>yFoF>HlTC4D+Km>sJlTRDuo?^0zPN9K7Z(NBxVktML;}R$(i)- zlBnrqF0V(l_&pKT2`&x}N^f0&Yoax`1__4(c%0!r9CSOf00ECwd12Rn1VvHu2D+c@ z`BI*RE|N*rG)DQ^;z+%gEF_Gzb0UhXIj1SOC5iXHvRIus%p|#>v{BcOfn5+;;Rb`O z7K<)*UZ*?zm-A!;($dTo%c6?)xm`vAr$8Mrk+7b=lcd;R#<)zMhHj+*feg~V8K^Xs z93C?ia#B{U>&ecaSCg5$%5iq^$CM-l!jXppO4#D9+l^a$W_}=;`i0uqr;-OD;10fD zuU65mvT&x;k0pG;QzT8E3WSPIMjSzhV^0vP-cQqNz7Kt=UBi~h$j+C>A!oMD^yiAr zDV=xw=90A4JWov&iRtlNoy0DDkbN!K_7ESzd0jEX zHz4B@^eH|n4_i$FQu7pP^d=oluNto$E?A;5JSr*9iqE(FsEpjJJqM2sI?6r+tD&OF zDL3uLS8|(5MNAFj-;A^o#7{BgK9G@}bAe45t&lV$R|61AS;VI<-G9;SL`j>r@Oq$E zO4|yYKjufFk&}nfAwECZC{w%r@x!h)uq;5G1|6n(W}SRN*~ePI>?a!0Y8`o8Wp*T& zp-X>)$fTbAo>AI&od}m!k8L@8Js&qoR}-%-uUPp6t5v^FQzqL^@grLXn4}$=X!Y^x zI*SynUX6LR=l0{HLpHESo2(WN5y+#Tdn(TA+8tJ}9QKdBNvdVG1$kfR7v*jATu;A@ zyw{}m3;u#WL*n*&xjzRiPv(6qqgb)piO_$4JZg$xR@2OAuj)Nu8mQ`JW4-6z_N}F( z(a&?;(^-6+c7dj;)r9|5W(~U{)#6n-?4CvLK zd8y1@_zrvHEj%;`vS!h?4zsc9(Yfm3qE# zKO};CaK(+z(;{~}pU#r4gIR`$=bbrSugPUDa^&?Tc)U34ReK$0^PLYZM*sV&J8YfsD(d&L^#>qQ7y544aKarIR2&u@$v1w zp9j(o=3JtSj9Ciiycu`dnuM?LvrF2|E{#hf%=D_O)0d{Th@}a+m>nuINc-P@Wjh)1 z4-QqY)U_%V0zJVr#}2pCF#vATSxRt^h|ErzUN76j{CW-EyZNjj|BtQqAE{(Fz2+m% z&jLT=&!sYge;m7PKdZR)|E%!Jh?oAO$}jlh9Yx4P4Cs$4zd3zyvO5laKgB+q76Wvk zWfN?e@Lh3<_171LhQ>RhRw*=1;iWm_kPVhVfXtaY1-mdy$H;o%0 z8Y8vS#H1F)I`t;TKrsok8yfUFGu$fZwg~~`V(KJ2ITB1e&cIOS!`Un;y{G}m@=Zdn zkT_ZNThV|kQ3bYR;L|6BL>Id%F~pu86)_Mm>M9p}WMmIr$!=x8sV|L|tG9#%;%g6x z9Ioj#?0buKt2~py=Ng;dXX#~hMYDzG0>7?iAt`L0{Vaq9nP-}OF`6@&t4^%q;w%EaD_@D~fF>-|}-`tEix*aDT6o<1VT|3EpgZBXA35PyM%V8a;Vm0TfPy zb}FLU7=*1e%ki_%SDNm<{qf0($%^Z%2+-3hT>=-z; zdM7hheWe?+VJt%bka|kgx&-;F<^54!iWxkVulqS`+Ccx@z3@*h&&b%$%GTZbb0I_5 z+V-=+)!b0u$^5f5elBawt7+Ph?hcV&N8 z8d652ip?{Gzdzt8%mvjP&Ydvod7F`3X>~Xr3`d|nRo(zqxYfumdl2QI-EQ6Wm+5Ze zXeOu&08#461W1n&b(lOlPzk~f$b+Qn@JWD5cg|Gh?XK1M4)_Ph_7h0++mJ`fgT0%| zfL(%1gYGc2-P2|leVG`WR{u~yaI{_$zN$^Q(pq2kPeuK>*28I?F}#RZIOK+(@MjIygeLL9LO4DUtaN?brr zVkA&#l_EZ>3(CjbD&vbw#E>3kx;Z(qIqtSU3C8~J__#Z{vGFavx9G}=BXjI64P#Au z>)6KOZ1SxYqN6?NYM06Dl57z;`;c)?7%xEy!%r;5fefZy;8&yq)JXWjl#l>$g8`rh zdL>g$Vb#8_IcA=I?3B}JVE9kIY<&Vs15MJfxhy!VTaFCnkw$nSE~sUTPCh;d1pFj5 zkH>Voy>Fl~MTjYZ>8UZIj|R9ipbi92tGNLI+Gbq$@tO*gqvQuU(0Ge2cs2By&?bHxq`R!nF!j2mx`eMDH&(Pzc zv0SG-T_kIZ`nQn#9nr#9Dv%t{y{EH!3rhDIi7=b*IUiG9i8C}J_w4d4cJ&li!VUSw z5ws2UzT9**tU-gZ1zh1t#E;jNxfX&-l#FI|=^OEhh7=>;QmVia7E?4w=W1)2lr>8E zEi^J_TSCVZ*5DzQYP!D2(ZH0sMMM_FCXP@?tz(=CEFwM-Jwo425?PJgq75WLv-!&t z_?Lbl1BVy*W)Z{Uo{A&3(#4kz=NMD@E2yZskQA3Gol?}WSzDAxl37tY6!+u$>+jj`jf1LaO-;JBHvr#R@<{-&+0I}kp=tCKbYQJIe9xq-L0|kA0A)W zzJ>96X5sy`qYjm}XKZh6Z*TTy>Uhqcpp4W$z%RktM<+rR&wE-T5_!nPOR-V8C~2FI zT~PfIXuI)JVPs&<;(7K3)6tZkQz4L2nbF=q^K({6#p`lX=3sM`=5S6%6OeT&2DD=? z$WXzDeLTK#`vg6PFo_8d)vutc*C#rPaCJzPQN2-L#Y(P+{fCfhB$-OUl~ZKCd^cl*e~ZbJaB%-_1e>1sxQ2zq@n!_FNtE5_? z>+VOV`w*&0U*^{2QSO(Q@4KFA3Tss0%9VEwp=3~l*Bk+;$IJS2c@=B=%cx+SBTl0M zioUnG8HH$Fn239N5mo1={?Pk8lt_!BRF_wf$Qu#!!>kA*aKRzdcTFxS-P+h67z30j08gUp8TmiL=knvl2PDo}#Ja7!stfqjYRJYCYd>iTAyX;niMy>h9N zx~xv-q4RN_>w^pHdCO1YEK`&0RF$S03daGlXn$~L$V$WsZ$a(GOZTv;Kn=EKMM+M@ zqROO{s6ZUnPK$-31nb0gRXlZ4ITk&#hnz(vlnX&Q3JYEYz_jCO$iLn+ZOC-eF4W2a zCiEO1b0Z+{)Nr*Q(ajLE?Gr2LHE&a1&V@dJ`N_rQy>Qomxn!z-S(2Y{Q)Nwz2zao8 z97C?PzBW(imvnM}xZHM~>yz5v#?Q{qf7dlT6vkv;jC;+QKNnwix1`^_;;dHI2m2=c zEDTS*nflN%eUNur(C*2;I9r%~lV{VqUVX2&{QL0jKgTNbZ_pR^&+zT~PlWzIx{3bn zSUKDMR67{|bEcZqr5v%_5WDYHb4!6k=&ojO3BgU0!il7!El|rO3s;&*D=_T9Nb34w zOaLP(f2bPX&0Zb``1w7Pfd~fv=a4JW9)PT@w(Xrrt#PZG7ZXcygs8EOmOro5uf6O} z*>j=h^?Gw`NrE;UUK{BgB1FgZcm&h5F>2-N(swK-;i0nNZ10tj1{d#(I^%=;(fO#>b!xSXxTZl6?wpTlt!Mu!MOq*rKWr(PI z55XeM&bi4@AE%otDZm)dm}D14ULi2s8i>TR8;r%hImd|8JFS388G%+=AGoh{fK!}faVmS-DEK$H-`Rp9_J%UsyukKC;mb?UNB?Z^8&Exs85V@>0*{%F?$yM;% z1n;AYn~3;O&SJo}!rD=Q5{sq=V3`3KWJ8tZa=2l6BT@p^&~W0*z#>O}gY_rXu>wWc zRwro+0`XVREhw({d~BEi>fNV9-?4z2ad}{QZXGCT8h~k63r{l*E%Ym|vDtiMg?wwD zL3yRgH+<4@$}(!Ikz2PP6~W@$MMZle6_}Nq2YwmRs#=H93c1zaH=kx;O;+~omR`7? zUFIVCeYEMrf>VzmT*b1bcdXRwJ4dwvBbu9Dn#c@cRgyk( zrscCtxeJmZ9s|>HK(~Z1j=1VTuRY_f)3WY|9+rBPqSpul(d|=FtgUS^orQR#S5d~T zSIdZ{y+1W?l{CqIH4iS+xwhhLsU6F%y*;IV{tju?SNmLS@ds8{fcbofmL$?q+&0>M zFCY>=FGTJ-C!l5OQPQ$BHreR`L;>Vb4A@;zG`K6(oUE5sH2ajl!AH!(>X7D@u1DrWd+R$bnx%D;~YI?ag2%*o=9T;XpU}xl% z!|C1i9{d+g;$c7+zhizzr0jmN^2|5@xgghit`a`Jji&3q=TlfU0qUbP~Bs{k7}92ES3 zw_L01%_fQ+&l9(rW*IecqP68FwgKPywrd?6YYqIA;Emto1|}C}cfSL!s`KWhOkjxT z?deL(wkRPK+)5Rc<3*Wkp#a}}9J-)M=V~`dI zD$s94{Il?k>}h7N+`hdl7^J--u{H2UaWcpoGx!+ncPnrv0!&dE5{~v-!oEL}Z#N?b zMpIAEbvb{vawZ?^*IKzCv8BOh%)AI9q|e^gWWK&bf?pngI~}Z?>y`lEoJ7VLts`G5 zZ5w=rR1D-8R7BTzbGygQZBw~{G`G5K|BA*h`{e%>Byva2C8sQm4_IMl(P}Xc-q^Pp zW0*qIf!m}ZAK6P=z^Ewld|IFqJ@<%yVXJA|@8{XhS<~v_!Ef6!66bjbK!W2H(u|>Y zS5qLBhE>Ut3Ma}eg(qq=T^wp#QBR>F8Uzdtp?b84kRh@iD>lV$8^)_>Su`o_tI<;T?rdR zQJkzf_!soQ-oyVeF=gupSua1SdzGL3`ahLF|6fzzzaYkcVGHY+H4cQY=^6}cJ`fL< z^@=NG^1^kS=c`%e%Enoh66GLigWeT{V*~K;@~`KNy8As6kdx+-kWB>7;h9d}r&QCK zi;`!UpG{oxA&-JQe3+f3iJU)ve1qvzNN9GTj(AoEm}5=7^tR3?12QOnX*C3g;U(O7 zPvSG0h&O7t2=yEXlqawu*o%JOcX5QB$7M)N!Kzdj;V=j;Ic0nA0X4e0{dmu6PXA0LM8| z%VQ^R9zEOdlRJ;b?cLEATF##?4xa2;n_c{qqG#GT_9DgK8DS_@+IYUC5R`gSAXs(0 zqbRFfhaAPE0$U}55pKL7q^ce>3eg&Zc}`TxY1OY40HG!w$g_qt!4(;p(k7}mZzgPM zu(V&tH~LK9_g|YhzczSyHl&XeIxsi*dM`g8ri^~I}q^C z#>XRuD#dcUpP;{)WUk~^76ug~;e{qa%=Wuw)v<;&ZQQbm4iM~~s!)Vi3g+tPQ6XvO zrLom$vb}X}Q6*_Y5TykfII9s5bU`3UReF2gRT-=$0Q_M8XRG4}<14BF`A-ijR|LXv8WuvaRxV#A|a`#r~tBIav z8!i&fgNk7J=uhL|3Nlbps1t9}cs4AOy4{A~F^Ig-K@m zp2}Lg+m!P*avuAMV0|Q0b|KMn#C5+?c^!+2z#xY(lMb~}2=rWgXuCZ)<;Vsk`ozFc zsbTY>HNJ)nQx}4ElMQ<_6EIz{ilmwsE4&UwrDVr%Eu!B{-kcQNxN=i)z&4?6r))+Y zQjW6}=fh;opE5gluOw0jg6|gz+9~H}VCW90g+zJEbYLf=Jh*8EfwPBRItp^rN7^LX zg~Ac}(4go@PG!g7v+8*h1KQL)$AMxo7R%>_@>t&E<0Q{rmgF=;_EDytB?P5~GyA1S zNa@SjJ~^t>X-1<7AA>Gg)a?wEP~MxYiYL6?4NB+zBrKU)iH)0#W&RoEdbBrvrn-OR%_CydZM@Gvj6MtUD^lF7${Rmq2sCjgDwk1O;a@{usJFIlP(0@PM@6s-Owv%V_AC|P+pUMp6mb%PFnshipo%Y3zex;@^>!5ezxRN29mZOE& z;*X;Dkp@sezpiFmqvE~ai{+s;YTj@Rk{N$+N0fqke|;b~>sc=K{e~YV{D}^OSS!M; zYmlkQ;Of4fs4w*!v3ej3GW2RP{h#4a`t&di;L3Srqd({~dF?m0o1Y^}L zRH)wD=NPwkF<$TQ(7>~o-&#er$;<)P%|o8hU=jnjXrfJwRXzB4ST{4@jmW>a%01U+ ziIT5w6x|XzHETD_Sr+@Qn>B--$Js=$*$gw;I$Ei2^+#f(Gkty7cra(RkSvnN(Zo|| zMyS!c&>-cVR?>vI7A{pWM$S_md9t%>tp8a`kC@d`Ym(tf53TkTy;)oGe>K9@oUv%L zC^CAU6HE+~0XwjMoP#S{g^HZ1BeK$zJdT`SMK)08xFGC&+oG!^1feO;AcmLOBqX>- zvEEtBK4KhjRQAl^##6ZSEq))s5Ng@BbL0!#nl!b`H}i5$rkZ$H8+m`V=;h1Ui=kI& zG-lMiUkn+8qDplll|m!w%zCSmt+OF8Y!52-78#>~<>>TugZ4xeF;%7sOGz9a08clf zC@i3V>?oDbV(hI@fE+2O*WIM$npsPS7XLJ~Cl>T< z^uAac;Z_)haEkoISBe~^K}9Yn)GppRp(A`MF6waVeKW=eOF*m4<0| zA|x(ehy@GUaU|SM2dV8W4;F&b4DBF^$5(Z&2Dbr$}By_2TfB?I$JZ{=i_- zpgAd!pB@43)X$y2tB<-($JnjNW62#fAlYbi7HkR1IUbs=Kza6!*@|ZDPCHF%O+e*V~$~XO(hpe_KbH8;t(&@*51X+st4%Y>)|8462 zA8rDoDJhyB7yzK+2Rsn`C*WZ0qHpE=LrMHF5>ZP3vuo1px<>60Z!JF_Xs-++%mGKv z{!C&8NDxBVrd}dSYkf82Tsic6n#5YzF7 z_$qQ2nu|Uv7=4Tx1B{=~=25IBbyrVvH4NBHNY29u>Sz213h-L75kx`A!bL?QPcg8o z&^n1Mo<#bVRv{G@QWSbv^J_fDo}d&7XC-;`H+jORPfn<$t$`M!JnOP-^>K=7#Nm?S zvX+SVGL$#Prz$0`Y6qupEe$0qHd^^0UL>$Q#{n;sz}=Qad^<(}JLhGPkjYpfIXOG2 z^V<@{L46G124h|xpJu<;-;kDuLod$iM?Sxr`=ybL8R{3Vj;<_PmHP_Pjg9`psl81v z)*khn70*=K?!J=Oy-kc*&EdA2t#&yO>ZH7^R8rV&q&i|!_9hlv#-ujsHbL#ge13{a zT&}4gKarM%UzwGrdFnz%2fyQU&z=jg5_D=(sQQSiuL7w+S6;gp&4chvn2P2a(aqjI zeIBjkW7%s9L6zt+k7{+KXwAFuJd`+7)=Vu5+3SN*$gZ1s3E z7(Z>{XEl^JDh|n#2Npbm?7A?CQx6>yspgNXaJKZy!=Smg6%Vc`E7-*q`vRl&+p^6! zX4dpVnp7>F$>RIJq4a-#wveaWe3Bp4ssr`EiQfEFa{iZCdij5>J}?IZl6@|hAiQM= z2rDicgwZf+zoU9t(H5`74LWLKwI(cLzqc^2G-FmF=Y{-k^yoPcZZcNH6vV_t&T;$H z)2$P=s$pRK2|KymUztD1QVf#A09ZHlY9;3>v?b59(q{t}D1f+i0|cYa00;2S+Y$lE zu!Kev5KvQ5`zcRz{}c@d@yVH|k==}Q`vJ=!LSqu{ z82Y9Grt!xPtCNTz5mXkb|FxDR#VdP}D;GZ&owX9UXFj7{yXVJ%ZndH|te?BR_2_yE z96B$uaK}M)e7rq8xG>=AcnM=zSH4bwV9ogYnQN`gvgJ1dp+s;5!U|(8gc?*J9Frc8 zU6I5}qtTu{?XL_HoJW$hPRu+m-miiB2^41Y;~_&n$eJ>wJ?^e7{53j4d(rK^JUDu; zcxJcr^zioP>Ppj^+&ROVt}Z@K$QWBn^swD=dIQ}0U3^SO&=&dBKO$X+7^qaw&Gpr#tom1j6xitpJlBovF;nwwrFv6KS9e{Mief9i zdY>SbcC`U26lGc22xV4Sk+hY^MX5z5qrdB({IENW1l|l~5QdUpUR5*`0uZ7Iclug2 zcHbqG_1A*Joq;~0l*UA&^KR)R+PJ>IET@cAWT*y#zZPXWqWmKt1g8BhJ0mqBoOHGb z$HUWbxujb2je2afnu?)k9cv!@4Q3p`NLG~t;K7#+v& zVWD$B47VTY@u3S!$U4x^2N_jfPjPLT6yTB{34i?d`@GP;<9?8fPn(7%{YM>=rL8qy zB$-QC2xA_ewk*c97S7}x@DRWpv%iFt#fo&MZ86`yp3b*}%%|IJs^6HlZc9e4+UUKc zuy`4I>mVr9MzW)%Y$T(?lU)e(Sms03MKjbMkZC6c>si!rsUi-aL8t#J9@ILcTVSXY z#3pI6rEM}$Hy;R%X}!}j=pK6|>w{@dmdAiVRRDrQtt{V!2Th1JTvIKVq{r}L@hmHM z7%H8g>`01>6fb^pD^$!L&yFme$)i=K&ACz(26o!vkyS>GluyDo?|oJEp-^ z*BGK$T!-TDB6f?wj_~#L;<`uFE7MCk5X4N~!#Y%gJXdRWv`Xe)e`ol!l%;iRe}aRa z%ob@>cM{I{!B6=2{LiGkHQ2T!pmD`r*T;9K$mY-DNp?xDHe1#8F>N#H(4TDfF1n5Z z9BFifm}}gFZxujQe4Ep6`&--ADfY{Xxm*Qr)#3N8Ad}MR(06?yaY9kE+CmbpvV13G z#h0{?9FtOO_zS{HUYth~$}CN3_}QiER&VHETau9soZGvV(V)bwc?xNnsxv{N zF9B!W%uAno<=&TnhLp1AFCjoroLs1m8uC<57@0YqFH{P^4)rFkmz)~LW`B1$o`p2iVjXvP8Hap5U1?I} zzZj5bKy6d%-U#!om;sMI?TOI`Ra&$EW}Qf^a4}8A0-Np z4Kw)U3 z`7Ek4sM%LPp%-+7^F?QC`-!TcRZV$7e_iV7V%?S~BAlrxW{a%{b;08s=wB?*KVH)7 zows!JAE8O|2g&`%$|YkrLu0%D?SnW}pZcj>LhCuM*(nYoiC8o@Jzf-n-&(xHTIUkT zywGF7fM|R$LN1bk6&ZSjIr_8xEH0UEq$#s;rC-NM68HGxnd7DFbKC!&*{QeEzKT_+ zrS6igQ;V2mc+BXUj_&bn2NT0tT3s1PFf{&95Ga72 z5+xaONTG|aaEA)C8PVl%6(kl>@B@e7q2HnKNL+VE5pRLfCaZVX)Y$s==**(wZ)9tN zYvI(Lq{rIb+5UqEQ--Wg{^ZqSK)hW1S&wpmZgT|fK4^I29VislYq0si%RE4LL%Q%5 zhJKKSPQAjh%K$8aB$=e;V17NW=Mqr<8Y7@aB()1ycEjmM;-?``&NO}3#~))pnd@)& zd%GDQtnJMx)8~b;%*~Cu^Nhb8r=LH2W3tzO-JY1=SDc=%;sMiP-1}1cW05Gz2pk33 z%5RSVaOE8?MW~_0Md%b3t-d-=IsatvUKXZ_R%En2SFgv|pv7!VjKMJ@7cC~VAzYsau!KoK-ykas3HIL8> zMC%C_L_ATpV~BGKk6YPT;;^Ov=hpf3K%rz zdRD-+_+^%==A^>)@##IikQX_5d7b}Ux8`m%s{7?Lu-FCHSt&uL+KLGp-Nsf}s`aQ^aTJbuT@j&;$b}5ooo?kCkw!tPTzX9cMh<&A0 zp$WZx(x?Pi0oOygBuGHQT0#P4JW^J36!2F0AnFbOh~mPwDkC82tx>TIn3P@k`>@Ef z8_kjb#r9F*lpkyR0E@fjx*$+&YYC{MLJ%7}WF7nk&3Kd?mO@i-3hOh#T{UTS@F+=A zyMAyPx0UiXNw&+a2Cd#7==4I~f<4l3NfYz!tOwpdF+q%uI^<8}bkwie-rCIl1D4dg zbH&uFbVKm`i-hUYcUKa}2=BGIYx+sZ9Y2!z&P(S{z&CC-P690!NIPq9n$bwha%GQ7{-lfi9BR zVZ;^2>Ao-O<^eSWFVl5MIExX~mH>-G4xFS4>VhICWT_FZHQmmElFM*S)x|dSS#;MJ z$TXp#N=(o0wRI;LWP-X~fg)ET{Nr-)A?l8K(GQ0hQE> zw#=<9qNsI6GNJm%l8Qj%u_Zh8MyghQ4KE21eb@{Amm~z%XhcGZ*Ts0W!kx3z&i&{} zEyT6Uv?4fgKKu(r$SxE@OY@II-APLdI~bwAJ&JcY*7H}z4O=4v;O@b{=y2$K=<>Sb ztt*MH0OnOjg{GPzgZEKi_0_pOF#$~77efI>*b!OD8@=Z=f#oBV zPHc(eQG4(xb7TE8E=v(KV)EM4^)_eR=FES4&b>14)*TRpBTM!;W~*paUK@w3&K$*u z!hzerVZE1KrqtnBiX(nPZcp@RX+1(g!wft&TYGtmT#DWyp$7k!a9e0yW2~H?!Ds*W z`GFgoVVnySkoxY^zf#DmYF1&RPW0Afc#w-CQZP-tw+Ou-aEDi>NG{ejb!+Iw8xOv> zMrB4`i7YCjHT@CqZ;EL>Os6f8=RC`n%u|_o=X?699!35^wRP#K2{R{-%ySqTn@toD zn@%r@V&#vcvjD)@$zCfVM-55E(%l}=BzoS>?t$y|v=Ol{RY9G&R>QBb{+!q&9F05? zhq~{>%y5y4Td)k9Y&n1pCpZ+%y>_GXOZRfDUYp&sEq63nuXG)t6@C$wfoq` z=I;fomzz37;hBDW8w!u)8Jp}~=6az751Y8BT!&5G4H=WquX!2nKA(?!2mi)8{UcXJ z(sRdy{{R)vpQh&j2B;Vt{?zLHmtnI?{l~D$f%aqAB$x;Pi@P$0@_yjw=d4{~DZQLl zw}}fA&i{{NGn&RiygVB5pl4=R1gT8w9OO}mD(o1?hv#{q+uhKoi`{Ivp1I^bK={+l zcWe9OgZ?4x>XvH&5z$O2UuYbux#Y%yd>=8L408Sf=!aeZmfXvZcN8Ozhe9ggiGmcn zg97W4*e2q&7~2!7Gp21fvCQiU)n*BwKL)5+GCbX6K*3Q@P}$FfD|}jBuW!z z5kcfOfgCayo(&rh*cyhy^b6&yf@n^{C}o^Ay=itlMM%b~{lqPt99~%|SuhV|-9p@d zKOdY8Kkpc_>eias1~i#^QRS>^xn}!b#5iqGw=YVnl48b>%$~oRmX;c$= zPv9>ju#6E&J~vh$;8^LoJ|$SnBt>m2(kDu!nmwq(ezBzT!BXNKcFPii(Of z)Ue-?-%V1hkkgiwVzrfHZ1+ol&?in!z7S>P2$ld9VA|mx&MuwoO;ublHfDUXWKtSl zv$R7Kp~(){Y#rrZ?h-V{#IXWYCZ8Wo+UqkQ!rCgw>S@qXG67UW|EP}Yo5hClBzgyo3YhLPj3>SD0_lO& z1t{2?=a8BP2qzTc zcTkp(cND*oE=oZTs*y^LhxW7Z+vJF#@CkG7%Vj%G;mkGB`>g~8qN!c}8(frq8OG6z zB=)zC>2~-hlQgO~gWTB1X&W=Y2*tEuyrEj=K9esGxbZTJIf9UpuOK6n!G!V%xTO6F z8u|2j3vm}93kKHL?;^3xQhwMvuON0ylShKnTZND+wu`4ge-qDc3?-;$nvG_#*jseL z^=#Bek31A+ZQXaP_dog6CaNO6m{lu4FCe5~UvD`BnF|Pl=3@BDNmTX`xuULnvt)>H zq&filkYj#&wIQ=NrvT*}BjXqzx}8?s@~6YPCFY3-jAfn)sb;2k=AaK4)$cSkk zTf@&!m%6hvmokl9Pz&~D(XS|h+8qA&sbeSz`0HD4VeGLD#$(O+K+SnBs@+A&T?&(rvcwZ*NtdyOT3{$NoTu1A zsamsZP)0bVHZETasqGnv*si=$G<2hSg7gq;w0zEm!qflOyIsfVr4U9d7P7@2@T>Ll-z9Rc*^nw$~?=Gg9K-LZh zqbX=<@O7Iqo=SlS_UP*XPJ};^BHDhbcr)tPT;$>Kc`B9L9lEpI2QF77~mD7DHjhQ^x*P0M+pAmr- zt)$)9$PwGUT>G_;x|PS>2AlP_xM;yYRT4!%5qc~-Psp;JuF#fmGU7VWvZ>1grqi$6 z{XXC~IN5_9grd}L&bBqKhAosDBVb?kp{R9NfTIs_IhH8q8j@*jICf_e)bL5mU0Y|g zW!qZ0)XD4#hBwJkcZ6>?oUkqg5T1+u z3+vl502pAJ%5SBR>PI9nQIp({bOzlAvT!Hc>qRlaiW?iBuU+QsD;y+(YR0jAH22`a z_BFiT8m~TwSE03YrrR7bxJ7H^ojG!*O**&hxG?%m``?>H$F#gPR6ezklAUI@#XI_1 z90`z%^OxV}j%1I;ACG}F?o#_gVG~-%w)8=)FAhGZX6U7=kJ?+BxLi#J(~c0ELKy|T zlpu2;dc?U~vTLjdV5X~Ezk1aK34oRo`%YCrbC9=zilHGiJR$K;zJJxR{ZaKAh}(kf z5}0`3E}4SJKyA6*j;O)^o2@RFz@=6?LuPtv-^#H9@7!O~YXv8ukC&}`9nVg0f%ETs zIsd>2v&q&Bn;-Ei`)BRy2TA<@T`yKf`gT9URZ`MV^oRrDpXd?rv7YDd_@)k&nS5?_ z!WEWG7Lh~Ci9~Ku++?+IJqhX%#oIRbVhFK&((v3+@=*YM$UPiA-I=KqAaxmBdWk3W zf*Dwi&eto}*AXQ&O2lk0T0vKAnlxwEkMI>>oGfr?%U>Yi9dbK**mi^n6~Kr>Bns;i zQ(K7hu%LEyLvJxqHn-PJU%OEX^opf+?akwsU(wn9_A zQc)pe_voKmQ945;wBP*IwUh4B!404oh*F2^XHp4L=2wI@W>O?X$J(M*=*YlSN4g-c zZeUY+)Y1QRwgfca+ySS=NT$~bqlX*0yUC;mexLpg|5Cs8<#_K7t()A^GBM@ijoLd! zTWQ0Va(?+{B4m55-}VZHznn3_Nstt|-0xYmNfw&e;b3sl^a?bHCrM<GO3dD-6Ceof+d1U9D1HwrpXe%VTW};I{h&> zY8=Yw$8g}k&X9>U8P92SAa(R~vLRL@$JoG8CGEVUSwzbCcYra9Ias;oj7pJw#Es|I z*E8#yAT)k6+=Ig_9Qg!Hgu^7 zjTQW#O=oE|Mp?L9Ba({aq}piv#w0Zy^DnPnt_ftfjX;|E54eHU zMojfGc+3|Szy<){o!5*lIw@siy54!B=AJ^&YGk`V~kRVJpl+>m{T zVC4|^mGx{B9O=<`sw~KXS>v1Rl@F`=S)*~3KINisAhwyi0t1WrP2Y11ytq*?7;8Q_ z43z#fMbY5Wz{Yqt<(j8cKVw{$X9CM&;dlhvUc7Crn-|5r_Ma5OY^$zMi-l_N($=~9dg)}v$HHpTos!zP2i(` z*F%}Bt@dY@KQV@aOK<^@OWkEg`TScI{6D(a^eJB6UAN>*8oF4D+?aTyzhqG7mJrrO`UD-!9& z_}H8L5O?wL_&J`_kB`pL(c=@G{&|zh;UkW~m$|?-F}huTF+3&-k)Wme;eA@8!o!(5 z(=sQ01QNNumU5-?oBAhe*^YQWwJL&if=YTv5Wsu6nym9d^rb8*Ksufyv(3ILtcz!z zq`^g#gvL?`^FOi|MQd;y{7zVntq^3;LHiF z#h!1Ppq=wn)Yy-G%b@N?EpH`(>WY+9<#}3cpyBr5g4CSOL^}ecsp*UOIDBI|xtA#( zr4|!XW)-Lq2#vask+|w0XfODOKGqO5=|e%18f}vIO3sM#ssf3>B=cn&25AIC#*opt z@nOJ}X)pRhw_{HCY46PLpV~RIV91W1CbM$~9hkU1HREc>Sy%_hh_v0kH}hHpEliZB z>6}Sq6_9L`ArIaPxAku&B#kd($)-I30I}IV0qfy77%7I_4SUV5pdLlv~P}E>gM5 zLEdVgwJ#mjL>yNy=eEkDnYTix7I^Av;mT$AyhUuI+JQ;)i;r$4{gUg7jqc2fgN932 zbGm!KKqk`ItHXMZoTCo-TmqiGcoRk2%9F-p%g3>;K5s*ZnBHcfZMu+``L~6(2$-3I zDL3y_b65I`eKR}jujb(Zr~+4&vG;pAPiN=~c~RPTY}AICKV*+8K;^n=m%y;8U>gTQ z^hH8zcugcGVm(!Z!i3PL&!TQu#Yn@fzZehC_mAodbCyec5}umM|1jOkKYUDn|3BGE z`G5ql`JY5DHQayGNMWsSqi_1ZX2NA`_t_A--c?~T12X%QS|WJcZu%ZgT0|AWL$m16 zDD-CMM@@v{s3g=G(cZVY3x8#Cgth4YBB^Kf@?yT8ibY31EO7;7PQqo`zM_H2mvVbQ z3UR%Ov;E6th=`@8-1j2@37YGoaXp+VbGES1YFD()Q z%Er|v1B!$sbOtqWO-*zza*z2f*=gTbUAFb@qH=1uKwch&@ZL+PsD)U5IDPKX%cV(8 z$6Ge@vz(i9wsrA)vaQ&P9b6AnK72Je6iUT+zPB0cG)p%itmHAH$_Ae~I{elc&)q!0NSe%@K|dc2?7g!(1(!{0?5jB9f;!dZ5b?ja@#CoM_`Bg(o7V~$%- zH$!MPiP2Irj>?s6a2UfPMp;tyDcYnx^6`x^UOX;aCa-7BpR-C6>@X&jL3woPkYL!q zCrPY{%!Fn&0yn(^6MJ%AJ>s}TLRPM5Idtg2!-N}&W7&CVTAuk3vvLA1Y`e^%U9KUN zY`hp}p?>=GxZ_ziwj~>;LMDyyaDoI&AD$Er2H_RprYIr7qhtr>-kFRq+0NTRn%@gB zP^p5ZWXZLtH|(WebYG6Q>=4Dc@9- za)p_fA{$uju5NDa99?j*s=C?4*boWwiS+WKr&ay_mLJA!Y_SxAw=;Ucf?%`CBSX4Jt-^{Fvi}IZFn{~m-gFA^^ z`%=^n6EIE1^LIc?Rs{LpfDX4LQ?dG5AxE*kbtN}1ax@X!q5F|8=kxLslx$>vxP20B zO~cYQm%|y1s4}d7G{EBkCX*=E7+y?bB25vu#N#@%z(FRk~&sEzE|zCvPdvZq!+=F*z%=G~dr1IRQ)0W~tL zC)dq5u+?R>FQj(z41;d=P))|Qk^R-jc+YWn^T)xj_QO0f@QZb5?WNf2k_0VL9|yTl zir+YE9uyMU)>nH?S;&8sds51C+iOP^r0Wd7ya3y`=i|gj6s1h^DuHtWbaV!>3zkqa zm{IV}_FyJ9Pg0SLJPF(96XM2Ia{v_OaMV%ydIlBulZ>B`K~okT|`AN@PoE`v6BR`MnloS{hD6?ju6pZ+%e~p?+U0N4$R119Egq!HBK- z30SQSuFQf=kj0tQUaQOjgE@%GgITsbUEr1r^EoLBY_Glwe6!9s13i09f;uO1aN8A{ zliw~T7L;N;9X-!mz9rQ3bOXlUsOW`3+SkA!;&=kPRx}WMSU|TOhfd33#hcD8&v5>-*2uBNGtWy-a9J$ z&Tb7M26ULslYVvDK9#=kw{?Y=a$1LwK6_Sn;WCM6>)yV;)+@{@>4f1n=PD`1pCu`Dk!`7ve!U6vrv z$g&=2tJ*roKsV{Gq|`;f!qi(!u%xzmGT|Eui(qFUJ{**Ntw4EStF0nF=2=q>ph}^v znVi^L90P?N&qUuCGewpS7Fb7S8%U+o@35}m0$lMsn+dzl;u_ZI{^R60Dm)C#ZNQGH-c33y!ZCcHxymF9(mK0=}DWgP{ki#$cKcN z-21}V;s$sal685F3(;q7r7p3Ep>R)%XVE{*b931E&}gk2o~yv_<3lsYxt6KXf9Op@ z>|iX&Mh86M*^CJE81;q!Dch)sTV&?x5p-q*c#x|(Jwz+HI|ETnIUmEqRoi8nanc&( zKcP80WQFX2jbN+ZT}t|)ROcku^Mg}mjdc9(;Hodv4{RZ|jMv1(=XtIjq-IT@1F_F6 zmHEtpRDQlm8)#cOjg(4;9AWRCz+K+8Wwj#I5n~%hU zRK0;{p*pCEjrU9ACrwA44f;@1-+A7E%vKeOP@n+*wMMo6im2fn@GsAsLo0&g>%wQt z1H?bwQquh_#MP-NZD}LD8UkI`k6R}epjB%PEyD;H`^iM02+^`&BeH_mn$MIWto}9T zj|J~Xx^G*FZqX2UhJAc9um^sF=8T|t!q9BgCJJ~i!d{_Pob{#Rj%+)2ctjJvWNvIG zI|Oy;09!T5mp>Y3xv?7AT#9bwj+3v*vex!l`KojiQ{A5Qc)afQ+3mJ;{g9r!9JMOy zuHfF^OV2HF7?fy zrWS-h&${+@_(rbP^QfM82zu)2Hp4*Rp$n)YXb_FU>l;S$#AU6bbKl-0@MHNj?ve{K z^mR@n``6LWW1VjLIepNr2d_G{kD`4Pcmo+L+ur~^wXEs~B*jQqW}Rbh<0~+_)yhcy zBI*9SDL>hqy*M&p+T-*gmIM|*BB|1U?x-KrO-zCGjw=<(K4vGR?tnNm4DL_-9g+0H z9Z<7AB$AqfL!a&mpaU1o^K+T0|mE)t4M}ccBa<+;k3O#u(psV*uDNgy7Sy zHi?ED@lEQLy7}pG|33(O2kuO}EekZL*fuM+ZQHhOJE_=K#kOtRwry5W;eEf;J;puV zaatm$KA1fTIj|y1~T}S67r4WmFrEFa;rr0Bq^y( zwM)X8a^qZJA=;QRpyvp+!f|2$nWS=_33bbSLIG5fNZKVrAKA{n*n8-@g|2qnqx}Ym zr9YZ~KL*DlqgUR$;C{-0 zsfLV|ID}Qy{pinERA4?e48zNSx#pTH7-Ur~3?S`qgAo>bOulWU;PnE@8l)0Y>;FY6 z%ejG(T~E$r|6&(kpZBAiS?k98=hRs0ima)r!#v8G;i#R;4X9b=PFa!LLR-rNwcKM} z8%~B_^Zwkf!G=VbYx>5+)=3Hv?Fvnjp>6iYsS7k0(3>IO*!2jFg_R~7jX$xCeYxz) zmI;BZEpU#J%nRs^ha}(jfm}99vZL4b;bE?!wdhL6E?IG9x*mHn4sQU+N z9S*U!?1tv?i3a*9PvJJXcmwR>lC#Xd$;T`i=dUi7X-f3hL6p_Qb6aKYq#V-) zIc2E|olNBo*Vg>sGr*%4OIBC#gOjR7_FjP~#Q_-_R zRjf;ni!FP_eg2ZO>biz72&EZQMZ!)%!3$J@FK5B|1v<;#@r!fkPsaDn=n?DQE*Mb! zh;rc4te2NSkf}vnVrxOd*jFiYNdF@|8gSp^QGM0!W}gf2N>e6@#iGpx?Cpqh3{W#P zr?-$|F|z^$l3JL-qUf0enOta&{5O?USwW`5e{*B&55NQnTEBiIgQfsh#bIs zFv~YqAbylgO&$rB++MYIRHR?sd#rYfQw9eOoO7sX&ffD+>jy_&Vc&^svq+Y4NH{&P zyX^fXY95F>P35FmyTZooH ze_6=|*s<|y7`L;_q}$;qWV~+e3kH?<@7xuS1Y=1s8#}>F5Nj<%aFQ3f5T#dF#E{R3 zt!0~)4;R@hJM65&#myMBVI^hz8IdUeX-2<&z&(SMwftM&E-=?30$Lo=guxnG1Y_j6 z?a;K-2J<2IQldX+zX8<*vH>f8l~bDsCTe)AYz03gDm45BYq*NY9yYJT`s-8&#G}o;uH}!2rM&JVsEFPX$33!)i zj6lhFgAo3J^28*zh-q29Ir)h@+mk9iv|IfL&1I|=l;0oVzhQf*QkwPtvLtD^w)Xe< z+Wnm^7{9E)Apd2H-;#}Yyo;2HhPIDUPBl1=%Gx{nfOodU5I9xroo&P&S(3CxJLB;& zZVmj0AE!!fQS2%mlJ%z|Dc*KR$|Q7~|0l!izgfEevoV6S;39+ro}}PN{tp1{zfyMp znQ+7ZOgIi?z=RVlLTK=gU7&TK=fiBXNqi23OBBtzF`B3Tp;ch3XR0Wz;K3r-0f}7ALM={b;LcMMlBn9AMW#Ux41iQ-c!_=H6oKhj$X@@ z5J?(F;LZg#ZkmDIsE;&`nuL=I8$XK|r&*#Q6iH*4c!u^ftq=68J%#aajO4JW7+)yC z7$SRCdvW7Df54y|s)?*S2}%ZPBrr_PSYT;%-RXa4o@W1d=BfG#<|xSzbbk(XqZ-Pq zk~;n{eHed&{0$(t+?18SM+Zio+o4N)a3MN+MQ*hnZJpg6?YY}opk~5Pq|(2I=D%s$ zepsGz3pod%E^-3No~J@eo+&YDEP@c(ldke;$3`H-bQdQArv+2f{_UEB^GyK~wDAYE zh&DUAauTyMH$OU^T)(!lx$h#Zye8{jqWl&reu>o zCBOhkJUsy{*l%&0`T;Rm}IScwP*?}Ac1N?PuMfi9pxGeGXk?5JY#S+))JQBzNIZP;P`t zNBnv)&#xyB5Gx>lAmfg_hhd8(Eh!k&@jncEl64qhLp$zwl@x{6ZY=oTUXs%B&k_`0 zj_-nsShcSwwt2YMlzAVA@YYfhLL=mZ4JzbT}J_;=(tRveZ-yKNrD!xlIJh&>X1yS$FZD z10c&+Kr|RcaX-{@+X*mQz7l>jm?SHAbLCg;nGk+_nTW5JXOs2~yl(llPQ?Xpg*Fm! z;G+w&dt+a~rFG<$i`sk5T}O^q`cWFCL!L~5b{Zu1t0eCYG0MZFO2hkJBowd$73##W zspHuQd97f6Y%E5SlNWqm%WvE^GjT*!KdqZn z6Nvo@EThX zR&38#5+fQ0Uwg0;U7)vYEh??0!(XTC?noTb=;xu*>XKCg`C{bk*drqha$5>GYY#Xs zuWg!sA9@)utE<(mtLkpeVB&WfTa{*LHw1vq!$&f@!lC-i^#q~qerk1$%8D+csEI0M#U7+qS}hd^diLb`3s2#|?T$VP|4 zZB{JWm-fw?8Ho@$pEZ|EB;k}R(1=KK<2%H$+`0{U0xgGj0(o|(a%2+r7(OT((4krw z*=K25blsvlpoP=ewFBS58*bqH4S%W6{vEie|21a!g)P#C>N5z$i!io3C0AromdLP# zP6r1MZmgf>F6_f%cUk&)4*o|F8RPDGmm1g}w1a%BA6=%=jtb(HvC*-CoT~<|_@OiH zT54}t8)R8}w9-j75>9^V%$&_IwAN-@^6uHMXcKo81?{GhUQq#oB^-}~X$RZZUf;6a?8vdjHLzFTic3GOp#m{p`dSIyDQffvu1+vrNrhI!jzJ<&y#ZH0EPtZpGxb?OlgB7?^=<}Wj>X_o-@$$lm@=L~SXHd|F7iJPAaWK3m@Q-;Mt1{>ynQPS>V5<~vuv~Vg~Za3ezm#@H9(^wOiH*kvND*z_nAa5ydQ`ACV0bR9lt7J%fNxl-y}>Be2Et z;W+AA+vnrf>rj8e8af10f%KP&(}u8r=94k@>s$|k@SHCKvR6gVP!acI$K=x8JjWXh zPi^=qpN^7elIAaI1?ch`*cM;4u|d?weeH4GhuGWO|E`tWZ(Q5D9{o*t2WzS+- zBr(cd7M-wn7BJ>K!vFJ|PycKs&3be~1#_HD2NfE0T^FgjGPeB}N5M^Ub==S1?wi|y zt$kkEc=GUL6FQD5+VDdalr$N~Nu-eDiYn45;;8BEYfsHNXjA>U4DZAaCl#GK^rzX? zu>Eewljn{+81s-EyE0-Y-- z1QZE?{{N%5v6HE@1Aw3WFT_7Z_11oa0r7K2-?4xIn+&}}>U}`PvWlOr37$$wT@~P_ z;{>&X%-xu+#CGk!yADNErO^D9$l-pw?R~1_p#FW>S+J*^V}4e;)d4{BB~=`_46tc=2?>j-bUd_1LA;Te*0}UA9EK!DQ}lEqB}rV9lgZ8Hu49Vv7 zj|)tcIs6|Cup4)lh_FF+<==2yu%-GVtIBOyGGsyXE*|)O9w4QM^Xm>=xN#Qlz(Mo0 zK6tS+9RW*B6(Mo$4P+9Ot=B_i`j24Y+Db;6Qj46SJSRk)sFMB2!6JNl$R@B(Dp;$} zCah2~D=L(;ZH6Pfeg}Z0D=otbi6M3t8lzB8Bm~*g-G)84&g+^>%r(rXEmWywUVnqg zNg-t~cotQyy zj$f5t+CM*j#H>zT4&?S`%TXQ~*HlR~R+!o%XV-;hHG6ix6`%6Sl)K_Us<^Nua~qOY zusrux$!-4)jlk>f-B6w0mGZoh8mTYwqIXrv$r*f|#o8}8qM1$(82s#B{$TIX5dKs< zey(nrQMkO(KgU|P`1Wth z&p&l@Fh*ZZ1*n@n0N)2-M)m*A$#XU}bTYO8>^`;$^7femh{Lx&kqORq%IzF6UQQ{X zu3PA=4Wx%G6HwJ@z$F8nChm~;t+zlenN91USGnx={`RK_MwtCzG&a5tD#@@YzEG>` zxqO4}02&r`41PyD$q%)-9WU;(W^jJIg*)M@SHBg$5EB<*iO|rQPZM%xHnioPP*j+ zkl&jH^klFwMWKeqA$!Cmvt%H?5bhA|{i|+U?+|U-=B;q(Q8erg>h-oqHa)r%m)XPB z;_jIBw&j42$B*cI%5^b>B+9+zrUsJq17E>OTR}5w6_w?*kTVJt!GsKR=dqx`Svz?D z)->t~G$yHvdK(RYKKo-05=tm9J6P&w48TQGDx2Al3L>6KL1_n0oI4RYgp#|x;IQh? z1m!i(Fody?3TKs|#HsS7pvPzBXl-0eGE4d#zqgLDlKEQA;l-+ceyDC+uyDm!s*2h@ zir3T7V4LL{8xEJyO$$}fU=G>T89)L|jI>7myyX^_Y9Kk)MAaa`PI!DXoBH4`Y(N^aOi9*?bk2AOB;5&KFR>*B79)ja*Ws9#C?FR^(uY7dH^8=IJ(zn)UHJ4>f$Ds)t(X<=JG5?w zOzp#^=phuJvJOU_um832`+{cVF27W960Z5qgo)XydG2EZFhJ2jQfwfkK((!7St=nP zm@8EW2%rlQ`mVIj6M0|xzFBx?!f8!!R_QF zm`{$5uB=(q`CnYR+Py2MXS_D+Z!rC9&CF4*cR1{e}@Y24{ zGdK#!$N9gb#fg!SywYo&TTbfK+;vLNFimvqL-NyDAzA2DCF{{rHQjxWjMvUdv}}nI zsp3Q%^oa>OqYk+(s`)yL4_}cn3GM%ZbsEx+BCtNu*32^EU z0=h|``rAmvagz(OPeKs-D}zDnK5^aL@LqnexGZ0xEEnp?;M|bq>sl|;tkS3=9^)sM z#!rzLSXOhodT*;I1b-G)O|lD5sg8T-5s|Z|f-6y~lY=l#Czn(F>$8%v3twMl#HN^gsCjpsCg(`i4v9s7 zdW3a9gPU*Ip6*l-V#%!D!gYzRVs58}3v#=Rt@Kz);${)0Eaw}&DOM`-TO%rJN*ksc zSHpK_n!SEL#Ssqew+-X}s@)>sKp6QW->Z8u+(eo3i~yzy2UTHMA#iJ1%{0-*B7FZt z$*gdiepITv0z^yLg8*c86~E~lq!2l`K5K+yZj?FY0H1P-=>+^G9CJ0U;Ir@iTwSMT z<>Z&0?{N~Ey3m58E6TB!v2%(ygW5cm`W~+xpNZEGg8FnzyaJSJUKRHuYMVy(J;ULP zty{$~=_-ybK<-)|H#W7T_(qrd&$cOxItEFc`e9QlB%Kkm;1?2I&f%N%cssPGKW?9y zM!lU}x%2@o?mD9&!i`bVC~skq+6C2u=308n$(2EaHVha%R~I>6#G>`TMwxeiNE3s# zQlND~@3D_cBF6}TlxiTAKYnb%fQKa1e>*38Jxw>bE0Yw|`E0t+3h6furiI#pbTIZ` zUl(RKkLa@v?X{$?VA|-_zLQUs8+?G{|G^%{R&H?sl-XD(**zUyVzTQpw8 z7PWvTuC;gDchsWI(I7+Mt=s9_lpYR?nruyqBDj`l>M(L9UILBWeO8?oDl}#rs<_eI zZaMItTd=rZzMdU^ColXsf>wkwjN2~L8Lc;@c^N{Udkf#ZOiM_68t$@DHk2W1PZw!|NRL5uZ zVK<^VWZOqIbk)R2W7PLv_s}8=ErOOtS_eM~6GyYxLm!0Ci z{s~Q>jtBnUnn?ag17Mzle&M_EjL14|#Zlw(gogA~4aMF{kg`<60zcGEhMmRMoF}AY zJp`5NX`SVwk`wS&aT;S#kb}bYvmxu3P|GOi((Y{07LY373|`hPbZ5*P0oK;aLG0*G zypy!m8Qs0zJ?+|CJ_zY>t6{|E&~abh!=zbm?c_~ABq()3=CW?WKC}Fuq4LY782>Hee-Iu330hefMVtYb#!RQt`7n~F0C9p)3rWo$456uzqkB7 zNC;~2@oR4I?d{QzzJBTK?sj+kc6Ij#+24*WZ`U53Zg#dR4+xmnVR+M#;)BFHsgO?| zXzc{ngHlifFwewdpJ8PV!}^-DjD%(nqlSQ>gv4=Lbqh@}fkrKrnN}TTTRry~%s8>S z=J*UqRen__`f`=3ubfDsM)T~)V~eIlBk2Vl6)gR06oJ|#)BubOj)P-8=9GX1%x$ui zlXmQrh;?RZ>Zqyu-6i{2hkj?uIZCUN7lR^*7bh0%VotDPI%utmn7PB~QZFWgd?q?N zx~Xq#@>B|O)OXXz_mXdh^3q=8C z1fm5s{&I7~LA}OT92~e=5jL#07SI6g31%9Q95^+tCuV6lj9!AYjzv1+g`opEPbM;A z%8BX--K|JJIDkYb2W#2#3kob;nD!)o5XV#)zj#yOBWueHPd)hUhsFV$Hk^qaGOm+g z+3D|wrzsjk-O5G7twS^MY?vyL9+ZMd=@b!L(MB)X=`W8**2sKlTSfvF+@wAz8rZ!` zG`lQd5iqW50y5jv`}2-eW=q(V!TaoD_~@Ww9jliy)kH=xQQ9CakH4`eYv)~lpI}s< zTG=edH!N9dN`XGzNYx@la#@tM-*kATUfKPaUfDBq%I zK72)bn3KmG^JE4T^xIgt&SwN=1Ogj3bvFD@+dS7QqWL{bPcv-EM~q%ky{1bccgxNm zPc602A#y|gCRsw%g2Zxz5F4H*!4*e61fQ*I+nq@WRUTB}YJz+gqXSOi7W)1a(9PRI zP_Chj)vmnlY^TkZ{ z_K!dA8I9FCX$C>7%93$ufcc!4qD5x_a4)=q77lpRa|rpD7t7GZgevSG0|Iph3c*^S z>oi;cMAU}~(&(}5yNBN;wb24}My{~I&sYx4t)V)29g}uH9T=wasOK39H&iWRbMi3k zc@AAL3^reSqk%I zNvk}t#|Y9nl}{r5;uwN{N(xePa2tbQ70~{O&X6W*BE`JIi5~h6vu_(T$qwWzW3u2> zuZakyGyYk@^Ejj@F(?ucCas7GoUI#OKvd|rPwH|QJ<(xW&YmYKws&`qp|fV2-hQ^{ za6tw-r=rdhh7JRU$_sIxVJ*kUrI-gs`(lP89=_>~MU<3n`Zj9Rn#Rr^oXUWq_e`Bn zZ4(M#)PDVyQ^oJR&_nxZ%@;0L{{HDjw(JKU`-Jg&B1!h_H zi(dL34fnSh`9@aa#dK5#Vfa3)-V!Ng+jU}zer!xA0c@~=Uoq469eHRDPIN1sUThIa zFeiDhLYFQYp5wMMG_>HJ9?BUFTfx1xelnj+>zznc3%U-7 z)`q9x{&aM^7Mt%{=m9kKg<2&PJ>-kb6?AI?)Kv`=5p+J|k3Chpu=YXRQ&o<~hQLht zdN9iMJ~(miu6edmqi>NrZc|)@uU%@g7s(`$9yTSzfO2}v!#6`8AUkC0v4K3Dr7e42 zQ+RqGsD`7wQOp40*qR21j~F^R0Kpm%D{x?=uMO z0}_Y@{mau1sua zfvXf1cl+axs$1o#LKP_2Q7}>lux)=ju8jZWD`3RT{Ch=;b>s5$O86_Q%2k)VLRGcs zWCa=G0$B^yxn77Dp`^K`OTZC5d0gsDfVGA2+aq0K3DcKm%XFeBlVlccJ=ed7D8@tY z@m=Q;M=t9`=ojC}wl)`zvfD?F0aJDMErSfG>XSJ2*TP6*M!VkPK%L8AGa1i$_vipy zc(#Dl8rI${y`+QqZX|9eQ#1S7C=8F36&-jcfk39-uHLQjO||a81aGTVn4>|0JLfdM zGeoH)VHX#>G#-3V-lV}U#LOnMdyA*uUh%10+mk$wGeqw>TKl_Z;dkil*Gjg%CY7(Q$vWOO&kI9l2Z zj|;_23ZzGY2c##m6O`AmVL0PmCFXg*z7ACa+1-dY93B$~b?8h-uTijUhVT?yd=a+O zFk`Sn9U>B7QQi9up71X#KMiCD4VZ4GMN~l^*!z6QgdNM!71(R$k7kPv;6-qUdrix1 zxVO(IuWQDjRq5jf0!{7ZUTpnnvc`D;hpEdhF`QcJb5}=V>e&vIMpy#4Q#cPvTbSw> zE$Jv@Hu6z3susy4ewj=Ds*F=KGIViq+oWry9;tv#r)2<|F;o_uIYUl%|Lx$q$4cX? z{=obF$LwV$XBUB7>EO5zPe%U}DqRh^{pjQU(+_{$0fz_RofvX^@4k8y4vg<)Nhy#7 zXex4qZl;~+NAzS-tNik42qPkpDS(xq&A8$39p~Q$M)8hVFrw6zh!z^5ks>rKiziQV zu{nn{CfLG=#hw)CI0V3!`~ox)&v%^CbI|GWPOs0LJe*lyP79$*uH=d)GQS1c}`O$#@UX; zb7hyReA^qa5M4YlzfZD>L$eQCWlAsw?JKZQ(4CpJjZ+&N8!tQw+hiWTF)4XYeaNuUs#iXCIZ)YAQ+p_pPUB9IZ|L@kL4La`2F zp_}}%wQxu_Z2E8FD*y|J^zW136=@GkK0b#h&wGz)HNMtJxN?hx9E_80POf^J=PL7Z z@{@9R0$Opi6a&1nDy8F6cQGG19l%yDw7?1&VoF@++q)lS$aOL-rU3^B)Jtd|+T2KI z1Hjus6bOI+lE`vIbS@1SD)^0|P3VMQc=(MIU-;7Ne+6yysz69Fv;N(CP<4fJqD10E z);v$UPX z(mvnUn%HWIcq3&)PkzTwUz*0G4s$D5uYld-DwOLdwtB_JGE~0XOYEvFsPiTxUbMXS zK&#eb-|Q(VT*p0g2;3e~MJy$XOIBAH*nFtAv>a_+u%k=ruZl-QckAv%Z;7PkS$QqI zT#WaY=DkRP;m4AGus}oRSdI+M0w2GQ%r}>mkbd^-2WxHB4ak-kU3}O##E5#|@^fu% z)oH|V=R>zuv%q(smReL!vL(>VlvDb?G&+TeTY8gbiD zucjIP+{kFH(EWbAq^}8!H!k6x4!6znP-BWbqUM=Anm~w`I`xpMiSC$j3yI7~_Q2Mx zV_@mfKN5^%F{LidLAq&?fgPN?Ai1$nJ3n|;$X?E^*Wk#)H{yRU27f9$N~0}^LJyLHk4WuK2ong7->^8{Qw`D%Zz64x|e#O zl`uB51lwSqUv;kFjf)XR`C!m7=F;Fr*(8a(-*_h6#O9%fX=nu(f8fhOX)%s<`r?sH zskq2wHb_Y0HQ|@ljhS_fsUB<@*XZP{oZ6@(zp$A)$6Cbe(A%is|qZZ}wHi zeUV?;sy&ub_Kp(eD(MTec+`Nid&{jD2;+GAPTRkgAL3Q=!A8Rg{J^AYk>p^Vkwwn< zF8_oi@mWyZqY#B}IPlC|w49V_ZOQJO-0_FT?Rd;~iJ-J|(N0?--=mj$Sh`%5BSq-< z#hmyz0_#5*_ZZJOtP=p^#smz3|A=wB*jtV|ZQ zl(FS%zG?*OSp}acJnj%qJ@01n$>uFAk?gALhKJE_k04K2tA z#F^Qh?l5b;dX;)yIFoeykSf#R^Wzb8q#;*0-5%f=@F!68oW=HiPUs*omI47dw|QC~o=-X6#sQIV%D; z|JZG_nKN93#L+)K9%qswQ?aL@^??N;{W<_)c14RdQ*N^*Mq?C5QdjnpZ&k)V@$WKm zx0m#k?s9e6JjW$JPR;nW8G;Ow(hS=Vtw!`Ba5c-K^c48^@mJ;m@Nu$P~M@NTDvq5KW z(>xsG<&ITTM-Ir+WC?~K#qA%pxuX#hoEPN*bF$L2g_z-tbWW16B5RdU*%7Ff;D|u} zj^m-+3Zez0#InyQZR7SS2L8|4$A=6g5iQ4TCMTSpDI-hA#x@G+u!@-~47~v6HO!Y)-w{*qhzG ztQ=!*UQFiFCq%aR%-h#h6r;%8oH&$Xd53)vdC{6#Y5!G=?a;>1fRN(Kqg1o>%Lva- zb&kt+Jx7yd7j19HA7|OJ+_cQ_{_MN-y9yXyy+HpHovG!$soDhSIaLt;5B0UHv#FE5 zxs$!C!++uB|1aqp|G!Ds1_pK+ZelPH;oE4Uh>+1PE$!n)VoI(t1>f&C5|XKSovv?8 zyhEtBLA~$W5GhencP?~$QW)Al)2Jc3n-J*rKi&YA8Pbf@B9Z7P={3nSPf81u-f6=O zGtPH!=&)KWxr~=}xi3tjri?*KrWSqGh$BZqepKT?UqZ&kYIjV2z`SZ_Y6W)R?hkd# zq*cS{$!-c-Bp3?=LMM=~q{9QhRN^mO6QuK%f@55${bi0x$S`uLFy8v17SN0I=Qazf zAqG7AmK&XFF!l88*fKRdy6V{`Cwa~`CSQ^&FVC;uI1QiG2vlNIg}+;qLkoP@0x2Ms zsPG{z=-Be$!ixnHIj7^<#kk5-LF>Hs*#-zb$BSIW_>%470H93Bwi@9`aNvyxc#xyc95adFvp`?eUbNWvRs)#57OlERi5VAk$h}GgYK{n%7im z*5|>Gn{h_b+}R=X))LOTW={38knz$=0|h!VmqN_%u<|(KVk_Hfnb~sW(_s1j)-IZV zn0|MB)h+HbGwTQ>N|5R%{-HUE0;bW7IC5>Vm9+5QNk$f;`fRH|yKRy{OcN!;eGUwB z=pzW3H@R(@c9g1`Cs^hx+`MMH%okM0W)0>Xo|$lE^lH6V%rrn2pqYOnZi$i;%2Q)} zwt?kT9LMZJYYtON?@*|e4>{J&8ZmY8<72J*U|y=*wuFRFQMfrjQgM@+Fe6=DhDU!f z6W;iZNo`+hc=DSfQ6?MAd7%8T#<&m|P7r@|e+b+J^#sB)Wub zA;WiYje0kS_w$b3uk~DnXp?rd#}Y=2W(|vRJq7r8sps!~iwd-dJeC?QsZ0|KOA`~+ z>9d%zzxbZdR|FY_(%ylU+5{-m1!TFFmas&#tp?dA<!85&TOhrGdJgr22;^P``^z z`$`ddtg60jk?K93yP;~5Ir*DZedJLAYkn_2R$N}W?df2Y4EUYm;|~H(z3<}F%>WuX zUd=n-b(dAzj_wdQTSxErS3CD7E0^GEM)=Kpr<@GjgY0StBT5b?D1QosAy3G)%-A=I97p5`t29P{B;t$QbF4(k4RJJ3c|UaktcyzY8|5a+UV znR7XX5O4;HOP)c9S64IN=Ou^|O=BUzdyl5t@|aH;sHUz|^R!aT9(|lIEpL7_M%7Hc z+gFY5fhDdcb`EA99L0h=85Blxzje>T|ILH1khV-^XodZZNM>3_W=0-~Ng@s1%aLHG>+7EO zgGz~QQgaG!%Cjq(O1Zo*EshP!Fw1oB3eLi=t>;uS?7#<=F)fr_VJz6XP8!}g`j`Ji z0x%#L3Q1}p^N#h;Se`b#>pQ<;a152fFdJb?$bbVZ5iE_!$S?mWPdh=0@MWsmA4!a1 z&2`f3vREWTi24(V7c)#vW)``Jn+3KIQ(SuwtxaqMdOB6Bm+_oC3g>@_A6rfi4v!wJ zxH`Q;re-darrPqCzNvyoY;M{5oJ1nm@dC|k;G{sMSw|TwAw8=@(3tQ76k$5eGK`Z& zFe`_34O=f%fsHn7L8~y6=I~|>m@WtC57$lD?mp=EA5FeCpGrA>@OQVOOCQIVVQcL7 z9=zV{m~wUG@2`2IOZE2#P2TK)aHT_?@9o=5Na9r#I6aZo?#;67^J$XBnK|Qzg@)4e zWnfaBB$jzskx_!OE>jqq8o&jUs8q<*2AD4SZjUkDxL~T)5X~zjhKx{%;$w_V64-`L zbrheVmAx4=zcGTRsg-g_X&CfE7uK>J$MAF>P20G3>C)W;U>f z=P@L8P`Eck+gMV9g!pFTS_gcC|BG_9q>{N*CGLuGI*5H+=IfYo~3(9l&+2 z#ibHl@O~}Ie0iXtZ0*i-f`ebMNXeEH8u<pK`k&?pK-cT+*nZafv+@~ZbFIVQMvdWnGbdG+G6q73^Zni)j=v7>;B&!2CH(4DCt0wlXxd+MzvF z+!^C_af9%6MLOs--(yU{;TMPm$0Ao0v;e$)SS9glQ9)ALBe40Pm`*$eTcr;d>B>sP_wa6CyN_eSZhn0hM<`i$Cf z#2RNSMh&s-0#T?}R3Q)f9aqUUUXH;hXGe%P z9xGZdh1`^_7-RR?OF`l_y-^{xd+1T@0H!Ak>Q;gJ9aR897OAHV8WP8HL?{<+%=@y? ztW>1lC59YWzXAJGw?6Ic#eQ2-SoAZCW*)t@bk5;yX%#1F;*$Qs8tZ=Qk8lfux`3T(kyLwH5yEuaX7d zhK15C9X7(mV^o7VILDmj0yiJrY{kL0OoT)jp>9EbqqL|Ct2a}*P|FY6svupPQvdD1 z_n}%nIcLCYS77_Va*ZeirCCy5Ask?O?DBDb4T2m7vRzWRYcXG^sm}FA%a1|6~bJXECb(9e>Ml5OxU$*p?mv|DgX- z?gudXwE3sUx~lX?ZZZJeM5w{_ZGw=b<3f3p+2(Sv-C9E$e&i216(CCsC1!3Xe|d{H zRFCc0!rwDwc-ouoNEED2a44{$6dtFa5B)aJR^;u7FuVD&h~+;o(-L${Hi_SB-@1#R z!N9a zj84cQSHF*URA=BTX9w=no&e5Mox07$!(Olbl#dyE`Sg9&4Zzxc@ju7!QSK~4nCf|ICP7&B=pW`+bpNjIvo z5$R-2Z^2PqgRXJLdtqo=bk|s`QDz*zrbd#YsWLih1#`ZpAvgFiCmqag>oaXr1a2-f ztIwz`hr1&A6^~lWB%d^7&0CMrPv2*#_t6Yl%6tSjUn?PYX&ZhZ`B(dDd?+dzmg6<~ zlX^&(N=t56`ZdZ;dyqQHwl}S%!qJ2Gw;1tzsD)$(fnUIUds?|!a!R8Qm|B10O0ipP zHR9mRoc*sE&26^-G6@U>!~7UmtLfvJ)BY0rx1x{WCJC zdnkmuR1>-=>7uP#K^UB-Sg<6ZL~aQfc|2al$Vl_ynCm9`x_ zCVx+und3_FU4#6>zcvyMo5D~aCnc0{F`JNhF(HIFkGc)Ok9HIZt5f%6(Y*HKb)_Eq z=ksB1cP>H3>TAJ1jD!Yh#)+oQ?|8=-eLPRTf5=-PvS2S zZ=33T29S7%?pi+A{Wu~&?7XwsMhuj+^pK-DjM9&Ng)e3@XR%jQ5=}(0T80YAo5JCm z?(ZwG9!KzBVYcwBw<;?p9BBK{AK{3kGS>=+06A>?yZ6(0X8M7uz%WugdD~;tsjA() z^fw!6&yS-b;=Sb!mS)+~Gbbwx3$hP&K3eDI@UMT%IQR#A|DCY&Spm2WEr5{5fv9t0 z1s|_B{AL|J^@iYVR}6Vu48!6T2mhC2>W?BdXmT|0G6mNWt4(B#Fpbi9OSmMyfYE?2 zv`dpeobf^^b)h>;XGCt0Sl)MR?re7uzJ%6$eBD9I6dF_2!*4j;IyMOAp1{UG{{XKC zg0K`J-O1)h34kZ_a?37I1phK(=Vi_;vbkr{UQ+8w1$-(2}Co@-= zwdzgN7(2QUU#PqNw+DiMMAk6rp@l(=k1|EMlVB8grWivSGS5zcSkN2NV!~lN3NB0# zrHW`I_7%9H9PS@00P+^S0jb*8c}5!y@30a)GXmgamr|`Y;Gs?knZ^UoT1MiB&w+*( zBA7!nZLtBEcv;Byt2K6FI7JT|>P0`35c5D<(?qOeUlqm{503R@<#|)hWw>W|!opvb zn|d>^*0vtqk=C@L_1rfV2^PAiZ>oIC%`m*WL=wkm0U^>#K}&;nu}IBhl2t7Y#Um63 zsz%mD37T>SwWzR(=MO6|rHxS_r)V?>wm3ti-2U804d#@Mdr}&Vt3|x-|e;wx&9nmesY}STd@#z^5IRJ z7*RdH8fD?x+eX>S6N$>xDznd1Qftqn%j-EwSusi2Qj|_l{mJ1F9T(Zhnm82<9#Gsq z-#cneaCIhbRV`A~SWM-BSY$0{1Cs=h4iP9@9j=R$O#{t!9I(e#vw~EnVt+S(Zy%6CN|{(=NdLlw&p0I{?xAh;%b5Duy4>}Ba8#S!8nrh# z&qZ^>Muu`Ns+Jj0jbwiN&4llE7iEau0^oxF??=_68(@l7Ku1v?lu5`nB5ib!Gwn~ixh=^T<(sK~GPvLUxC zm(uN$D4Kh~r^v_6O>+uM#O0UM<8L0)yF#~oKbl949iN;Ka=79vRUClwo60qSa8O3?#l%<*gB5X7B#x z4a_8cgfLUhH=EkkG%BnTh${RYS@PD#z2`ud+r}Hw$c>h-&b`PE-P?d;5=s+mnT-h zrP%+)3DCW{ds5llylb9*IeBAwiOwcj(T&-e#A`+XtxZ~CQSxV*7nE+JOg@Y5(S9$- z?zVs7lU*oQY!CW;KYFIG)b@93@0aPEoz+Df^#~0Wonm-tCoRGfmqM=abRoN26@Q%d zV+UvV%SlgV9%ka@Qu#pm{P=$uI}50+w(W0Amy{CHE!`#E-Q6JF-O?e_-QC^NUDDm% zDcud<%enVly?p1K|J{yPlreZ%d&S;!tvTm!g8cW{{P?%1Vs60e?Ff)%ME;M~%pVG4 zcKYU4W`IJRFY`Y{K|*SQ`$cy#cy-km{F_Yye+(aVRdt{@KQAJ0uj)a?_n!tcOBx&e z{?E%QJ(4=_`Q5A?IG0$WZM z?f-;TYWA*888Uwz)`%fLjrJ6C7&%M^T|7M;%B0-ZmsWeU=<4k%vq@)+@5CzT7pm2C z2dsrPzM-WIKOX{ALD_lD@Rnw7*9 zXNl()KdFHfzkK<-Xz*BL!Zd*3VnO{D9fqe&0cC<9uSi`*A{TN^juKyZ|1vD@4?v}_ zQ>2bPAXf~j&b`k=&yYtQb0hl;Xp1417Tr-QPAp&dF+R1Xs{4LF`NErbOq06US!QKJ z`-ZS@mr8wm9+^kHKI(l`dV3OnO@6kC#L(u4^XMM=j6vvFJiVW2)!7}mLd~n)_R|Ps z*nM}@W$Bb!Ws@JtEz52jZRGT zoIh_;rYRg07!Ehlt?Ao6)B{NIjzoyld?i_rTp;<0hP3x4G=BJPbLdm_5vl-_j}CN0 zMlD1Ft60I~XP?O*v%J#k2vd4l@%`A0$k!&OtIHs`T7+}JLQh9u-BAli*)uhBT}6aB zCz7$)euSELj;@e0Obh4wGxd+-UolC;E~cB~X$ZY1sxaUFh>uqA4XWDxA_Zy!$|?=? zr*&5p$6ToTWcUKkc)lW<<0f&+YzNfUSwqF?1?;*Cj9JRXs$YEdsT$b3r(bG-~%0Hw*+;k6nT zPFP*n`igKycTC&Os^_yV-6sa^kAHg5WIY#%pKtKlFDKTRnqL-jAlmcI(6J}8TO?n4 z=m={~Z{ESvVMF0UT#0bFa2mk+Eh%f8!t9-k~{LA_y7wl^fe>br$ zONtC38aZvEmmSX#SlAC(fGYNL_Kq{w(o-JC#T7vBv+r~qwucs&ExVJ`EOCx84GI^H zG>a+Tj^n8}Kc67BoOu5r5*up+o`{j>MNWphW`g-l2Fmb<;wkDNdynmiTr@a+zMdcY z0kpO#z`Ud4WGZLaDb-ajgIqiZo?R)8MhIOa>j>AvjAz47E`@->7+hm--h1oHU2}{tir$* zXV@a^<|>kbSs_d|-MZwtv@X{o4&yVCi0E9TFSMf1cpG#`^!I*|Qh=5?3IPpS?TdAZ z#;ka*ukYe+4_t7__lBjLFj+zua)bVcJ*3mAYRUshYHfZ0!5T?PkIE9|j7xZE*%SD36ML|hd?$2HRejrZBnY;3eJtSuiZh>4WcjB~r9ci3~_^kpi5 zGo-2Wi5S6&eljv!RQmZEV8yJOS|pfvSblliq+Z0h86#dI+wpJHG8xJ;2@be`PP~p` zI>hx`APKrdI~pUdx!Ne6iG&;vhlx^8zzI7wa`3#vl=;*u=)}qVxjF>ecKGPh;>W(W z^j;x=fvF8JFpC^oA?M5^3U+JSf#^e$ME%-B*XkU!MC)*k!H7wnY4^-NRE@PY3vt); zS29YvI!1Vi%NVDQeztuQeG6EF8m#xht;cy}^aiJ`OGe$W*vhDbBK-9I!gF+2 z9h|Oj!eE*6;pPt{NejKZcNAGmsy^y=`PH=BVLpZGI<0;wjL3g?cSZTAe{pPFbxqL4 z5D?wv9-ri!m}fp;rxk+7%#PR?V^)Q@RloJ_mh)wa83_i-lik778> zjKWG|wm9K~ma;C2AvNQbTc@v=5U3>MyO*elY`{4mK>6gaGyndu;C^YJ*vkS``Cp7U zC4@aZku_EgY7o|o@SG)sVqrg4jj^bV*(yHq2zHUuBoD2A9OH5Amfm+bI4cCs4%2S! zXcTtU%<>jk;+3QT`|a-SN&%7x5nWYzw^>ouB+=>C@)qJ?jxUO3d%D26xAUs=5hpkh$qwG0odNLB- zZ-vDI0nz}~!@v-puLeTXQqz^AuIZ6g1jOq14`DqdB*Du(GDU;NlqIN{AwGcj7caO5 z-~dM@E*ox5YstPnF=n5Zub7q{l0mzbvc&=cGy&!-X^kGD7|J=5yuHiLr%+g-+XtGDqFsRN%hnY}Tzwk}u>L$c9o zw+wcBvpqr{(13eni5#5hk3fUDtn#WeqVv>8$!&wb;#rSf+dNo&5(`zu%O zstg-2Up1iLyrKHXIScRsIvDHfYyED5r6_7hZG8Geq@E1kT*lha87)8ohxP4&Vo)Ie zK;{@tVDje2YOBM~Y|&Kft;hCJ-1Ge9s$2{KZf-~QIGjggGA!N%pJr~S{mr&MBfzg+ z3|MNd!AG154C_{vcR2y7W+tSEk;l=*i$bxvz<^UG5{m(E#Fp?p6Ahy!1etq4>)BArFFzb>iUu*)~*m- zj%ZPBE9XVyeIvuO+iP99t(P{TG+zaB{>S~NPAF18I=wT7ustlU6$X3mel zZykJ*)QY1?dG>5II6o%f7Dc=5*jc>6^)EQt>++p)g6ZNQE1)Wv!_l`mkv<-Er5iik~cnFHh$0niT3+Fs*6&?}%Eh|NGcukGJo>x6$f3vo$OA<>SA&HX8^Z*85jKF(P z9txHmQ=TEogE(Q94Y&agAHMK46@(j5!g$^f&_wDV;3)d-KzkPTVzGPRF`flu?cdLP zW5TjxNw17<DJn56PDGeqF4 zi7l#XTT*T=7UO*OY4W&%hE|fQzAD9m_1q9YxIP*&49CIAp7PO&V$_VUA6Dz0u=xT$ z2%RyP9+j+Gg1B|xV2Mi8wP zvu0%fMu4!)P4Hd$wuRETh@%D<27ZDaQce3BBvrFXM~Za7vhq*v$Sa`AV4mZLgH&60 z90A08q0MGI?iJnAKZ&M~+mo6HBMsBW(R>BAfI%JeyL~+qRUdqPjrQms1=- zD{SAX9J5wcqYpWv+l9^&E!e34?7Rj(xs7veov<%Le~M#yQX&2@(qmwEts`E`Dln+Q z<7)5y{%&RpVJz3L26>FQRX5SMa$l!F_xZuSpy?>$8IU6F@yftN;(Rns02r8R0Aa9y z_G0||N%LZ3mM8*VkAeuz=Spu6KtzOc$JL=fjq=zhE9T>YgVi2;Q$a$X8yMDIY}e9$%agz?vx*-j4lkg;trLopEn%70pt6|U9^ zIRvRSF2@Qu=?Gaps-@3uiXYi;fK$$54kt_6p;R0xQ;JjCKlz!=z^tOhA37iVTY&y#Ta(C5+tD%iD}xCouJytflrT=tD(3ZZ-a zEM*tZLHIrt-M_Pgirx)NAy7!qxgUr0fbPd!y+z#EQ94sz2U|{+da@D})wFE-A*OzV zT4@$2qjP-tWzYykt&e?nd?cx&k!ooOr~^V150wdw)nB`KavikT z7c4!LGUBIVGISWZ6x>IE>v$d!=#`sS61b0~IoovE{VdRzl?5&gsW^lilQDJGj<3mp{98XAtrFAm!o4wTGv* zzq~h=^uM}FgMY*O-~r*Oa6)bPWd6wwac{y)BzrGNVUHwsa_&NFmy6-j@xQGIfZ^~4 zVEF!V{jEg&AC|A9rH!e9nWf{);s$vYr>PjJJqZuMWB{HL|7<@y+Gtx@{ZV|wJn}!W z#d#MQdOF$rVmXp7pUrDuVvENWrWo*gFgHJzCzy+76|T4$@@DcUX@%FfdOR()&&^qY z8Cqp6lw_D};6}^UHQiW&X%)OvAtzK-&R8VT*bj8FJr4X3+2DuwhXoxhu*z~xD5FA= zE(eBgh2iUq_V9rm@qt@cguE`88u!AhPdQPXi%z?U&8Q0yoH?qZ2dY9+AlQZ)Py!;0 zYdYrh8ug`69tf z3}{;=l=gIn8>zzw(^g$rTSMMB>$#$~RCP1A=Wg}{2sG{J`xBGpEEmk75XBJI^C{S8 z^5$RAqyGru3ChLWZ!Ojz(+Mjqz$0Efxl6;|z=hPKRL1vUVCQDY(0mr$%boG!()(*>Lwd9O|r8cv69!pW}BPn+YsVl`hM^o{COTcK$=6|2-|6 zHP3s40j^RXz@#DrOio=hOM5+I17|IOY>}Oou9>mEg&p-D)6!hq%J_HhxqigU**XIM z@l&9en+UX$q%CQ9s(g?6S9H41EU-4&1u<2g;xCobJXT^TK%n|zDi+sHhHNV8isyh$ z_lHyWKduX|tUnzMC_QYdB1;-We+st$Q?U6{cr9V?Ydpnc zRccU8!DrvXxEtPXydxxts@)yB#q$k6qmd+wD$?S)0LrOEty&ef{Q;0;X^>;gs43eF z0res9Sf_a~Ll`|XnK}!|3fwsLK#Q8=`tLD~&D6=S0gUMhU`#3g?=k%^AGmo0k8Khl zCgS)Z5bIvYQ9XHkJmG>Lt5*N#IvVcKCP@&OgJ7(@i0{pcWBVuT+$k`{FZUPCQ?Bls zW0*{UhzLe=&#&qoheLTICn@MM%6MaZ0hLpN34V36U&;LVNk9BcX-8SWXC#!+Bn;WE zffph}KzP=NYoZU@J?mVLVX>RJ`~&FsJ)@e34mje8c9~@Eq&F!-HMsDMq@b=5Mj+wf z#-WN4qwg~EMnh-BKhmnPOQ38cfEI!6Qz~6n!|{Lc%A4~0d_2AX@|-y9?q)Q#pT4`K zS~B~tb03k=QwmWs3P1L2xB2OC4YUJLL<<63AroSQn*r{YA|9yT5lNVt{3I8y*{YWc z`F3@8^sD1}!yB6eQy?jEqj(~)>>qDiJ_@K74?p0n(o%XH;D|bjpRxD#+o`p2ejDO! zlp3&0v%Z9lJb-e~oqL217wUFg3$o{f{FtMito#GD75EfO)O^@zIWs$vka$vp7~Qv< zJ!=B+m%m=@NM-Yv$knGKEo)&; zWip1G{WxIkw}a-DL(1!KD;hINfa79~l0x_k36Xms&sH3Xe@;29*TlCfQ(vDgb~bLv z~acORVt6h(9%=RLE2Wwxlx0>>v?I4`)uVU%N}~ z;i$AF#is%Y;Kb3+e4fD+Gy-|od)C5H|*)|EHztE%ib{&tJLNv&qfa}L<*R!uDlc6gX6 zNun3JDPz3odskoL_kq*~aQ zmFJRdmc1(F;S&3t2xIX(Ah*a2$>GTDN2EhN9*Wf{N z&xDQ&O;1B|q%MkBml~#=>5GTQj5;wlwVPJ)O|XL;`5e^pfv0TL|MuOsE#B9Z5suC% z{WqriW^XnLa9eGuHpHO<9LwT0(H>j?3gP5cGFwS~h`vhB9mU*Y?#dX;3T7A5RK*-^ z2zOzdPsS(0Pie#03vW{I@JiMDiqDVC!7r?EZp+;!KJ_#)Q_UH}A`41WP{hVn zJphqUu<|m+lbXg5)9R^GmJ`+>7!OmRXbeopk;wRYcttN%2anU3R`hoa@I2g2pq)3QyvZRFv}l0>EBXS(i$)y6OKwCQrc zS?aqva$irfeB973J4BO=`Zx&{y;U=aMOCtlJ%~^|BrbCbyKe_CQUyQMSrX2fl*wLOKBCTqVz!j4e@#<+&VwSoP%|@X;a{_7>z1@(?1qY0 zvwoXNi%Y?jZ`k(`0GTG%%hy^a*tceJoTULNlT(%QWR?1sm9y4c*AZV=qRknF`S#pZ z!`)EOw}&1WQE>mbH(&F z6dQ!eG;qMZyoX1dutEr{5!nSUorf!`Q45YpTLpOz&*7sQtN6`rnQ z<$P~v>C}8wGjZHFDpTVlFgMtN%6)SSF2q1Jjk0n^CM6YbA?wEBepM_J%Lf`nsIbfc5B``g`mFz3P<+}02&;~eb<18DZsG3TtiTT#h+XtmC) zgf1b8@>V3E9o)Yh#8l#U?+M>Dil;o0C`mNn%N}g4JSJ#M2a=CM{9=5Udm~hrk;5JnjOR{9sqDT(0BZq;E)0Uwjbi5N3Gi^}Sj41;91BWS12~>v6iOcKK zx@&}b5b=PGi00e>$#(qrj^t%q^8;`wx*&=GsNDIX9fax3e!fNir$TlTuzA)vZp1|< zG@hxhRI)i{*__7vvtzbKhX-WfDuEKMj(Nl3WO_EXfi>;Z3%E6YJ&eAMui(UXYePjd zmTLrIbA-BhWbrz6!UFg@l0mjuw>0AK%ALU8A@{QdfAQN%{uWObj4MSDosJ60x1OGM z76kE}C9j@+((M5j3WOP*2Dj)DpiN+-TmhTS%U2psQs>Pgg>b^zB@QBmhg3wdMgfaB ztxj#07}-S}Xi4-n-dNB`@FrOC{3Bd^jrV|IhW%CPidNYS=l3secpL7rpB0{6?QED* zlOOpK%_nCVc=U@`w$&pS=D?K&BYBw!GN9Ca!rOELE+k+GoGI(KjSsxu*)|)z3m{q- z72|wKa#!=xYlKPmOLY4Bq+5qB!KLAv(lK>%X7lNf;+@t|#Hbq+ zV|I45xl<4yLR;H+#%?A-vLj`vnnto|0mVB>i3OixExl(W=}^Bi#Ax^KuoHeWPX7J@ z55~KG{S!cbJ3p7Pr&i}KAEp~JEXD?Pgta=oj z<-R#hp1or$R;g2A6`FVGSEmw6heJHyVO=k#?;`{s-logyOiS^DdL3rt8bK(QEfvm4 z8rRmA7&t8ZICMUCv_Aznnal&d=pQ|1@G-yU3_m zUnrtEJxQ=`B84)U+OnBFOLCHWxPo-yUYe#8pVPHwkFCfP!DV`~Rcf4#B34*c6e#tZvq7mgGgut(_ud}#hRwzBvqV~A ziiadon-ha@0U;)@ON{a8xD>E&67wu7Wd3x!C{W}QTvJ6REFKyoS}5%NdTuKd*bxx4 z(m7fVtGJNaQpVavc3s=1@SiJ1+6TN*mHL*AM6@BicbpZd742myzbXI=oI~M-#?os( z1ZcbFUEJfrBhbbPzCRAnvz71+lZ5ziY^wqbM%iU%qh#Y9&$&2qGX#0QFgWJ&9n8m! zev!aoI?zhEX38jua({}IZ9&sh^E~qMxBcKtUk7~KrA7txF*4xuKlZhqrInVMzJtCQ zm7SBF*l-`UM4xz3FtsQpRe;oRpZE~@+Uo&TpG}NW2mFGU4+-G&R|g5NCX14=fPgs6 zh_J-a7_1m2+3?`VcUhWA`c)gLAu&o(iazQ}Sz*yW3aS8Vhys~Wno)YDQTowM=>8Gv zu}g|+SQ1Lnp+50SSrSq*i7jXm@mg7ue1`F%ff2DOiNT`H|8L3(J;LSo0a``~m~wv? zNA;?O5(4r({5-e?7QP3 zZ3T8G*JC%=CgT2CZNcWecx6A;A#pGikg0xWG&asu`|RlIb8$XD91HF3(NMh4>@y}D z874DTWhT5hgyEdpTJn}xW1OvO$|1LWIx=F=nH4bX;wibF2hS9a9M|!ZyCi7DKs5(O z!ar)3iZK?LPS$C0i2SskLpg=094|TY)QgmLZc`_J3@ys%HmEKS4^|gYJ%iYzoI;$T zt*Swt{8qN|WnvsDTQ#l$f~E%n3aO<3+nC7;@JY$?hs5@Z7DRqO*TBwJ@%2I-6ciPxfi zhZ7uow{fAF(OALwRT6W`&}I_8^$4l+Fr!@5jqtp5Zr3{Qve0RQDQzqXl0jQ zx5x5wonbp3#0<~1BD{JEEZlNe;og&K?^g`!-M%hFqWIlmc`5|aEW%1CY;GJ!OTF(r zp%tA{t~E3MYw9yPB2=zNM34t@#c&K!j%2I!M-$#8-b;a^v+Uf*9-(y~+fK~8WrEg^ z-Fm5wnc}W}t)#059H@IrsWngDSTpIfK?+n*+9A~{(9i4(m03(%o{t`%D;!BcDF3 z)S80(Ztbo^=Ua)?BJyOj9-gYtc;rf#N6}DEWGf%mV5(EKGn2P&W&ia-riq zDo`OFDlKl0tu5`rG3+(6_HM9HVfhV_yNRebhWGs33^gjz3Y)c-^5gvFN7(`0AHH$I zoF7EjC2q@<~>fy-Hn&TkOzQK0vr#B$CmiXDj<$K|GY6%AHS8(nGkC?y*EtMF3OgUs z_iTHpXukL1NoLZTbg9(GeD-O@HRy&IFz@z=xG5SH9C6_qZvf>O%PLxju&tA0CxRYU}z%F43Y18 z@3b@y_oB1$%-ch@2iK+=@Z-z_8PQG%Q7> zFI{PhJnG_{vxljD_SL^_>Q7rkj1yAEBicRZ}d33d(P*Trn%sh_m=IaFk0N zDS(o9OU;5YkC7MY)*St5(z)k5TOAapUvU}kNz_;Kp+r1`Q=S@>39O>?W`!*=ikUuZ zN?cc4jOR8f38jw;^v&l`iKtZO?ZWp(@GiOP3p52*r&cN$^&dw}ie|4tQZ*pPyjzBj zCU4E}jT1<+BUohMR*o%g{S+E?yhq{-4@IRX(V+1w^U;nkC{VtueA|g#b8Rzi9r7@Q zj}Gw%x&7><_#=)$Z(2&&lUd12N=_+gr0R&A2YQeN;1 zlTFU>XZbg@qZ^y}C3Pa5$z}u`8&11S*6XT>5LP== z5G<=m507Ai4swx-Ye!2S(LTDba%H+Ulk9|L-}<1ICgbhr7N>aFr9U$oeX{*9JV{#h zjV!9viQhp4(M!xyceWu6%5bbV-#cr)N~LVdLresD5UZ8mvDL!SN}hq+|6PKjdfvlh8FB)t>lof=mS5znW`YlbU=(+xf-S7W$ij`skMzfYR|Q|*oY;{Cq;#Iua&_Gytq2x08!M+ZwX^N4^5 zsSwdM{ty^o*E)<`x2PA{{`+4#M{0EgXm*?&!4PVuH(CL489=~DAV>h42=dK~nv*>QGfEf0Zd?Gk zRB!>`{qxH9dimF1*}A{G%6_N4B&?x=t)038c2zt8LmB^16yR&N7chYTmoyzSdwnY# zV~ao30)OYdv@Yz%>1#9~LhZ}H4`TjAW_z^&zVp{SXF!I4maUzQzP7p6pNZAKb6?tt zOTH8>2T%lh;{BI~)h})$z+(JM?!P>SfFqvYS#|c>Vr;Ex;T`~|gchKn>x&@bpI5dQ zDc;|*>}~D-aAE%rduf={=lVT1Kv(GlZW{2@|GBcgwg3r$f88)Z4HiJ<^}p;tbidwg zEkN5=0Ah_V8>Bz4Y%eW}B#CuihmZ1G-QY_w|CY7yCPwlditiUk%C2{0XLJi-Z91STJAnu;u@j_gm`d z>!C0jtV^;0^js<+a0`I^&z0?^57-a?f#+wd>f-FA$Q|Wg?_>J1Y+o05 z`UPwE{2SQsrJi2nUe~<&g}e3n8{B^?;QY>dxzE>?O@6Vo{Qj2pXPuMRu-C%;zhH+! ze+T%U)2hu!~#{5{t4bu(YbTK*dkc-hhS{3G)}k(aND zuY>J=5q$v%(|>6u{AK9fYwqiSuU}l{f&Y{HkE`@`DA8}^q5qTo@4%wht$pn_{>5yY z_&=GyIgx+o{*}Ax7dL(8ueq;I`(HV)Uh`kOtbXwy{x|-AIj~;SUpr}j(T(Q*r`G?M z%jPxxwRh$hedvFq|KY27O?~ZA`9-yy|DW3Yr+?)&__br=7uajze**u@O(87?2LAG+ zw17X|fPHMi=F9*743>NI=4IA&7hfVU(gMAC`2e;}|5=5U+F$H#^eO-Kgrs&f($_b$ zrM5CQ)uyDOVxgjCptN$PqqMNJ(5KY4aHeuJGW!z?`KB*xpMM3mZIm4dkj4S9DxncYKQs!chgLBF`^ZeUG3FMlDk=wPjre{ zWFP%;6TNIr*O(JA5qtYd!4*+y-avE6XMBm|o%LboymuD&^Z7 z7BjG5!&Km~#4{@Pvk8%HxjAHwNG5>U#ELpEp~AE*?>t9|vnDYa>3*Z4Kxby#fnf!g z#bWwlH0kYzE9s}Rhsx-ukp`UeeFJ8d&_YA=3zw5gv+7Rsl{Z(fK`!du-dx7j<7`Mk zfE~4iMeHQX=5Jo=WI#_J!|a1<0iOLXfT4c>XHRRJTU%*a>X_*3+5t9MA@U0^f^lxw zO5(8XaG)OCM$nCiC|7uUHC3a`S+g7b8bWlDl_eQCTE?5om9!b|y#lPZ+k**cdB%6W z47^ixB{DuN^dRDRt2jQH-RPklRcFjqH-41t2dypKS+hTQ6Y|#vr3~et=rRT{A{v|1 zSq4;5MIv*JBMI$<0Efk`<#hGgWtU7q_t`#39=kDC9EiMV-igA($w{-hw-D}koa_f_ zpCMF6BgSse*Cr;UT&%-^-S|UbqjNeWWAsZa%)xVx*1)OfGu28ZTCl?~3RaQtVVf$h z0^7jq>M|)zH4`c+NGQUb{ENKaqZaXvzp4MmRwlm z&@1y``xg7~CW#Ag=;q2p4=F$iuasSUo9vE4*-@{a?Ak?-nj&Ml^2J{+)++hqTc zbwB8{lCd@d^N7{($#Mps7C(R*WAA!$`*|BDcO9;k_(CqjMJ6Q%>Fj62V?s46He5(< zadx@2pX)4lp5C{9t4WMc{S9HNhZhVErPkrAxk>E^N8jdD{rzygz6s9BctsG*jFnQz z1*%mK;vejuY)mPaU!e6SXrC;7KaAh{7TQ|rO@~a4$J1MVi89Bri45A6++8r&;aJFT z>cGniMKa;|$+Jr4v*S9M6OpO74t@8E`)*dCV?;JuVDRj%t1iyL7600~LUlpQZF>sZ zKwnYnvg7piEY+6iEY*FrdRIBdxoR$c%EA4a4qpnlBz3#K{q#bsV@Qh8Su8Bu`$CmP zjCmS1OV7;6xZ%fosGx^|&T{^%;$t&KZvDRByzMXZ(O$PVUKsYxn>xVL!o={KyJYC^}BjOU_#FIFup zip*h@nrkYY1KCN+RHu>IxG@?2Og1q2;D@}$O~K-##-3e_cw$2LAvrnuZQx~YAy`ta z{>MU-sa@0}lZrPsKJ87V(`G&s7o)5i=STZ?j}spY3_NxcJ^&*ewO(X`6g_m;2{oMqK>@8egn50qT` zj<{rZ0h@_c6#S>~R6PNQe*4;lo&n#_`+g*~wlwFYY3*S^nesMyP>P;bQwA0H-zu#N zMHWRYBi&-`a!h!nmCvLzv;$Ph)dWIR*BSUH)kuk516jz?Ig~}M2iKER=2UJ-jK`w; zhJGZG-}SfZVP-o+ENV>ID=e^JD1Tl(jTil%$cBD5(MF>X{n=8#n^8`d(6UZhvA#2~ zr#rDl)Z&WrhhR`(jx7*t3_lu0g7qWBGrm&-bNYTJ%l?i@S$>0#Y_LXd2)9@zcodl} z$OZ+^f}WFiEOMtG>HFP6>5@0LF{pKcH@JoxF&AZJ5mxKIv0GW%~-;Q^Sg2fI@6%>V+_EncPX{pDa%9@FK5l@h#bqodd- zgC6(Y^Wh;^pJrdbd)k{*m8q>yB%ORSL@0=#X9G0BqrKjeTn5psvo4lC`Q?(H&g=z3cfsw6!b0_5T>N8m z4^bKNyPVEZoO zb1JR0+@DVylPI@jV(*moRL3$ivv>zGTf3Bt28Jkp z&Me4&?VkfRx6yDHyaMGt{Aqr&DZiZ^Hi9iEzRi9_8)kH2LNtiZm3NQk@^I(c2OMnP=#EkP)OARqCC(Y*K&Vl8l{;_^4Pf^E$f zei?iYK4Fh+jiT9eHn71TbjV!+Nb3$dM4A1R^)aO71UH$5_8p@|b8GVUdt+@xA06`Z zc)#Gnt2AYNuF7=DA5;E88Z6I07S2~l=4r%g1Ez$3!nVb53{#b4iij%#+#ik*wk=mc2-R zz)biaw@V!FQ3itoud0rpP9!F-QkvCz8+u$_^*$0%oGCRJkp|e?*{ov#E2~SdPBceKJq8^@n%z9s%lxe2mdqt zu*ZGbmlI2C%YUPBS{2Ge=sF^=XTMMwjSV!cQ{YMZ!5_)fo!BKqHu+JEFX7YLtrbpw zhqZp=sb|bcqbP?vSNvTq3KCGD8w5`(Qh6iFdxEt*myrgTT%+pdQzZ8gunbi57(0uQQy0{sO*gm9d$PeN<;^Zo(teEaB$mc78C0%akCT#=rkVb>V)uNv zK{fAu4~uw+oyma%Hl$vizTu)8(2piy=CDgYAs|1F)J&DM;PCV7jNi3|9S5DyaoFiQ z!NZ?neM~h6zJ~|y#%()xXlzC!Dqior;V>hnLy>B6mwqn4TX&!Me1;*byY0Z&(G?k3 z?ty$U*06Su0W2am+GX{fujH-a=g}LHJiuF-J*(3RU3%~YJ zzG10r%?QoaHHUU31QG1-V?~~$ds~n;czv%-6VfjWq1YJly&bN?VcRk8^a!Lb3}>RZ zeQY)4l#_*0evDj+CH=!nR-CYCTV7uJseuCq?ipMsyer0{x)qK~S(i;-;6gegV#v%2 z6C82*>XR(FqLSn4cbud3wZolI)3MPCv6!CycF6J#W7%M@Rp}jXqJ8{w5CNU9bf^a24XQdJo66b(u~>H=2ZO z3gNOA&D!Hy$=g}|nDdWK6b4k17$FbqV4_<5Gy3Wt7*U+p43z{sK@eUb3++%1%xu%F zMrcAsV>i?>g{4RRRjI5qATgf#ojyHrvUyIFA+}S4Dmt;g{u+a-JlGJ!wcF~SR=r8C z2<`ITO;*`&hlVHU*3bdlVWv3rN?;*^-3G`Pzg(5H1XtkPg098YO`vXlKQ#B0?dCV@h~8-JfBglYhW~ zDlkR+p>denoDSkA=4BR8$h$PHhc0ATzc{5PnF%i2rS*{#(7f!!B^E^H45~I9UDQCw z^2zYy=V2qMq`JN*iX?vwM=hmKs>&?+_W+wDQhgcA#E~W{^WII1HOGHLF zQcupYtT4wZzN;8Z@sWgU&F~)_=9Rj6J~*ym22j?t`pQ!4hR`0Lg%qxKsP*0)q+lFo zVp%N+X)2E>*`TlJUyf1w z+>`t+{UO-4i7#Y^ejy*`;W%*&g7F;<8wmvGSw0+?5+e3B|ABnkV_a!!{VuyOG?>3T z5a%E*VjDiJ+G#zcDcrft_eGoAm0#yAFT1YQ z*{~~NVnCdF$D22Rlb(N_x9A#aTUY>Mm;swE4pUoO!I{PfmO_m`&2--EzJ=7u$H+EF~0QWH{B-5p0dzrn9) z6&~#AYbux|mDD;f7~JPRNuv}FogFmvUAs)_B{lT*7s^Sr9QFUiZ=`A*I52m2*L0w6 z{UUvIrB*G6{5T2Jl=72mANY;DfI}(OIlTT-6)0g@rIeQYrC?Z{>&fa`=Qqf7iv}|d z%UWpg{31n<>JnO3|!Z4D(s^;S6d1#iww7t`YgeI&nND(T*XtV=^Mva zQPggXpef8@3m+#=w-~IOA|LqSC9z0-t3ohpM`Cnl5 zC#MfG_ye?jYWAgU39b94+~v&;;Ayw(t8$&=^aa_;Eh0#Io0i!NoO;$Md|y?CDgbKU zWjA%76?InCT~?IvYqz}tNFVAeMepOt>qhZl^#-V7Ez{x&!?Oqi_IAJD>PfBZLS^TD zmo+)O-w>cR;JRyicmqLNFz2u$K&K`ioc{-fPghI~vsOPkKOsQ8VxS#C6#f6{m#^PF ze+I~XLLXnhdH(9ft1sa5Z_H=-@LTgN|M)uwQm9R~T9sAVtyc3^Z8r;N{DmHVRrR}b z)hx2QTGe}15fz;0>#MU@b){tEWKK^JW4OvnT?2;NF0a-K(bw7Y_Q1Swy3c`JnbhpS z%ctg_&U8*QJhJw42n2{An6SJd=;rT;Ub;)52R*qEj?h)ORt6?Nb~SBXh7;680S`ZL zF=75)ZivRpR*yIj@d{ISu!w(6Ubf0PtIHSFhkRQWg27kxqIm;%Zs`MsJ@&r{9+p+L z_?$(&`8s&o?uYxhUG67@9AZ6>Vbo#^6TsmwfSVQyFjF9v!|O-|-OZjTf>{=D-L-04 zRro{FkE^0=_j$Lzr1bz*biiys$6ubAAK+~GZ?4X__4*19`I*aDmxcPiSMzPzcJq^y z)EhX%vkWOZ`1LYxS3nJ$ZGCO10iOIk-?rhSYusKK^O(VrJ@h-(;8qmnx|@d&$k_Fj zJ9=WC@Eq{qDUTto`p<>b9=xM>aA1Z&)^O&}_!BcEpTB7K;`55Ps_Pr3iGa0&AS$~y zIJyqoXpn|Z@!X`3T*HtP=fch_FAB3<&HLoz0ssI{S1qzUwQ4Wx?(BWj2dwT53Na7@ zxp^&tR|i4tX2z?)Z!@uDFE2Prot5LUfe zW>4c|dRg~d7;_7RA}mhn1BP5pfq+D=b&j9$w86xe5g!)rHpcS8SKKx7^LoMX0+6GN z9hg`6`gvV%4USK<*A>WMMk24EYydnl3`3d84aX(pz$n4ZbUcpgv%Mwk{yae*yz@6M zDd^dq_@q-;a@vQ8C_yYPF8YcYDybsZB?yyqUL@?z^`+utah|v3TE?;R1hh2ZgQ!2? zGp%YqsAkEsE&?xv0qTuH?IIWbP{T6BaVugV`8T>RQ?ZU}=khaL?eZzD*4Y7X8-qV$ z!ik;P)~))O8?!bVs)0pg7DM|$fb=dn5EdR!AmUq*5;;eufEY<9hw5h4sUJG|A*KLW zf4gqVb2J+?yz9#wZ@SmOSY@6+?|#o{m*h*D(d?KVU(i7DzI!tIp0{0_Zl5EIb@!d0 zk-cctuI}uie1#tfBd{7eJ?tr@}yxRe10spbKn%VBYKL_b{3Cf7G+6pDw4sf4e$i@Pe z;C+Q+2Xz;KfrpkSXz9Y?(jMh_YD2`VdEXYPF2KFz3moUCvCK8bjPu@~Xp|*hK2H0wT zarR`9?fPw3?zifUU-W3`)AdzVUju<$Fj@c`ySh=D653_<4HAyamDiwyRNaD(u>mDG z$St@w2~STB2nrVc3g*BR$K#KTYp3RoFT{^00)1XMfj4p< zjDhUTX19gDf1~dRtjHRJ7DtgOciz=i;CMmFrFScf2L`3dTK!=RdOsd}__24Ne ztM#@glO!kB0=n^9KNpiDx(4)aKZf0AdSnDW2JQe94-3^#Wbi~%Pt^o+n!VW2++Z@u z3`vH2uaoDBPEO&nkM!Te#Iha&$E=yZ=ur(C4uBKvI!Kp2bZ||6Bw57)a4<6wxzQpU zwL!BL=PsZRz|tFpBNOM*O9RUWcoQJ)Hw&%u8~_z!`>(307uvB?pgZm$qC&DnA0P6i zzC$++5tljMV~!nSN@Yt1^Z_r92*9VLf;nciYp<^002eFXqq(CO0}GnFEXy*ilZeT& z#SlnE^45`qkNge9_GZ8_0SS58rMTXEhjlPW5~KnE4>$Z?)NnEp5BX+8w)++czqm1Q zEGN_0T(DNt@vA$PSFRdsv>?O-P{R#zCWnIxGhhjqciwz7+s$_Qjg_OosTxqV8gwED z-Y}QFlz4EuYsE~o(2iMNxnZG|7SQs$BhK-;$MqF!>*ROFX#ify@FvEr-2i&EUF`@9 zmyP1L>Vwc_$DU7GCV;|``%3+=Cw*gklUcvhyj;ThGM_yI8F2}F)1p5cz0-(35B1)< zV88~H%zaImaPWKjpKx>j-%08n;|Au**2&d=8_#SAEq|N2 zvz(oJ1oron@BDovF_S6$&$r*jf{S0Zu_y*)m3ra=BDPSMXR$Se8W6qPz6BW|kNLun zal*X3L`>x*QU5T)6vI|wIhE!3U0DxR(?0IiJK5S+H;2iGyxi(G8 z3SQqyIJENj3;i+9QNQfE{pqiNeSLksY{<#6`yQCf?$`P5`~Bl5kN@NGZyuBGsDP}N zm)&mriAWWOHptpTa!A>g#5u@{=f_>yCE$pL_+1t%_^NCsN;LaCd7kBQ6bXO}3_ycr zGr;p#JS$)UE=_cS3>cC+1jNuR%8qK*iBq2?wiS{ROryz#aD2)2j_jiw4p!IKmABKu zTKzZ2myDqxdwNc@r+o`#mtCowUw=UE4kTMP_JNT6qi7C{b_Yop(#DA!oqVxz&I_3g z=n2)wN)-$7b7XF~%sZxM{zq8KYz_Z-R4yO2v+PlJE6FqPhuIxV{Lk;_Czw{Tx>P^R zPn-pXLR<@QCze<@Lyu?)b-+}4)^k>a5;oVo&o2UL7Ro+7__yw3-?^w84=+aValrI| z)D(%qf`R@!5$|^tv|0f1|0cd;1(NyK#5b*&vL^~Qnd7lZIdA@qz$cA5E$_|Ww+ZAP zREQ3#01mB)sp~!vDgi+9Y11_={C$!A1;rc#uadD-NQ^UA4k9&!UQltIUgls){>}!> zT2J_pL)Q3dB^j%-;7AzM#m&MA?S>Mc7^H`HqXS&$6?&Vj5$2gw@)E54`EK9A7#JvU z@@*P7kpvd+C64h!26Vx*z|j*a&ee! zfq5t3EL=ytaLB$Q4>D$3S{D^t3nfxdc~MsRmMQ9=F7JQ3yg!=D+ocCNO+*gzZ{B!K z60Q?B?>Ys7#1&l0KMjb3krrRh02}feumLd*m>ztSV+OMW8csPJ<)UoYd4svY&dD1< zdtN-=Dgf7bX%jzRB;Zv(7z((B$sq`f`K*Khh1J5`DWMZMDv%3M$_fm<1uHcJgYFwZ zMAMb3)w~&KEbr>(MlkXxuxQ9WyHk# zD@*~%IaS+gBUw@3mqH>VMGRZ7gBi8{gp1!BJOs*wePvvqa5hX*^c+l~a~{}7<|b4V zbnmT03QKXLwJ277@S6Z0KQs==lp-*tzcB>l(9)@>srH++49YHPz=9mCRaWuKa!7rj6r0vYT#wxoXS5D$HjwU#x4;CE=UIzyLzq1#OB4 zYv1AbJy;Q764o1%@a0-bs894~5+ZHay6G75jsfSttFo`^cUp6kcf>_a+`exbWh*+6 zuqc4%WFYH#YgedK$KXbSaR`~7XqQ?KkeIAJA{AJ}AE;nOYoa#clYwo@3bSHbUADj( zC<4*X<=oV0Q#dMBMv+kpj%Sys{B3J;&@ZG|h{Lg!QXF~4ps90eP@hNVts@GT*&Eqn zd;!HF;veXT1RO4-++k50>3X+H(hA%XU)AkM%oI%yj|fjQrV&b~ni{okvD80?d6e%jDkXUim$iQ}(3fPd#6o#Av&jix*51?+6$z~Ra zFtRyS1Z>*_nlS%?vWrD`6;6i;!@$~>yRvIfmf6evhROGkEyL5R#aO^x3#65YRc+5H z0ev`$v*lZ$j{f2@Juk|3XuHxmqhql4lqB)qA%@3l2FMMP~(I|`l2g4fsWWa+KFHz>Lxz{;9Ea+pKdzO zPz+)sz^CUPCk~Z?>1vF-$T8JrLNfQa{tRDV#o>SUxeYt_hMjqD*;@x}ICQT0ipsE~ z&mJS|gSeYh&uTu+FUqO+PbbbVz=^{I8@O=>eKALFj5ofTA$TLH5ZB(2Kj{%H)Eox!j-c;+$rmpI~&EE2& zk5Ba@t=%RwYJ?NC*H;J6gya16#HPO*Ikw|;XHGQCrraaPp+oULb=1Zo*>jjWYQW%Y zERHTI;|G2?pkv4?5IbeZu6R`LRD&AF2bflWPQ_#%_CK!BlKq+MGcc(@=-U{8FIT9x zOpcAMu0!+Kmeid+e1!(n7G!wep^^2_KSbZ)=5uEV5*(PY+{&XSJ2&)BQl$Aajx;A3 zxt)!zo4w%%5=h55?+9`T2fb-_9WERy6&!~1kr|-)tkBgupXn$xZ^ff_kv(cpX6|;l zo8ft^g2a-fW2{i;{RJhFVqObU^rO<|Nx?W=~E3!1WU1=QHT;V{s3tzQK0p^uM z%~V)jcvW{VbO$HkUNiWdz3cbb>PS&}+dGoYGcS|y)1r`WJy&D`(718i6emF*XN7pi z!*Z*Z1cz)jzeZ?s>iWS4rGE0`&iK`onH)Q1XTLCmn>Ot2o2NQ|dyv6;R6n1RLf_J( z11a%Lhl{xGoRZiFW+VjIut|E#34GB3oM zSM1Q#-`%>R`MCywqr|3$vs8xQeBn(9v1MPT_^J2qco>!OC*A@2cLY3+ChM1e_E>T( zqUf+l8@)pqzGYH6&KpYwKDx2v&42#HBY#c#$3+>vd<@3iaR8DD#nY{?U`Hm_`xwSh zsP#5)RGK%KK=2qZ$TABJ$?a^${rrF}V0yn({!{b~y57c%h7cotSFfnl(7Z~XKd|KW zXOH2GK=L@zf_fPxn37j%D=imX9>swwTWTv|MD+tOVa^{b{i;gyCOrZ+7h3xgeakzE zdYQ`7reWu)&hB*zN2yn%!w+9-Eu^*9Gxeva zD5shVZb^efgkZ&>HdJ}po)g9_dk9s|bYFh`?!AT_1uKlU$a8Xx^WQ)DeKtqPo4T)x zlL?{%+jV(u7+gUiNQybxKtd2Ah2%CNjQUbmb@dp1Lt)0v!Tg}nzZU&4ws~VqCL4Cy zq}+G*rM43pO;KKyNQ9R+d$8It@uYy4f$q?81%!z`P7b+n_20VQV)<`?EnK0;1j0Nj zLIexT|~X!5x0u)wr3MNJKfxEdh3V!L5 zt$)0@l4U-p*;}=%;bk&*tD0?1@{h3x{2XbJ0ux;lmgZVWgq4Z=+2$T7v2QY8`I%%j z>iqK*B@bo@+*UY8Y{S`fyVp(%l)vpJkMEwXSOPw1-RYjal({vZ>4)tsxlY3)THWet zHg>L_2?StH-|!f|kydU3pl4^9mWZ5cj9>oCS#VyW5d$Ff+EnF6XaV&bo1p0dJUUZV zPN)&$3-_QL4NV`6+i6VMfYLM!?F90o8W7jjHiT?U-g zkoFtcRo*X4(5Rot60qfD)RUQgmWc?HM6l>BG>y6jn+k6>r0ifeaM%ITZ%Aa|i8-vb z*RWU9QhQA?kC&*y?@$vo)j+77eLgzL|TJf+=h7(PD#Z8YmKimUdcW6(vXdj#=7Mt8^o_HC^ zJx=t+t1m`oib)E`PZQs|uQ}ok8+ui9T}f7t!;Gh-KL!xXTUA>uCFM!G95ig)$~iW zWWW(Iy{g~0T_%TRenCZkV`|nYT7OXr7T->ACP%=X_Ly?w`h6Uv;d8O;$9>=|Xwj6` z@a!~Dxf?rTNA*z%bh=~XJA$l;FQh{@Zhw~B#9g9hZHXw%l&H%Xa}lSC#;|mK!fjWo z&>5;>AO^F;(D&OqIpUn5%^jEdmME$O!&{GRa;8&()=DAWhrB84-syN^YbSLxQ&L~4 z^8jM4)OB~3B}&&6dKTAd5uvXOpaKdixVy|L$y1-GFtPkgmCJnu44R?~6ibj}jeGDI zzb)hmr@HiR9C$GB5i#L}duMtd730{ayG24DzFqk-u6%anoA?>0i6viknz_;VT+))S zv3Afj3fHBMgI8O{VFB^F<(tlF3TJxs(lKuZ-XwQ^#K;GC=O8bS**G)6Bokj_cUieu z%H@P+_<=+Iw;2JQoigyhpWtT7Mk2#bflA2$GyWvrf1ftJH#vvtM{e$;ta{s3%=3=_ zv}pmuVq@4bZAHg4pENv0Y$_!fk`C%z$RkMZytVsI?_b(col+!u`L||d!%ph5n~i#= zHLjB0ZBv~SM39f-6=PoQw8k~XNBmLGo%V{$v2$GF8eK=77VSsB%lX*%&BejvF-+)h z@OAFzv+--CtRu@!v>v?ph9`~XCgux-J!wzprNrC ziY1~cX;qO~KPg<|a#<&Kaz{2hnWaPfA_PfSLenFP^$26R6T;!fi z=Q}4w`gH5M*18{7n1@~_dz=QB>C$s>sJbSv+B~>)^{%xc_v%$i?aliimb`+wi#b7% z`7y!{n7^q@y%P9&D^L0un#gN@DJas57(kN#IYJYc9vnsz7anBP;4g0q7gOerChPNP zRo8mn@*rm}1*Y|HUcp>B?m+9*9(NgruCSdZW)ymD>}8;HwZY`JzSZ}S2=&A6n0?ka zUHxP2u+)>J_t(^g$nJiUy^z!-y;|ogUElp5hZ%G@Qk+S7p>L1;zAv$4Szk&o>bofk zb?b$-8v^}Vwk-$e3g$W#n#LQKNBK9t22F*19N(>!$Zt0L{GiV6cD6mN;m5T^gNu9W zU(kBLOOyLhCoOD!_}O?_&%D-g!}nCutxeS42MFq-Y&*FM$4NcCua&zI)oCl=9C~un zcA9oyk|IuFS3pAFLey;Lf{ow&;fAEo{%0pE}&`>S1h5nivtEkuditfZ5Sr z1v;YM%H;*R0)ht49lh3YeiPRMOwN`&@&i6@=pDHh`!YfMD-XNUu!1EZnM(>Y!ucaG$In8^LZN_v$Y|u9`XjC;nnb1$``LjWzK`SJ; zX<#!W%93|zJ4Y)v&G4Lwd+^a)?!)2N{r!-0EyhzQz_?4;!ISgCXt>H|hM90HF-o5d zrFP&p2S;{(?CAU-ql71mY&M&?V_N5ocWiOcoAVS-q3(15!m0uJbhG4ZGtvAg*Znqk z63x({B1fQ9#CQ&5T_I;Y?x-Q;O)JjAg_9tu+fV|f^m}ZMTW(!<;s#r1ZmD-emvH*u zUR(|X8ua{lSNjbCvYsC@&*I09bo~TZkRB3!E~h=}_D{{3lkC_Kp4X!}H5a#;t#5-Q z?hhZjg?va8@$9|Op*iBpobCWi91_PrP;S+jk0d3+25v;1|B8POT~VI893A=rSd-X@ z{N2GnIOG|e_&OugV^?w+=|KVW1zulWt}}YRbz7TZm%b~x(<8rOFNn5`tf$eo3i(E5 zS4!=jhG=xv)3utxi#L3^U8y?)+ABb?nGD{;+yVt)^E7L8H8~KiJ1_ez_YwT)#+cs& z^%?iWri5>L`B4+;j@}+Pb(Zc^k_wkLgEnq}gpC?2;xS+&*MAotIMk#=jdv2U>tw+?aJPTXC6f%g>FmACev#Fi(d zi6BqQ82&NFdR%^);)3y0N#P-tn3Dj&JYTtY&#I$#nUV!%pGoJbYSR!=bB%D*b;x*{ zN9Wogo|53Go`PFQ6_mqB7xrK{bz5Tt?w^)R7%R~aou3}$7VKrbm3rx%1${4u9p3m% z8mX<;_Xqqx)cD-96j_`e|3f4n>l(m1>qN`> z#6FC-aZbF!v2mZ&By@5Y9-7p@+|bSK^e<*&F`V0QP94Dc36mt;y9=gycGz{p8#0^d zj*-8kjIKLnW!%y1lDv&^)yUiPlmeX19|5`^H7Db)t<*Y)77!eZR@!J!RjRLpu$eJK zf@a$xJNOCItB27Xw7!K3*27T+%enjpbHw*fx!ghXOlMcD9Sr4}d!3GSKc|NTctLku zQCdP@6}I&Np>|uZ$xz{T7x*S$6|mj9i4r6!DB%T0?f2p+xpp!uNUf_9Fz;j{-dg>A zRPr>GyzE~QB0oj$7c=ufOXB6m?`Qv&JrSIFuP4hMY|8MjJSdoVvsIhU>!{AD#R< zRQq6&@t$rPTZuP5l^lLqH{BWxk?RJ%wC1jhrzS)*Ycm+o5D%wkQ}ub&W~ZafW-4H< z$mi(B&zS2@$V-`aBBewqgmyR&99M^T0SxshCD%}lJA1bdm+Hel(v1Rm8aVZ2Aea1; z>?No-TC0k>&_t?-X%ckI)jMul>x-z{jV8VYC4^hmQ*SDTX>hM-2V-SOzdz!S)dVZa z0A7&x2oLOp@|y53-m34sEZ;v#7C$PQ7oxvql>M%qfH4FY1@W(Z?+1FUZB9-6)PmqA zZz6dQstqMH%^xP9OQzbnk_k36<%j7-buM`e_eW@+r(OSU=e^R;*)oO$6E#5W^n}f1 zo4(@oJ#1aZz8rtHpCNHbbSHP)tKmT|olAP~e7X{g`LnwgPseZ`P4H8PV|#DC`t;@V z;JnyfFee=I|ERw?9vP!hjuVDIiA^ncbJ68S@jk=PbcIGD(<;o@+T$hBl=PW+n6`@_ zu{CRF{8jXDY)0!p_ua@3fPcOe{j?}FlTYg{uC*P4nwUE;%bLOqj188W%CxJEO>wJj zftcEuw5M|vNybnf!^!b@Ii6c4*BIHyHtk|aRrOLcQkn?ce-rf$bAvaD?hba3ZkX;H zCpFkrD?BaLS1;1q#j%P7PACLKr%x}8ZiyuBP`dewvUgOP$@UZMF}hK5hIpW#FbSKnw>oz60-DhA`^U z;dXq{o6cIJ^xy-j>RwVyo{&_0iAF0v2iR`uDJl+!!31m;L7zAIaO(9WTgDjgHcvVe ziY70F+@i;{D$1 zP_f=?+OAbumECHUD)i*WW!!K~YYMtFz%I!(##~j=fZB1<#ONijE++|<1Bt#mPM-7= ztx|9*>(wT2;DINhaSeeyw)`t~c6}17cb>fq`wDwEKRIT`pZPBR2&U9j z>BA5fvDlG96+Ys=sp6SLMGWy6SxL-dd>I&Z6|xD@vA`OvQ+p|1;Y8_L+cg9AX`26@ z$+e-YgU*GR43dw{X3M|SrSaT(Oek^yg4wFN_>Om(TwEIGY$J0m`$bpIySkG=i@n$vXTT`F_h%T*7U*zuGX5_z7_kJ2fYi9Yk%2$l6ohI)~N} z!27!XvaT+O&hAVEKa%(u)At-%@~>y)d$kK#>K%+6xZd_^N7d+y#sTI@ud@VsS>`cv zzSBG-9^t=^86Z6R;daa;_{UxoFgBU!IM}^oS2Z1)n76#e?} zef@LWMzY}V`YUiwxkznj+RkqFs#KBhDY6o))|T`nIk`QbivdYc#1jZG0BBje+5i1@ z_k8ty5uoJcwvJV{NMNRCrl)77zvs!5C&yKtC9|q5vss&0Wl~N53%)f^o;=yhSL>>7 zleB5o*XF)aUuRWOh${L~QQh3+<&FBeO53ISzAn;sQPnH;ds7!hK2^W&(z=9-&E8(V zz&6I8vbq7tle}D1$*W}e=h6PbUIHJh`gonzO$PnL-}HSiE1JwLDcS~p&^V?Lt znoLwP6aVEbEsAM6yA8Zqrhu#>@S@JGveMm0u+a=K7aghVUlDGM^PV4(8dwXxsfBf;}5{gOk z8sB8?TlkvQ!^xxsn3Ku=-rnA|E5&BveO+?*!w#dsI z-|bPI11ga;ZJoS6`QhmO+v~}j^Q-HFWKdK<9?Pm}2fSbo-BtxJ&M%?hw}1Vg-^4)u zbb5LH{^+d&`Fs#7`2OnT^6co{2^6~7WKNsB;Kk9^)z9abuY(17=iZzgU0#2Ga&$d8 zJ-a@+{ORcJLGmJ2`1sAy+1bh4$-ATfy`|I-m(W8|25E1ML^swCCs(Kc=Ootcx97)4 zZ*g>431f|R`uH5WaeRGxel|I}zCL+(aeZ}=ymU(cwkWF9)VVylzWn>-^~u|#zaJ#u zjNRTlrLWG9|8{acxjub&a{eCXgSk@UYGS6o%FETm5z#cXm(@u$3QH)%0JwBl^xvk*|b z7M_J`I0c$bolWMjZHi6QsUM~|8+<7yXhBoRA4Lzl;KzcY2yx%;2c3hV(d#8+m)A$WTi#zsPQ}0k`x8q`EOX0=6=s(t zZo(;t#A}zTv$nnm3MtZiw=i2`cAcgv+_JDTyfTwYa7%%*YKb{@s@ZMUPJju?s*Tro zdrkAzQ)lbiUp=tBUS_xkkUwdcSwh@tIz`apXVa$TEF16XDhG9Yzs?TuyxZe&^moA4 zrY@7=;Jc?yf)jQKe-Y96m#T_!W88c76N21nHdwDl z*v+mP;G@=Pr$IBcLo>YGcgf2HwhjL1Rr1$wzy0&Kp~lP@!mWLGDC&~n`YL&`!*u(c ziJEr*%@?13zlnb*GVpuXj~oKb-d3^*ln3(Yq=PNZoKD3;{5sBGD+S1gkgsZZ{Z-}FCIf7K`Owb+_W}9NH`ep`~zn7 z^!4QW?-wUm_B_FSauPCCMlM{3jNA!|k{2I8BP)sBYLSTHKdnQ2milZPQ1IZ^T)!j@ z{kv;VFyex}`0U~Mge-J-~5U@r8M;0kLduh#O^C_%o9NiJw0Jpzp=UKbmlW#1=pt3WMz2%Mul8?ri20rCMO#K_ z-$q*jgngI1=sLIpwWyI-hr66sDC4P_hOeD-i^>E(o0dpx#H!ymWj?FsqQaM&$G&q# zV(T=8+HDOdXXhm0m<*qfLLnSqY5?%FKQ@IHMdDNZ=)$N}y!61SEcypyQ#85@KIMok zjP^$%DkdZX@oN|QNE_8>d%=Q#FzQIh(r23xcGB1m(Sb0gX_I(kPrA^@)pRan0gHev zBO!E3n+dD_N8mOs?}r~4f?4wd&tW}ntOku?|6|wea2y$;763k5--RBAY*-=M8=NebsT$bU)o2D*hj;Xk!KegE{r21B1$tVAc?s zZsA#4-}}N3zWa@I0<4Jxf^;q+{Q;*6YkNdp+9z?28%CsPhh6Q)yso8YAj<(iwN`#$ z6aA-y+YaP>@JC&nn`M>k!xQlefAH~cn@RffN7fj7aY@pvPRh+{3Tvg( zT4@?^S`^itTi;QeD6I^7N(rS5D$Rh>kKX;~h4lM!AcQ33H`N`q-ex7X+hnj2=u*}Q z%vo?kXF#GXtK4P9+SZQho6QPvp(zC$Xo~S&ovtMxlcYYDLb_-lTf|c(s)Pe1$Xw>a zig%ahEvgcm3|gAQ4miyg=(>m$TxOr!FesPfdEW?hFY}vaQotTj&hDXldso%BjZ1h+ z?7GT)iOoZC)FdVj>#&u{_S^AXHv*gy*@AJ04!k3~apaw4OOBLbYam+0tc6$+P42M* zJ~hWmqQN`OaIuRcY_iZY6eHfT{&tdt;;*xN9TP-**oguMz+#}r8OF1Y&#oedtm zF|*peHfN``9XDuJ`;nWp)9(ju)DDaXZq^Qz2W{94Ms(9=WgfI~2hsN6o!bWV=-oRA zZucGBq0Y`-+{ODNc5=CV_4j78&gx-k0Sot<{juKf_YH)v61o1dyKpF^o1zW)&A1#Y zUoY0)^9OjoMI7JQkdB%rzY(@3LVd%#Pg?{DGt@a-N$rRax;g3JhJQFL+OwD-6oN~- zMn}u2;YvR@{KMf|++W4AKixIgvo#MHm#5XzezrcVOz6q(58XVM(Q|NbYPIX zxr7~DOw*RbC;P>lHa4)1hK(ULWJ1-AaxY8$oi`}Afj|pVm+xuuHEiuNDZX&10eg`< zARpdVV_d)t7hDX?OVqEzyNEiM4jhv*s&Tb9+*Px2L26|}7@X161a&kVJooZszobH9 zXzA-hJ|?^1JLJ6+^4kfLbu7Ja4TBR=*;yTd=PP>Gy!RI{;bUC%8mJ^q@i> z@!haN)R~gQB=-zF^-cZ>N^jPzNh8Aa9|Us|A{VY|wL&|1N@Q<92jrUIV2G{Pl7nRW zq1WwQ26Sf5Dj5?9t0XhTYC$B9Juh!{WxbpbBS4cNjjh*(>?)GAg$v32cO&8#iX{3a zEFC-}Su8|zAeTi6Y~+v^m(?s-A-U}Uc9iA8FOK-e!Ergu?phG}C<_)@wpO$wsgc&Q z5%Ae;!}|LN zmM~`NQmmc3Ly4lhg1un9qW=RESkJT533;cYQyn&GwVx?ZxRa?zaFEU$Z7$|`o z?~SD2H`mt}S3qGJBzZ={emqUzuF zbOm_vmb7mc1l6jy32E@5&@3HW2-W{@P?*=l#Hjf#ab4u37?hxOhquYmy3n3K5jsvM zYPk$Zuieo!Ht-#T_(C5!2s<b~#aN%QQJ|;CyU{gXhf3h##j#nNwj?{<^8!Y-oUec=>TZNRPYgK4PP_^dJ86 z4={=&W#uIgc}zDz`X$Mlt~3mJB(uGS{-6A+h=gF<%D1#>t<4h-)2z;C3YOejf$gZP zb)Dnk;%Kyxg}Tk|k;4~n#_+2dI>`7cIV$eb`vy+()F{Umc@51MIr8XmLL&?@e5VaF zxDNpQBO=lKg5|azzVK#^m&luWegk9?m?0Z1oFzl{#0KgUA%1`{@gMq-Nx>V3P4LOj znR(lU;o`!yc9%g|ZWx#;@wQmmk62A{*tLTQK}SVND;PnbtZ!qBof|XZ=i4X9_hFJ= zQvq^6{KpBL;4t2+gRGjU_G~Yz6iHVF9Rwj z-D&`Gq}M@Z(^fdnD6~|#L*I?ARkdWGg!{?Wu7NsEpL}t0ht36brK-gM+;Dff)^uBC zr{6+I+@Y^hrL3Be^}~JA+GV%2(+MX3?a&jhRa6adNZ~%&3dUePr+2n&xI+gWU88Et zffw$kr*(|gw$BPCm`4u?qm%~jU<~|JRs+A1ajN5BIyok;6A$ad&8RG$xcnCI4f8S{ zT`zOeh6^VzO!GxGgdZ5H_Jq>GQuZWwdArm~mT`hG2%e}bHB!i`PcgFZQ+1oolX+f4 z!^M3v1+3R8c@ehDy4u_L9ALAwY`YKC1hKuX(OFReQ`@)uRC;dfQqIqK3KgEn1x5J@wqZ^gey|S$)sNqv zU!A-TR1__Ts+?S2o?ixP5GF$v&M!{R0_71)qIjr3FWfh$XQ$UX(-C`qae01yeteEO zeZFzuU0okh%AP;FFRtI8A-4YFK9^nnHqQ3=r%zs8U;O3fQA0tq3)1t2B+@*RYe-OgVP+Da{M=y>YuCHN03g z=$fVbs$tn$M|vNN;C{rG#$Y{uTZ;qx;#(Vj?CmYs_`|n2Nt{f?e~qdBpvg^bsL2EX z*t%L(fULXn`}kOXd6$+cW+Jp*UFJl{iSVCRog%!MyprKI#_4=Md?9o11UAU6s;uw~ z;c+UMkHE&d6&^{G*2vCFdxD*@01bE~=W}T=#EDyM=swuJS%*HN?b_vr-V>{3bQ&Wn zsmeuuv#C>-C8x3Hkmyxv-n8d^9roR~+Bj7^W#-ax(~{)^c0Kvfu_Dkx!KReTyS4`T ze#mSLhzUzJ*VvGGE9B3KSbfeO4=>fSe4q2n4GO|{NLa0w#J&=i81v}B`6w{n|U}wYg zQfzI=nwuj|L%7RfcBYxOBwE!+GW2s@+)pURd5H0ML}2{j6$RStbDIpCw%#8J`30>h z_Y%UYLVsA0j;%AZV*=Htsiu!MNF2-~=TUHX9;TzyWbZt`(=3VO>=DQzzzF4$*g@uV zN8H#4NEkySqJmGT*CPx1Au2i_hc;jslw|2)4;R0NBylK((R4;SVh0%KGG|I?HS0wb z9H~sjVn^jmu+=rkXsu|?yCKKz12K^|rn z#DFSM(~KzkV0ME84e=K4In@bkUL~ z!)%QvMWOFufig#u73mr_-jUATgx#!1$O)tx3g**J=k&12S0H8tHc|A5qBGNgUb%6OMoiZWWSp zURWzY!JLj)*j=!40em85F<+5Dz_Yn&P@*3J$uBCcS@UCdOgXNoz{X=?M57W^2q7c2 z*(k$iACb+T4dWBUvt=qv%lKI0A+}>t?1J50s}J@&9l?NonAq<;Hyai5^T96nk%vJr zQ_|2b_E^6GU#78phr5_+QSXjUANr1Hj4chlFyif%*y=?#OlJ{M{Ndp@FJ6ooJ9s!a zLub_jcF#>aukOl$y@X%qjdInZYY2=Q`INK+=yrzx%6p<*9g#J{rG=cU5e|eIi*`2b z8X5JIb)8p4w?dOM*UjOz0Lih6@48#&v!w<_+j0tJJ`sP=pfSG@d@^f=0e)v42e|oW}^D5)CTfVHg}@iiNFG`QNa94vX}D_ z;6aq6Bufm<&^fuqBymeTcGgFe1tem6ON-EjpGP0HsJ}(m^gd&4+FQ|Nx17nNEnaqJUlbSnOPwhll zzq*CpYnCO%Rj4LtB~8%@S8CV%d9~Z;ItQhOAje2+*El6B5{<3Cm;QXl)fs~|jnl6b zIZ>-3^Ad=arQscW5`g6NjE5_1HgIy@mE$dfRX;jHi z8^YG&_W1cS99(9S9DqKdhmz+Vs5IuJZR3XNeV-g%F(FWEWGTtmWO{xxju0c=bhisK z;y@MuJ2FwvxjeLnyDhqCN7@xi6ShF5;Ao3g|DOm`y#yfIc1ZkAwUhcHmKCOlM1<2| zX<1jmW#_2$tW|;>^c*;R`NBbKArWOOP)%)7Z=C#$DmYYe z^uNsNHkV$JUy1VnAs^rCiO?KO;PBDk#We*gr512_cwAR?t68^AU1wIbyy(R^Odf0} zcb6ji_Jvnt#{h8u{VhJttySPkoRnin}0 z&@8ss$L*v!MR{XVDlMyxnJc+JHp;jvTW&UM#7iS;k4rN03EhB^b8NR6TB|$@RwvFx zTN6G?ym<}pOHhptY{i^EIwfua6cnf?!bty+kt#@ufMn~E#n_GP`1|7^Jg`oDWS=Q! zC7b9k)4ZJH2HXcH-na~U6g-NglixKg)y9`cLwr1O7BcwRj<)q?TI9`AFw={?UOf<9 zXkS2AGz~A2@Q93l2mJUQcSuBSHK*ulislEwn27y^REc`?vz+uK^U3!XavgGojsTiA zQ{}`G;M$O#*a)Qta6i*(gJJ0+Y%j8$WDdP3Bjn+&n{U#iF#4Sx2O=4wS-KILqXfp0 z)rAl)>$GgF+#WKXeP1h^{(u376n~QAw$*>0LCp<4G43h;HA=R^H_W#6P!#LKO*Pfq zBDsS;l@i|{E0r-$!};y@3R+6G6&L$1qOHTfZf(2fR*NMLoYd|q<37h%2t`Ir3wuBY z8_k?lo=hqMCffBW>tVkoEI4hAf;Ki9%$C8nn=*U!Sg!$yKh*K=13_G!19vFkwq0Y} zwr$(CZQFKEbYk1Kd1BkPZL_(3qwTo;6ML@@YfgbZM+5$9!>T~}tcg`%M`Bv^)GR>- z!$8{(Pqp{Q2)d~Cy>NB1n$wK(kmG?>vX0vvGJWlaDF2i(CuEprcs&O35h&UNSP5g; zcS@;QA};)=b3*p~lkkxcU9aB4jWY?9HU7C)^X%d`4mIV(b$IPme!zzx1B3-bw> zLEAi980(VTtuZS5-QH~4gG4W?t#MH$C=zGFuSUWFlxhYDtv0k~;3O;(_QA)5imC8M z(rDvPxl=F<-tdT#1px1xTu>^cH*!bcM{dr%GBaHfh`&Q?H8(AK#Xm>yJE0Rtrm8pO zKf-!d6*!6H{MkBsfxGv6Lw)S{+%*spE*d5Z^Y%L?XE?SN@GRaD5r5~u{$9K0V5IwU zKSk}!491dJq#Q=kx6a@2g9BJ~r#Azq@jE^=@lOYKl;A+Y9{Mh#+?U+Y*cX0BA zQ~{m<1J3e;r*$F_CxSk(#iyhE_I*HS9ZSHc+jp0Gkc>AV7xuni_MTZ|=M__<;sWmMWG@B!Ju6HbT3+ z<{cwFu4(4Pc$_30iC*htTPiKAVK8-1KU*Zn!KXegIc3TXtMCnNPc-Wv)dg^B%;>a5 z%w(J@D)7V$6u4pFhLmDX$_iYja{#bNgvPu8=^_J~VYpWG!2*k!+{koYgeNq@oYRnk zQ!QX?`K(xCp-&DLQVmMEf{MJctWOJlkt98w9B8-00QxT}S#}u=gU<-krTPy0 z$@W8&3>0Hoivqk*eY_J`46EW~&Ba-mU22?%B;tCc9)o_1xII)Es>M84$q5M9nAZ%M zAu^B&nPMxcsB2wqIs+QQs8$q~47QS*nB*#bDZbH~1fR-o49?CK1!cn({Q_}1mj$pz z2t$WP1!gN=JCV7Z*@ZY=1^cx%;QdHPH5Kvk0JljeK9=;A@-&g{-&vyV(A_Nnr4&_B z4%8AZSBF{d!ygHism+B?N%Q{{CkV!cNw8EfF^(xgj)~uS3?uP*_Oz1V-~MVeMU4r6 zUd$YX8EQ?krQzY2<14R$2gj=*C^7A5==Gdhl%Vb^eGyTiSkl@Y-fu6Wm_gzCX#$BZ z3R_E1NWyF_ImcI){@sav@LXBQWZK9! z*tnu%wIdkrpV`KN2a;e@WB|pLLlk>mR+l8l8)MSJxoRbXGh;Xr7B=YCI1H_zy-UPs z#_)HR@Hx`%#w-fYE#6g?txlP9+Ky%*mnyj8knpCEhlTe>YD*!^>Ty&kQQ{Bk1<3aG z6^9X+RG;VUYWW*)txqs0?`zri;sa#NxoqI&h3xSCEBm_aD`AOkN5>rJz~18WIA))= zjl$_!eo6dzUToH+qlJY7;g0wS4A!n#vYQ6nd<;1Q6dL3ldzh6*tdWv#W-na~(4_%V zHVktd8uut7TFeXFFI6f09!fRXV!6~q+tK7`d_#ak*f2vF<{5Hc^qXFBh23B z9;oTPuNS(^G(|Ba!%&IIAaq$xp)@;bZ?)cHjrs~uuNvr5(@nYAf-0A~mT1IYft~P+ zBW-FgjzpLmHE;lxXnat;sJ)YG**o%trtU>CxVFlW_~c|gn%bSj087mpLLfs#2Qe|fm@!)qc>1*v6E4Y9kPpV zQcrjf^NrhjNq-?~{OzzBTiIY<+ingh-DN%3(5p={$*5=P)aSPMaJ;zwu=N9q3tj!c zlw)mgh#L25X89QMs|j?R{TXS@e}JofQ9DuXOh}uwTV3Q_e?Z$#`Y^%D%d%YzYQxtt zELTu!S~W|B9&)g8J2T6KZwcA>PCi&9__<7 zC&T~Sj9M63-G(IN2BDfJ<$(OJsfGMZqG0b~A4a{?kY;Rs$9;3fX>)!_NKg_asmx?) z?Zx86wiJXfTw(J@O+9FO){ziJA%Te!{gQ|T?TyNQ%Q=cPoi$~ik!uvEhZD%|=nA#; zO^9naQ`ik(cM;Ml?9)l@OTj!H%J)e$8a_9%HZj$O&yVa2-g6Wtc#_lYX&_1f&Fr)Q zKp34+{IUx_pDL4VM`Dd~c>EAur>|-&`#3?E5zK>U49CBZpWoU)fS?Jm|!RNx^>u9mTd>l zZFTkVQN45t=Sn=iG1;Td1EfD$L&2fk4IX^sulDl!F(R;%nUlIRWw4acxzo+zBBEj9 z)b=2xaPab{k0~4al$eEXHD}LxSLA3^rJURaSzf!`D;LYIi}ez4nEjO;d;@+ihA0^{ zWr1G~BG@@j0sJWWK-%ik6c_oEGpd`hq)~C^AVIK z5bD9H6d3Tn0*SM$Qt7=?a4!yGiwjx}=XR#!eS>#}3sU1U=6p;A))_Ozoip^)1>$f* zvW8*+(3U(SlLM4~U?kIw21`%QG-ZF$06Tf_{UFm3vF*thhFXg?@Qu4+$RGBE2CXKY zQRBOzyg8&dV`Z4)2HR(TcmJ{u7+i&bMMR-?z77bRI6Tf_N%cbiSa*IbAGw_Ai>+$u zq>>%x@mZio|e;U@>JwG%Zp7d zXVY-M?y|Qp*Q2l_%*E@1El=5ZO+x7e31-oJTtq0cOS8K(HB+oYzUd)k04YM|Kg?WW zctT)ySyCPIw!M8U(FK}MIRaPE(AjC67$`*Y^kz1HGG8i}%tq8|$vv6YN!}3d-dX(dcR3btTvdI{2w*x8xB3hy7`b)4H2BYD zDsAI`KCh+%?NC5(xr5#-n>MUCzKH38UjmJY^OW^P(K62=weAN%kef#tizI~G$<<1fA=@VSbo;Qq-I+B%~Kj;l0fW;pA4c~Uxv%L?Hc^omn-3$Dj3i7r;U$mSRs zbqZPRVQ8?UR_u7=JvVRTc&@2U}eDn8Np6OZUbq>Vr-;$so_LE~5*4h_*;7t`J6BAY|sD zA8{E?E2h^8=|)mg*i|i3s89~BA-nu&qKWX-P@Tye{I z*Wf)jSAH0&$G46x9Pe7zJcziN%qn~HT|%|&@D0<8S3ZyPv}b1itr+ir^BTUxq;ITK z9M#7>^~*?|Hcd;Jzno>#sQ_qFBw!t^tG%zh3EN|CLfC@njU7I$PnK1OUM2QFzFD@{ zGIisFlMsg3!n=N75XB{?69MJ!3*&1qiuSJT+n}(WXkSDw_$E3{UJ0X(`B1xUVh1UR z74B1j4ooS}B_?qqH(ce9SBI&v<)sCv+-rYV%&E7D_rDe%#)-RkoXxGBP5PzZ5QLA4 zQ}8$FadAS2^5qr255sXJlUZJf=}goT3k++c#c-WFK(Abc`Mri^7dT~7L}17BJuJvD z${TJ(B0dd1QO5&Ixes&ZQ?zYxv3M1^EC)jlx~wcc-(F?2D4m0$7ABr=sug;`Pa4s~ z(=v-XWI(`+*WdDrEr~9}VS`4H1f&@oVDC>7p_LQ+nw+a434Z#-`R z#@S{>L6w=npGR4y>MmB7&vByXuyTpDc-9{S!5R@JMo=}C3_=~szwI>{B_~s2#_p?U zmWe4{IGNU<;{OLed{NU`BWAtg(H%gzEzXRXRH z$=~>u%@mi)5M!NzLh6Zw(lmU0>M{Z>2dsFLwA~|bOdaVpWaxBSK^TR|($@^0{3oNw z&o+^?aX?)k*862Y5-ZUh#ezJG0M`XH_N%)=V)5eqnLV(oS@{w6$b|IL%Z9)P?haja zFb}MC7UYP#3>NcbDx~*Dt#uFl3>rF>s933UAdem|NqwVFi|~!6nTnyta#o%a&txSH z9iWZKhqweY(+J`YyoX8DY;3JK8zF?rPUrj-;JQ@ftaLkRm-%D7KL3G~2r8E`qclO^ zv&jH5Q#N#bq!Rf9oob{W(-W!*YiYYR@$%@`9F451wE-vk07xtWeQG51pAegAOH-0VEuU>CPW;d#$!!Z0&Y)X()yU&h=v@*M z4(JA&g%1LFwEF)2j8sSD()ZEt=sv2fM_XHu)ik+r~WVb;*K< z%6hGtO$7YSx-4I5+_mxU^Up(2a5TU4Gi7k8CgJEjS@NAy+|!*<)_sI&`(i6z5fi}M zp!M5O1%A-PB}gFDe+Z}zNRXD(^p=#|U2>CDF{YJ#J*sn}cEc;+8CF84J{Tmd@8D`D zA(|?6du!W@jHQ8m)}kF$B5Km$>!L^WCmshePkq}=d=v-i`-U~C32C1=A^ZUhnh}`< z_6S;q32pkrq-gb+WKm zX9a%7@Ry?rBO<6%dH8j4k$VEi<4AnYAvEP7I_Do>E#m0a^BtP~SPoUK<29o^wH z)87}uk=`!797n||TB;tFJ+2Ale?bjh0$dg--{1-p)T%o>UA6=23KnMMj^|o+dU!?H zlFKPwBpW(j5Zdhy_h|2gKB%GSr5%}F7-G&1gA^G491AKT;IhCGC{0z=zm@=Spx9Y;nL^A6%n49f5{o|Jj#K$V zvF|PQf88i7e|4DSV(_VXlg6V=6VU>Q6Nnt|dt1CJsw-w{z6l6(1)%Y9k=qSQk3#Vk zjL==ocZ}qBh0wOOa@47mICt8;JO$9sagIi%ru) zO>?afzUU3XyYc44^}6?>fCSP+xb(Te#I)BjqSdh$gdL{K(3J&2@oX6DOi7P%LvbzHfo8 zj|z3yB$FSX2ruTg{ek}*h`R;^#4hsd{gnCje*RxA&aVT~Y@eoWFm`XW?O*(WK!99-18C(}Xs+<+7 zWb?xDX>MRn0Gi?T)ujG6&7nAAsTQS-r?8Jce@!T&xQoT5^evY7T#5fL;c%1p>l@aykGv-BC3^ zGi!(SerLJV)LY5~E5)rKQ5982S!v)8rp4$kD4fBXn2HA?vb0T9#`P#gzjXt#W@ngVZJ>mnd*tQcLNtO4(Ntet~F0KF33mFxXw%%u^QR8 zBPIC(@h#XTWef3W!4hdv$QC1T^U}qt<@@t|bq|S_N`Hs96^S<|lMwQdO|n1{8I)S1 zMi$s{#sl;o|Hgfati7W9hgy@dDSi>0lB1CFYA1p>*U1UgAF zw1=%KI5Rcl%%@MfZc=%Ti28d+f6D+U`N0NPq2kf@ODWC@d0)VMeTj2^A)7>$6eh-^I0^lIih5hWC5e?HaENN2puz-0B(pH6iHPdIv+PK z+8{L>O^1U5uQNtngY`6=J7#aF@8j7IypE}*KZdE!4x~>rkfc|!;#j~i>^!nzlF7b+ zLwaL6>nfAm-adnm1W8Te*c(KtcJtx6{(E)+eZ)Wbu4-h#a%Qx|pVdJl{g)wR}DE8@C_Kbdih%rZA1( zHgPVY!$6-kFoMFjf}>4Iv{^3A z;BCR|?a`z4zNDiyfS0Nuv=+tyJ$diyQn%YmRy4;}Lqu>0tn9tz*$ zeWlsovt9Qa*yjrycQ+*y^Y6%yEU7wc#$L;&{BSIaZ8jm>b>mtUT#4tT`e^NL4aI9h zW{S%Eh?(F+&N-BLsk7xk@g3`FNT3>DfxCNUm_3r&Zu;U&_XfVXaL5NMer zsRR%f5i#wf2~>)?bfk7;s_0-Q)8*aYBct6qCw>Lfr-Ro-me^3E{`VqB%7ZBB01VL*bZJx!@Ml zugI)q&o~V-w=9&u+M+?U5J{*@K?y#=Va?G9kc}Qeg(W(5 zs)(me6Y%;7dbdRgERdMfl*n`g4PayNX}$cPSw@R}WhhZ!?uCx5uHv*qy%@5g(mhquGz$q{#H(@a2|=$TG7ANNI`*ZWip5Kyn@LkZQm=4J=ta8^ z$|bV;MQMrG@D5#9NXll%anfRtps%)`%f&uY!((Qh&g$iLzvSyo%{8MD)<{>vG^_ko ztbL!+a!*Mf`gT}gX(2j2Bz+l@=!G9WB%_D@YJr9&dj>r~k}(qkwhdVgMJ}DbcLnl| z7jWdBt<@FifRdfLYYja+Cy;bz7=VKqZYi66?ag7n$L4ehEz(8bHSWPXff+kvuT!fO ze3qCcK*7QLJGQNNGzn$@;Z#Y=fv>9APYD>F0*!_~NeX+yJ0Tfg?@++@J}ZNpz!HK5 zLmA?$d^-Z-=6t&lwTj~ceVaP{G#@RX@2Dd=yJoR}`{*wN&XoL(uO7}pD@u_onl8xB z_&j@+g08aDtwOpGHAfauCAghq_OVAWV}y-2=;p4^JKpi7iUz{tpN-N^3RZ`8g6@G8 zUE*JY;}xzeH>B)KRS|zxN|do7Cpu99G%^J|o+LW~x7Ph+s@>VlE+*&MS0(1`m55?W z)+vuRR&y8B$nkD4iLDz@v4+^FrjR-SnY196w2rX6Y6Ze# zCWNYi^5gOjzDKV+oFa4DJ*45rBXDhT|O~#q@>g6)gr4iB9L|YO~yghR1!n{(AtwC|{ zD2AEWrnv4WH0}=D(?x)o#=c7V0;FArKnAb;7q*#Lu`saogS?5(rZT7UKsfCwI-Q5k z63sZx6aTgS%M9P*+7PiOn}}&#Yw;S@q2Ke_ROcTvB|2Z|Fk<`Bn{3J3N%I?$Kd7RQ zeuK7b+TDH}(tRHGz1X*d?7EcRJ-7zp69nD?@?JwvdHKWZWY8Ki^|9~1lmPen6|>6k zS$CvMev9pUQF06MM(sdfELp$K9HT?v6DJ0Grei9o_Ozt0t>L&h(;r#7@ zxv7SG@DCN#>OHL5ds^jk%yOD(33ps$&&!cd#>PlC6CJY5oUJ1-oWVy!_IMjqtXYCI zAhx*%+cupxXAV>U%ih?7s`ZjpKl2<`hvDi~Jsz8%bnZ%HN4u8|l8I+{XvJ^h)zfnE zdC!@*+FJVA_8{u0BZA7R9BPv*`BAb4;7fIs*^b*t62}YBmLET4?Ve%nYL0*_@|G3Y zF~GSF_6Pj$oa&0Ll>h!K$;A3CkpABe>3=zCr_%KQvp9Np9w^~}VAcc_2e;}B0pDl2 zXcY_~8%Vb%6hK&98zPj7#FXqd<$H)l#}caB>JMNR5@{9Pdp`W#5=hwhse!eL(A#$d z;BlnMn;Ik&va+)s$Erfz)%`bp7{oH~!j9h#_hC-Q8NxoigNxgH@U@dXyKd-%YnY(s z-Jz&ZSq;!a0KF{hOwd?Pk{Q#Ad2N}iQJiYamN$@i1ZzhH3!vQfnH%enJwDJ%GEeSg zK0a?A=z+<((Ecu1!*-Dt#3oM~#N^EzVxCl(^}Ue_Q1Be$Zt>UNpTP*XrGZL2#nYyCAxFip`LS@8`5I#=H( z52j2xoBUwHNeP6olXO+}h z6b|Kyt!iGoag_1qYD=0%s34jG_8AKx8Ek`%EOtTNw2+*jt284A2$46lMc9X5Fwet9 zOw!0u&z(k=URV4QR=gY8Tcl*XDCmkR<49qm?qb6_K{){}$s5jZd|^8by3T`m_;IVo z@#fHcYPJrAbutFLM%ytDg*Qzjz=x%-TjuX|0T|02Rjl%9P#7Ugm;GpYl@CS1ateFP z=l&KlF4xwbTkgft=R+>{#8zw8;OD-mCX;v(scVS8D01cRQs`b;dzZV|Y1Yc>JvfM- z$X+%{&{{w`tE-V0`$%o}!yL7cBm=La|1;i<%7|2(HwO8BUr6fNpsP(jQAj~g79Zi` z-B>D!K+)Lg8gT``WM1H-cJ&S0jt-}9*|@I0oXzgT3SRING915luvb<1f+xNXjYF6~ z(oVwkI6!7?HJ19ko!a?BsFSaKeyP`<`BJ{nk!|%e_a0=1JP{Gx>!F z{T&vJAE5u96bga*AeayU0F8J60Kb0C{|T37PKLIo|2tiN*dMSVee3#z&WIXfK3O%2 zM&ZG<^_m^n0Ub7P>v+2h63imuIvYn+h>%}=T-cjQ@KQ+E>ptQEqNNNHa@O7)IJhxj zd?q}IFf_js5$Q7g+s_z+@&nbLm!Lt)L8tCcIU_!>oIGDKV8HNT8dIrR)8ggpFTHP` zeIuLCX`NKez(vs~j<+nIH*&8U6*=@wWyj~AKDN=iM(2U@g^VS7 z8DIeQ9dJ1G)N48x?Hgt3sW-m;K3}+k<&7c33+AueO+pW1{Re<%hFLQ;J*ZStV30*S z7|Ac4+(`O)aKRd-=7h_<4i2(QO$%;+&nPQWk*?JsaTMfO?cBa%HOi^4IS&+#>F6yb-szXXU2WY`2+k zjg!T=UZa5_seIA!6y4|_PG))jwwV!(_B{*g1;Z8zbiB6z8Y_QVHmCFubfRUxCl(~j zpG?v&DUSrlR{*At`qz*x)wj?a-TCWhvp-+MlkAbA$z^)VJ?EHHQ0LKopifcMhu7di z*I|DqY~rdWm?()9T{^;CHUt_JH1tSBI3|+S;yfT(MK{ zuC(qj4!B^tDbnB7(xr&dy%I~&q6LQw$^Bm+&fbO`bRt|no3mQOe? zKkJ$fxbNOn7N;@n}3naMwTo+$rA+7NxUQiB>3NABJTrp5!A`C zuBVM1jvrgN(@=^CPK=9HV1`{X<8xUb55?i4U&TGFu5HIB;T zKf1ioC{$XKX?Jz}uF zE8X@sg0kDEyO4ZL-^iKY+zekH=6QYeKTKKD+^j7~9TI(?0dCEzmIpG-k16$i} z0Bp=Rk#_yQh89WKOB|$nD2VcB@>E`F`{;+q<^y$j>wiC+Ar>hYz5TVY z-CUCFH86Qz?|%ORFAj8ZS`rAVd7p zd^D9%AVGk91Za$cq|w&}ouJw*gfofu9y2fJ0bQ-^RMO&PoFD;)JHPkh6r`L{QPr~^ z)&do|vVVC#69@p52+|)ZdYY1M#YiyoZCBoGiD`+`N{FgAd^cj{Z^E{T^HIv?#) z8kst_&0HBj4}*nr*|Z2`4rK4(+KkCM3O31RNyciS%NHd(L8~>>k;{?z#@~ZePt1n7 zzzd#P!yWho{k(<`DZR>4b8jmc#MQfkAMujcvLrqsFT>vwQ6KStbMVhhZnk!+7?#YR z?OiDxHTT?^mj85_iDgMWHslw(JF9#_YJSf87@I6N@=KPw_Ln}QP&#qB(VK4{hWO2U zA)6B<5af1ZM8(H6Pv(ZFq}Wdvc?RO~;Pn;~^~pS2y;LBV6JM*#=I z=cvpT`u`nL`O>&kWUJjg{`u!^;GgcsijTdaM1RX_@CN)5q52SimMg-C(VQKvapS^) z*xRJkuvHYKgRo7c)V{e@>taVPq+mQYEp4`@O94?%_$kA!jpqXo9ts~Od;H~52e`ewk76D$L6_~P-AZlZow}9m#@Qo>c5+m z{`wK|yqwQ0uan>4p)j>OzJMF48qsuP6WZv$of*oR#f98^e{Ajj(zSO2v6M|0yUn_< zb-m?V&vAtE{iSo2o)Xx;r49PKlYyUY2V&x1?EgDMw1@HB9DxD=JfZ*qApV~WVPR_M ztpj%@)aV=wYqu=abf4jMx!xjSoFU+R^xK0L5aE0_KVcir>ECRtP1LA^0T-WnV5AFwhS4B1rktU>lfc zLA%yptf}XZ@AsR-=Y=iV2EW%9Pq9M&^_5rW#&%8q9X^|c8TiCQjS={z{e_3- zt-0{s^;b;@C;7MZP3GcR2>edYH3*iP(HRTSb|aBKxm%TJYH6j_L=wZSGm>7eUGWAW^Wy&ADN1z;Y`JU+(u^uqHbh+cE#?g(1Qs!;|FLYh#z%m89Ir^ z$#YjLE;&P5k#9Y zf|^IEd~#Xp&PDC)voNjzpnRsrm6Gfkq{VT=_cgqelzgUPaNv0vNFM?jb&+~WtHCxx zHcB)s3=7+JSY2Cs_p@qJFlgy zhrxDEA;TgNs({NsW5eX0k@l7;;hZ;E$lr1__*Y*a^5INbEf&m#(p>}~^*B5jJ_jJ( zxbSh`2qp7cQdNcEHJLz0zt**x6zIm>CN%S)+UKusrpBCHvxJAxI}r{pgPIH7$QcYK2ePjZtH@=|9&K z)CqV6wJ1+s$*MAOKba$H8M)a>Fy@AAI8?(fQp`PtRpb(KzGm%S;!2~9yi z5QH%S6j2jsH2T_AlWqR$ZHVii4b$n2=>A=eKD#g)ZL5v1RA^8_j!B_USPy__m^~qI z5m@6~C0W>sHAxPv5$b?CW*U}>%SzuoK&tdD+l4>e!)m(3VC_LKc7IFeTZvdfs2Nl| ztC#`5NF5lOom88$4-^ZN)C}h-tVeDr=^i3YTUl4pA`>>$kTJG$f*%DmC#4A9DWz=9`NM8H!uCP)4yNG2f>=5T z%2{QBq2JluI73KJvVm>{Rfv(`Th&XLKc@9ce270kHAivPz}NNr3&6=RcB0NqwulN# z7*3v_^DOmZiPQ^#H5fJKx8ItQno7$5{e2h-uXryvLuxqR+(Fx#m`mn1i6f!62`|+( z&9+|M#KVcr5J)7X!t32BzOU8}{7?~xuZyH(&^18)s+uJ#0){W_*V$TU!cA!+(I&i) zqUjGd_kk^I^ozIvjqcrR4rU6Li8Gq%9&TGY@_2^RtZvuQbs$vuvCM`ye|JRjcCNb}%*mT?bdXKgtIjDL=gap|vGefx0PE z?gn=09SAb)u5k>6ld?P8s^cVJ4YvD#4`c?eu7CXA?IcrhqgEp%qbh1*ic87gc+bur zNO<4CFJfUicm5j>5*_my7W=jQzjSWO8$aC(>nU?77^` zqs}hJGQ4XV9jbeMU4W?{tL=WCCsc115UIk`H~vABS_{lxz+d54PcuE{Zl+^%6N>5=zd(= zvDDGu++0G(ZC0^SZOvrs&2;0f1q=EENLEfswfZ|Roaz3p@#=A@sijk(%DV*azeZ4D z?6`#Q2p2BY3q2F=WXFO1_?mMyza9H?)~t2pG}~S;e)1JX&k)EX1el}wWX0`;x25~V zP9rQWLYq&Sdo>*jn|Lk+MC*Z54EN{64ZQmfQnK^xbNrRvYRPzfZy3+-THoRKl>bCw z*yy!hqZ62l^~jZFkkJfXJff~LVZVBOD|H(ooRp|a{o4DvwpF10c?co`n6y>k2FrWe$k6p` z4d$`0oPXn_<4_UZ4DVB;Tx0j9!rkx(YFt&na>;6>!LQCrHEC|(^O=auyA9;n7oAIx zqVAvLfVscW+pwqjryzdqcjuB_GuDWz7*6dC#8N%_U1nSCvIR@F?7*Cb|DIQD*z%2C z9Y9eb`pJ!-!!OsPggFl2&q6<}z`6zAt1~-9>Ggiq$;_tk#Skt(cjMW)I>lt@*c8APHRriNk;?L*t*mdDJBq$NW1IDJSz=Lnn*3 z*jQ+Go=P)B8nznoiM35ke_TQ4jvn`JbYr*M*7F~zNr#3fatmU$3gR27=Orx@AA#iA zZ+yeMzd|Q{&M!yfATc@I-cY&78Se|pYTB99UT}Ml>^l46T5(N+hge|t1xQOYf|W1D zDtBL-EA`y))gNmp%eIARtAe}Wj@Qlx?nv7(tqzGnQDRDbN>Q(j@$p5lV^J`s8jT!D zcOT_qKR)L%^^ECs{a?VM+wsh~osDCBbAXEgcm{Wb{&ixW92v#;7HNAWiH3hT@yIZ= z>RIA&Bw9)U4CsW++1!rgd@OhYW+5{`5l;K|eg;k8zn{4P7^lBKZ_$vrF5E}7JC@na z4QW#z+Sx%B9)9T$5l=b2FsYo05u=q?H?#vI{JEF78Ve(f%XE(ZoOL?z2BwtUmAi9g zfV$@Rtmg!(#%Ux`3X<$Ix&f0bp>g-yO{JJK$*3>&ce zOy-hOLdM?p7ZlepER4`f3~C^pK(CFiXVB>KdmChc4H&oc0_&TSB4WfP9GTW}1VsJG z*8IQu~2OD8hPA(D}f5lxh3Ln%^` zFVG531;rgp<)!1Am-J3fxeS@aoyDXERz@&d%SJL@m~7pU_-?_gHUJs%apN_`VsKCe z5)}sk#DCKbd8zkd1p43kkn!daXTE6ck7T_g$$)rQZdQXFWEoLl$f9ZYv8o!<70}_Q zj+%Wbv1BykE@(wz!tST#6mgdnWw_PHXt)wdO3xXqSwP#Qx+tle;6 zRwBgJ?-U0xMxv{&m&|Cjl;_Zu8&%=cA8zg#I&)K(r8j6b*jEv7Mk1|HOrD$d^UPvA zzQ67!zqFamV$vVb^;jJgL22*mo|N6b37w^#u82MIEUD%Kc_{c+s|~-x~Wfk z9!D7EwZ9HVnP>r^Y}Kj($z*9mCDk!<_9+1Ad!uXHa1kP%;D1bnI-HlWLM znOKyFEl8H2`;vaB8(um45o zrH%G+Wg&Fb5;|EZ7>h4Ja;JfBNaQYk5G4_=W9Gw4hSU*>LExiEB(nf!?+oxCh*TM# zuHwDvLXlI@C2yv}M>ZD*72K~s>}fc4^0BxIi>X}e4OPkB={l3E#S~2Y#5o>Boi_(m z(~onxK13mzZhS{-Rc-<(YgP1<#o1VU7Qy$J)5f^YRK224QLO{C%^5hO1NJtn0LWNL zX8t?$gB|gsbg-QcW>Q2x$>IM#mvdpAE6%V$Mp2X(MJ!5D<>=RZZ3JNlF)y&h`=$s> zh|FObqds9ZL~`3SfmC)I-{`GX>BRwDE18CmBiPss&@RhDS6GROGDwsg`nufnCEE*1 z2QkXJC?8H=GM;pn!DcDJv#&LUE*k;Yzfcn3J+33K<+VI*SuW~(bVZVhwUe}nou+TEspX%9HaW+HS@ z(KG|i?~5!C#0PX-vvKm9)$0%gJIun2!(t_fTnl6-(2SjtNu-ew>CKKGv*s;51h)xw zpSjZT8%*F&l~-~f_YtX89USxN=lZhXBOLc&%WYQk<;Z>hYSUoz+I^mX=&{6ti?nj! zfM>#)GC2gKmSD$*1IXubZ%x598P_ zlG~ScsFllsb3{G5Shi=>-USEkzOA2lw7Rc7+YSqp;f|aY_@1Yn_4D{ zk6+Vb(T>92(h^}_q0DTjAhISWW@@ZYD*|tD+QJMj6&((>Mp0fvK(Ap0Hr(>s{cZsX zmJ_dM)9tXEExuTA>#TrS8(hMTr&6<1_M$iU_78kn6IgiVdQO3c=#Dpoi?7%t&Pu~% z7=hmjvXt-#Wb5Ea>qb#sNmQ=T1G@DV! zSXzdP7bVExHber@Qi(4w_P4fsx3H&!<=J{8c90slH^A(w#yrkx{`t1p_p%#JC~2I9 zHH#6?HUDNe$7%rTTeu&}4vlK`|D>MK2uGYCM zmnqDG%R3}lE>guzmc@aHhD^}MkAkW+)^~n-qhxR!Br95vkb5KFp63%o2>i}sOJ2}B zwmUAa6@r{PC4M)1 z&M~($_?XF|?*YMwMJi!PHfp{6b}?z;vPAeaUw2eDGR`s*#Lx}xY_Elq1bqO1!^Lsu zDvpe!ZBXLqWLIpMnw>rst9cVg*XFY2_`Ie~DLZ}fFC3F2N)wLBVQdz&f05W%d|NQh z2eH|YNhp)S%E}@LAKePc$Wa^_3OECYY%kaL8HODGZ`N|!lT*pjb?nBeMC*`$e6ji& z;}9EWTptFN*Rfv${wn9tig<&4-{O4CJc=YRp|$eiT8MxbwW=$}!a~WQ=pLO|1h5{3k|FDrkTHjYp(b55*`p6;Eq^`4Yq4aM^*W5pjY>6vaN=?xd5Dd~6dY#vZIz#DLU#1zs#;7}9l{N9 zZc|!h6^;XqhJsNuc+O{ao{3u8_&KFgnq?Bn$;62!G=)MDQW1;|_wZq07JSCmiFPf( zHHfOD$28u-s^MBm12}9vqVHU69iiB#JS4EXAV2cun1P6$6fZhVBUD9t@W z-d(@t6m&7$h$886$FUfF@&!;xERTD`nVK|FWw?aK@iIFg6f4h~!Jp(otAqjf?$^H9banPGE%BBH|cnuV1&;agJXoO~4_|fsJ*o=-F?JWZLDQklCUIkZOlgQO zj(%GM?$Yifsif(32$(4KV17JW)xceNOP^=W7j|#3p&MW_28m zPWN2yOu3=%)Qq`s$4tFp05^!4@Q&4ZxMOU(;;bzbImnE+QuA?y*mTWK9E|&=1!h6* z;_EUJ8$$&%eGHCP>~8az1WrwoGB%-GKL@_?G_^J;c$)~}%=Ff6yv#g9mGDAG^F*ON z(wtQ$9CoE7m>IBnE4kQr!Q?u>m^m1mM+t`#p;GkHMX30{UV6D%>B%$<8ZfuXV9cEp z2WS8bPV9k)=AY#4Etx@nRlFz8AUjv8dJ89Kk*nI=4!1cgld<@Cm7+9#n6e?VnX@p_ zDxA8xpk3*3U{#0|Cdl6^dRrvg;$LiMp$^2ar)Uri_+*6Hb?6kd0F@bc^F*;hD;4B{ zJ*tB}mg}7a=~R!n*!C!?S1?FR zCzh}-lS4?~@qD}W8oe`Z+r3&%^KSF~V4R0|Wy82D@l83Dg5$Yk{WyT)jR!b$GGoLw zgYmx+8fY5J2P*V3d-AJd3|eEsH3da5oN^%ygB!s=CQ}$vH#@Jl>V6u zxq*@Dw`CUhc=!Y#!zQISfaVd{8FYf;bTJtTb_ZMp5RmXq8G}sF>q%#bOCNT0^N7^j ziAh!;rL}1#BBW3z_CIur4zQFV9-1UhP3x5DPHbV?(b;}MDH(LnQvv{4ObMf_v^^1Ic<%IPZx zlbMgSH}bIi2QkJwyDU5H69Q+=waXqvI!m;lU_9^GwSj9rU3}LG+_m1oVmG#1lp?)dTW=a@kZNC|8n;@VV!d4ilZQPud z{@<}l4W+w5W-xPd$RGqDWd!DU!2#dAVDqu_50=)TX z24E03CBd?a5;ORf52=?C;)*6ip4r!^9N;_+8wT#fApPhjxNou&F753IpeMOflG!Lp zSH4<;j20JzUB{e3(!Gq5g3?Ju-@JK(Yp!e#{M7=ClXHxt>L1<=yQB5ml<~J>vmfqr z^Uf2$(3J!~Fr$^owRV4#xq8e%--iKWhxjZavTsteM1@dU{LIR$@Eh8a`P!GAHMO}; zj&Q(=Ub<7r36--gKWAXsS~lP)g$p{A0$Dcz*xq}@4Wy`VNxwx1PbldCut&b=KrYC| zhE$b~<=lQQfhDuIt12+LjRc{7FQ=(L*gQ4P8nccqU*IG<&!#!dF>`qiid3Vbd+aW}zKLOs%Rl^rcE>^>%bSSp%?mPhOZroABc0weM zh~TVI21a{tVgw4SRIjJ~OO2X`6D(M;`PVY9x1ixDcuUiSwQFX#- z%UTGzaK>p%8go#dt8_=_aYiQJPlOx0H7LFkkXySxc6CN&zdnx0gC$T&Zt|<^@UZE8 z2|L@}>~g=JDi2z+=^mc?t3mpA@C`-fAC67lb9zni%9+dK)9~eA!XKCJ&Fq7Q$*~y3 z6z9cVM3^r;c8;K#o#zlJ6Q{hjT#!geb#iYa|$=>W>6#@q+z^M8+rU=!Eea{5_Ywmf8R^1I?$wB@P>_G%Gb$7hCg7EW1 zr0dF%uv{=Gw#@QCCw5?imbho|AyTEFTqr2LxMiTs7$}kD^>a`>vO#Il1kjiTNvQyh z5Mitds!>EWNoazaHAj|GjGf{xnER_2R>M>7%&%_tZBO96K5x7Tts;ap7n`h`Ek|Th zSDT}jlq>^&o-b&9$IGbvnb@RCG0t_|Zf?Ip1XO0riM_uu9EdX7x^8?ionO22H?U$u z^lkCUul+Sa93eZG&-AsPc|?_DVow`4+Ur4G6iovry6bCded|H=MOojVYEn7G9k|+0 z;A%tk3br!lL;Cu9ZlP*lyJr_fg%yr0z#q@=Q|9Yt9c9|3UzgV_04Zi0osb0;EWQa9hTcy}}&9xk?aZ#24^JC`3_1?ouRm4!GQXPI&H zIUz-NHnPNY=13PsOPD+Mey%wY*fhso0=nL=Hak4&?*lB}M&5z_PucbtbNd#&2bSD< zJe_rq7XISJ`*5lR*@4CL9vMrgK!)S-U?H%APMP{JBDqaZ$yH{knXPWyy3zL zuGP%4Dny7&=`Ls%azq1;aZ_34D8~tUhHR^h<0Jee9>uty%S=0QxsS~VrAFxwGw@{k zchcKxgqK^7%T9>%31)=)w77P{87FwKl9)$71I6^K5Tjqc%UArGEzg4115SU#95?vY zTYy1#A+%4esv&Xw01W|WlQUQXa7IdFVfPG&;=Z$1agWg;kF$B((>ZP)yq~!LDL!c8f0Y`9rqr zhxu1zsl*ifC7hP;8|_y9Nfo{R_``27mPRh!rah8Y4Nmo>))cI!hFy7Ma?W$J*vd)c zpLi9`Mbxk0bo=#+rT1~a)cbT~C#$qAH1F9NiFVy+PF>mRU)4u(xjfZJq0oBSSGY<= z4-j?zieAfZ8)MGfBXa4X@efTUt815NmC`dRyzwl?u13f%@()JHC9Ni^mYj`s3BA=) zkv-!o$cS-v5Pb5=3+3>s#=)iWlLL}Z*33JL^NcxfNIYl{4HqHm-&(Xmb`j=aq9{jo zV$}BpIX=`{qQ>;*+|WBBJv7jR3&%Bh)2u?g-+7Mvcb+>D2cLslgKf)gE>#;?{buq& z`EAL3IfuQ_Pj2>2b5>@s*TZoSq|=xDJSVSOMYBqYMP3Zqy|_F%DdErngcQLs_zbkn zNjiO&^VmuCiaMr;f#4y*Tu^Ov9fu9(#YC*(G8Ipi@#y%D$np0R9002?^vegjgYZHf zq5Ode@-V%@7&z)eV0n@+=7>}J*B8msQYwD*D`Qh9G^3C(^0f-EXwMqcr7;3!hZYw<$3(r~*oXr|K~zMl&@(oBee6Teq{g{4eki5Ymj$0BsW zwi9ET9r(1^CgEFJ?vKo*O+<&I1&LfDJtUAxp5%s*2XA&)GfQ-I>WIS+esx`3cK2qPYwm?K!4JP2c zOEmD6DiYvak;2&GE2a-L2^mzf58Z#=#bF3|1)``MIUSMQWO;GL7Z;DQ1Z;XJkU@c$&b3SZ}PqtMz5j zmTL4LjtbGwl6J<)ZA7tEf|krchm!>ED$k)w+VZ}<-g*2n=@8Z8W`1hX&t|S1-)ZQq zLg=ehV$IE5n{WT2^X1#c5g5t}Hpv@hzqg-(tu3X$P=5dU*o()#o#sFQ05sqL0GR*R zXJue)VDD_==tQrlXJKpMtf%+8!JeZm6Sv8L&~vI5y|1c3*F*SJUw=+T1-f}%Qa0%T zR&UQ!VUz#%f=f;k99-jy?jT?^_kq!80E0gW{`X#~G0>zjTy2hVI_+{~?VSWm%;;4J zjRdtsrK<R+XX>>y|dyk zy*+M|8Vn>MVz9^sP(G27!sqqvPjSV=UhiDtnUR;-h5X~&?G&$w>ASWHnvDS%yne76 zIS5a|eSG6FOf4=Vi~at~V9=z7$SgbV@)mctFZ z%)$%YBu5+(wEG`M_IF+lVy279AC0um3-0+CU^ILbh7XN59|WK@Q4S+0Eow)eB;M`% zlFZ`(Ae;j?53_Qb@k%ROxhBRC5v1u)f?#edVfUC@s}N?Wc6Xye=0n zRi5;#Q5zl4u&vJfi)N`|!@K1YjnKg@394)R+u|+@yuTN8k9PxF&jVe1z!)^1OS^NQS(!;siD8)c zeJe&5!nMWoox!~DX-bb1rt%P%Q*4TuXa<+j%GncllFA?~1@!K853SkvU4YvPjM@#N zqxwrkpVUMAe-v}ZRugLsz}XL&tH<^K`TZ5#*81yvu?O4Ga4eDN8xz52VN~eE5$u(+ z^xex!1qsA8@T;5RSJhKKnTvCo*vW82T$_S($e_n$HSg3w=P}J#IQPb>+Dvq=jC)| z07<8q2t#HXLjo$h^+iwI)cU9((XHn$??7G%Y*HU9H}4o?QXB8QMs=}ANtILr7C4mq z&ATizU5S{rWXw>KW=+~AWr{PRA}sA6)v6IXbfQngMhlkh^(kbW;39X&9sEAb95rsy zbWv*l>gxmIWc=M;5Hjq;~f__K4fexB>qt*~GJ4wyu^vWN@8(>9z!b zd|dOe`ui5?ozmGilIXL?T%@)9HLKOrZf?BBpW_@ZMFzFpbY$Ar5A_eU7_f`rsiMA~ zJ?i8^-PZexkdF|I_ClDofqZeXsT&1VTm&Re9S1EQDlJuiiJ<)|4J#hhwp<3z_RS(# zHJ8K-Bc}H#3o3TKUSYDzocX1T&xtr0oc0P?p5l}kBTpxz$s(FX%?eEkUS~QJ-Tt@X z0Qm=-LBo5%TcdXcR#?-r#*v|vctjn!@jV9}vVyC;))=r9urlsE4tO&W<$EA(cTjry!gg49=ni7a6itc)W?utPlT+R3=%EnOUYjc%{P+(MLtK}Q~AKK|DdNc zY{6k62^?W5b>a}_yY5r@H9TbwJ_;tZJ$yhF7hY&d)zcIv1Y$N; zG=gz&(F+9XJVOoQ`#Tz;E~8KbFZfg-WGHbC|3^`)G&W!7XM1e@5BUy4meFI)W!3Wz z6}l^`1%Qh(VWuX5#{vD0}x5Po@Zyp6Zn7@(FTmzQ?K1dA{G zXyi>GQf8H)tH`U!o@*{o`#*$?1|UTGxMobuHRX0n6$Q zEmlA;_Se>Onu@p`Zqm5RV~cu1rASBqd}Qp-hmhw5;Bk<%oad3T$ASm$0XxAiPr8G^ zrLA4#C;OdRVoBj$mXF|kGT6s5C@!H} z5S~afQ?W27rK59hULEhOt}A}Hf5yG(cdlfV_#ZP$rxw5H7GA(1?h8ohQw)qJ4h@dN ztv|khi4b^h+T+l@TmNRo)Z6(PVb|Q8S-a7yVCQ~kt%OLKtubh#ufWawtUKabH|+!p zmNv;Kr9v1Dqvsp#>6x50p87Yu6;fw?=#TON_z0fa4XHD{&*98EYsVICv+FAr37tEa zjF3O}3H4}TbbB`FY;CgXQ1}5@NAS^O06;9z+V)&p$ zlMS)nUY;L({IlPHk-1WKO3O{CtU$T1tkGU*6?zV$*ZALIHc+Erc~ArZfGREk0D}K# z1u`^n`roS$_LtpJ>yz6LYA}4pHJ#H^A$6!e=DyT+SAGYFlOr#T2;ul|ye&aQ5dYre z48QN?7oU)9zTvh5vn^6OKKAk@;>m&23kyA4NJ0ZO%Adv)<1wx3g*L%*qCjapImj_B znTxLU+>H2C9hid6$Iw)|W*QKvDml7DF&#+-DP;?+eJ}G$Wjw2@G7+gr^6T48G(~0d zJRpT$N+)$3L;9XXR`1+Vtq2#|G-voP97Ds5u`W~YX+?D($-|pQ@!XRdXw{o4NzedS znpSE=TKu^}kje}056(S|9%_(a#w|TK3}0MS*Z%o?fR4qT5-)@NFP4JF3DEi8BX_F1 z=kM6SzU}?ZjyL2S*48;Q{q26j=@EhW5G{P*gg%2jkMIG;Xl&0_Zn;dTWU>yUwGe?X zaTUn%WZVRXhSdIUeOx{|Pm%-^mA$D#sD*^0&jF87g!<5B{rb|?iMJ~-iH>(~d;4pw zC?Bm|-ruKrcor5tI`k>eGdp1BXAB*sHaH*CQU4Uk*27xuVYGk)UWvhG8uh>Zun^d22=Zzx-IwE!ib00#fx7gpdu;C2tq6B8ClH-fLI~H6PEBXk2 zV>TrzZhWj-4Vdm`!i)np8jPLs_Mug&XTcr-*kQ&{EL#IGr>*!;oLc~-NNH$wkjmYY zk{@8UkgU7)E8QDrUwbE!U4ufM3jBghGPiLuLW_}hAz$0%k+R z7+Hr=_du8^k%EPK$hkiX_VJI6l2Q#SboC$4X$%$rxV6Bu%mD0~gMiZ94&ECRuo~i-{j1A2_hHeOg3nWJ{dIg{zpA&^x zwh9sp@X0)t<2}5)FA2B3bA&!E-2vzLpln*>!T>T*1xnSSonH_vK^+qSg6j&z2UP~c zlEC1&`p=<+!~xWcs`?cF9B=ul%^lb7pt5iR&;|aqUjR6q)*7V;=1$_OZi3b=2Yo1- zf%LlYg^1wr4BZUs&`IJ|S3Y40FNJCcbdTCn@Rpe*Ss>HU!1AofmCJ2a`J6beRd{nE ztW8KubHE&N2;e5FR1gtGhdK}uwAXuj=4Yp13z|Aqcb9WRe!;?7kq75H;b=wS49;M2 ztXu0xKtyweIy+5FQOOM;t%I@fAFwjS=#xW5G+XEE2sKV>XxgaNgJQISMH09cP+wv8*uUk=35&n-Oa1p?vSS#u&9Q-3X+z8a`v1120dn>*%`eh?%w_Pu`}7Jlmr zMY^$eroFL&les^2UoP}gLQ`Y=m+r5#w3PQw3WH)=tJQs8{1-B7kSK!C(QfZ!0< z+lE1U!P3x3_0FL1PkigM9s_fhzEGS}Nj$4I_XnrxSeaY5Auf~xf{FlILpteFVxX^} z?GW6U-YN>bLtz1eQ5BxEzTbd^SwUf$2P42Mt>fVaK94~H%)OK&Xz8LHFw?`-hV$>2 zEvpx-&p6AE!R)p0^()m_S_Ov~^^U_t8bC_Wj*?@*Ktr6~7}h~Ob&!`}gK=vSYx?rZ zqp5UBpsvTHo_JI1c}yXn*#($qd?%7^rB)o1m?@8ZmB1|f9)V>`(UxO5t`Gx9q03S|f<@{i z*sJiA+iVt$ALbYlj2d}aAG7&@8in(QAm4e8OoUAax3b!6Vt$j+^jDm2wnVe>Oi!UQ zn6MC1B4%X{aM_4lXfN(~bP6=QG&qXSN!IL7I<#sV%N=40W5Y2O7NaXkM`@A2X}Ce1 zB!@;oRbR(=wLWq%WNVd+OMF9C#^QoG7epE-%bHJFlTXInJ9WjVh^G zS>>QF&lVwRoUet>vVhq!WaL$UM&#ej)>qrKtVMr$dAuy!8u7WS*XE(EMR(KH8&-*N z%Mx{j4u_~$dybz{6qP^z2I2%I;<4;NqRNNiRq}G_S+6l8OnU{2#?LdID#LRQi<8_D zM>U#`2Dq#TN+tU9ClZJ#=5j0^7XD+-Aax40lM>v2d6kbx=q*T>$7%H&aWju^cdjq_ zU!!D}_VfdND6r4Ju<8QiYl6WcCs3yfN>IYAjkB`;_x20{G2ihfA`G^L~OlUTwm_R${N3( z*X!-(r#e5dBAr_6+@jsp zi0UP^_vA2*q}6KJYg~NIAj_8s&FTERCgA+mUzEAp79dgzVmf9;IN%l>?F{v1z=kFR z3yb-6QLwY~&T=rtOw-{*H3u~ug|?P5|L3ZB73(K1+~p4LO^c$J507%+ZSj(9pnTZY ztZSH~DJ`EL5(iU@)*ntSrCL{wHF;v!(NSDgZ%AyiFde$Dy(H-mi;F5?St8itkFW|Z zGrVIh*=r1sRK;$!98zZjw7)N(8mWOmdT}-x(kp!aj&F+!)P-p<^k8BTo{^Y_4Ul?Q zAj^M!5~KmUJm7C}zlli~)W-Myh`^=Lz)@?6VTq&R4W=80ln*%{xmfD1E=EDp;DEa} z?tteAnRgPsFFo=J)jv#x+z8cM>DiHp^|QlKsXY{kwk=xuvn$vXp6icMXUWn^o58Zc z%BaFyx$+<4Blpcf5g$&3N6u}71)1l{48FDf%PBpSrhqJ;!1GLB#rvl&muco9_6eIqZb10N1(qA6M$_ z94o9!_zae^n$iw>D<2-f3JcK`zK$Y&_`epw7d5$5*jYC_=k53PL-s&JDvex!xNpAKh;t2d zlt;+?%R7PC#(FC;=YS}v33?PI{YL_oVb5CJYx5CCcgb|h{U!E9$nTDu1l!uW1_%cGDh}i75xyTEGD4M)0Z#x9! zQ0{ZJTmy(aR(-+_mof%;2dQ=a9p=lQDW}~VUve`(YwPgWWy53ng(b;0WT!O^aSRl3 zm?fh?MJ>l@J>ougc($)^6K`#y@>8YS06%;vaz0;;cbo^psoTQQDqIrnbh;lFksno_ zc<^@l%9zB)%|`CFfm~tE#g_cZZN{V%N#$9nv2sb7#8owAI@qRH3o215ErCYgf!4P+ zX5?mU7_Qg@80qrQDRG&etp}S36T6{VhrGi=I#rG(uifGZtERom!qDyAvu3RH^CW&LtT` zUq362kF~bCL$VY&Dzjy)q=7DUYwRn;&bD1&Qu(|-+~TY?an36TOFC)1c|JS=`N{a! z+`AUI0dNIvf2dCW%hTtQGoe|rtKHbq$!db@qc!f1u1Gq^7ZL&qKNC{(4Afa*mTo_R z=H4VIhK^OIa8(7k`fXaz$EfiT9;Ftp^$w)&Gr+JqfYMBZR}lV=%b!^UbVokr=Z;jZ z2?+6}YT-o_)*8;FP56b=l~q)i{m(k~%@O(x62OOkeBgN`7ZHReHCzQ`Wr=+Ih@M1v z8Zga&ByXa$%-VT9R;&rAZe)2PE$3ZMj1LTtMW8M}Jdh74d96TXe|YXb(s)YSE8d<< z2$x>K@oW`t9K%TInG;|qv}PV0%t1X=(21k&eaU$bd^BgWddZq|m4TcFP!boa1>Pn; z=Rzx3knnqHGVGIa5t_#H8rW6HXv4-ld$*;9z8Dt`*>|`8jg9&x_{T#h9J9r8izESZ zi^{QXU8HXh5Yq{oXA*6vC18)Q_G$lm?VkNg@C!=FA}F$>oXwqF`m5VG#*NdVj)tZv zrXsadrJ>5q=+p9Ukwegag`SJ5_ETGJY;TQqFn5I(s+7KL5$TIKw(~$fls?-;0;5AG zYz5DB5s%cEx&J{HR~vZE@^7TD!@(rCQ|1KC!DZt~QCutCeJx(NqjWuQ%@o?`IM>`V z^1r;-J&TJRTkzCRxGf>8!k`{f>mL_5JvETX5e7gdu|EaLNeOaVNxrKx_&W)nuucJz zWwx5ZSC~L8=Lni@`}faFv%QT4bk_D?*W0^)0z`WTp@~J4=0i*o6nj6R4hN=aVm)!% z!M}fcyl-|-86O^wF?0-k@+FQ%RSUO6N1!JFj{rEL?G&Kz>~xNz%!5!(Rm$--59CfP z^@V(^4$Bl7J3T5J`IdI3D)1vE2xn-h0KznguE(lHV=j1~-TFLhcKIgjGdwt)9v{A6 zc162)WU3l5=t0a6uYt{!(*LD}ewDvsxs)M3lR`bQDtpMYO0M$-tA*Lt!Y!WnrGVC) zix+STrPbw2%R7J2%~zuNQ{jHpl@3XRqk9a_L0=(LRe5-?a1wAsooCr;Zm1KiTxU+~ z_x-1cO`hAMEkz3e@I3hc6R{1g?ToA}Y|Z{t#J={ia>5o%+;{tq#N$K(Fe6OQ-RWvS zfhAW>HP>oDn;<-QxuQgoM>a>`1?f7t0i&Ef^8Gles%*rA^+(}l#)o4xLOiRjuB@K^ z?*pA)SDP;K%2GqlZt{XFYgI)>x~s9a(L1%Svv9)pa>G-@_~hDBV;fCnt+Q?GkgcxM zantn9SFP^(!oyW{_c#a*fK}xA{R@AtQA24Lb%x`^Ljfp#tMi)4y(UQa@wp(AF0-?8 z%|_K*S8$Beb;s00>56s4#z$?s@k2zxcJNFPYU5exSGt)%91DNH1S414QtBYe~-M?!m=Dye`k@KR-49rUvOk+$>DlZJ4pWNjtkM zxxD9mx4<71hA13gE#J+gfbklEm&X>`RDf|`VD*r%)s(i7 zw+}u$Ds$5T6d9!zugB8fnZK8on=4O^Gt*r%y_PSpgtGmge0Gii7+*XyX;W3+o=NV5 zPLcR1d1WJ!XH>qcKno*%wOx)Cx~&|nb9E1`^5#2R)TjQ<4xq%dv9XNeLvr?JlsrD9KCd% z_y==^n6hLX^ApB?c6N5E(*aVQe+__usU|C}LLYr@Zu!kk_Nje_(52GtnLllIwcCoW z+WLAr#`=zJKDUv>^nltr_U?f9zwqyXdup?&vc&GX**&g}J&p2Q*(q!`3;PwOAK)M=KC85W z`iLFWkP+}lAuL+c4<4T)NgxBGPKMlpJ{f>Fg%F0mu37;KvjB^xq|f%6mhk1<3C-#fKW3fA^R z2=q_GF(+?3k!)%#$YwdN0D8<^iUz=F&8D%^bmu-9Jpb{5w;qLd%^SiCCWz$Tqz-En zAQrG8pfwfP!XkgR8~*Fg7X+F<_lfVqf2Z!(LJtI{zgd6H`bTt`0((Cy$VVtQL8|Zm zL~$9G;Ai{}(-;4yY%gnk_-d;C>{hn1@8Z_%^!D8olYNBMItVldt&BHPzbiNApH$pS zacyL-0ax`xBJ5M#$Htn#CAe034o12t=DcJ79rl@=lI{|3b>z?$6k8t)CIAI1x8Ek# zIa*S)^g{HP3o>9>4_up3S}D)uDrz}%(}a)GW}jf`CTZK&^j%Q(!I;8xz)xOsTbC~$ zBRbZ3FX~3aCpK8tzgMl-8$9lWSSAA7Tp0<&0IE#dM{okRReR>L1J6v7$}SKD=drHD zVrJ-V)oYaE1VACdE`dTyYz0rj37be)P$)@3l;KAje@}$NEtiCnWHmj9FOVhbvZJ;U zq?T*B;rE9v&VUc$N~KHXh{w;1%B$TU!~p(ft93QCDicmpSnuFIfgma?Zk!I4?+Q)= zROLg~o;OR-GxD!?FLf|t77TzvF#8~lRvJ4f(-;fDArk#Ik*&XL{^ox2wq-oR3}Jb- z_H^yJ*I30Hx4<&4SG?atWiTWRZqP`W!Mx9&Be<$AYO_-PoceU&qU6E6{x`aGhvo(Et7RJb%Eg=>M(6 z_dh8ezl`h0hBHfsmX+gL)C^o0#vbT6h5VPDZ^l zZR6b1P@_;-c+gN2resL+!sswdw-~`7)Hu3=8YVHsNDXu$12ILxFd7C)kCBHRH;FYn zrmSKKHYSXRqF)_Y4-kA~SV{_joZOYOM|xy*f^06&o7>aDlcSR(KOL*vlbzMm>*Y2v ziClkiei*t;YD4Gm{+=^>MQt&9|2iByI%=BO$~${Pc6Vg>4#m&zeVaR)n#fv8N;+as zljP>c__^^rV?Ulaeh7O!io%!m^Nz~-rh6LA!k43u?RoiTecJpuii%p>JEG9jp1g^8 zcVnd1Ps&ZHAt+4mS-(_*l#mcQspcK*c|(-UN9w6|9@E68FHSl$Yh_-!EeJjKRsCR~ z`nlWWggV?h#IT9P>#^1ah2e&%u}usuEHE(`HbrUM4NEEr(7QHLr`N z4>*ae4~PgfA~4pL&1-r}uSBB%_Kl${KNNmiVlg?-#@myDw>;z#P^HDrfm+b6u-bSMxTO-KS`qE;{>(I8(e@=RYvbvQ5ukBgPtqpN7h6F#4$Rq9cxW3l>|Zbtr;>cf;oclRe!9(V2) z-Y{St^kZ2eAud%1OHvF$cZT!|jt$ZzRV=Cb}>76D+xp;~I3 zt@QKDzTcUi_=sPlC@Njz6Th0FM6|udI3yOVrN<%-KgAVl5ft>k>>W0Ukk^0?!I^T= zHIqrg0~IlAjLcuGGw|`FP9xK6lz{gr1sD-{?YPKzwA`!@HG;+!c+{v4;s7ee89AM$ z?i*sZH=qhl=FzWR8v@DIUbwJA<7bI5F=LUT&GSX6-A3yn&S+f*b^F#!0dQY{=GzQd zWSO8gWACBB+q46?CPe3Q3#R<$e+ZuFFegEPb^h%d%%4C7M+Fwk6A+EI4JGCb;>?|! z*q}EE6;{_$t5WRsw1naQi(C@OUO=~7Yd`Aj^%$cy8%;3pJbuN;5Wlt9BK!BD4uWeG zlzBTZj2$s(Q%)EgOi6xhiN7ELB`+q~$KHr+BNNTO$oDQS^lP@c!%Am zGuP&hZ*Z4eH5+E-oYiGJgaMF!#Cz0`WaB~ z4=Z2V)D-;ur&$Ygp6_h2KFu|MrIVNt`Z_cVjg27Ay`sDJ0_*Uk~!i zD*%PU;Jsvzn?6*G3F<%?@EcH?YLl>{O@k;rIZU|NUn!1ac7#HFx`ej@@J8%@6>$&O zZkcmY{gX;5Q5`39mrJf(Z8JvR zSNeQ1^T!!Hp2-s!yG(AAs3!meCWx?Kw}$M@NU%fhKt%I;qZR`+asaXZi)B>_;ci&8 zy+^}@M^~C3b$R3qCq1yQfPouIG1uxIo}m537hP4HnYL!C z#K09Cp|o{;kD!K&nT8^4C?<4cvL3G68lWG}hRl;Q>omr#m&&yYb*Xadf4$d7Zf*MX+XUqyXc3Maaa za4dk<(GcNvlfs|T2CcXsRDppCV=YaTpMWVkGPe7*@i-|(8x~VUiSvw8K~~oHSaWQb zpOrGgT~_}V9!}^OO+2666=a;JOaOsYeEfjmz$#awozRU-d?7`Nsk+IT?YJEsC1qE4 zrR(--c%^mKh`%Na3c@DSh$=>SYnQ%XIM7d?@64Y>2umL@w}E_NqCvo{c`y?xZBk|T zTs;=X#F|?+D`somA&pnJ#;rQQC*?$H7OTG)Halgam@%vqqiJ-}8id-H-fT4`tG}qn z+O`7dN4=YG?*N(w<}on=K<$$A*PbIY+0Av}<|+;YiJL&t8<|YLhmx{xHw zgGWW*?BW4?=(d|pGUkyHH4}DeNbc$9q9x%0H91@f0(r@N)%ZM~Jm4prd=!$oFVd0z zyy}6%6laIWE;2nnIAuTviE3jM6^(1?q5QOYER9`cCx9gjEhvq)FCy2{8pgW{d0%O8 zzh5y}78O(X)B3rC;%~$akH)M7HYS8PZTN+Mn0P^87jQ>zv%uIO(p|J-d-UnM&p-bS zjE4uu7yE|a^Y(slIKAH@&vQKlyF^qoG?K=v%}^WPBf42-iiQ=(%LH=(#vfw~UM?#w zlcf}BV#MUbiEiA(#qsvON|>=@<)NjYSeexBS4{kt)u=$xOsi8pULg}>3Bl41THH96 zPMNH`;_f-g0tHv}YGLzAif!qms=n=>x|!@2V;f$SfYnkQn>II(bF3>uJLsz+#Rk3m zQTehbdmF{s{~1;{4l$0|72{~)IoXzMmZAM7I4zF=cr6apY$dzUic>ffB=Nm{TdDQs zs8fl9XP?GO%+Do|$R`&Yzq=a^e&sxoYc@ABBx`1-7nGU3Ij_e)0){oqWXV*^7G*BO zkca!bX#@q+I1*Ig%fxoWUA(6uQ7lNy$w@K(k%|Mw8iG^aYHkb94_UV|L+*+&0C4$% zRs@f!or61jaehFa6k+to*7wKdo>R>KdX38^kjR$|?E;_Aq|p&1_VGO@FC*e79k4)1 z&_dl9Ed<)${ftB8p#YKjW~`10GI6NLab(Xs*hEiBE;d~TdBXSui$*bsw>236j99}t zHjbotD>m3ZRyoZSR|cHOLh;S~S?W~=s=9W-~@#8?eOX!$koa1tX>~~ zufL!lhQ0gh<@t<$GOV;M=B%z?-r(+1_b5w!02c=AqHw9CFDRpP+&Bi}XQ<)({kRt! zh$TrP%tHy=Q23%4n?5l|+(L0?de9l{Su881mcdoY_+n=UnkI#;{Ys{zYVpoms!tnF zuDXSNGVK%_V(HCbivp;q=e{!wIMQP(rv*^jSS}mRHT{q|R!e+V?I{bao%#0OC$(~^sbXEeB692Ms_30eNO zR02YQp*_49%o@D%nYo~+iIc2mk<37YC}&*+JZ|$% zzUkeWUoEo&Nc$wD*kUHy-dqs}qfc=8<~&Bm};ihFDsP=w-S8Y^}~7sIli z3u!An8U7DX9_B}pOlE-}rn!1LU4HMk%@1)^6G@Cds{}(lHP^=-BZ^d&#da0@BJtNr z!p0*}#%tb}ve9W>N$zD%Ou%Hq41vt!1@Af5%@CP{?=8T>nBw#-sz%Lnv=xo*h< z;s|>!1OMf5$bx{Z3jCS54KNvokZ#yAR1I9sMZz*u6d16+G}v8aJtJ1(sf8IWDSU?! zNQ(}W4)H`X3s0#hm2v^v>{(NaoIw=K8{2kPvSQm#&e*nX+qP}n zT(NE2wyk}Az29g5h1peI-LuCyM$Ya}qo>Q=#jc*uV z7Vo$?g?LOj;ru48_^btt+K5T7>7A)pwzVFOwgKmay6tSykquI7ct_bZgyI7q5Pj{J z^y-Tg7b8RwiC$jQUVMn-*Tc1<;?N}a5p@LD_~Zz+nu~;$HE22zfG_z&&_4dzvM%W@ z@CKKOx(nLW2Rqo`k=6U52kM8{aEu$N!JS-eN)~8g{_kXLB7d~PxRiU8Kuoih4>}#S z;iaw&*s*Z^CuIpI2od_@y3R-b%$rxnYNcPSg(G0wGwnh_Sgf#1>H5=5Gm}h(0^r#; zDkqI?n-rsq;BnI}-t48)GER{23SY4ej`O+KtB*`$ORw4NiVDK!y)s& z2U$;TV9YaY=Qh^9^quS34E>LP6DxA&w;xMS3hmp-*2|eeI%G&Y#?}1PWxBY`7 z-%5eTY`sww6YPvj-%tJ5kaSpECxGiKo*B*Qt9$7AN*V(VH@_zM4U&u`3%pEW$M9Q_ zYeCBFz@5Y~{XTO*sPAkl^RBW~2eOBT*&HS;P+b1|BRWF_)DCnwI+HL+jPXx5Epc zpT6UzD~@i?cf0uoGUum*jh=GLAvH(`=gx@t11Uj`F8#tGu^TtK^A_}qrAgonT((*; zHP7?F6?2wt18j4pFQ9*k8g(0@9NVr~K2f9eM|`~a29*>5z?i1ZczKQTY+n?Q=D@N# z=skYcZ1XMM3`IB~$?W@H2b=D>}@hWE24FL{eCcmj79)3Le7d4Wis4 zy)S@Y9~BAtmnU!MuD|u-&Ou`febR?-wC`g=w{#yN$P-|Ni<&4uPM6Pyin4y~SqI8x z`07ZGi>$!DOq-9g^R*(%UTVkigY2p!mmb<#)4NKxO!<=Ub61eN;~nk&2%lHE3B!1W zz3oVx(Z*iG*Imd1!)a5jQAge9qOwaLwcf(z>-_0)SL-6^84fi2VL^DP%yzMOm>>O zTHW_}-->z}CNhkv?^_`d;ut>q-r`* zO69P4whD&IMWN+L^sineT&oPKqJ1>w2eiehAsd3p+#xKLn~&$BQxC9^mHD>!$DF?m zV8*&60VuIwa##p;{n|G?UJ*1`^@~!jF1b(mrnxK2Q*?85WVqrKE zvK;5flL6ecMTvYaZ|sw%9dCd`@VO!Tz?x?*v56dz$6&tWxOXX-&u>JPS^|f*gmlm{ zA`MGor6Z4o)}zn%R=F@NF5Vz%$l$@8BM>%}5DK$8MrS{>udH8jqbG|srYMNJZGY-L zHMDKD@AQ0)I{%#V^1Q0DoYKV#wVIvn$k~9Qzv@vGTEUy=>AJ*YBn%u3N?{Qe9=cp| zIXn6&PKX4{u9PXE$$>#T-|hPxM=|kl$TQuLj=TxluJvkyEC3y0t5sTbOR1o)pR))N z^T*_T4_Rlu&=l)$!#rTWFf_PUT8STlSb#k;!=MmYK!d&$WoQD~ESb(V@9lG z7DJ58*`fuV9C`up^o8O{UmUy>l04^?Krt}%PCFLpTxwoN z>IILUzKH(9Ge(rHoWdC@+;Z}<@4jW;>mFQ~>rvXz$SxZc(~k=*5~ zEcEgVL^9n`>71-W1FtyxMx)rJTPPXMc4TfWVi(qe;Iua=Bq8H7lnkTr@E`hwPHNwJ z6HNX>B;=cwqc6S@k4}gxHdfNqVbj9vp_zS&B1Nd^(bUrtbVFu4IM1#;nSH|l72$(6 zZ|IiLaIZMb7T+p+O?awP7kv5J{)cO7JkGu_KK!@?+#!9z!Ug|6Sg7D}kD-R74Oz@W zD*OVUQd$fOPXddR`68}*;ZXwEJmC%CXt@oPxI)IK#DpWi0v=_k)l$CI z!|eTp`Pn%tw?_2-*zdDLvRV+DyvYlLHLEb^gj!OB_4OQE9ibp!rDkN^3XUF}QN_NC zttf3$S(-6IA!QAeC=&b)k7!-Un}SjwXF_r$v-C1MDT&LsRTxc!^j)Yx@-6(WVOw~V z1a9$mkmXehew_l9%$Fs$GT_KJoPK^dFY+@-6jwkEDNs|?8%?aa8eXxz&NMli73&(q z^kh<(f%F_jw7Xteeygk2t)}PuFNGWk4oBdVAw*Kfy=L$HfI2im%`w*dUGU$|(a_-x z#JXQpoQ)EA;fsUMAJ>)T`^Ua8#4NPipfZYF)eEt91hS8s0Vn_F)j&GgET_%01BE2< z7>#iCU@SdRSlLK4bD>8UcnRM-W~*UxAq(q7u{@to{RtNheH~&@86AFcGZVOAsWnVv z-ts8PppGdeDnJ;e`Nvmy?MkPuB_f6~VbN7(|Pvh%#TQh?@N^~t2- zrIyl3HLZhKkd5x)!Yf8%p@=fJU6%oge;|8sqZa=Nygs**f55 z=f}hr*XQTv74t`O zZxilIXA-tc%$&jI9jzrVI~){2yKh7Q2cln@iBZhy=Y?apYwyj~N^Jr0UP;3n2CfS7 zbytOlk!ElDNlorXs#t?AhRead(hLGix>NJ6j$~x}{j_seOC+dg^=X22Qo^6ff(&(Jl47m9frPA%8X7y#>>**djSIx;2$xou1&ck%%=ozw@~hQ%~m+y zgTk&x{O#RqXh^=+@ln+FINLvhE(ccw_@;I%eZg%U9d(=nUMXoYUi~Bfd;jJqFv% zQ2H#g{$}98|Er$V7g@fpCY=hg6$BYu^|gQRs3K1eGtE-;SfkR*yd{XT^FO-(2^TRH zf^)Y>KUt9-p1>11cwitUDSOj4G(f4vJ3iNFCG7?=g(4V|FqYnt5Q&uGw#H%lSDDd0 ztz@&1o^*TmzPDPX?X(yF3zslsx`AxTmnPc_1%J$T z#3#*Ek}j>XR(Idy5)=+PnrH@gx6ioi5~K@)#!ZqM6y})v)AZOSVzSF!JwP<5;EeeV zzs`Aks3jjIk-9Ipb-FSE5kUc4aAcdb!L z4DG#Q8!zuYAn*Cl0$pJK1aA%PZ$pXV%E3V2`6H?vGW3`KaAXS$<5TqyP}1*|kBC7p z-&|4A)D=y2%wb$FCkzGu1tXBqbZZruD{r1KHIjZg*1sVZJMFlaQmDxdUYBCd)A>2L zG9H=bG0)~0-#^^tL>zI&7$BEKZK$Qr0egJZAcqa}MQqXJ6Go|gPF@kj5d^u4|Iq)+ z)C6&35LO62lE`_6~U*9 z@6nXXX)u)e8S-GzU0n2ARd?3(mOOTo&h6ORivm#ciPXLChZVD1$|d3LkTI{>oJZ1% zo~W)S@*Xq2U(BGJKX=rK`Od5^79rjEKAqmWaC4{pL@@QUM?_r3g$MZ+OGzN=ldl8S zm7gDaHNe#BaljzREH)0qgAPxSN%|>kL&1O)et6XRwwM~dwk=EQG#4WDO zNUOZRl&Y$&E_v6=sZ+~fgVrME?-<}^GS>ZAbj z9RyWLu=Z5V)=z?$uc#qZe5SkJ>qEl{p+b9^0LgKy&0owjdtG+PCDE1lqGk>$&K`wd z?@=H*%#{f$w?;0ev3*DsVBFy=)vE2Gq4h|8A9mDIG%|vVB!F1&y=;FmE{!YmYw@4_%%8g@yRhiS($VvWf#ru zTMk#9eOE`FnIzAH4kqj_p^UFp&sbLCf;SNkj2O9Pff+`%FZQ<%dostT`DtqF98)Vy zQ%0}3cLYx3CcWH1fi~v0YYrd9`g7Oe@wIW=ylh)<7T)D<2%P6P_V**OuBb(?P?i+4 zSoSwjwS{!U&ezdS)uFOW$w~+|B&K`8iOd%c=13o$7JWk&^}?o*1uj>+r#Qev3|y<* zIPYJ6TSy!DKnB%IB*Rra+p;(7vKi$d?M->_m$jnqD_LbY!<8JpTkxeBW;adI0;q1G zIdK_JSG4@D-n`Q+-p!5kF#hg{m?vygncFWZHUl!HMO*VHyM3VH3F^_&JNh3Y)hE&h?+$ z&RxPKErG&puYYF_TGq8<_6!r{k+IKo2yE+#TK@l~#O3yzZRX?>R5*wauT1}m2I|kz z-n}SdhJ2SLj6AuPUWbOAd^hH9r`=A6ltX)D3c$DhXFNFKH$Mn&#h^z#2Y8;B2xv$o z6&%kMyZ)Vg)YHhd`tA@bZE|azZN4s`nQaD#I>(*j>r09g{kn~WW%oUtNxDgPkZocW zMwkKoOW+0Ep?xLL5|e5~rsBibpP>aJmfAkrc3_z)zlTOqDXM^04(i)YX|Sf>RuD&} zH}QZc%;QwC80(1Vb=Xb^(yiHYg8SFH!E0?)ExV%;wCP`~_%+wIpy5K*Y0E6q8wNls ztMVa>NL;_P9KnK35e=v&p#&C;IJ8{guZzVD6#i`wQ7>ZhfUbU@vaX=DbM6i~LT3OB z=VJLnU<8lPM+}a*+`T7<^?6r9g!(oI&#@oIGt0lo9SUAg zPjOC^W=rj_u`$UVQZgObnb% zo_H<2PyZMAss>D$%Fttoa_Efpi*^&z+LFTMdK&4PC0_6fW*0cs5Qx|kepK%^Jp=<= zxoAjMmz+O(6MaV^!0WrPDs{$|TM|G>^Q`4d5aI3xQD*VAU%+20v+({Vj&%dJ3!eM= z)S?1dC^i1$pOM7|A0fE+j%{^E1L;k>yU9fSqO{s$U2gt|)5&gS zql71lyG6?bS5B{aYPit0gVGiPzE<4mvi3+-MUzDvb*B?T>tIXVp!x0$-A>7Kh88#s zU8o7<&C#I5;frpaK{=-RJl(M&yB#QKu>Vs4m@weZ-$FJg(R{8?MixM?TwquEm7UCzFbH(u_R`h7L zF|;mhQ|&;cg2i*=sy&O5*MyJ;ycoHTR|3OZKjdYtc5895AnZ_*QfzC@D(+&KR>{^3 zw-P#@n=b8Yi)N8|(za(H$ui~q5u-vwzGZzbtr01G1v=#L#-?wz&- zdEG9dSDR#>eoJ{&(_&K8;keuB-IL+%@Bb5H3^sjVLIn#1#Q2{eo9O@exveb>O*~(Jw`NDoao&9r|0s4w?ntc_Cv zpDJLQ&_uy8i~tD8HGoI8Ft2WTs)n-bui2Q^88nb#E7b4Fs@4^)-->9^wEBOaA$D-C zXElKBEykO&-=?#-)~(EVOCxQ(;R#-m8wyh|C{5C19<{P>jZRVmYT$6o70;9<;?G42*U zrYF$9a10_$H*7+m{x+L?SoI2rm9HgG`Hjiv38<3j6M^2RD9O}$+5?Y|nGE>v{@29d z2@o8Q6$tNI7yt}sDS1*x(JEviX|pj?D(b-!dn8i$K5O_?Dc4u1=Kj7uROxE-98OW7 zXf$Kg+*+PIsPpsDP4>3iTWm0pH&?$V_t8iai)89=ptyvt7@w!t!{-AZ@9&SBvQMnS zt?g~d@UmB!BA%Y_&}=N}rql>od~}bt1CNw|ze4U+1bv($-KhGs$;BPvf>;NLZNFWy zx3>pvZFP1(_Uj3!IJaHK8tA0kkd6C86?&5rO zwzqb!cLRcOIiET$~i;xFMHte>C{2je~y!dDncgvcsrT(5^d*+ zZ>cdBewLu}nS(-(399Nl&^T#~-Z!JHQ`y7#ko6XNxPXA;|ixb##`KT0#OT1lq`L z@yVK{1^vAhpf-PIZb-yldwqf%qDbb*Y62t~VZJB?O+$R@&{3vtwA?$dM9JoNZJb7& zKX0=;u_9rZs>-q&1-UW-+LxsWKV-O@OYMd!q4Ck!28i$6wG92 zCx|HIWS@^a2|bKOF!xo}3`y_YCs@_{_KmzF`^o|rO2j4m^VBCHpu8GJa+#ga4PZ5p zQ@`~spX3JZ(BTjgfI|mR_%3W02W1pnSSNNk^`gZ=y+AfIY?ERMxoLq>k%uH16)Ay7 zg89U@V!w{;m3=&vMUcToP7=hU@-ojILF9lZc_Fj`#BSjq(Ej%~;PF5n?gc&^K_(Or z#+)3IBr>dvqq7)ywEX}0_~Em1eP+&roz!xevV28TZZU{T+z2=aN*!T_^#3%4@x1R348nG+ z`}Blx^-G{9hI}%r;<)2!Y=LDTq<_@(CCdI&XEZDX*%q0jEk)+@MfW%7@j8+wWJLzj znOT*Se?)Fy{ISRDK~>$Bl&uT)$lPRMxzG+rBX_`OgSzL2UKU52VRkn0cY#@H3iu$C z7c?Yexs58#McJB)T_*=CZg?#FpbNL;360w*kGryuhQ`Va+Ox-i#f{W);1HZ!E4WXh zD^L`kAAwly8@U0n;gwa-L4qJ>9M*)}GFl#DzUZJuC{Sy2t@eL=57BHr4EAYuU^zI$ zvXF4(&i;lRrI*TKRS(2hc%gGP7 z2)j919O=}whEM6j{TX9I4>e!-YYCOri8&T?-zlU?*DRSAk1d?Us`Vf8VO=(4g-D*K zRht{B4->7?1$b9=Vz-E>f)|t<^c|q$(Bg(VC14?D7@pIVjJAfW>-=BNwlcZ%@Bsvw z{=Pda8t~`hy(0zRzI?9yE!+#@=3D=OBJ|H*b)+7u!b;j)y)yVyd%W0_N)7f}aY*^Y zBhCZS4Dz2g!BC-mU{k2;8ou9&o=)S)NlPeJM>Y|Bm*{|?y7nnZZmpwT-3GNoM*=$K zF@!drQ>#PrqLLwQ5Mlt0NzAHwao5EpYz66eHalup9<`L~@T} zC>mma0TqB)?bFt|9PB0(sEVixVlJTDsc^J95av8GL4E#2l>#yqkW_Zxs8RFvWr_Kb z3bCg5gaY3!cC`iZ`#ljz$axgd`+7pzn7Y2`j^&T@@YIBXp9Z2L;vcXBQ?7rp7&-&p z>`npSYAV>G*@@lp%abCHD1;N1&6RP&fh3FC=$=3Bsx# znONWY4|rNo*OiV@SHJ2&HraO%%wOS%BD*X6#%l2oErc%}@iE5kgyJ+ksAm-7Qe zf7_z?Xa0(>YwdK7Rl6asZhv6S1$d$ZC~^m0{t9|MIgw-%?w*e7pdxn7%dDw%pIMgh z_2P(eOg?n>nQ2$_rYwpXpY3De{^3?uHLpiVfHOO)mgBU9O9%>`<0OO0B2$_leiG2S zF(*Rv;N&^7$O`zVF7P|U0&TnQBC3s2N95Q%!67h=*BN#JEopMA3)qp{#(xfE#R#;y zUDPu<0`vqg1@^+ZFu^FZxkGZXEfF%4Em9DiY#(mS7-m}MvoHtgAmy95c{0`ub$dPV z|F7#2(fxw-10D#7M-&K%`2P&rPA1kSM$Z2`X<<4J?`D@q8ZmoY$O>?!&|^I|C`X+^w`QgJ5?JS z8><_hG2_JAR524GeY8<2v=-7lfKkCTV5xuuE|;86Wi+g5rjfZDnbHWG6W%^DZ&^Q6 z95PGYAe*LGEQ)55d&rR^7SumKKmSLk#>D_oYG=3a@w{9Pw^G})?py*93Cgs145T93B-a zkT+`h604AOSBQ@fsv3Vk>b!jWxV0k_xHrq8&i=qi7CelDx13SW&{|kftY{fq;Ot60 z@wMmlxQ8jt>Eh?)d^f$jJife?cz%`(8b3ZBHhF%Y4eHlVl`tAYzh8u6fjh>{K>+&- zVAAuinDXJ%LgQL3S+^9jsL`yk(I0MS!GMz}Udox6C-Kyob%H=|qwGRW(dZAgwfKoI zZx26Yk+Z==6pVRf;X z0_-fi-Kn^qDOuw-o40DMsBe_NhUoid-rykK_yUYJlRsQGh>{!A2^z3Dyw%da{geP! zRmB?HJ9Wz|!x~-JLSe4kM6B?(i8ygB5Iu`ac^QAMo>wtX?*iDQ(CUoo>{O&b=^^48EtO{(j&TlDxG|y`HK)ZCx-W6a z&mFGAem8C&%|Qyj353a-&-&5SJ0ayRo%|Cp*R>g{nGmpR(9z!DI|y##q&Ra*U&{1` zn&+fcq5%cg8uB1R{(-p`6YJ90%ow|qQ;$;a%xM;?7!z@L;I>Ih4=cWH#M41)*Y>Hc ze`3-CtWGzWaux;rjtZXn;zME>xBIECI$$%%Gn}@4bmB}sXMD$4ip-=;iaatav=PN( zz^V;X`EO_4D58=xjdU!Yz-GFr&$z2?KuOn8Shhwr@jKo(367|=0?7}q3Z%$NwaWML*>AJ)YvBp-vZJg5j*Q97HlSg(`tMVg$5sF~iY`oxp3KU!imAPz>e_uCp+^#r+%k!Sg&JH* z(b9sHB9@sJE3lpGPr2IQge*IT>0Oid3GRcF=^=E?x)I_9f%e2?SyPlmmFoDh7uF`` z(Do`L_IpEj;xIdcaBuca9Ccm^*bk%J3yC6+{?m#g!B+Awgw%@(pCl5|5eV$yRQ(i} z!~&pjm-twFLKwU4cJp!74+zzU*lj{oVNf6oWd}H9wU#1%|6LzJH>WgKfWP)sW^)I_ zFX=ai@a2SM??lGIu3}_Q7PO|eLL}W2NV>QO1XWBOG6fcnS{~7+s7|4ltH60``$Hol zhDbw1S*XM=Bh!r-Q0iC!epq~?9r{Td0GVS=%ywxOk;aJw+=mh`okXMjD7B%peF!9? z+WL66r+lcuzY|AaOo0QiLQ!%<4OiOSEu+d+(kiS)MjtF~Eqm4vUD`5&xXQDPjL}Pp zhqNK5kukKkOA9SeefrqH9Z#XK_~7a;y=2dX%1!Y6 z5LHhQh*!G(!Al|!MfAzVYNT*N+u{4Ycyw^>@~cVX_RB5m&?gN-qjteO*t+6v&gI&V z;2#TG7ASbgR>Kr$)W^*{eDuc!1+4m6BGVPR&CpE>%^|975$RA^2i!1?MT>-?{2n(~ zH=xW?bJsmJX7tcZJ~9LSe8bWaTC`xZa)GvX-n?X&cf$gOZ9@phf>y)d(_(ZB4>#mz zKd^9D5tJQtE}UzU#_5zTp8oVN{37OK2M2GL$9KfhADpTKcD)Yx1F5!s&`x+aChB>)9~bQg z5ATU(tRFiL6g~Fbd6~)4b?a2_5S=taErjBQ4+R?T<(Dmd1_**VwId&dPt0Sv=+ms6dieKtH@|A%1 z?di2|_Pd&M$g?^y-DYzGA3Nyc1Hfn2wewk|s5r%*t)HZG=ilNb44OYj6%T4~BwTKi zMIz-ieZ&n@&k)2#L-8uLS=}02VX(k>;@PV)S;9he32%7@`T@cd|6(N(a<8lQ_r?+J zB%ggtSC)MW!$~2_SDkv!+lWDd2vuywA)GI8;XQe`vAtkUG$j^?K5*Ex-+lsAEjYpA zK3}ol>-bZx+iVy(EBHIadQ4fyk*)C|TRXsYdx`$vpV%^SVu%=Iz z=iFpsdy#i@Jzy?cX)FaCR;Fr`zGcif!h3_@^UfHqkSNBibPyEpUF5I6>a;%OwuZ#) zBpeD}L#FJO>qjdItyKe+&G?eySf6fcdlRTI4O; z_gtj8%m2pi9p^&($tw}TTfdE#&mDy?ZrkS!hyUUAC15+&RbTueo?z6hVKOfw&&9_l znsi|9R#3e99tv$-#l9Y6?W7vBoiWh{LwBWAWN*P~{Wc)e!cF72Mjrhs#b|DEzsR0f zI`E(K3B~uD)Ytdr&6Wj zFZeAV;C@sEjPdULYtJcx{|RiU74IJqI9=OnFy7sL8*J;``W=2u7j{&V4far6Loei? zk50>{=e=Or&x&z@ZUPbhA>`fc?Cj`Qt5a=lncVs$rRmM@g4N_AQKE773;_f zRaMJSk&q6VdEN_?F8sGn^T4OGV0xG9xv^0J+=Zc=r`}M!JhVt8x62yTs=A!& z>jB5i+2^}68(q#nBc^3EUn!czx#VI8?S3AGVbcU{)qkHP^3;uY8+D!6q;~oPRx$bT z+$q|=^0Ve==%N-DNLNMdsK_}&wwy%n_89YH2Y5TBT)N5sH7TaWHES>Ho~7!<`hc%OKj5yku4M);4mONb#Z3DB`T+zffc)IA ze#8uu;gwQiK=2`g+^ECgbEN;O_rIHCMdOLQ1Q-wy7a|bQ-~Y2YI@>wg8W`LC@9Nm1 zCS|wDfz)%U2IpN7!y23me-zKw2?%Ju!J&MikY5-hqe-HY7{2S>-4{k7wK`nn0Hv{BlkL}} ze)3{|-YnmtlKrF)%W90{1WCGuIh8U}7bB@-(E$>9Z25gYoFLusx@>XZc?%D&RtamA!6$5FS z6cKFYA+>>q5uNm9nnF>ziO*7F=OpIL1#s7m`Sdf;G!&#@Iuhx)>`_v0{H<}D6h*x{9E zj!0qF**hcYBxHVFKo!zMkFmnO65tb+s%xE8@!0i)q#YqOGzqV{Ji_?89Ofuaoac-( zq=J~`2~1`2sYq2w-c73G)s$SoQAdEc-5s4x4LFU~l+Rl{+LNEHJ17%p=-M(hBaSCD zH5~Dyhmhsx6Q?Nit@S^pJ3J!hF8T!5R+-FP{#2Ie=i4qMZ2SB;^?qh<`>pxo zev7ic6l*>yim;3^(fu25EE(z06w~PWqyp%lo@JDtr*3gr(u;QrY@=mI-RLMw6q%uk zhGAt2hR=(IO#M-*>ti04$0dWAa6^9$EC}+3Bfe@PCe*6d8ZjPTl%pBnCCeV>EgZ%F^ZP{cnXT@_i82wIDfloIaJglEsX)2x9bESEd%Fz~U ztsKRH;$cu@v3Q0DR+584#zf+7} zr!aPW;gaA+4k{ZuOEE<~eu>Zlij5xK-|rn#sxpwppVU^sI8}U8unXp=QQGzN_($y_ zoGO+TK;`(|Yh*%s7fl~}`FzZGC_W^Yh2dqBRs+o*fTE${l-WP0qI}|Ywf6kk_+;Zt z!(vbtqUu_6;LK>6a_y26SiYZNP$Fw^swlXsb64x8-`|HuP+Wu)p+>tMaBY`HKq|7A zb2D@e2G@2!^5eT#2pu}ms=!e>$`gaa#VK#zBE#istAI3k6FDI%1*}UlFQ-C7KV%&AB zKCj|i?C>EDlY@zYI^JEn_Ad1vI?Gj-L-s{pK0xw)xR)19sll0;SJK$Va~sHS`_);_+C-@6d;Bqv8q#wc%j0z)mtxqy{C+Fi3_%w!~)O#D~XRBw~yRrqO-ZY zpHY;T-1j|QX@+{PT13OwJuEp?B2`Bni#BXoK37?yZ8^x>x=}e7tsM+PcELgagtZ8wnewGElH z0SW*vx~EMC1{(u&eo&jOmI;my=D+KX#1RV6=G}qL#vA3%1grmOQqgoVYv+Y^$?-KP zYL-R%w)gLnIQm|_DlO*CjK`IV8UIS=C0F{sRb88sr>(nF?z%JSX(EJHz-er`_RkK0 zb**bIK3a3zWfF+vLukyqy2K7j)F&%7$DeuU+*WUux91!G^#T!3x*(uoxijibx$~l) zPt$(u)Om(n0mX5fM0bJyu-EJ$>xi}>R)XiKrKneA0LxSnqY~OTo;?Xn7@{t@at`w@ zmYLc{A7?%ZB-JPi{{8PAvr@QOC>qYK7#MXjuos7um>1M)xD3M3#g`O;)Np>9Tr*@X z5dQ3J$do^ANAI$muf0@!G^@fd*bH<^V>AYAN8<*I#zTV7nlhj4H!eU#>yR$wpqgkr zSl=6x?FDHc{Mt=;v8`*iacjs}Sx~C#pF4sE`;RpP55q8Uvw${>KTKw(dL6s}=}dUW zvBqLqqiFrqS2bV1L$48UP_g~MI5Q8q;%c$t621&5b-;8e<61*~T6%g5sey^UV5O)D zD|xB0#&LDRmSB={2e%04p}%aLd~8=(hQMq6($MKzWNm~h_BTAErzZK@`xl)~Hx$yB zwy&~V?#f5`PCBh+Y{0!XcH5Bd;Tcaz2B`CmZlz_vpV{a1rFpI1f*02(fY+HK3nN`J zIj;@CL1RY#(Lz38hx^ZL%jmKvCAuos(qH#I`Q2KLhPXc22r4S8#B0hST;)rT6S)NQOZG`D;~FomPE%K1hfH=8~?DY!&hWrA3ZfMvGq zoa~Z{u;u27F|O*ldeFi~YK;3b#rsu5k$TZX^(Q?NB1vw)uzWMr=a@?dHlJ`1C*bM@ zP3}Y=iP>X(1BQ>1;goS(A)isiNs@{7@E<#LORVR1s+$RI4h3yejb_z@poYbvuY|5+ z5K$n)%9_JlLvI?2ThR2fM&%sI^Dmyv|Iiz@86$gm7ka8>o#^Z!hXw> z(>@lcec9s>kV}i@cg3Mus^$KoAFg0tl_{niL5(F ziuWN99te_3!M_|8pUFX9{>z*EE1qrCay39kn$wnplv$FugC|zfD9avbKoCS5nFkC| zN9|4Xu*3BUsT_fSCNi477^L*1zE z``7qz>6gShsVp{z&~*O*3QVu~@Imv&p26zH4lj4s?=EP|sSX@dXU5N8BW0@wX8h%T z-~z7!Ph(smYO?Q70OGpZHV;yRF}IFB!{I2hoQ{|HFtQeShC5zh(^7cY$tC7N{8M`N zU#7&gQoTC#A$l@b{c?qT7Yo#;OC`JuFMl97x@>^KcZ4Mfp1^#BKLiFjS*X4?dW$7w z1mjSkEiO2Gm?8?~0axV}mNsJ!lF~)_&9rF}#${h*8b6=Cdo+`#ZP z+vxMzQedf5hB3c0BB_?0*QEL8FvA%uuZvl3VNn}Y1iY#zBUgyL^5sm4u-4(~K<#Cr z0or{m1Yji-7!jLA6sUuIh+uxIE}E45+Gk-k`zlmX%6=)?qrP5(@Gm_U8nr_3cEQ)= zjd45jvO#6+H#Cr8(1^J>00SK>c|Ae#Zx9oSLpksSKYIa!I8g7J1rxHkJkY!Md42KD z>=@KR@z^+0%54>`D5e;itwyInqseLuD6Ix`So`m_mjt%u@RUbDzUR^!N*egm!U@M{@HW>LBg}2H@jI8PC5=ig5$kefY(y#F55szzbMwSdtIe1e?DpzCj?ACl-W@x z{r~>^f>v_1+z4ZpQWWB9`vzoF4id!RI3P47&7uWBe67Ng=$w&Ol!7AaLd$L8Aa1a zKsM(=!|c>%fH_TMYT*Rs4xw26ofF%Cz&GKBwt$fPTllPPHO5-Ah0CAeuzTg{*G zEGvK>n-Fv#2d2Ck+WBAbk;`L%*EM~+1fT7QVCjKcp#|#_#0|~)7A?|@?p46t(mP7+ zi(?EKZjMo~5k%bOpZ1v2%{12()SR<7>xmisXWqe7%=tIx_|4Y=LJ^X>0!u6I!1y{+ zkw|@$wS}{ZoP{1%Z3+!#QUDh&O7)K7-d!U_;*2(dJSbnQ<4DQ*UTB9mT);L2a!8+w z!2uISvz{`6m=*}LLkaf#xn~f7DAcTXqQ=%r!+fp*-96)tf2v!ORuOaQ!Wv`rUfKwkks|>DqVE#5GXE)P zwZ(|V?7gf@G|Q{Es-n38ODI|Xgv9v5$)?7REHgm{Z>JFnh-D0*<{6R_SpB|Kp+W0hGi5L z%_OSvq02_rT0JHt)#P=3;V~p6ldwWfM+Za?7;uS#8u?moe3O3WOp#=#urKzMQkPh9 z`vd;4b?(o*i{s^?`Ql9obso``#n-o=!RPC$#VkA%WBa9Zy=llc#Kzx%-oeW^G_=k^ za8b;T4%G8ikVfe*bS8SYgiaKVy&(84%*U!{22F-c83Vof5U9-?2RjvH{PdNV+-R#t z2d2_thJ9i4Q*$#xy>$S22oknx%0|Jnq6_w>sdqv7P*MNJ{(lEQm2=je_<|BRZ?&B6 zu|do*?OE@0O+u}%@E|Y)wfXCysD#^Uv@4~xn`Hz`a3Jnuom(zUuN!HQ5dN2X>G=x? zKv*Y^>)^Ml+7RM_*G0pkVwP$}UJ8K5!uu(_V*gXZzhp?a%^gf8Y`r-L9VzdX=!45s zZ^A{~gpo&LSYF@6cQA}{%Wd!?#~NrU)a@_c6i(sAcdNGD`x=mA~pJm|INJI^2W@emCE>=^@`m^%QZe7V!-!n=VbffnqwT<*%$vl!`;L7IYp7u z(yUC8K_2sjAShfJlaTh$saU^)n! z>!8;KvT53vdR>aQ?4nTIWSQPWXh0AK-CjfxkX)eH9rhw*hj#1s+=l&BfL-yx4RxT! z{cyrHhK;r42e+D)owZ#L54}?7qb^7YhWDoY{jwW9=$x|**DRKCun{QIP|KJZKU`r5 z3F;+Ret!VS8w1TMLMg0s^|=1D_`teaK0_6#RW@r2My=vaE3y$?#OBowsPrhsW$&Ga5KPar`AV{phpg)>|8jY+>+`yY zA7RTn-9z2|q|l#Q^R4H7{}J8dI+RYuSIhTy=z4N#OASt22vT!`@-$^2foklVWh~NN z)S@G(9mhd5M<8pJ2f4HDmq1+$$dSZbFxqt>DIoW41`khm2h^*yaWVzm9EEcunsX&Q z_Yp5IQ_?Q#M8^RmH~GX2@L25-Nn6@pF;~rL&@8zWBnN357<}a3QP8CMI1Wh;IGU$V zEwMP=B`qjbVACb?p{E}pDID8anIBq*3Nutiz=y(O7bRlbxdpXm3559Qf`OFX!+gU)$94mQY`+~Lj#;ABsFDJRwyYt zNi|m;ct>w#R|=wp3tbG;xs9!ThpGZY@9eZ_2;@qN629I8yR40({c|53(Q_5+FpR=?sQ!Dv>D41qKLVi5yIsp z>w>C9U}$31Q+X)i;+q6fo5M?;&=k}myK%g+FegT8tDK6(&>QIy5OMXe;FGojvgFm^ z+@i8H>plNEyf!T}9C-pkAO)P|L=M;BkOzhY?n^dkMlwS(PtbiTV+j{TAbYFC|FX1 zy6R;+b)U_&Fy16B@vBKhDU8+^yKy~;w`i01jcmEZQetv=5it!HG> z$${!+d$~wgn<*V|fzE~~E;;C%MSbQ_n6DVmbUoM6-qhLZ9Ix5Z-g*nLKo}zod1lc* zzc-axc-aK)_AjMzAq0UvRF0z;eO*%4RaqAmmIA9|KY~6Ypg1`Idr!Fqt{Lg`^DNE~ zfc(bB7LulCckvJuaUi7yKEwAAu10xSo!rz1l#o9ugh`iT$=~-4=EzefpA_r|<{GFLUuyIdRd_AiLTn!D$-J|r$6GQA`NqbeP~*J zhP8e((68e4ui*xqw#oOgv^wp^zw%d z3ia=|;O&=I1~U&MWXcOYx=jZ!?pizgaL;;lTOAwUN+ z*JTRZ4+&|ECF0|EAR4vY+$*W|fOEMAFHCJrd|y;EwW9ZCc=r7x-YzW@C?#!&vRMa+ zv%dgtl7Ge9Y3OM=Xc?GkjQ}Ao8gm;HTRI_OML`8|IVEvf8CnNNC+Qe@ivfN(p?B{H z4u0I#X`g){;8M1kZw@q_Iy4EaUt7*ukq)POqXsk6jflbmm$n@H|Ras$?IeI?$54BnMn+pbb+ z0;(q_;-X7?`-uA^?XgdtYPw6>h4E-c7=98nbTEQWLVU-?SI`1jw`mVEN&8ZW&$sb@ z^?h&D$?$rd9_~+(z2DwBc-<*o8Ibo_0sN21-haNcwXqW*7qXK+t%aklO|jyd%?Adg zSF~|iVGuG3ws^8H%`gJu?aX`7%JB_c8);AV%bP`#Nxr6EGnLjZ`2E>Dr_#sM$5Re8 zLh{Z~A9_PiuzUPi%v3RJ<0lKFob?7id5-JUO>`7Y6*@GB_9}q-jy^1l)Pkd)RMMg@ zEE^Q(AF%T`WywY=$lH@i!Y?hQ!IFuql&$iiJFE3~@WK|E8uS2U-I z)rK_al_^;X!lM|3GnR`8Z#1SEM?IcP(FjKCQ&lUE8cVU-41y|=9{O5VL1@p40=t*0 zgC*E$lUEr|WqRaHxyh6I@a8^PSI#^`PTZ7DeL(Y2bC&x)&ShC2;$^E9d|G0W#n7be zZV*I2o*dMH({DIc!x{5 z?BJqV$fQ)rL$mcURVJ+YisQ$-<%MF{QvD^ACo2r!BlDUFwm5;PMY%tGCMN>&f z7|2D-;~@S+Cg6E1;<}w@kv^Pc8=IK&hhyJL3uH|KU#X0eB3ba>bjI;GnZv$FMVFuU z55#J?vp1$$5RVxKYvYIpebq#r*LNZ2{*HGteA6|tbqM)r&YjOH@)Ux@NPSnUV>(ZV z$+Z;0TC3f|yd5*w{XhU=`*4Q-*Pdv=ZkrEC#0>;!l>c7&`p;JBWNW8uW$a>XMeF3| zL^U!Y^8*Cv4-Qw+u}~t!5+f*p0mx+zga^3o%q{i*ljC7-N8_k(V!Zoj@!vX!)^bL& z7C`K`8~eYCtBMH=OTkWyNl(tgOVUtIO-wf^&@V7;JIGE-(nwH`($y=7NsLm{hSNco z%g@lyFtN@s&HR8Fo2Hw+rTzv_P9rfnDpjvQPC+TX2O}=kqCj58JU2N$Ex9N?QSoEv zSEW|srI3RFJr)V#|9U5BVI=_}0VRQ|q&1s)ex#7|S5(I(Lj4v293>*+f@aEKVrOia zB}>np%67;Gu1vk0oRz_(R!9MG*E^iAY;bD*9C7Zet=(C6rUw5ue>3J9mhg(SwW{Mv{HADALkHI0ZsNbg8) zp!sN-7Hih@o5u*(~ zds3%}pM7{)})v5DKUpDe#teHA3@XZEil`Ya<|Sfq=vL)(fiFvm=P&Yi!BH+8zS z{1q4jE9iO#i>xsQy5rD?=&Dt$CO7MHKOFO*T^XZBY4A8QWw+`&mjnMDvE(qq2I$dB zv%6WXY>^W~-TL$E0E7K~mVn1HR|~8LY-r%()b$&z+OZ~RaEM< zk!DO1jQSD}^*$9T;*M;^9-$Ll;CJlEq@SYpg*G?E5KPfZm^Ux3HeJZww<}(oCpfDy zCXpb5NcL*Xp;Qa0OJwNqhB6{O6vKak$nOk>_xND=sMVtBeslsash&bSD*H#D{H;?- zLeN*g0ampmpn!mI{%faF5EhhG5OQ7|t8^GI0+-eY2f@7!PXfV& zMV|owaI_{qMB(aiuA!V8Q{?CauMGMYzWb#@4#yV`7DAH0ZoOw5g>zM<8pL6Pof6M) zI6Pag?=e!-PM{AWg=Psa@u|@d8tnOX?E(}e^%&`1JiGL8axNV_YgaE*0lgI&Ls^$L z-zGDB_a1b!rCEqm0jksUp_U=Ra7b4TW|bA#{F)Scl^`jj0s7-yqKOA#`NF(lZA8CR~R|qFHV`p(h zU-}vSdNT<{R&)I6Ma4znjtH3;aiMq$eyutN-Ng3PSEDOVXcZ?$W~I`D6YV+s$sHj1_LcoKBC29Y z?9$zLT&nkR$QhrQ=L3jfTlkxn4x)dT)dz_2~NMK|zA)9fUzK zvz|-rCz*O@i08Xnqv9}1*h?oGNFXN`eOf)zD>g2G$n|KqR)p+JR8F;NLmFjF@g&Ow zd;yF3C9z;bYLw>04ZS78^INd}u%~rb6+6L2Tjo7+cQ6B+KCxunj;_;Msq`XR?)B#l zg}FjBknt4)8-}ap^>Rd(h>{O`%z=3{`VQ$x#XO4P$ifK^iMAEQJ-#-(Ni`AueLM-V zs5yd~_WtgRSrH7OLn$|Kho=G4T(n`e3KEb@4|gza*^}px_3E;UpQQc3Mz)l zJ>o0{V;C{xLKJ?;~fR=w6Ov-m0t-U2pzUILOe#f%3OpSSr za*bk&@F}^kvFQs(ybLtrttX3C-DrCkl@Cm|b<6+GiBBX%_io14UdJ(|z|EV80G?98 zy|Aj5l3bX*n9n{p`Lqpw!)rhvQQSRe&60#lk)&fa*+`~^pPA^gO(JZvE*^BPbw+u+ zu2?~Z`mK>^TamnEx+dUt^>#7&mBq+oU(v!RtBP(Av%*D8G zZL%khALaEs#B~>Dn4t0CuGO4ZzuOBuxyk zk)@U6*T+8r6#56iP~XbRK;O{vZ=|=EWADVsfPfhLfq($tGyVH2^0!0&UD{0F#s*-` z{ip6bM0c`QbU;AX+dx2o&k+8775VS6|1N9`kTrBNx3&2j`4tclHX*>ABZctmyZf8{ zF7IG$WNhPPu5ab|H-JYN`$A|y!8Kt40m1$I@xK+`oz=ep|L~9gQ*~!-h5X;j2MeJ0 zUsb1Y{FkJ$o1wAYZ<_zzljZz%!7u?+Wdp!|1r+|juOfd%*MG^IIOtm&|BcdZq1@+t z02BHK(1ZYG{O_yCKh^hNqGrbW4o(Kf`hQp7=IV@ROn|3;4g&t=ohyR>CGKcvZ1^`1 zw)?rwJ^^@~B%opaRcEN8e@Qw!ng4A;&;96bHv_a%YJmBV`EQMXE9m#%MFF0uos+SH zv;};5HF5@CH~Fn4!`1l z-L>`yPW}E@+~4hC`<3_Ww~T-A62XE0HTwKsuYdbxCeEw zi~jrp1jYR)@IO7rUt&SOB7Y68{DHjxugJfIT7Cuo>KFe3j3)SRI{w8={xk6J9OOTM zi~kk)ySw~n*57%{f3Q$L{Ws3101X%i(E;#3$^Uuit5O5(7G*^O>=w0`j90hOZaKaiH4AXjgt5YC zFF2)#6Cjg7wo0PN;A;Dw?=y zRO=|F0dvL@xAXZJTx+@Xh=+2rIILA{@AewIwbc(@0O=Ae z_`8X;0_OMubl@VK%3wT*zUfo|m?FUxoMXb`Y*s(o*K|D9jyvJp5_#gHhbRdV5*Id$X? zVh);p9jtPFNRy)0P)FOOC_JW(;Y(i>Vd}U_xhFn8=sJdy`ANp2w1V(9Kd$GjEY*xAbhfr0C}Mm{f-j%d}AgPq$==^>WtxJm(m# z8w?X8Xa!p4x2~pz;9zT&D2;P8T_y3W#>Lz(PEEwE5q0zz89-h-Se*(Il(8xH(HGsQ ztT8rxIM6FWS}CkMC{wpkQ{F5whl}4neX(f%V%|ger1eGZUTMLtJ^za5=W54vu669d zU79s6O>i)0zf}F#m|-0%S^8=Rx0|ah7~R%w9haS-C5osl$aiG9O-nIVG-O{sxm#6k zsGYg)Iq7cFV-0D0O7t0~Z(ouw`qfw@M<&hVTP5!?992_@Jyc{kdC#*Lf4|jO($&ne zrfD=d*H!A^*mrDClYe}ple~9{^N!nau{8x{OJlp+-0=Xpr>5#qxo6Tz zzjo&ex}#+0*NAtfE4bSOsXWbIj$WTEb_VeR$vynJDmY@AYtwAYJ$0Q?#yYF89OHR# zdkq?*p|kY)%**AV+U z2Gc4T_khp?_^5^KfUM@Q+VYLhyjj~e$F?P@+&sm%ja{PIP+eBjtloiqc=y(zn&Lfl z_gm<`I{WYxz%#9g<5}3NF}VK6ThN1IT?agw{G!6h#okBuBGQ&oCn1-OClhWHn|Rp zVUdEib}@;}F=O_gTEn5_;0~T{-Yoi>Fu+Fm)OGrDOK?Gj?ljqsiDv{2 zTyom;e>n?+3lO~!u}2ke4q3u9#d6+$MQVTi&Q|85SHbrR`^TK}+k~Y<<2(18{{jQJ zss1{r{ButF?+ab9x7T;qi1)iYe~C!{1~r$h6R`zMj*bAko#KB$|6<-m%L~X1&?CJ> z?0pc63vuB82@NI&hE|rxrX>7T9YwVc_ry70>5;2L9D&E7!PSJjVK;E0Dq_|P3re1L zu!9;Wpdt^2t(c`m`2w!W`uDZVl|LM z@|H~stE7&%;ORJX+m%HMSU6spJhjqgwLJ{jZe0505yFw24XT<%@K6$1(GHjbgc8As z!IO^XmbE2=CR&}G1|<2rq5_xZygDiUh=*;_HHbRR36rKiQg6GGm5;+fOmi@Ei3dT3kc#o{c4Orq=fOeimsFNnUq|NGELEq*8h9}+;6o8 z&#uu1FkAlN+WoIu`-=@pMLt$j7DYEYJx#Iy=f#QNpnqO5`Sd@U!vDv0liyU6tO*na z2DH)&z)k!=RQuhUOpY7>t$_;PzePOy6Bkp*brJ@E`?E$bfJib+lZI3A5t?ctcjJ{J z7SXP#x0_BqOl4qT8%gnw#Ez*$k2`&mU?$eTIP;WP=HQ9waf{y+*29hx;1e%1fq-E$ zV>H6#_`EZODFJa(P-u#0l;RxmTq|p7S`Qjp$7a@$_;y@54SGK%>E`^gO%%3+$q5>T zv8*v@fW+q||JyWcodU}W1FZ%+m%RCpZ|+3jyS%8_a*N&O*kisZqizHn*Tb{Kg^I*i zK^Fy?awfP4TDcDBG&0q#e2hc9Y#3&zl#Q&uoD}O6I+(>U=2FW){d~fAy@-mv{MaOg z|HffYH`o-8^ryw*--?jSrt97cP<)Djj!yVLitwLCba4En!xwrWk^AhUOt6SBzerl@ zq5=Z(_}p*O5YWtO1Wn2l%Fxlu`Sf8Zo2>nMpQA-N%7`{*20n zUZ<_X&Dn7J@yg33a8R6PecWX}1ok6WVrc zB0H0ekKM}JxZJom-u29lSq!{B$JR3=Z1wlLGypg7K?CaQk8t7N`44~!`^WXKaN!@` z$e+E5KSO@2@?R&6KOjl~*W^zw$^V)@eg*$JY5V~${~zGLOd-Ewe;w8S!0G~mX#bbK ze;MO`#r`_3{ef-#AK3r!aQ|*B`U58m{eNru`^faGg1>gnKZpr{x&Hrp@4tGxkU)?? zJb>=a`;RE+@5aMFz1=9uZ@b89z(BvmG?;n}IgY%`6is~rc7s?5hJ{EN}Ts;VkcU&>6Acwu+k;#uyhOmZ3%`D{AX z3%hjL3I|i2;_;J`%IZRQb>Uk^ZR&!|6G92q3SnO9%uec`#GF=m$=B{Gi}J~@hS|V* z>N+)ZCLZ9?BA51UHudfJ8$TwM8>>IgQVQ2fLm(|xD66vsmW}2uqDH{u70(WF>N0b= zBfq+NJbmIE{UR%e`kXQ~rwmA8ZJT0lkItg%&LZeHseLm)iWoXwJ0??A!L8s|SlK!e zSsCL(hyw;Bt6w%m0_U7Fzz3DXsg^WLt!X?&O;y5?M3+egw5U}K{*uV^#6ORf%`EpR zxMXV|U0Gv;Bo^;gjkZDAV>HiXx7BBaC&Lz`vN;^AZkT>9ZBEk(t+X)InBt*WcC zkNcv~Wg|Y%)`llT*k{)gBsdtU!-D6H2YA5xhpP91~`T50NY)vlWZevwjOM?T4r`GN_fKwL=jRF~G z9Kz@-%o+zt>hO#m&|`z64$=zd4(}Rg4AgoIh$4HLwT~$eNRJrdR@sg6ZWl&KM3;`Q zq(vyv+dMmWR_k|(YTlS)Sl4{HV&tSM7xG5%&e9o(3>xMR;%Qhk4U+@oSNBVFV#Rh8 z)+XFsU5O7~#u7S0)s1QX39)azu5=8Cr(+z6#@$Y7OGtrvH<@fIhu-Q2 zjM>w4J2nY-O+7Hu8|*U8d}YYit@b1w&;dfXwz7J}2~0OgkbqO73iwN9aQCF1 z@k=yDi0|b)sCEGGM7?mLgYsh77mtkZx&&KW1A-I^#q)6S%E`c-O;VZmF0e#e%I*TX zZPa;tl$oq1HrQG`Zi6*T!U$gI&q-eh!9g^Cyiefqcq}Nn3X%#;IK1nCK9w<4rB+}; z1|tsNSR#FjNDqxve}(c$0H)w5l7LiJRv9>CxMA$lDiQo)G=G&S$1uN&-WUi3Vtu5{ z(rfAqIYEahoIr<{8qiTL{Q`7aM=-=b@7)6C^Mx5w!3a3KKYxvS|NW zE}5<<`RUEqgh-cFw}y;WPg&v5}$*P4EJi%fnGC&KlR@4g6Ppk8n; z8b0xKerdqTeioqwo_oSI{!QapNXBv5d%dj!S6>o|!)3-`2nYv6MOuTbK|zLpB0Mqn zpC*!rWTRiB~@PXWg60gvVmihE*uKcGAJ$vlYg)Ws;{ zfO-kFbtdKxU6w)6w(gwOZ7P*j*aD38Yi%VlBsqq^Q(wViagC0Tj5s9q3)l!3ft>kM z^?Apih8mbLYX2aw?DHAO1sb4bF!>p2`$cQv1a1-l1+K7`gdk>5x|D69q=(kTMm1!aZ)iF9RY^4LbMfm{4{L^16 z4c)V=`v_%PTwSNImQI^9zv?{$FC$^zp>6~U(Yep{n6yjH=$v1tuL>yJ3$*o)wr3L7 zQ$_Xh#zS9VO!9VL*41vGgS#G^V*jx?EK>onKdwPY!Dx&nkDeL&aOFZ!pY7X+5=9|x z7K24W>Fyl}Rvo-0@0@6g6MUSgz#vug=uDDs+`OA8VSbN~mqzK;dDJh@VzWC8@v9Hw z5o6lXCODoo9%ypsE%M^P1Q6#NMA?I7d>lVRft3gz z4SKmjTL$|h&nv%Jfc3+n!)Hlvw<1lso_s4E?$8LDBEo>n7peii)LW9P zRGP_;J#*BK=^(LV1?tKHc`{15(^)?;KBGn~!j7gul!3K@^$Y^}Aa#xU?bZ=~C-bpX zqk%slazeaM!iwnVLES-HvHoxn{hif4afS)>6ohPS6$j$l53wJ3$@&iVu6@P#3XqRZ z+yCbWIf^83zu2L!vs2Jg#AUvR^J_s+XJ%lX;!ohkj_hnoF^Q8zL!! zobRoVW^g@WG;DjqS|8+bZof^wApT6t!*K5B`V_+FJs8nha*bY#R!JIoJP&qN2?CAW zD+{bO7{puW_jvV>=6RA%{^h5a(nAk)1EF|C&j$y56f75;qar>^F+mxsFx=Y$_|(Nxn=tF5Bhn5&g8>oE3(yHr>$X;k;pvG7m$ zpYrjZm11;aAiNa@=p-W_7izMFeX=p3dHSA2di{0`qk!^6un&43kVP@a*6g8aLY1n@996tKMGka06M-&a*bt=bb!~C%;xq zO}5owe?Nt07kCCX{&0x$g~gu^sX|T)#GLvf4kX2*2`GHC%<2llvsaa(S7rMq2i@G+ z)b@~#U6}myCv-+pd-gI@Y3WpIm^3_YWPe)9ZEK+nV6`v@33N1z0ynPPAHvgXz7HyQ z>$aWYP=Y|rsDnDd!Pv3WPMIED$MF8LfolSC(kjmJZ`U@JWan?fB-CY#S3sA=*k~X_ z&TJ^FTmIj?->fRq8;>ATYV)oYWaXc!&3YRu%!HP*68tXLeE8?s3Bp6BkXrQ-og=LKFG%G&~EA_B!voa zwn7s1LKly2z6xjo!ZM>eB$BZS&9Q-g7}KJOKP zs6}T2_C{#fQ~@%4aBsyOs%%kDsH5KafGQ4Oy~nH#ywZoK1Hz3IAbwX>KYmL%L<4@{ zpJ8LK3I(=^A*}clnr_TsI8?8U^`by$U6FA~f~hds`$u(sk&f=5GTqzb0om)r!Nb8h zub1ati|T=_?(6il{mVwr>x*{J7WN^jFmfx7$aoM|l9%E79KXdDp%ixEmSj>6!+4;(aoQ&gQspiWxFc6owpA1VcjM>4)x z@lKbP?L#n_h<}4L!zq}-S#6b)Pw^i;cy@r#p() z(Vv0-6p8wQMqOhaStG+-d&!a?ay_83$iLwbdp$%0yh81&`zv5Ofu+hzX&A05*P@3$ z7)dwqCr3=)9rH>;4su-&+ibd)2K0>O(FJ)x(CzU!kTHSiM-Qcl&Fi1ZP_uA@UWXX^IZvyIE2&$ zSB&F7DWEtj&A}e4@MMChWl(|zHRAX!gX&iK3(H*ZT1*dQJ*U<Dp2z(WfjETW-Bs3t~Lusy2u+ZTzo27x%Jpp5w~)$u+GimOqKX%oGvrqeJJO&_^^rsT2% zyNEAL%{k!x4$?-k*Sn0SqZ}%2c*>P;ItN5Q^d9uNA4SO44R!18nYZY%Knhs}dv0aA z;RlYtJTg8G4;-)%XOQM z)7C5pwCEtzQD;(TDMZXJW>4Wtf2?z4d|JU^ zS`0ZL;6J2-jr$}Qafo@0XY_EfMb9hg`qtKSy|wFjYwUWEc}@0uzQfz;gF`0Ueav^} zYpNPN_6~a9eOmpq*L&yNUP&lHA6%W{=zG>H{Cj}byf4gY@4Jq_)_jW@#n!O4sW8om z-)`efUe>g@GE5Lw6}yO;kiIk)c3y#AJbK8FF>Vqu$~ymL&^p<;k)!??;=J}8p=mx^z}*}l(ezy71UJqE3F+?(3R@v>=l0}yxpxHfcE5Yk zGS^ds=;B_(?skIgJyr9wqq+(Dcn9|71fkRb7QS+p3(EfsK~BD{Xd^-64HOfzi|4wm zH8;DfNgt{9#|#9a5$v$M(WEG+ZGq1!Mr=y4vK~dXM3kQlD6^SiktF#0ixT%ezQ>0( z_U@AU=;3eY4$pehulCU5etrP{1?LZW@ zs)qM7Av8?ipqQAqxTr$OZ6eMAV{%jfK&uH0=O(Vd9`EMCVH^f1-e?|>om+-=+#Ivq#K?FP>Q*Cbd=5} zA|aA<(gU}HI^<^_GW|kn^gMiWngOszQGGh@IAY=-YtB88rV>`%YFTt*9%1flOw{5~ zSkz->uy*$vHAj@kz#ESjr!KD&?WosSpNCfilX4cJHR%jzx1|nOa41g{Suomtwro|= zgB+>UEc@@@bcEYyV5hoRA6Ydnz6*btl5Qyo>_e=VJa2CmhlYN=KwQbD`_$eZ`YYc?{nJ}8w=%#7@LM4pHEMjXFrl36d$e*kdeE+upHhRL?UuxzW)bL(WFd>i3Mz}7)f8>j zz*6o_){pvujtk(DOp<5PkKWVE8>DQ71xS@SQC$Gbl#yj>`9yMXnz*Kd z_YHjX1YOx;Iu1lkMGb4;PZhP7c^0?jpb$kp@a4uYmsfc&yeB$92<|(6-oKTm<~>qp z{d{lMe#cL6wu<}7)hpk`sjt2+oqEgu(PsfGYv>JODG;N@wFgVwlhjSV$*&+|A6NCB z#>=32YJ}Nj^D5|v5VPp>FlWVCry;5~(s#^oqc<)iE?DDUJp>-F^m)Ku;SWP2$Zi)P zTqR#|8!+27c2EQ}oizbRET2oZp&<=@poZ-iZ#H6v(2E4!8QgckjCq}mxMi%EBaJkF zdDRyh;8QHPb+L)kvSKgm9wNfpomk;6u^9cLH6)yC69&T@Iqgmp*_Wjv6XJr0k^@yH z1?>N!V%p-e@m~A9ym@B7nc8Mh>S20C+YdanwDw-cOVy4CxN1Zhy(kxE7LOz+i2ePn zEf{cSDW-Y-j-t*{rgAXJutsWWT*~sTv2r9#?9`Su$M(wjM(V|T%@ge=(0QAmcuMn> z$1vpk{chjr(ZfdHQLLz~$H8cZ6zzo2%tn+laM)bz?!f&P{_T|b#^pqBO5*#7vRm&D z$HLl1KD?8jqc+FUqWEU3^MT7*-M3Y2Irlh2A9i+O#~-ivzNgu?+uYa$cFL+fBE`to zMLN%Fm6FS@kZxjmZFad-bDR6Gc+v7)i(JSABh4C8c1xgr{U6Fp!AQT?J7e~JSilRM zj9TRxGQWh@k@-+$$l!98~<0WDYjy9)ug30#B9a`AwK|^8guLP!eX%shs>sM067> z&j+&K02ww^Zaw~q2Iq}hD)}tG!z~K?VDrwp=+N;56iZjs*N4Z42dRa1H zuSqi%FQ%qG$^G=3USztWv3qcYbbffwA~tyFitGsDKOqMBH|3r zC{))^oVxj=oiAQjK?ef~5Q8bb5eWwB1mB&+_(2&pF3&>p0rpl!GUDX2-AHsnnr2wn z5Yj0PX<|2|48r16yd03mKA{^|`jef1dCPb4$M~xcmwGA62u#Vea5m+6l&e}&E8*Ui z4UZmugyyqKB#(2JiBKDP5X^J*uOg!?g;|;+mJAviOb7!xqDQ8TeTx}V+=oie#7Ldb z_WH}EyVJQj&y@o^eC2iDAR*Mus zvQ^fiVWvK<+N^?olgn9`pspVM9J^s|7a(Z8nm1DlOD;H?!i7p7sD^TjizdDdmxX5c zx^ldht%03_LEd}>pHPfjB*|MZCyqhs$=3a;OF7`o)yN(9`Wg6fVMe`NC;#>d>fGW9 zkcu)V^Ft~KN~bWd>oY!rW%z?YB5^(3hu!Yx^aJVG?!`T?@vaVtg6i|b#6#R0nlG0n z(0)}Ucklv*U3spRW&N3qaM2ZNlhao)tji!g&;`R73&ZrdhRrh4gI^gU$6i7YKIa{T z!!!hDIHJ_Uk>WD?ZCK0#8_2Gz@wnF5mnf&y!v@f!?t1iQ_ltup_|qMuiJ+CwBGi~Q zmg^eem!J5@Ktn3M8(7|suCp*#o=bAF=&w_lXUTkJ$qdWup#aAT4>1eo%_2B~X5fQi z1VTxst94qPX+B{}Isn40^Mq1wTOy;bUpIybNm?5k3*@`vGz%%UhfHDcw9ke- z>W$RBJ$oCv;X>B;6C;US=N7c96XRv6%fRNVz^5X)EB~Fl2Y8YF@ z&(di8%>c0T_Pkw6A5hi6acZ0urdv{Mo`ro9uULtm z7}ES`wB8xhdAwVu_kqhex`|5a=l@&!W{xa{ZFi1)|4_fi zyjlphL8oql69!IqwEcr}bc34uV%$C0+xiIk%FO2k%Cxf0u&{plqjaMRF#eD0aaJ;P zGOy-*l_F4|+TA9$R7Q{I%AlX*98@cCXZ;R~CuuhLZn3nRR1fE9n3^0QStMK1bWc5* zhTpr38#xRpZd8E*;g+2Fl8O^S-6l}>v=K=Xq1`7S%Ynkq2=~ZO1ab_Bwq17J-3788 zxR=iD@rBDc%mo&RCg=GVoe! zp>Jj$AwSDhB#a{ym0{3t(pr%`+vPH0*it~GM2wj_ltz-Km&Q!F3Z&mP@#PY2hEA_o zYu+^;-L1@{4++j*79QF5&97{ays-Bk*3Va0nMED3%EQDWE0HkHHz@L_kG}kEp&@V# zxZ_r_Fbq?ks(>vd9Qw~T3`{G0VV&1ywh+`M0{a0EDyeT}zRrANu_lcy-5*oCh(yQy z>k)f5^C@*bnL#SN2&n6kaUx6UJjK+PFlyp+$G)D;>A6G+!=&viwMO3cgTW<$$wcLI zJbGc@^JvKl%aD|`P~3@qRPi*4FEVJ8U>a37th648VVd(q%wM)EsL@hOFQ&H66`8MTVs}U`}w!qXe6;dp7V03b#)Gf*&x~K_~ zTg4cz-eB*tx%4sRtJ4%#cvVi?wo$JPo^%S~1cS-xTpdlCdl<)qbTJZt8fkw)@? zL-}aW7sqe=IdAgnrJinm$ttzjmIjUFM4v0>9n#&a$gRwqE;Mjv`6Yy+E}d`GObu|p zp?Ef(Ok#Zo2@deb9T)q0SJ%o03_3eE$z$T2hR^9dWE4rIVX;gi_J-KsYDj5eh!bq6 z$lhX~77ziRE7*Ck-uL`8%@e)hzbnd`bqSVF?*6esS;TA=20n(O$fM_zA)9Q)6q>Qx zU0pxU7G(s$g^Lw1T`1Usu=WKxgwN)3_F?62i4oegP~#E$u9!`ojkeQchmaX=bPK{|8Y(uD=khTo;YZ zf%04u?)6=>W!w=n&Q@aU}mK3Sx z&?A^MfU<1Hc%lov0=`4~gI5nYnRiL3Vd&A&2}KC_9GIoFb!14~aiFt1XYH`EL?Ewm zFEa5+S}pF7x(mYbWhS9$Cylhi>(Qc{P`n=M@ukNH?efdc-X<(6FH2u(7ZX?*Ix2u@ zwVUki+H&M2-@}67wKAG}L4g`$+rsMh$WCf??hrcil;PUSn$-9z#Jz*%s=2e*+4elZ z$72`-*%Y!ZH$$?pMsEkg3ay`fh;CZ3W@@Is%I8gNS`7F<;P6pKI~I#A$2QCE5BboJ zm0?$m7FBCZQ9u?u90O5>A@@}{_6Md<729C@w#mZ;KPsZD0u@%F<7bYFt;Idy6d2!d z)BaR-!egeu0{A6Z%(&HPV_-8yLxe(PlODxZ!SD!_??|0ol(Rcw=&h3Yj%{0FwfthN zI`Eb)XfQ_AiR*DQLj_RBR!(3u!GS>D59oaemlCN+f6xMfpLD78D|ZSzmnwkMJ2q15 z3MO-hcD(4}C6uB88w;{N3{MPfLVHhXy*;7Ezk0mSdqd5+dTetEPheSoX~8<{DTYm_ z>Goz1op*s8ZP(Af9ah;ec|w{zpig3rr-+EnE`6FM#0Z%Sr!#rxUsyS9^)S@X<^~M& z&S134m74QXdCVFM7)zpBJe-N0_{_-W=fs#q3Uis8dn#w0T+Oy^bZcufGGjS`iu7!S z9m!p<++KN8WK|C@xzmC*$7#csITW*%8^SF(v4Sh+6t2brq!`Zz4ySZ}JYa7Pv}!}V zh`cx{+OmhPndx1JY{u(I|5_`h4*Mc#(NRC>-7c4;!qt5fDl!IV!w3{uuvZruM#8qc zB6b%fbVG<%&WN)@4l4D56vLXkF&Q zMqjUbePt+>&~HBV`+G|1TcvVe+YdeLhM0wi)4P?5P^wH2D2mC2rOz!ZGsH-)a{F7J zCP%4?An*|lmjLI53Sr-q$l#i;AR#HVDP>XI$n{?SE=Sa`a4`gOC8gQmW zEvl(z8T3e;V={Q5{Ry=P#>7%ra?#KN!1hwcq4a&957sT3xrR&j10EO5$4Y&&_)d!>R+QT}_+kOq9%}U|it08%JquO>V#bTxU*F&qtbi(%=enQdx%VcVcFftW6`v}&Og$C9NpAZ#EG zU02y=Td+oG*bbwnK*D?oR9lKlx+tJ5nF8EMn@mfDUBz@P?YgCF3b3yM>&*LB-81^; zIVxGNE!a}@+(CGst;x--zg}Ty;|&0m0iQ<*9fgslGq#weohrat_Sg7=11-CEe3Avz z*WE|{ow8?wB;{IL__MKH++8?-$jDQXRqH~T-iB3SsPL?#A!=;k*uDn7se^FUsNFLM ze~+fM0YB8k5A|CTCywrjLf#%GnwKZ_kt-lKXHOgl_9CIL29cqdslyl~|$+fp|j)qV%Ld_>hJIK*|ctY(CVfe>YBbJ2T*^xYHdnd1t4?moa-|xRWz@t&G zPvJpUtQmRgI6q>p0on#5XM_^$qdkITVLyq_EIy&00{l zwW%uKNzB+KKyGw{V!ta>=(y`GQ(lqVh24q#-7Z1NNn;^#WPZWlbwC5AvSc&MZ(3f> zOa@z2&g^$0a;TVSxu zV{JTiFl{Jxdfk*u^nj%3xR+UxiG`R@HV;mnUlu9F6AQY@SF)pS1E9);fHCot;xn_t{S!-jEXj^VP0? zDPf@6%yU!_?j9HwSMIP7l7g+g$y3 z={cF_DVx%AmW{sJ-SztRMqxP$W0xp^u$FnxYB! z>A|}XZ}(3R;OsuC+;~p{w)1H32hNd1HdT5vra0s09Z_{`UTJbIt55K9I2fE~L_JVx zH+7C;l^#=)bULuaZ|Nha#O#PYC^O~<9Xu?^<^DMD^kEkA5XvE`9sgTtZa?L zpC?$+o=RWkp#mS&@la({2W|`{ys95cBLT1NXgrK(#~rgq0edi^UQhV-XFt zt-}mW42K7NKzW9*f;+O^vK{5oOc!f_wKI79r_4v66L;5LWv@3LiC z-Pt*ObStP5^TFvnNiChG4m4~04_pW|rmag$83H&>waigsa{E=5UHi8LlXz{8I|G(SCOcV< zoUh0@Y=oKDmUx;o&Qac%)aH(x%t=$OXi#lgrj10s zUaNk$q^H^riF*ILgfZ1qPh{$SEOHjT$R~F*ElJR zL`F11JtdKx?IT*(%c_hK<&mtqij0=+v?tO7^746Od7!QqyKFfSdZ88Xr(tLeLqRP9Zecw(Oz*M5L(45J zXo4)Gx6P>x8 zGeA$vB}~K2QV86nq)($ud^^ygKr``VO)OKbg&L1*n6`R6#`GRN>1NNwI(V1f=F9am zs`G!+o>&rNh%VOixvY=Gp~TbTgt9N7bjYo|J9zi~;oAeuV*=p!cAvl8-R%r*B5j8h zhCh)~z`+D3$g3@4NVHzYpjmevds4}M7}k7Y8M4^`jjyM*@@BDZgt75TgJ2DTbb_)0 zqvN0acCt$Pcw*N)^RUERhfwkVa6?F_r5r@|4a$IeI>w%kj1w4{3$9in(_RVkW83wT zaAv|ms^|v}8RUc*oP9|AKu@jG;wgk%wBQRN+((Y@a-xv%-f{5-NcYH$-CwuR8uXuX z?MB_vIv22CG+Mc+xPO@5y-oK(Rgtc-8k-+&+UuF~{`RA41r5Rbz^-V%Y?lmFW-`%Y z+C(nIv)dG7v_`m9*mVzDWS{St@`k%6h8GoPx{RiaoQ<52Dr%dztxWqQZ$;Vc63xDV zCkI(Md;Zz`uq8*L9k6Y^+c9$HK3!vJW0+` zs3^?_C&g_ow&%#RFc&{$I}FH%FnpG$lg8WB>(PKs63I!-$o>*sXhb60Cx zme;_BHmsJE2+@nz{0cATYEnYc=2k2CJ)A6RTD&AW$uA3vTgnyWzQu{`$#Hhz>MhRTC6iUzPU7qaL7*60i%NXkX$Zmh1x7pU;ME6UM9LMGnGv; zUUHTz2b#2k2Y4!^ZK(SL-PS#k8{Dp%j@=kU9=onK<5`*=} zV&@`(F}Wh%19Em-S#g~~s}=dc7zm#2QA%(Gj_u-;T~Z8Th)XdLd8{YE4 z`W-*i8EG{OyJ_s(M<$Pp8sT$)G zphRuxfgPqKC-ujeW^DYAdJ!Nwz-f>FIzBl)K79WJdk49p&<&nZWEBMIqANh5XsE4Z zcqYQ^XQB*hfHpAzdLJVHI0@{A_R*KsM8;* z&tcQg&0>iJ}1tL5SBC@Jc4^v$xgD$fwkgv3ZMGNsOqb5$-_d8yXll298f!X>Zi5v$HP zKCG+nU!qVzvHA2iwG@IA#mG5pjd4n24Wr9HZm&|1Zd=;+DPFL8{G565>!bIl2k%eE zr+@vRJazFl9ge&zmf0VB6o%cx0)aN-;3W2hd6#{%%J^nXJ4J3S@l1fTBJ!1eUm;aY z-f~ial9>tC(5C3=3DTa13G0^Z`fj2C2~W#>7^O)Pa<^rj)- z=5z*fdl5?^(`GP-1l9`WT#;lX@YZ>(db`6GWB9)B4|;mFF0QlLJ>%wkLEp0cz`hv- z6vYFHz>AtHEo#(E6L#93)OZDhTl)fO2VNQVey)BldT=12AAi)}dj3q}Ms%l9=YOP$ z^iq~c#s(^Kw)1>=9{n2>4A?YHI{;WMJcZLs>z#_Vqk`?hEQQM8+)D<@=#`q>t~&UR zvv{M!1=Zr<-M9x}m6i{%nm1UA?i)=BC%zcrijO?rPVRjjbTBaC0s{tD!TwTaPibxx z?S`-uuP8A3S{+y&RreKC?V4Y#A9j-y$Pe8`_`$gx=q|yZv!T>F=f`JizXrp+m|fVt zHnc_n0FX74{O8}~GX^ZMkv8_b^GzXK)VuCQl(37=GA4DFUB|mE zrc4D57W!N~Aav1YqOgv5JF-v`(hhTC6ol=YPf@QZz5Q{^{KaB$doL(tiV3(+*V~+> z5ktFpdgCdyXw+o3IN%62Sn9r|Zsi2tdjUIGg<(+5_xdfs-y-?7J7SOhX|$&+P=;SA zL+e2#2WvV&5tp%OKh$NkLQY}E=cyM0{j4#AMIQLD@2G07w@Q7uu2RtwBxD#s18*)R%(TxEYstK2oV$Ipq$mnk_aYxZoI z;kKB_uAD?=Aw5}`Idj7E5Lw@}lTC@PCAHnDT%5U^G)^16w#wZK=-Qf{>x|u1mBfE6&bNf2hd#KWpE)4!W0nm zdz6Jv8rUwE*#ux%T8)lC6gWE_N`=R0yRR-Qa8%am@OJ0s=4OX9BI|0Q)FHTbn9)FP zOOS|L(B$4+D^xg~gm|nFWn-t=7}J>#qZi2@B~nc*%+1~kx#`e;avmT{Gl^+yv^KuE za6qLkB768O3kaoLhTE|!?p1B8DGsZ;ti6PVtZ2XKJR1W_qtT43Umx~*zo5$$hSNek zgMyBc7+u|6=DvE4EPw;I;=aB>{eFA!{)f{a1CA^L%iirn-CZ?GM?P`#oQaz-B}th} zu2vSblo^zQHJ}i^=(Z0b`cvm>&@9``u*$E?6x^PQr;@&%n z5j%iCBuJHBIu{iO{&JISKOd49{Ah0<$R2Db=DjEyDa1imj+$nCG)J^B$=Nb4Qi zX0IwnUx0_q*BBL4$2dELnVc@x#8c9Pz!7fJ3aI+d zkI+p=v+5_w5ntrRU3YvAm>{IabeWBl^|>}3s{UpxFe-A-O)wOjsQ8F%Vx$--1E{m) z1U03{G(QuGBI%45q49+|@}HFBKhg3HXiWza%gMfU<{UV%VUbGrT`b4QgTw;mH5ptl zZqhrDg2`Y@d5h-S`0P_oKHg$x>#DTKaorWzn3dRMS-(P}!4WttsqHW0?~jgu+CP4C z@Miqs_~`VAT?Ta_l7i9fj)#p4hHxx$c*Sx>H`pIB6pss)%J6fa+aowXLKPiF_CQKN zB*`lZaf!IPBYHe->N*!!+-G~quCk1CSJdwHN7JjL3C^FGC*ELe zJPBleafeBz^2;kPDA5AOzd+L}ikKl0nBAP8eU&-R50(t@U0%XT)OhdmKy*Y)Z5}}v z>O`pM$jcn$fT&<}I-k)s>blW=qvW2V#ks{%eZq|Cp+xc0~iuYwQnD9Li zeIM<4>vV!oC618FQbc#sf{n6DWpE4mmIa^kX@*hi>eP*sr~)`*TN0siy}aODN^aBW zX@R9Mb|WQcD6-2G4OP1(HZ;LAp>(M>i2jvICT+rAS~o%M)w+M7oYi4D*?xaMkcaKC zP-+>dA&Yv*nsjb4SLxWb%N#wKC`nVvi_m13%%d`4NsQrSf+(!rW9tp8uoQPYLVdwa zj^SGPdK$K~QpECZre>kWy0|XNo1#UEcJ}OD1)^ucEubax!1Zsr$w7*RH79u_s0_-B zCSV)ppC^$z?Cjk;t>i%5F{$>2zYL5%+i>bdMlCXW-(3(l;{)q0Uu7SvhUnm7SDrmlo`r$~FEZvbiUr$bo%L9b0j zU0`aWNgBFcE>J4*lCp*-KmB`p8#KN5HHy4YXfL%7RkoBgO{9 zuET;4dnT?i%Y38Q9v!<0Yhw`Xs{w_S#Q?Q^6Sm$nRMB}~7=lUdDl1-Nz}0*j#WE2enz}n`qlti#bUprN9QI@EmUaySv4myv#J32iWe+1FnDCAwvr%XTLjY|#j3;x%#z14ewgEif|9JZ2(edGb@1GtXy=S9)`}jhDhWgSCe;MSW5r%e< zH7@rwL{&7nxMK8i<3_ivZraF-GF_96JAK4VEN4t*ari-~3+zr59zT_fPi%*1dxwd$ zFI^er)>WKZPT_Nh?58^~CC~>@z<*{{N%4zHwvDsml0uvfO6tSqUCQUG zFyNckU?eavUbsL}eBf!ZVCQk#VJXV;NIovPm&+8xE|u$AA0k~UYv zQeC~OXZcDQkFW+#a#BJWWyUqI-OPD0H{sF#n>WX8;(Nvw&sBDuMx@oV^Lx-Hoy}V8 zPMw#mRkqJKIOz|WXje0G@1(1c%p7>qLh2Ty!H4Lupwr&aP+iNkX}JpCeCos+=ml-E z+Y{F7z_s-ig|1P&MwVehK!ayIgnK#w~4`o8TP>syVd> zGCG$8;TYXLSDa;wKt+X--qMgl2GB`1^&*<_S?|5^$*0r~Nd%t>m zPgHgy@e5~+`*U`u9aOV`w>NV)<u#zkIm$Eo$M>C1;}sCfXO`WG7n|3r z+7siao^r|PDI4vcHoNc16>X1fPQ5D?)tY+?*4>`+7E<8b;GBy>BF+BnIslFHXHR(+ zTJvGuuc=z0D9^IQAYHeXxc8LMjXAi5lo;MbBYjKv@a=Yuv0&goN&zajmt!JL<8i|2 z#m8eg(yEZyN*C`mBq`lA_Io)~NEN}UnY@cX4uWlRERZk*Fmsk1Rm1>So^F{?f_&EH znq-HC*sgoqbV=jgVu*)XmC!)cgxNuf;3WmOqt|c*CAtp}4Pvl0rrJ%Rowlz=Bl}JN zjU?~Svm_dR|%oHw9jtiqfr z@|ggE#2}N2n8U=qF^C{LxDzC@3A-BWyBsIDNg(P4ce|oW;xaJGx^Y!e&7{(pdaF70=&Q;TxW&)b5Oq3uFdRC5sFMY9R<>Iq^5RMd@9*2K2UgK1|u3?&gm`whVG=`IauJCz9x^{@m-g zdL#p;)JR6~aWWzy7VYq6A`=}ixY5Q8LBQTjsw4$aPqG5@vB2Nc5-%ZHHKLSje7{eT za)@xs<;9HeCKU4OT|zN(b%uEuwDZDNk0N>M3_&JlbwZS*3uyV8I!}qobgoc^2qseZ z<0$rn4DRhF&yyE~WbpMx@)gsWi&Q1B$DaO6PsQ`ymv|&-Vn1S9-@5gFVG8ZznTbq~ zr1XKZm9d_^1+jaL#x5cA5I5Sim zy9oHyKoDJ+nM{pNkB6EKHD5kU8=L43j{7~ov?lo%_Z975&)}PHL=^(b7hH6UQ3!(B zyh!aLSL5h-2x?M>+bnc5t^29AhqxWOT0-rqsLkerZR@dMRwD^e5)^gNBgUHB;eD;y zg_EFTj#h1-# zv7D`66E-=Syxe_>s%*uQhXDcyoj-QN+cZLJsz zq5MW&lG6`&9W3(1uLsz2-^VwKLhsVVK{TeL|HBp1t+r#$w$%gp!w!O~9O-e<7k5*{Wj=ixKf$=ic@i8vK#2mw>87sel(fyL_CSjI zcEtUGzu$cG%`n)6Sx$tDx$KdVCf+T(8)KNkh6_+Paf+(gu%x)RJp;*!?xyi1#i=Yj zk0c8P+WWQxk@b=&gpMsx0~@ti?J{t%dY=!4RJDmZ4`Y2E0K-FF*z+kN9 zx>4GLbLSf5Hwjd?s`j@HI9!Ox=P;U)CsMYedVzr++r(au(avnOhc$pJehBxXC z&sp8kgZO37S`g2J8x1Dxiq2S9)`^%-8hB+bGho3zcc%L(2B_EjsP7(oYa1fvMuv@) z6BDn`+k+1t*>pfi_w=PgOSaF?l6i?&<0NZ#_;}aDAd^RQW;;=_Vp>NxOxr-uJaw0M z!{9D*->D&Xkll5(sz`1i@YFyMvfCB8611xx@Ec2eBy~+@7L=OMeK=V+Q?yZ{Ac0M~ zT*Yifgzw{9TM;IA9tH$jyy0DNZvQA77w_Q3iy+@1?O9EjM}B zQG=vV7Hz$RO$}AxsGzR!b59i>$&kF4C2T2OZHs#iyZ3rQYTeEnZ93j)ke!dDaF&A+ znMWLd|2lfUxBHEgPC&S!J9GLn;^NM@Ir9MCm4Gmd$-vwl41*K5OmD~OCCtQ90{Y_> z5g{z#;jFfe&|Mok3x?1HoEf#lRit#7k&o{W{}Sn){vd#}atWe7uMU6b3CK zcCA@twW9f=a`2vxTJ4-1Xl`IU#6FN)Z1g<& zno{6pH(BNHIM~>QoY^O`@)O{|81IvDX(B$5x)HH#mEohQysH2pAd&c1k~NTA-c{ud znoQIfp#l>`rU18uFC6k!y?21!FNqo5}}DPLxp*lr2)W2j+Wx=$?@kbBNN3XI;T2r{{+tpkxkgb zpk7{IutFX^BzUMkLHQ}I3f$VEVB07ZWd-#W-o%!HDcTd(4SFp2(Vi`4*Vosks4Ct8 z9@}scdtQ(2T(%XTGI=^0re#BcpLT2rkvGCOPL`RQ(3o(Vwf3YT-wDivljqsqofzI*7Js(e_2O{nu#w$Km$7;r2=N!@JY1)^#L) z0w{tumX7UIgvL`I=AaNOHZtuH`%j)+-%vmZS7Lp`hKeSH{-2aHe;G-FVOHKuSUTX~ zHS9a+i>VDKV6MC4=es9;?$DXWSsc#JUhB2O9yirC-$5FYod${5=z5^{8$+_H!Rk@q zzSmQRxF{lr=N=nV{!G^pv2D>cP&-FLIR?+FWH+}cfmM$6jROL)m6BrIH$;PApfXlcQ+eXwBgq4MbhJ+jk6BMQ!~*%P}(; zux1Ox*?-2IawtAhN{K441(F+B-Mp?jrxvBsLVK*sMR}1LInuuAXpD7QEH^k}+Nsi2 zOeMDPY|Wu3EUcw+&y3~I-E@(uplhlPxyh-rIVmdH_UVZn2%h-B$o;**%afF2JMrKs zwmkZQS>A&eC?1aNBzTE3reWoaP8H_w4}Ss02+*;B_<|+mn*UqYPo~YSsuZ&8%YA=mg3?tBQ-j2u*QtpN*f)kF9S&jr_;T5+cp0>Yp^v&sj|Dk7QTJG7BL%}s2fym zljVW5u3J{Cg$c9W%KsTo7d&b!!ns*>h#;s{gil41j=?QEQd zWIh$h1m3c={K{Bb`YY-zBrPw0)ydA~ccYTqj$E4p{Rt@@*-&3W!dNouyIVv9N4BrN z2k?eQd=Ju?e*9j!SU)V*mlzf4w*vUveiVjqFBwN#`l9GV#A2)+>(JPEOrJ$Lbo^FgJPmQ`AP{xj4Lb`4p2CGkSdR zq*uu*mQ4pN&(>zUq5LvW^ToPqTdC8`RfciUd_kM-^W)=_tkHQR=r)Cf0aB!J)2zp- z*C?XR*NgUW6=Cyjy<52%0#!|VhL-aHP4=QaYYuUwbB9wvj2k=VR^D4vA_kO!f}b}Y z<+S_h(IfAXV4~id7@B(lho;c>WFtik`%5o5@Q{S^9bzc*;RFqTCX}eJN*jy`T+$r{ z?If{(Fyiy1k;W!;GoD|XTOWNPWZwf}^kP(Juzr}eFP18dqB(H>x{FNQLZnG!@*uQY z8F;E5jI-hrZMw`{oBV1zE{ckbCO z9K*tcD3*D`BYL0l5Vdvql7fLe58fx@;!&Bi-E*Wa^mXsNAFGafipN&7aIE*0jUMDM ztd^OkM>>J24#^BR71Uz~AUklFpyd9CLpVYly*V02-*aTgi>yKHAyrW#NIpKq7}(8m z#?g}==v|jDSIe}%?z-cIvleD@hF(pt(@SyAucV0@Yg1GaOqm#cIQS5~*nQp)7}f|P z;UD*fG>>Ml{LOv6EN5#9ZI8L``G;eiqsNdG+0B>>u&qu%1PI;sVE>HA30p75|LTn? zc>Z|Y8%F9YIf7E)CwzK#{;+VPPzP34Rl%QVijD^5J+@{0#p)7{CTmh^MH>{MJZARP z99CM5h!+e4=kb8Cns3d9*X@Zmgi&P`$JWJgA!RjGnWU1t^aPG1dw%90UE$wGW-VJ_ zZP!FS1e}2I5Zr#Nr=*HA3vC=8&9gIA*7OnH+%up(I|@d+umig({M%MwbV=APgxs)S zRHeS%W(zM(*SzPd`niRYjd2a&VguEIfdKa#OAJCu=l#j&a*uv5f&F#4T!L8gvB_a> zkwgAUfWPfW^ZIwFULuoQ{O4VMo2!#J2OmKtD)LaeKdU9u_(I2V2eE;5=}3z&va9qH zNr0SRo7_4Lt1s}*ZNcF5^?W1C!2xO593#6yB?GIQ$?3GXlM8iJ`D=KrC88XDXng~q z*)jrTgij!LrV`9md625W!OHNCN6_{c^a;O6+5UM#ERwZP&)KJzOAozM)s0!6)zHQu z93&yyz1ke(!!O>les*G#*g?n1ZrW4~ha}PF&RE)yVsd}@6J6^bqh>o!h`5X~y|-TI z>RnMu$YfkXlBlZ!H;y>g7E?R7e*6hL$VPq61Zm5>z5|3;)q}x4UI2$N0)M%%S|*w# z7OJd*-YtVgvtmIm1$7YwYkL1_VabSqDU{okvJ2PFbJ@*uap1lqpc2O0eWN-IFV$C` zZdaP?oa?iD=lcBKxjuX7T(>|~8?i?hXf1d3nRsJWY2!}yuob^&d{q#i>?QhDI8|-L zs|TX)*%vkAdMkA2M+fOIyB+Q94M;_BkLv=N$ACm`!ccH%1L7`D-<5HhvV20L6vr7n^KQ0kULQp=pyI=Xa3 z#L_+*WG<`6Z!faYYF>L-EX3OO5t25Qb@ZdwEPo8&?^+pB+|##XG20DvNQG>pG(91& z9d|L%KA#G?TO6>^mLWo0IE~^}Sz|=sJBdOYnwzveF)bpGBn6w13>{Pu6DMJeQvvhS zDdq7Y!?Sz|2wsvIBgw%#Bm?e$ID`}Zo4=>UWyw?#z?O7@b17LJ;4k%XBqP+)x5*Kt z<#1omrfyetfr+_%wYDnTx2gMM@-U$UBzo|+A+bU!OCskOER>f-1ZE{n$2V8`^vXZM zu8XBaa?pWS3kqGW(k=BBU12d4-8C0=sUxduK>ALWd!XaJL}*qkWXzaRNCc5}Q=<7E zTT;%l9b01uguRpiBTxo07&RwUe}|kQ@@0JEq1R z6>5VQh7eK5wX%t_+Z#89&0`|Z4aPaP>|xhMPB)1vofS?5rCQUevuOuTIJMG5L84gh zS6M*{*$2!EcaJA=tlE@hiAHXp=eO!E&&vDL*0I>$Jo1J5^f;Pcz-&~DbYm70zT&^@Dp_!mre z7ZhxVgD(jYgl!Sp4z5TLMuF(0TxM3hYF3mBDeOl#DdyjE04YQ<@q)a792`L-loKtZ zB&rmaqO~dRnPCTf(!$wx3RTyDl#iDkx!eh)#jq2?c>(~<_a#mkJrui1e0)#P3{2I- z-RtzYeaPZlJ}4Bh!X*s@C0GjBdx8Zz&a`S@vx%kYi?v)V2E`w_O}QOcf&Rj>e@hSw zM@Tdip(e?;KYbkiBtaR7uUxLv3S?KdzlVt}FxD3(tRee#;MCf@xfKu430Fx049RdE z-@tNP&%-lCrU4q2jcI@xldJx;XV}63cgQ;8oE!ZwC>(G!>6Rb9IzU)9S(elwu~VrP zC!kto$#m$8rS?bNphHNh#8yhhVh3F9)|I6l$}%h35(b(^JiSgu%_CO~=1%*;sw{Rn zCOPg`XtWHJFHme*l|Ng*M9KqGP~e|+%=#z$2AyybkLFKE<=+gJTA z{<(1(QTDJ1fUld^rvoc|BGtpIe58ToYHmj_<}_JV`6-`eHESD++&0TJf;R>6dBRBo zYIH<$n>?nre*S`uZT%OPyE zNpF=cvQH=;eK`1Fsb5~}%o23#`{KnQdinAtO$z*Yp|vFBnwdl~mcjx#-&-j2SHr}S zmap-Q+M16#=_?dbM}W6-I;Qz&Hc)a3xbzb_&`xN{Cll06fds()o?hmnE^g;<@pI60 zG6WS!+&9nDR>>;8gaMFIu-pz6z$s=@M&k$NQ_ZO?Xt%)XJ*Ah1#-=x2l&xFTld)=v56~iBa>gjV z+tf~bSVkU}_Ocdf^yBTenV%2Z%Ji$EBYVKlt$e>;Ox*iJ#QUCVTidl8f_*F67THxr z>h=TVZW_a{gdProX9X~~=OyHzb~gO#oczHUTiQ&5BGgjJuZHJscPAYt*{-95yl+HZ z2l@ucdbol6k~7vp->Q~u$!Fu;CSR>Q{JPRZDSv7oX~y}Q45f%^&RlKUzRfJD)VdPW zK?!s0+li?d#d9lHII;T`X0In)&1Y!hhACe`=Gj3_7@WR}u>>|lr5_$ln17-wt9f%| z8Qo}rb?_Pu%#4TPK#s*|a3sY8C77p)ITZo&o83(3xEy+z?bAxoOlvGaa*UHhbYqs+ z({haq3QW9hO&ax%kddPg;e0{H4_ezg3>KfxFVD89t*!I3Eo=|}Lie`Lqn%fgew|QX z5_;kIw5gA?i+HBaoY{Fw)=KjUOO58bR9N zoT5HimtM4~YJm}b%VwYqLW#bjp&}6$w6kiP^Wu@AMo!>#La8OfUbuH!_HoDiU_xys z=)uI=RCx%&ZZC~Ldmd27DOHP7-!fHCG!com>*NV#>9E`J@wWLDpe(i18{CY@DyiUpiQ0p2@g{zBNIWVc&Nm%c$}e5ir~jKu;G+GZcjI_ zbB!TCR5J1hthI`WtQlqqn>r`6cdUe1a|7iQ9#>4%w=z6b&v8M&82AG5Lpua#oE^S6 z)9kamYc|Suv5R{)nmf97FD(-ROd{06K7ru|NO-{L@uPVP_Mpv5)W>5fVOVA?_Qv8C zI+{0A#T@gDOFs?q#wpohcPntYB;xXGyepwlAjO<$po_=RM+uG~s@%SapJ4x9y1~%R7GNo)ow>-k^nxcfKjzc zwhC6Q<*WoXj?>s;m?%|K zGijNm-dy3%qq3e^8R4|5!6EUd*Tk<{tlWzMrIxG9(XbT)ikp!9&Eh&2SA7(X$vloO zYVJXIZnQfINV}UE+08#|(@HB-!}i8*Qdif&<#?-v4kdH-l+6A@n=)O0Jb{l-KoB6QUJ$1p)anrBZuC zLqXbG(e^$``{6C=%ZBaXS=LSRhVxbXEEs6#K5RNO(&=X?o*qn5f|LZ6pk(g5U2&Fo zg^E5s(V$d3Gum$Cl_)1u&cg~A4On7=58w9vz-Su}UAfpihHjag8Qt`KL3RQ<3Gg-H1MGt7;E?Dg{nsyj z`qAz{-|KPR+2fEMH3l^xSA;<4MDecdza?oqVCCf{N4a;^4{)lM6Ak=3Ti~52UVh)^ zEJz_W4aM%Kary@0Fx)fU^Y&)lbfUJmc-N}xVD+1 z#P5q$ZPCEjwK~DGNKAo1Yy(m{qVR<{zDpw2P0K4=nV;xv zwsfrVjXC=V#>&P4=5*?Du`X$bOQDP&yPzm)3K>LWg?{tT?Xo ze`ce--RCc#eErf_f?_fHVwJ_X4{mKoSi?=v`X^F^l|7w>5x$^;O#Q`hbT$5Hvc&@b z)>(G#vk{A$Vx#zlY)MTx2Yxt+gu$9(4=}UAF>tmK9j(rcYM}f}EXxMgvY;o6@4Hu_ zbu#Jy5JXV3f`wXfJn+M}u=rXp=$NLAT=T=hlZa7}h*pbxqmEY4G#CjpjX1ldO7=kh zP#MKjs@-VtV#=p%RnidCi^=1)WS8KkEEjd(@>&WYm}+alA@TivMpLWGuxmJdbqi3{ zu?paWhJ>ixAQ_NeJz$AjK@L<)_azi16Pk5l66|=L@zl0Z(h7)roUt0~U0S4)B(G)}+DjSyd$_FMI)fScKpJhkwepaM*a z*gbGjme=c*GVg^_z}1d833@L@3em}7;n<9$?%_pCuK+~r8AGEk{KVmpddV{&JUo;U z{u!A5ji^x{Ww|UMqO$-@I#P;5hkraQRv;-LHf=z8wHC&d(r);L+PcXhM_b=hoH)^Eln$~)vk zdP<<`Y-LNq^hU8x+F~s&1cT;C`mvkQ2mq+$T#^q)^(3#MFI?J%2nBEz;ceXp#^?dt z1xZj>Pek5!E4ME>Oa=5mshXI854@aAhEyub>Wd_5L@dNfv-ip~bPYlxOh$&cbl;&> zbqZNITxNEO*29&d_pT0)HrU9F=WN)zPNXuvsM~NYeARu87+Npl_<7+OKiS?hy^8BYsyF`vYU%x%7@KP70SW`4D-#w zpFaN3Hhs8rGI5S6)v!n8qQ#uI6OyD}-)$?vAyiJIm3cy0|C|7nld1X_Xdd|aXB z#{;x0P!7np|_KxwEGd)H3BBxAN4g$qPvq_R8}HF6=dD6-$oSX`OI@ zLu5tmM{2ifuv<`*Utl=Xy98s9@hyXWoY7&>0BL&ky0^hFi=1KhPhKA$MhgnijBXS8 zW!~W5w7$wHVhk?Rlwyw}ftr;~-Ab;g5`4-bWS%3gsD43Lr&G#&nN~XU(}09r4kG1c z0sZL;L^r-Rp%IZ=9HmRuv8}LkN%WQzMbS=$<2?CXmEIu-5BoF{yK%+j&AeF|9G`#n zm9>$=wu}zNwKvxWMYhmNg27F@o`|!U31_w zO6P6*5IhV($zgN>C9j>g)GF%B1Dq+r+klw+Y#oa*Bd3ggMs}X0^&HSqh`_O4Y2&Pr zfR29aM4Vv9%<}pg=bJ(dVbCz0EP_IHm0^bKZu-M{^u+4X6E;fYuxQqXjQ;0z3bgvU@)T^s6v-JlOaMb`MFnVV%2oov_bq{!PNK79SI0l3zW2f6~N#2Bk3yB zi?V8B9|YmSu)_%cl?tVhZz=rTTT zsXJ=M50i##N{1e7r!Rd_xhCRuwLll@nR9n{f2%KcUr^|l-RBw<(rOj|$;zRn)8t{A z=W<#uRQM^=UD*&6*-zJ#*lgHPK34%NIkCyf!SR0`9FIR7ADte(K6=}uG$mWu$g{m< zZ;OR>=o-%j#jCb*`>gKb>7pJv*>_aQL}w+_iP!L{WZF@)%gHh%g<9OhyofkM!2Dr0 zi4>^r((J-NB7X3?pvf4o0;_;Y1z3@VCT=z6h7xHI{U&aaM)KV~{$t%Q{*{zgw6V0i z1OX!DAp7w|?@KO$tmuMl1MyxG|9rk_b3<$g61Atd3lTLmiR~mZ(d1 z`rB_E>-l2bl@A#5&WL=7v4E-NT$htj&|oA_AxZkIjs86Y47r+7K<6HY{OqAy^-Y0C zS|cc+D-Uk7)9-iwVDBzEXp16)W{u9MH*jpV6dl9tb~>EcC?khX#upc9pW~)}vHR5^ zdda)wfz zF|On=IxY!Snk%Cs(Q3z&t8xuEagjNSRV~`IWh=i4g(gG1YC^*lJ1afu2UG|hBZgeA z(MA(DSNq5d1QkP50gv`uQut?yPM8k`o4csWo0=WeO2)kj$*F0bB*_GZlP*d(K7|!x z4{IQS)w3xs4`jws!t&zr5Gd^>bRvoVTCUMS%H`1%fg4Y$({R7dhlFFXr zb#wG@&z`t~Gq`<%)?tQyVX$o;z`K#}W95g+nyr>y2a29dka0bGGI5h;<67=;6mioY z?e4zX+l-y$0oc9=!^h|{VO?rjx~Gk|W=wOm;y{ji&*03dZq1BdX=Z7Qlz!7x)b@qc zo0dI`;ov|?2GJG=76Cq6m{(S$K5J&AWV<59FF}yPBq^zVYfLp}Qw#;0r-OO5Zr2D2Z_0B{lMYAG#SSPfp zNoyByakfH8l(MD?~~EicD;pTQvkWg$a-t;8GiK^velI6Q?ZpP6l5342J0H@#>EnIyym>8 z=lCVw+D-@2_AJ`Ih_?S4ZT~pjemC4ciGFx@x;5aUmrE+Bq0!I2*9(VXQzsTnnfN8k zrz|kqvDY}(*Wvf$cSmmyzdt;9Gd?+d|N5Y(_a0QW@QmQBaP`Mz_6rXZPS~~e$F06` z733l&t8qt^2Hy~u)U0LFuUOSm(N){46>60TGIc%Kr-~?iJM?qL~;;< zt<+iBJP=nqP7Wv)#8py9C=LW7#gQv`i zCm?78mq3HREi1{ToJ%rFSI$k?N$vDxsvSoFt;qzG*x8;v+n(X2U2K8FbSyNGZdkl~ z2^dC_#Y*-$MaGUuF;uA0I$Uu+Rl8juLoq&1aS(DS1n0m{|F63z?QYvh^1FWp zB98{3O+kkpPlgudab!8sj(j{z*?IdU4MmZl#F!!&0MrrN|9$K13!o(Dn0;?GZ(;)I zuCDH`uCA`GBb%_i$Z6Zu2paj5Q^ZC=MdcwU>%mE9X@;WA^I$C^hua22M_!0yM^owj`61@g!6b|q*2 zDZoZlj0WrL8z2nAkMF)+BP#BfG$4cmV2sJMo%8rl2is9L%LnIHiR8trC&2*Y@J?W4 z(S(*TKm>Z#uY^Om=BcX}AE~2NdD!{x7|sUCTD#SXRw8`!ce<=u!$&HM|M^udFf`b` z@fvPN|Bc<3-@9l#CcocZW(CaNRTu_e@F1fOXV5^dJ(nBlrg7VNw*EI}0$30hfNDSG z9IJs3V4BB+mOF$A9JY!!rXy-`rey3Mw%$0PytB4Bhf7zWi+I5Xzv~_+7QZCCZ!Hqi z&&7m7VA(=AM6)a0QL21C9g{`kv#06lv!`+eSmmd`c9oWH>P&O0m!nDIJyu39+W$DVc2;N{VYXcX z!CE8SaE)mr#_k+X2a|b;@vv2QC(BzV9VU{09d@1_V}jY3_TO&o`K1`q<4`A(?l0Fl zW;uEH2$W}?V=d8+$t(g&l32sLKSjPV{ihFs08&dPAqZ2g4!YPfhAZo9YxsF(iw%D9 zk-pR~DQtV_FLDh_Rc2=eWmlYsmcH>S6I&IVYo}#sX+>H_tIE@PW+JiTn;>e%Q&1+@{4oeMM$12Zos^XV`195%1%B_5*; zf^_E}#g6=~8>e4q{nk2#3I0-x`y#BVkYSvZgNs=LoA9Z_f3`UcZ^vC4#v&F<`3OyVFh#KheK%LJf*pI6T_kHbtk>P{ z4WGK!Ign^OB468I$AY*`FyE(b0e_w9t<)gTKaR7Wn1yhZWb09ky(R4npH$In4Gr=s zvC9g_0pQDQCjlHTsg~}7iugr&CN4a@(@1*^DILy1*pS9o)@3HjabuP9i~ay}q|+|- zkpiRx@K!n;1N*BIe;Tn&{0+rvL2!@x#S3}?wfr%V-LGj3{yQs3fs1BNnGA=??WOu# z8zn&u2W59RTZZi9W_#6rMA{#hG7Uri?086F=uaL(${fc_O#2e9Ga*{2gkfmfzhMZQ zlk3Q2k?~|*Xg~SZV}mHOIQq1a4RpxOYrvL+LOOO zkG<|Pw_Ma)(;FMii~V6G#2^wni@`R8f#2I$wTKOa>)4G=5$T8PYt5bW`gc@t*(cuM z998tz=^kyMMULqK6Z9Z;t@V0N3WOd^^(svM zM6ZBEc)(>DaS~6MB6#3=r*H5EzfsU^_yPh29x2V^lVeVC)UsGS#=!Zjo69BO{D|te zFy<7g3IxPq2VYAiy*U?e19DF($hlBUW8sdIi%6T%R+h1X`Rc&a15$O~E6>LxkUL?{ zXH}2sk=~D|qr4r_*Y3KrkoWP8-0T+pGa@8D8@+#d@MCZH?dx~Ar1!T!?7lzfy?yy+ zhm#472b{31?_M_Zn&$gMlV3FOYLvT12SYCJw$OM>T&rObY%Y&I6W`ML#VH=ZMqx+s z(i@AV(HqXkGR@A|CDZdT9aw!B6_?9xvX-&8oa=t(9&{t2!XQqq*}&?JGh?Vq^30kK zsU=|*nhiA*B&pzly`_q{22veLC?yX-e54D2lcMb2-ED079#Ie=l2{s;XTis}dR=t7U zfSxk|F3_N1F8$cNx~mgjXMHO^w$+D$c2-Fod0imsJ~nH@38}?#hDvmo1d0{Eo$daV zP6$l>Z*%kkMkVe@;xNLl4E%=kGZQF~1$z#a872(>p%Zyf5|=G zNhAsq^;tq7tJz=Xz!|LOPc?j&IpGCBhkWg6qv!TXo!Cv&wB?Ek=13svWvLlgRMC%D z5_o1o^lwqW!MUI01$$pc7y{;^DkMw8P$hwt)pu8I76|9W2isr{n-!={a19IA)!MP4 zD7j>-?cTrs^{Yre;k)QJ+Ik)G<{gcbm5(;0=rg)EG|B!lVFlo@=yD?)Rp zq8iLA4wNm2a1J7*342l~2K&y9cmg|duWt*Y#I#8fWaV=YKKFEX9kUQGo4N@CLUJj_ z6u2olZpbZ-TI%`-$(R^aCZ+6yiN^BbE{R{KP4#pOvB_{L04SHVq<%2o!B{_Fp%?$U ziw7X4Qm~al1JdGcrJ)p*onh#lJIi7zEIhvtU?>G;huI`!oNp`3rJy*O0^bRmNY$xP3WK&@`IJ}+%@pj|&jlZR9@V|B7m3Rf) z{ci2MHC%IiV07Jw#R->QQ#2hvjz7C#<|LiqKmG@@QDyBm{&d`fin)3+OC(eB^_Zcs z-S1#_g#r3jIFeFXx=y@a?jU63;{KCZEO*g=xzvPCuz61`GVf|wJfp5#q#x*v9VsuFL;f~i9N)NdUUlDw|UGms%* z2DnBUjXC^2H2)*N@-}}8vE36pltlh*^Tj|KRJci!|9(^?E#hAR zh&X%c*OE_VKKPhbRxhAF{6GUr7IidgDQhUO70yME)q$D{>|yl2!1TQ+>!1cAi(b9m zHv!B5(SDiLgD81{7|5ZzC*WOUDQ$U@pY=paPMn|wi!&k+Tw(#u(J7?)dbiU>P1)fS zVgmkDsspJ~FIl?T?|mX%cc5M8PMj(N(g?+TXCRg)98BelUYOfsJTmg3#Rxc#&h@B&F`nG8?-0{b`tmjKrJaNNz%pG~Fb>28K|=giqOgf) zwyR}vsp1PmZDa?uB-@eO6KA$sE;MEpJs2OPT89a2pM%tQ^Zw?KWrDPT2Lu}ZYI$Me zBn3;>C4@ubfV3{ie6*PZE~tvIQNp8|=fOs0SwU7*68oY~g8I=9ysU4Vqt9CeOl`ZI zKV~-z8x^}(Gwf^-!M<>Je+5)oPI_2iJfd?kT1`vwJG->=3jf_r70N*`KfsX9!m@MN`GHVY8(|X+;Urb8-ii3Y0T_k6wja0*RaEtL<=! z7K@mAtjuBGme<|H->4i>#^RLTYv?5UFAv`>p+Q3`*MWYMji=|?WcYij;6mVdR8RzK zG37MQ$zAfCl*UH2IV-64XIHn;EM6M!Tmwa3WU#GJ^5?7URCobrcb<$-vrCRDio@Mm zUA?-xN=FDd&5N^DbH(*LBwhm6%Px`k;O#5_^2dw{X$=lE7^HHQ6P_6(m$Q(8Yr+*$ zaroVRwe$AiaAl)&+(Jcv`qXCx54p)FQHi$x6^svGrwl3D!^`)(C{L`V-+Gl42cR^6 z)8Q@&3knF+mNIQlakE9G7)pigSNOy3UP|UU6AFGbgElhs%G<>p9T?u_Z5~bLgO91( z@A&(72M2pQz3m@&_g=*kEllqQH-d2j*dKoMOzQ!Vjq59isTV!jyTiAMj z2h!bld-#vBd2bns!by6tGd+XG@0d7M?cu58hdjsVPEa-Cx^{BztDEsT(9qyw?CHUvPKdV@G3)mVY3(*a0mahx#Ad*ET$L*fXhSafg5z6A@&Gl*Ma5; z+D?(05H8^G8f~9KzU`onIaW ziw1p6q)`u)9qu}E%sCFW-zUxyS{lPZ<$xnH*(M&MAbkG*YMepYKZiVq1UuCLDJ3yi zSC8g|wXynYSkc|^tCgq2qlZ&1=-CgXP@z~puWbVeOtNl}w?7HRBcX_D%2_uYLD zu?uLHHIUL<-@LYJRS5ie(FD9KI7ssp|R08%G4uA|5>g}kwHS-$hT z;c5dfa816Bf-GqOcqvzo4WZ@uxFjd_hWm>CFuXYps;WxXd~ZTJyr3c(Vv^l=8~VEW z%mld4uUSM`tb>%JE8%myX2%l!LJbvOzOcdcE!r`0s4`BZp?c%B*n&}1+N+G?rR0;L zMpQ$)Q|;^T?TVA-h!*;vBl#2rTjzyas`Gh%zW`+nW(eJb-RVd*PKU!M2-XRD_K`|CzU>ZtfW zw?yjb4BJsNn>Hugd3BdIqCRPTE<;|Sz6QPRDy`f8aj6|#Ew%mo=HvVI9Gyt}=E_eo z@z+3YkeIl+lEd5D$OH_Incp};p! zr6pg_`Uo)4nrKa?39RW+2Y=;54t#V^Qu0mJ>+sdr*lVk@gTQxRT9EI`^x(U{k!XEB zfONdGj`vNanYhy=b4gL=R&mE;iSmutEb<+fo5)8FPUS4g_Jc3~kr=4koP6zfSfu?) zAwfuvK<}807N|)<>u@JthM1V!=h& z3^Lij?2p+PxNq(G=m2ZRq{PtH>;?v%=gmwlY~mv8V4?twM0eeSz5BWwANE&%J&s!v z=1+GdRR}Vzpe~tyXk@F-5=AVq_99Y_&X|V4tiid}JZiogtFG*zy(6R96GfyKJcXfI z2OC@SkpDHlD1zg->`$iii=@>FEtVVVY8TbOyUAcVrj%O;ImYD;7m&Y@f5*w@4Q z-yS%7W_AhZ)_A#0Ie1*+kG9xU^TKo%E@@Duh+VIH7yzyxowBOJu{ZaZDG@hnoLS*a zw&Y0TJo1K?%uN-$q~B%J&NQxT22R}>`ZrWovE<^TZsL@95y`r9g5Bbzi`bA5k>er} zgcW-G?!!-SpYuO3NJS5&@U8^+;04<5uA|2d4i^BC zP{4HR(udh(4sr~q>S;Uu25bZa^d+!IWhC@{iks2b!+ zAD6B$yyX;TyCHZkbejc1pIQr@RdIZ_p|4K;n70VYk~7ZQiR(5f-<(N3sl}~jEIVq^ zE>gI}W|b9#p6Z6D#rpB2geo>6w#|(hK(JDUF@eYwci) z%U?_ay*zESFotdSJ2Fs;ZF}(%uhV7;2U_XIyp^WF;>!7m-rya<$G~PDP~_CsqakwU ze`PEKPBD+4iJMD_n<#WI7GPr)PCh{y!+mWL1$__V2`j!0dOz`;I7Eqq(*@x6g7MSv z4Sc<+5B4ZC%}>Rc zBz;d&L)lCk0CtT_L0FGR3pVqd?q4+fD9pt7^YVu52h+4}CN48Kr+{;clt`+$rAN3Q zOvablH;q*}GT$W2W{EDsI%??as(5|Vjh-}{Dmw{KYI98}PBDL^ec1?v=N^PpZLp@* zg!9E|-YKD653coRk}fO;ZVTgE9t-9Jt`0k z{+AMUn=Li*E}5KbKeFF$jJ9aO8Q~fYj$An846AY*IcIpa`CiWk;!2iWC4lrs>vy8% z0`DfM4Nv{X!VofZ5sNq!MGezbT<{Vu=G*NXsVH(KgeH?+bLr1Th{2ZP3D7)-=IVIS zFdD#ePjMe$los$-{1TEm9lKQ3D}J;QSe%J!XroC3yLj?66%362d}^gVmCbniv~!_y zTTPI>M}R~>LR8&C3rq>+>iKfn7^so@9L0zE45LWmujR4@Ozvn(cV4}o+()2i8+pzN zuB}#c6MH0uao!lc*`q78Re>mIs%DoS0;5_F;E&@f+OCSp$~JCq(7Ot7Bg;g00E}?7 zXyab6`J4U3Z~gR)+||(t5vp(F@2p_!8i&C*b8E816aaN*<`@inj6wP#^-S&>*ciEM zO=)D6Pd{-ObVDAedV_bfal^tj@TQmtL38cs4ICJYn_BEmq4 zj$)$ZSPpr?LIb&ZTJ@kI*U;&;?YX?PY= z8)easa2^_r1W{2WK6@yoRQF1pXK1&_KHo!J-SmtZMJ7Y`xTk6jKD-T-=t!|aPg1XP z;E-b>(W5yFbQ{_*H6M1O-IBsj&nl;$%D1f_b{78Wu%Os3nCxNAu za*e@bkK>j18oXj9X362o)6OyHsZM7%Ie9A2ZU%4+QJ|dPeP#W)sXCo$+%)tZ?%5$e zP(lcjMV$=w_{ZX{xw7V&XpH45pgr0MVyNMOak2!jP_$`7Dkm5X%O|Ln=-Vcq=+cGI zPpuRaG=sur*kiL<|1>5^iePOpb?9VrYD01CUhI+S4yo-SKW+)kX30C~gRF*TdH)_A z(Z6~MPKV2RL)&uMM20Wxe({QAVQ629Uprg{m}*bbt-vpUEU!*mHID9*QEe7+>BH%V z9XN1ggO~v1m|t_T*VgOFEJ{@=B^JZl4%Yg!ZsHCy^!XOPKXZjWH|SP2zTpwqWp2CI6QAmic3uRTV|c?M9!zL=P#F~ai8ZqnXbU{G=j2F|JCNjE{MmC%9~D{$5?x$m>I+6KM%`@=SLn`(2e6 z91&CxVFs4Hm}~&=3>$&KZd2ei@lGM{DU(Du2sOx2+66lYkjYo411j-)F)Fc%)vWo> zd~o&tDJGn8c)h9A7*TGlUkuI@Q>E>WQ%!s{ zt(p9cHOYb15dK~en;mSKch*rppAJ(Fh&Gc*Va?{_PPgu8ys_c8xn(*g2cetXnC-iS zRf~m}8F1#x|Deg@`#8g`rAOb#tbH^Kq4WOIF5|8wkyNXE;T21xrI^co{TB+)G#xrDxAL z$|8(n^l&X*-w4zmy1?QT_D8pUn>i5H9M8FzvRX0<2H6BHhA%Z!r$LkO<4Zy0*;p*Y zC&h zQZsMr(<;vmMP+9S3hvQc+i`L95z*^YJf670zaq z&4IGQIV|36nm$&EBPVnnvCJJ5mp?fIQ-kCO2Ue$r#3^iKms`L$DfjC@=f$||h>|Ar zswcMH*4)=F;}KEnppwA!#GxZDrE@5sZC85ES)35l=g@M%6jV^se5g0lkw^vUM~_TR zFKSj+_0Rtx;umP?!CmxExKU>EYqEL`okklArocE@QxVelVa$RrUbT@O#9^)8@oy(d z)^&K4`I|`*sV$_t|1hD|hQ{;Fvm|n7`H=3=#EE0gXwPp0GMK=W)wP`f#1Q9yji*2N zH@=QGIpL+4JVxjNq`z6fD!ZS)G!G>b@XyqulI;#(kK&Hej$Vs__#WNZxzrT1MH3ll zGg!2b;RxlN#)Yj*hY>{&fX$Y!9U6{_p6@c9eZuS{(Fr$pLeAx((2&Hy(2HYJu znX8TgoXQ)eFnRPU(Udw>=vgb!gI8Q;-KijNw2C}_^_FFE2EuV;Yf8m?at4c5R`n`x z8?-6E{~zu@+M|i37CB=&-Dpq=-J%V0kE5MX7A6Urb7eD#rQ&p{g;M0G@!&EN1z{>V zw>$~U?w|V<({&MxTEL??JyQ=2mb*^ACJg+*ztn!ayqQ-0YsXYOyt%?7Q08xmfTJa= zCWRo_`{zj2GX!95W9BRxck_)<@7*~ zgD?cX1=CwpH)hZWd3f7r+`rj3M>eIQ!Zcb)yr|#gCA~%W_t)7VZr$0Okcm4pdrDbW9rc>GBo-V_J9Gt;lIwc zS_6y6-4(CMgF>KZW!94IPlMceuTL z`h>8*e0c%ugVLS{noaD)VJscvFu0OQMz;&wdv-tgf7N}KlCUe`_KB|+Y@DW3>b+-J zd;_DT_lMRYj+mkb-=}S|+w;z~jeDjS&)b10rtVq7)5s1CF65{wW1EY6Wc-F#0`@hliHCmBidaYuirIWEGc@?b2sbo@Qi6LL)D~)9 zT$u|<-N=xCC-Ob82pH~QamU^DV%g%%Tix*}2}>suF)@H+bvshTzGzb*A`tI~@~PL; zYt~-R4IM$AlCmAj96LlQ?Ixx_p+WKd6gX@f4l(R2f#oT%k|`gYbx?a88^#bzN(z}c zSV~A5;xrSi>xoY9VdoeQS#*eOD(TX-;V;Bk6xm0Qibk;&3jJYfTQ(oAWthbMyXH;o zYAkuVeERZSJ%>yxIQ(mr?wvJK6YXzVTD)!PDwg%+&A(oWXnHc9BP#&IVD8gy$){HD zrju;tZm0TPmYlDxQR9nOo>pFVtl{33bLIf{?s z}T2|J%+dUu!t)M2ofH2Jcl`A>F*FEKi@vF_Cgz{Q-EhmuA3v-Q$>9~2O$^A7-$P-P9F$xXM{5v^}j*hD1M=)UH(PyC5 z&!qnOjB?0lkjy^=qxnqhqjhw2+G-qd7YOED{ERw<&n%RG7JnkHE&chn6TO=kCWCSe z!xS4vl;AiK@?*LHLQ5j(b$^mK_5f(L^Y72kTY>_BGRSn{({e(?(IYp#Rw>_FFOH6i z7k~Nu{PV+>!Ri?-oM-@xBfl8`O7Rr{*h)TH!Bw}yqiUEZtvMNFXO^1~Y(@dl`-^S+ zZ_qYCk-=))%P}DoPW$^E-m_7|K#3T6rMTggjyT|PL(|wxq?>C(jzEbK5pw|E@Neh@_5s({i&g?%R5e{uwaS+5v%YC1%gZkUG{#d}0!Ft7 zs|K&!LRx4Pu@$z!Q0JIGxgyr%xEcD9LD@JqtW8np8=Rm@l6D6HSY6!Q&Vpb zvmRR`3JR$0mN&G8x7}@=<#8CfX)eX{(WoTvruBBT=9h!5hP2Sm1I8PNvTIn@4C0xC zy03~L(*q_(^30&P7bcR#P}#2aOZMieg3e$#SG`60A^s}sM!!mM zkh(P%1JT2hkq~?VRU=u&&XS27mJwMhk6e~(VrznmioFW{_0D;vY++j z5{uj|ejU#e_70TpwH0!!v9gU{Y4}Ckb{uLtPk{PD7>9tdD#2#UE@o_QI3r78Det>m z_``h2lbS(hilW_N)Jg&UkQ5aIN!$mg?Uog($W&8|dA94>A5k0mzXKkcY@ zOV5t^giT>JV~`maIA|~Em?E~(daOUcZ9T@OA4AKxz_Q)OEY_yNxEx6ih(pPW;eLd1GJ(X)^JbI6|En?n&kZcA#V7OfyoV??kfp4_ z{;)@idCH}M&2`DvMUj3Qy6w_sUEpN2sOR@s(Tnj6&((nh;a&P^CwMO-3KEyBl5ABgcuw_ykeTy-g044+p1y+JZ zET>O?)a-mPxP6-Z+6`r!Eqbvl9sK<;dhZ@8?r03}@Z7J&E^$CQ4kV@LWIjW4ik)|R z^@+4JkF^`OC|xu(N?1zi17}9;mL1{kaQ%3Jjj)9z33<=~VuG=ava`4z-m?8tfGg9oF69ZOC+mR1|$^m^2wH77bEduq?lTH%LEMn)^AR zmL7_e)9^M;#JrrN>HrSLTMb*JOJkinku-<~xY79Q0g-9gjUGlvwFq9ni|;u{&-(la z^Cm!=CXn|R_pIs+25kyvKpIyP@3Ll}bGFGqa2M&<+bf;@*mlt5m~_4#c0AiZ(htJd znuQ3;KqZDiLEo8)oY&!W9Uq~t@^K7D=ts^NcN_;Y%VYU>i#%D|tBNMu^3`HN)faQoJ z4R#p*;mZ0kQp?oO65+K?Lm)w>dVF|J?BPHu(|4-EVc4X7e&JZT!{l$XEERVbbusK8 zeZr2oT|A-*hHjd#D0k@Z!_LZ+<2vJ52&uRo*3;v~qgS6fs_BlG7$P_~o=LJ?wp%S! zyxHvT1U8IlVb(hW0a+8yy*$B=@ZH2!TCN?FH?=H}4$kM(kNz>6ULCF-Q@ECIV&mIG zm!6m~9?|7O>&}dtQhY%23R)x_^cVq;QFUWiEf|W#Vor12!xPjMY$zxR%=*>%6!=ti zlX&HWVaIVt%Ya8w;_!jT0bdL%J?808CqnztV}s4(2uFXR4pFHhn1Wl7Zx{_{D2OJ6 z8jbA3dM8${ZurZRileZ^tA9;`bLb6v+gyh?y2assDn-RLg^V$b%LbYOsbvOwUtTqz zWO1csO3z45>m5rcOU^1dMDWM0CDZeUCF=p&=vXk_CR3jy8a}&@qPNnWV(aTu8Jsi=pevm6LgIop2w_@pG`iN^BcDlz$<)h?q z<>)Fse(Vg=eN<08pYM0xZ#;Wq4YBmH6aA?4ruJU$jx>a1qi8pVW&x$ic#gIDp*f}+ zX?g~X9xUHYdci@^Upn@(QpUY4KOV)kQ@mGEVo4ig-e$W2)u;cEVYFQ~G(b0c6aRsf z^sJOeNurNg+o%RwCSg# zF+NL;b@?lrZ0)>xzxVQBr}zHl!H+FPZHz)~GRA;rWF^&(j1L1Eo>Kua%~AmSI0WQ4 zY26=2_=*;;77QUwUth-yysZ1KILXb|1)c5(q)rhWe*D z2;&st#hSIEL}Eh)plo6&q`@i&Wt&^=?uC2QCP>VVjHM)c3L57CH1MsNpXtYT6fTsm z>)hCSFklz0-wZ8q7;8OXuae&k&-d}sIQ*C6>?O>Lg@u14$u*7C@)jdH-?@^(Nzw9PGtO0~tjtI$aW=B)2R+qD#FhMtO*9Dg=E75$39vB<6e*TaS$k`3iUF&LfF$FV73V4UVCn~055GWC)%LsF+mh^ zGLaH-t(2;?7f|e@50XZjh_^+db3!Xb9B$=Z?dZSu-@TQqig}g)TymUu?&+XkR_f;C z?F~5Zrnd6KE4CvVgm&}_ z{`+QpJ)Sm&5&+88Yu*Lcu0cuV4&2BhMYRD$jRGSZPzh%a%!va!#QIekv&ugpC~y z$cR%`Xu~-p9u-NPJv;}LQIe%l`RUqI;#RZs0z)dx+xRW)->+%^Zau)Nz3q3e z2vZEsI~kwC_RIXPbUq(GUH=XRjiufAg7%sIEU%U@SIFz_XyeJoQ?Kj>mwjJQ0Bt~$ zzuEx0S&cq$(u3iWU-Iu%@*vNnH<-i-OQ92^U+M|zk(T6R^kYV0{9li=2^^)d?jGjQ z@alZK&UM~q6`G)8Zi91>$Te)X#imD<_77ej{IuWO+kHzzLFOsRN0`;+Asl7nW%zyB zV(Sq4i879D&BT$U*}+X#^Q1Vo&@ht}$psB9;7~ys9^PHT<9H|$F8)E^V2*b_e0cW( z=G?8IkWikPyYMbA@dbfS>Kks*- z;G4bZ{ZHTT?QTa)E32!!I|r{~x;x8NN+Un}g+odh8hMsy`hU;yf!yIgR>~XUi zSCeduoui^ppE8O4_~pyyDu42em(>jhCb^kq-6d3St`5p_X)EB;l^L8G>TI>gOY8Z2k{SN-wd#C`_jd%oU0 z7x3OMINRFK3(TC(*~o}ufLMR}um^KmZGHMg;lSiWIxi+In$jwqE0Ar7%0ZMPLhfv? z&cddOYzwhLbP)(XdnJ~aVdG|gNfB*R6Q?8GzcHwZ{|1HhQO1W3MD&ql4|}B55mJK5 z9x>{CpKszAOA~9ql|In6x{-^a*<|n8E#57$UzHnQlVg7)dI*g+Y28^(F0vZlh?A5t zNXhA=2`iJqEyVyo+%$*_9M(U5z+N^@0Y*U3+MSM3-W&f)`P@)|K%@QvM+gY8J%#co|H%*@V#n}*UblM zG>I*+n5;X5*y%Q>N5PqUy_nT@`t9)&7GDB^LD~SJp(WA6A3RtHgqLnUt2kwM+dA#` z1{cGg1V(A|6PKW$Tue1NP%M?K43;&CqgWEl^evZ1(|FlQ-_Q^Wf6Y@4`H|JcqnG3C zpJx*{8H(m+h>xbS<-E-+j)J6}#7{)+_#-XwayyBSV+?KXzUjDE zL0)rQN)kMF;J>0|XQR000O8PELbN5A~Oe_@w{< zm_-5rBme*aVsCVGY-KGlE-^ALH!fshbYU-ZV{&P5baO9aZ*+8QWiD`e%zf*6+eVV; ze?J9QKKcmS6fD_JcESmr)!0g+9ozDeZMvXh)| zIT?!tx~p&1Rn^sXdHipyyXLAa9zBkBp6o=^a+VjD!)V>icm9A+9&K%HJ^EAGG>a_C z>nM%pY28F=F^lSaxq^qwd|H(|^D13tH)VAl&C4pPm+4{=-DDS0x>_yrY1-svQ76%1 z^QfH9v#O4&>>uk40L}7xl{V8WXf%qC%XO30{pcoduA+6dh*l|rZ8CtkUaiWi8AMG6 zt)@_H@F5@$&2X6)6);pNmhM=qS&`|maZCX2Ya(ji@T_~%BvXyZ0@3;PJTFi zhE;ZIUFDGi9A(92USxH&6X75LcnU);E@7zi9R5M@)WM>RX4xt$W?3=Kp?uj~0jTCG zE#RN*(FdB==%j%PDKz~yzo^pcE_w9m$8wpi(n|(4E2ryaRx~t4!|1AMR>Nn{E@;A6 zcS%`YK6~`&b-B8$^2@6xil_bP`R?9}LG&)Irr9F;FJstR&WwG$4Er%QU^t8eBGc?ZK)U7OypYpJnrO zy=X?goBA@ZvUyKITf>~59321G!Euzrg2QCMrt*NT7}#pDhRtb>66PwSzA~u10PKZb z3$v7CffQ&6Re4r>0C#5D#rpD|`D%b%C}agfKvfVkGap!$Ey{GZ85(S*QVK>e|3plt zfQpxy=^HMzpv8cHrPXEap#c4%7co~u?6qnphN^|0Cp4@Y_j=sp4cY56o)a*}ZhiqM zSzKp#e{_E)v`@z{(a?cMQsE-4v#(zcqUmKmh%(qdi)7sZ#Ti8Nbun$q62D$8)9C=4 zfPY}$$NLPG(%)nWq?jC z(`KCA!U$JYUeH%A3uw8@rj41~23HRr@#}Sw1K-6yrK(7Qz!v#Gvqz5}HPzjaNf5K# zzt@01YE0|ps>VU#!!i9DM2KSM;bK-lf}UhRN)D;gK~zydQ}bZ+1~;4OGc68i^rwlZfX-hKzl4mG0t?~ErFjZ&4CnIK;o_cJUM!= zgbxy0fO6H5@b>4)*AYrPy7y`ytB>j@Y+%zmtSB(ApE8*C8=MfNp!56|pndfWAU=DM z?7{z^1JVE=gPoRNkSTWIzdk&E{uMv|Hj3isgXn8{{9-TS za(nn7`c}%|ljl?f#|1q}t8xvrNB1JHQGklJ(t0Zb@&TQlAvwk7lSjBT<1FqEVR}It zDX5#Up47#-f3|nt0d|Wv84INX^%;>GDQkK^!>`RwUXzRbGho0F|(;b|74v*|cig|u1;-(aOP0uWm6q#}jC=5*kdN%w} z*p2ms=@d~{jaciQVoX}Dq9_bd;Zz$VBARAe9g>;@d&!J)qsfb`a z|H|;sWqpbKWlOWguQbbCrof}JXjYXVs1w!aGp9O+5QSp(Lb9a+DnTy6FEM~0L~kEf6gJAIrzh}4EwAUxTaDvBc zJd!B=2os2BIBq@~!!KgXO?eU5L=;E8bu<5iIwmMao$yYG;ZGm2BCqNE1#AVY$>91l zfjp}~LIg0;6B{&quc}cG`!a1>4b3vu5S0tGM)0LAX&GB<;0%bIm0FC1)p02p9Zm;| zS};qn;w*PsGkAB4B0;LYsQKA<|?0F0Zw0MD0D2!hWIP0I{FEL+7n$y zN)j0hEQ-VK4MTMO6p-)m=%)$~vW#!jMOxR<``6B!*!gA2t~j03MG4qYXNx)D!wPFZ zj{clwtLTP`Bi~1UAC+)cPDuLPkMJZ*yHVI7P<1$m*C*O6cZefab&xuWlbO_LXcV=NTM0%hsn? zS#3}pwMH;B5LFt{Dn$!8%`QkH!sVg?XE>920l(&XRX4bt`|$n_4yDmybd9q5hl3A0 ze;AO+jVdZUGBO(6WYx|TI4v(7s*waomZ-WS{D5i4iJAcwi%}{E^n%lHTFpk^r+|zy zFCN`f<=V6lB+Dj6+7IIxz34M=Y;%#HMxV3+0(;GY?6#=aqz2D(s20E0hufiwJdZjnv(9EA8sjMzvEKL9%bE_WA~7k>xhDWmW8 zdXajAdQ{{dE7A*+fX}MfMG3M6^=oI5UuQ-_Pq4lbFyQ!*H{&twiUE}xAdu1fvdB=g zkj}c}@;2gr$rXMuWTHO}&nG>(XFwa|(8ru0B|)NFKi-gmop z3CF(7>YRwQ)&rpE_#{yZOqiiML2as2Z}1glO$Ag zWKA4uI#4PkxO!^)HgN260hAP0S0D`4mos>GuHf;&5mLW3BCEJPvf3XRFw%AAj?GRD6MC5r;42Tw$xiwbxfk!AoEqMXu2g_Hywp?FJ_{P~>?#`3HK!zC{I(yEG!96jp)&+-m;=CVRbo6P;z))q>ZS`wnuMP|lEQrHC?2>HB+<*A;M+1&a0AvRvF%D&g_Y&J72q@Vc(y%Gt#`IJ@yo zm`Ukt`QEB| zE!T?~fxpOD?W(}>`8^xYVU?P!h*uUZK1EW4YdK9~g(GaZAB@ zpr%{g6#_vuM$wdd!i%!l@gW$h4ZNrq_ms@F(#&XOAGxb6sn-{A)r)`r`AI+iIsW;( z58s~s?bZ3ySO4>K9Dnz3KY!Qn_XfI2Q3NiB(K4Y1<6SzWFJOe~$zH!7ZAZ`f^lctS zPoY2G4SR!V)pw`63UMobBZpCt8nOyj&S+uqL{3Yv^9nE703BB;9O%&Y1nUq9vZgAV z&+{p&xj~FslJx-^hbT0MHZD_?Wnl98zFdQ6O3kxnuD7l-K0Zd$HgVJ%PHy!awZ^nr z7<59&BE>{YmKJw}mS$Sl^%~Ftw;(HN;4JzEx1muecquCuW(0pn( zJ(gvG0t@2)zk$s&g(GjRVcg```Ll1)7UtEY&oiP5MKx`1r{iM7g16^%ucQoz2n&e3 z%(8k4f(~mML4K=;6CsO}MB$JYB+wdRtTxan>Ye@V+4<9+^L7p!7eM3NDwCRzht$#O zx~lMc~dT{(6`uEK@onkNR)WRp-ii~U`9O2n{^f=l_MncbW*ju&uYHRWTAgaivV~r<{jfgLZUe1xg|(%@b(+Jx}K7LSl#lW z8JHAx>kCfm`X^ahq4AIdK?;T1w>l<3Lhof%8ygYS_gjG_1~!T&AOp7_gsDXtEz05& zCIH0k>9x^2d4t5I8#98BWF@@=385$|jsNA`JtM*nEz*qlMeQr^*k(mogf6sc{O$(n z40Fe%1-+X|{)9-rDkbW`y2W_l)T4e{}*`Rf{A$ByQ3uP+H^a~DCpYj{-n#8iBVkOv<1zK}9Hznbu;wm*F0Zxh$8hms+!znp;j%G+U#!R*0 zIS3H?$^v8vlp=b@x(69P{5Oox(w%?q@BH`pTz%Qy`R4pd|GT&kuOG+BlkfVE``_7B zq4NL0yKlRzI&h!3b-C#wNH9a}RPsM(f5X2Z*Yux4JMh0(AlLLQTFUov*I7{uGT=BZ zG$`kDQk4RsMk|gH8c|r2#s;V;SmcEvxiU`)l1gkK_JHC?06ra2i)Y-lO8GTh)Rf7=<{cqAe%@VJQ| z*a!IMar9ox&G_ruhu?!ytAYXhK} z$XI4~3iGrYe5=G~Es5sEYTc-!=9*Z^FQ#gT2=npyZA*m7>#@iLqv*6!nqle^)FR#a zl8g)p;S}kxiBW)J0BT{S_U^G;BQdaDf~%78v%>bFJaXj$o`)8IWm;b&qnG!C2t*wv zK95}1fl$v$*l5!Q=m$#6FahmR*b5IN2?_aj-S5Gf5*rT|=L?b^V&3))OA>+xi!$m0 z+`ZOoy2^S$cRqZ(UB8kp#k_{lvGyRPXLZ8X%UCox6M8m>3j0(IhOXcD+tmf(+zQs3 z@V&oRkuLOtb8ih4ID1BnBiwJlVWv`8v~Q5yJ^`E|CZj0P+9Pw?v_rSF5Y%KL5r2XIr!7ZAKIfwV>h7ov=1U6_^=gTMQA-w zwzqh`0{P=p4r0#YPTQ2w!N1pn)v|NL?WBkgQIkP*ye`nvq-FGmA77E-5+xbfnK$xt zLSj9U8y3q4A0m-w=Y2)$4a`6MYY+QIJWM4uzc~?cE|OR_F*6!&b-H(EaQW3`lP$ zl9$}b4C(B4c>7crc26}p6vD%i-UrljJhrwEd>`|!0LcBW`n~_@C1^eir~1Eb*Z+rP z9UG+j4scYhPFNOq(`7x5g&(yBXR*J-^&rOW-LFQ{o(W!5Eug5TdB@d#3!j*+Gct{t zw>%*^5zW#5vCgVH?-)fFM0iFbng0&i&O#Y5m_rX==Clq^>O?Ve1RlJ=j;V3SY=*9u zxWv$A-PRS=*85U!1w`=#%Ytx{Eg6jg*y4aVvAJA^V}G+^z09h#$zmFRe;Cp5&y;Ar zof{(;8xE>(@rcGab2g8uTCyrvanYw6qJq!jb6(40FsGH1p`C|>Cju%{K;Xpcvsygu zeb;-cEws5UiyJW${&RL0V8P)j?7b7;68C=pM~NpP&cAzZAq_J{Mw+bn zlvny@Rbk1o*5xUrC3byT)uO_q^LJYgc=mGlCH()ZzKb`&doEy-rLD8x@xlN7cyMw$ zes^&Cn7`JTtK6TC&jtuw)zz<2X+#^T*FF~O687Bz z9ujCS+~N z**#WT202hDNZi|C(OeL}Td-|U9`h|$l%XP;FOz`bw`cE5XHf%s3>a*#+L$bo@+pa4 z^W`zHQWQ2}DL-Wz0dXE-$Dw7z3h177k&5?u#Kq8(!ZuwhO1jaJHv*{Nfv{M_!XXrQ zq<#yBKMPZ(d+076B)}@Ezt1M++ zyEWKi=2VjrNGx?c%}ARXe>I4<-tj!@`(5Y>@Ya3&Izd3Y$g)S+d)2lCXqk(zR=xsVO@XCCAGA?YOr6BayuQv?XfiK9 zpFH9Du%rR8C9tBTSQbb)9TL!hj8?q6VW@=i|7zt!Gd3J@qbTMUVs9}-dyC1W?}3v; zwR0pCfR?!k-cF`ITwv;Lcv60({6svMWtGEBr3-^wDyWJ!7gKg(AM0$sUa&}7G*wBy z^x7msH>d%PG)%uya?L2`meE>_me!2Ju;)?wnM`oCCKC@jRUHWg@BRm%?~`wYF+S4! zLXCz3vJ7!9h7<93qmr$8Qx!(KDl}&uF`dR#5kP+;LNH}_Y_qG8=)nyuY(>VUzP6h- zfi;vTw-SqMve0998l2!zn>Hx)=>p17vgHm1%pjITeMdzSHUnn`Tz~fZcBj^cB?gLZ zdV^$X2kDZJEL0MP%HEA{NN<&(`yE+c$NYXkJ~eb!s#j>eKEk`2ey690=jOzvfCO)m z&)xoq!&)MK&?Jd0!^F6+ZRUB?qi=ON-*WG+fvD>{`XqV>eT!Pc-g;7Onw8JYJZR(fUM=E=uW5NN| zzt~!RGItFP>-&;UO&E7d8mE(S%_bt~Z%P42q9IzL4<`tFLd=hX41h%C3oM;Bv@QD# z>fhyscQ(`Z{UtA02J!^o06IwomR^?E>?rFQ}-0HPtR7fT7aaiUMpS$?1yGMFv~kOpUa{V0sIw5^f5 zjWoMc+x=oF;4yKCbeL^phESY-g+u!{KR0_0-{8 z?JH>{ndaOggBh}msZ&;1tn$Nw3GCq`z+X09^Z`?OM2eWc`AtM}AA~P>bp2ts-AS-I z1|^DD{Xp-#;P8bdH%F%uSI>qYG3l_Fh)ZC+1+~N)2O-@h;*FyEY2$~tAi=vX=(vjC zz|~;t2`PJl>mU52tK42GQzwVj+6!w4WY5bu=y(QDUPXI+SXZijDij7_W`bKxsE@G` z&82p`{q7t57Ele&yBcTZq4Ay||624{Lkn@{T8g(jVo1_zb|Z7~mIWEN?jr152L%E* zr>>WknHi^E%ezVAl*UQ)u!3VGi)g^nyRg$zXOdx~6idkT)q22|hZ>%?jvPn?Bu~vt z;iw3JJ}0OeF4+=yypEm0FI$d%_+>oqx#0kM`I27r#L&}hz(t8d7WvRc6dO=IX@MZX z^49e6<_aT;sSU=xuz~i8h`GIV-g~N-(5Rg9XS?UgGy@ty`vD|#f4yCQI$UctcN|u( zdy!Lp^iX0yk-XYn?08v1A@t8)-1Q}ff-A1UF|u`j_&lU>sam-iX;c_V3B=YyBbgTy zm@QVmgW+A!$2s<9kT$&>1jyP(1w0Ix+r2HzYY;0U#_dE zcu#fk$wPe-wT;r*G0TZ3Y_zIFvY3amaBzU~+Vdic1r7TH74;RxV&fW_u+LpNpZiS6 z`7Gcxrw=>PGM@pY8|<9`wE(IK?o=+SPLeJGjtuLj#Be{XS{PcIVpQ}DX%UALqo$a! z8SZLjbgv!r*sbUY6-mZrF=h!S7$%L1Hb7V}vub<=^b1%i*YsWF1sMVqZw_Duf=8W$dPiO>;tfOsLIzKjle1&2#ah4 z$KvVB9#Ymd#%tuKva!1~m>px00;V|??xMXg0fQug6JuyjKHtWD4;NICQ;F$qianBr z)t*@-saUSkOmfy3Yum8njP%|^C^nqvD;HK~Dhz|sI+1PE-oRa=FjATy)AnJlA_|l& zn~Y_JutqwEwR0Ymv2oyitCKe)}NCQgZn zgc)|hamrOb?&`prw++VAPianEiNiq^rS`r@8_g>+Ey^%@RO251oVB^9e^l1#9$s*z z73{{E7%j?((CV~YW?m}_TUsr=7DqIY5)os39X-~W7>BjQUM+jGhLAv^U|`2GlCga( z?oGfzv~+WiSsmtwPF*qC;)<3Ub_tUIgD~!xirN@Q;n)<;Z5*bcV!`JS?>TqyzW#Gh zV|U>Akqu`&K`2U|#cY)knzllNV+yI>Z^+oq)2eet8J2ylFvquwqFmO&W6&A3=(j=J zp8$G8=T4oU4bQD3k+&LF4^jBkr%7`OMCNHJQ3SH04bg;?%su-E`YL)eu`?YcD!Pd3 zk!~vX5JRt(rdt;NgqDep&)zc)-7*9#*F__9pgh+|FZ|?*L}d5Y?HyLY+ihE}h!wZy zO*$b@u?6a!P$2H}^tA58@I!ax)NTT#B}J+^^av&mpe&m)9{aezy=UocnHSH1)6f@u z)pu)&v@QN>d=D>vZ+L-9aCTN@UNjRr)91ip3uX6M!)UJBdT@@EfbWq0;MD_8=3NqM z7! z6t9PReChE)yZo}Vw+V~N%hFfc#RL|HjtU@J?IwG>wj6oM_pl&%t&HYgP@u-xwy?TA zvXfe!JA{rrWw^GoCN;haaqnQcYVPcHwmlE<@fZd{Hic}<&5$gt(c6KrLhC0VqMKH% znVPAu@_7@R76bkdIDC}Rj>TfjvCXpkLq4=)W!M#?Mb#Qp6p+OZ$3RqJ$bA)#{ekII z#WvW!ZSpX|kBaE3K!sK4_?e?(YjF=a1;#hrv_Dmy@R%vE0DcJ;Gj2877}!kF5TOv+ zq(`w;Fgya~J5nbX*yAGAQ=CtWK2%ALZ_r3&Emj*Zm1g2~*W9WQ!#38iSj#)7O5!xICW(B4y8 zZ%?T4uO9F7-cWO{9@|{P6IhmCTCmP~ieb}fy1m&$=UpI2+x4?=hgCLAo{%OF=#yCE zDI#LCOP^*5F+%3T=}eya7gkPNJq$IpxdFqxGZ?LMrRKa;9<#;*#*(NO4`*U0J~OiU zIWZ=Y!d&L&p2}G#SF>#!-P+oW%vesKB0XDSM{?IIw^!a2S=GZ!?zCXdaoVtD4#jNc zhHwi`tl)|{g{yG@DaNyb!zrB~57=7+t=bSTA}>ygw(Oy6W_s5loAEl*zt&2r!@dYw zbkq-ex637|aCP5=ij2Y8FaiY@?A1kvk+AKqh}{JVT@rGQSH8VK`>H(^+)46;c)VYU zzwBBsidc@WsgAjPxuVd6br};his+O*T9>)7(bub9Ul~dz^qWup{+?3$R;k?A_CpW5 zA!gy>^lqghlqwShiehqM>2u4<3^9_c-2RrQ$x*5zIr&MST52}OWqp}81*2M!b z<)bR3l~mCO)S}zcCS5kkInuN91DTnO2AnBTi)yM_20aqzm<(QMe?sknF|pK@Tr{)* zu)UNqDV|J_2~X@jO;(M_FW{-u3kRqkuyvnnPK#K@XzsjIBfT6bz^M0A)9dW=d|(+W zP%LTVR^-@_^v{OFoxStc1(Y-ZTaAoLC`yHTV#g>{&)9xL@YpqegK{nN1+g|^>3TF0 zKq2-`1MWgf^}*=7_OQWy3`axV zVpzIqW}BK`*fwZPAf}5fty(C>v1I8C2pfn)*HyOJ7OW8(w!^3?kT4$t)s~`?E($11 zrT{n6CespOS1}z+yKd>40_R3$_$JcM#rZYjQK|uUFXFcmn`s zz~>P{M`2{?j4ftqrwVYE{WZSeK+EnOpJc)Gb@!2fr|g*^Nx9Y*{%mX)cNfkdGV)Yp z)w)oow_#NnDm?3Gh#DI>wy%M2>L6S-YWK{+-=k@5zz_BCL;aS-iK9EBkhh14=H*F! zM%wI653Xp2WKfWvRllfgXuCI%%c2t9GM2lJ#lRRawCeB zvmu()rW8|@J+*ATnr+G?QB!$x)U03( z82)k9h$W$Sb|g>Q-pT9Z!w;w9_xtY-@MzTQQ+SXSYet?r&X1UDfVRQN8KDIGXpbOS z7*PHcN!FoQ{q3QG&GfcE(5-nFDJ=9_vlf(XZK}$55;JxQkQ?2g*zd{|I_`SQlvm_- zVRs^bw@XlR(pX3wnP2dC9ngTOEZNNRo0eBIlff31GyC0|3_LK4XN{Qgig&3t;N_Q{ z{yJ=SYg~1@-E=sxwWX^D9+-13Ib~oZ4oG}YL;Grj%Jn}`-KtKdSJ`4wJ{ywo5!O^u ziP%%4+aF~WgQ+UgB?zz2KtlTfwvWGRp zurx#1!aN(KH?)tv^n@e{e30Sfk&ICI78vaESQ`%=OdCp_UN_|uJs>GM?qybFVj(7! z&4W|tmqki3xy1QL8xw|l&)76{+@4}`avDUF4@W2b_apvElBC~#qBnlb?ogFc$}l3R z{ZJ>gjc2r9h>j%%aq_CHn(3Mj6X~ZiCl3ef?!g;22N{G#XIz8cTDya;Hvkb}l~Ul5 zR-t|@??N483uo<3#X-)DO}QCcJNA)L-(y0HefRWh`d$I9fSrkzJO{S3yk@+ zeR*S#3mwKf48}=(XXjMYefCp_H{=Ase6_3J3J677uz|F~+Snfn27!NCaUbjtZxyi< zazaLOoCVL{l?0uQR}RjqjvPN0@_|)fECw5d7uNPUUH6REz2^ahP&i7fMyA?<>)K0w zHtv)xLKnAWOUWeExgAWRje>H_dql}bArJz*i4hH8LQ4dtwO`W4yrN@*coenJVTl&Z;F*{-p%8dCz z2M-G}x#eLq`@>_+iWG3s$J6h3{?M~7D_i66=LuG{r_xt>sK5txJX9Igfm?#_d$~ye z{`m_i#5_C8zq@VWmdrVzETWSVTi@>o7wT!{GrRP@dtd;Ers!Y)5%C)5RKK z?F=42dD7M@b>2^hw26*YskQ2YV7AGHAJCNgGPad^ZErfaN>EK|0Tc5x-mR@=5$N%s zv%8BD4z`B{^u1cIK=wGf10uLQxXt1FyKGrjcXkdR-3qG2d~iBXQcI_)1I-%$0~Z3# zDJJZstk!5=Pw_j)0NER#UTMrp&lDAwS@OCY5Wz_?+xIKnzFRbGJTRPO6&iceyDg5? zI*4pwh5$}eEpwEZ+hUWWH54Nek%8+9X*bD=ZB32jmJb{!sL` zjZ=X~q4PF#AT}ha$wU<;APNFw4jw0*tZB$D!IaxXXBy^or2_{Q2WD0%pnFDHLyaVh z79o5aITs4YH^KIE0bkn_U|Yhob(Anwj9q~N=C88KiI;{r0!3Q5(|gT6dOL5k;u2Vh z%F9#*_Y$u*zd7@(A~o0zA%-2oBl^!$F5l?hnvy;P%U3z6We(s_o8JPB=W=+we1CLm zGG*BVv(8I|F?JT&e&1ZW(X2XUDP?s`sg+H(Xm2M%F&GsWKHDAcp0n`=JV5)mi(Yy$ z?a}jS=N0_y*~>y)(jVETuB$$DbV2c5&5K~KSAfWUt5M9dE@{_!-u`ZqcWjnnL5R;Hh*HxW=LIe1WQb!{VxFcf+6y0<#D|>SI9R4G_ zOf{s^$!_toDJQdjB@4!MLdN5+WD%0Rm~5Ip-P!i)iETmHWQG&j_pWTogy8BP?YO4#}RBSVY@bK3BFe(P}vtbld3M~s53oGKI@xzAVv~v zLRzX!yLya}&SlGnu+dJrvjDjB_FU49t=m1hI3z`!WuC$>$CN4o)363s4jO&Vc2S$xfCd=PNP}8)4?PC7$MtbCma`HBk2U9Z`^& zIB&gXUveBT6%1&My6cM^bJCP68dO`BX(Lgu*Q(zw>8Z9uqTc^5VNCVZ6PbD+3*OFF z_RO9Vm~5HNK@_c=CNapMK&^u);=MS{IMY(OufQLHO=uAX>gGnW&|WdBW4qM^L58?Z zk=@X)2^h+rQ8i%K9!72KV%HlXH=TasODD^q;B^ zw0J|gMk5mE>S7r9lHBJg6kr9nhPe~+a`-s-{vMOUlc_gc@BBNzH z?TPe&ynG%d(zui3MxDd?z*SYX$eG1K&GDgiICE$3aa7Hx&%fUL8qFCH^H)C?->#|*{%qIq^%;K; zcZxn#{}fNobV2(?Ft(%E9v%g1>necza!D^ZN%vw5W48_Jtj2Re;b_~9RJtBaYUNdp7Nu?8=$*7QT`~gA68dR9;mCu zE?W+SUTDSpX&4&AP*972TUd_`(|c_2&~gh4IYAP}6A|rnJ^8&Ni;yA&&&$-&Q{->I zBDBbFA6Y~Ki==fXCLZnRBKt~#Pqzy+4w*(W_tqwBoE15x+(NiCi_)>8ApKH-`I%MZ zKV?zD=KAE#p3^0K$=CHHmUEQEbhd+5rPgISMlZ#z-`R~ZcdA{}opjnr%4O`367o^7 zlm2U9mf2mL){)lbs`JfllYEQUrmuSaL}za24A9eZ3DYpM6aqIX>C@;E-wt#r&`dm8 z6U$UinOyCziw*qKox>F6$$4DDkv7q3jDN z9dax04&Hr#`1Szvm;m^_-RCcNcRNFyNZTQW;ZLL#a4^9M@@k7160MgpXx3fFo>a0Q zhBaSUhHN%KLzx}9MK|}C9uq&D`+a&{)nM|~pHjxYQ>^8+1tr2b&cHM&(+2=c^yy32i z;YEd+E~DupXCo)1irVIFE7Ly7TTwQaj=*AF11VSaC+&TUnGf2Ut9M)aEA%ji&(Y+1*Jr2kR}`w(&Qhh zAjhPlZ6>*|Yg&pO4D?adIi)jDVS8NzPm*&KDoV4#NpV|??K$!+%*7Ac4g<0w44>uc zr13WOdNg2@L~>J6u()*h`l+$t`Z=BW+|`tamU0ET?{U_OO$<01zcO~=u!mS@g52<~T%$f8sc!86bcvE`WdzNl zfi!nBZX-UT$N2Tp(Vq_wXoL0>j-uW6bkbvq<7q;%7pGj7gO*G=Y9Tf2;mg!C9*EkA z3jZmz5fW(ZsHc3KV(ejvAe@x6W@rT@)5`;$3|a=t6K-X~K9b5AFe5s-7VAuoZ!XOt z9J14Nz^Gt8B$ta?p*Bm@7e6e%mx(UROl6admz?FwfhMis0iFtJ8|wbRxUYEo!Cq$G zP%1R5AOfzdlQotif8pSXyi*-NI>wZe#9;lg*ttkxOsb*PC{Y`FV23HmN&PXV85{qjUIa)EaN6U) zj!#aH58wa5-a&3Cbc1IUSp`A5=n7CM8fq&Uo{2E~nJ9xApiK;b-iOFPPJ&u$!4eL3 zRYVgIGj~{tKAUjN9>C=sT|%BAJj$5iTK`Mw2rWmk#)prmno&|H4+))yQKcf1FiqgR zG`P4nj^gQzlD}&zpp4qZ904!tK!8GfYcG(nF@3MmU5Jwuz~abmp|FgeF)mG62b!30 zCwYT+&%)7h*cetFAGTtui;mQ~2*F|l>hwqIbJ(XT^lQhN(!DY~XV(H$T z4VZIA*WYjhe&*)G4s70h6wdYYmP}&YcC8q`4)J!0dOn%hYI!(2N{YH1eX}gB$}@yB zAu-a6OsR9@T$Kw}UaIxCB-F-=aLH?W#Hurn59{jtmnalaY(BkBErsAjF>=mYW1P}h z!|3vl+p83$+m^O{iWjUNKWAS2`sn@X!TZzk>0du6PhGrCha<0wW%kD&g<-d_K%k8{ zIEg)B-esSxGQJtpPLW$nJQLuohIy=lm|Ih}#rUc^$!v>D7Hfwe+8S0ot;ymcO{ z-tMr)7{2fOgPvZki|cH5&$#(s(6=l(liyAf4gq^l0HD1Bs*1ka6 zfmcSopR1pX9vn#M#~<~#o7EZ*pFLA5w|H|_ygrR4*x<_(sj`$kj3 zi7!UD;vkI=?zS8`1`(g=IX7iJu>?uC$Xizj-*2GKCSl5a1W?h+D-&Q;~3 zh1Fv`BblnNT3u+bJkLP0#Dt+36TPg`>J9~@c!`ccUVd{YP)^{#snCG4WJj7gnk*YR$PDN{j%g+3P#2wk+9D6Avijx3afw8NYj z1!4QkW-lPdFq8g z|LpE7eIB&bbzu{tN9r!kxqjf7p_KRpP;7^MKjxmXbP~PEFa!!pE7k=segeWV3+O1m zXE|RyM~&Kh1ez`uf~t|cOoS+z>J1ZqzoINMhdr^oy6Prg4m9v{4aee_0a2-T@X z+gt1xQM$;}+BU6VB?(U|s#8a->it~pPD$w?y0|Z%k-Lz+rM6+k4B>^NfH9gLMf4~U z(7h_W|1w$u!FT0PMMiAW0W{Zl8C*z%Fa^Z?9%Z4E2DZy(HUSuxR-+>j1cd zYcF9TE81^5&&Gh#Xf)&M*N45{FX%Fb;j|FXprB(UMpt*2xv!oh3*f-5xUVlzzuz9b z|KaqPjW zld3W56*uUM2mbbLIUnO(o%P0kIRZ&A9$z)hYWVEg#rm>NRHfAL@S=O(RXmA7$OKSVe`1_;dpZ1U69K0ESI6gW(VwXW(h@@aNyW?Tw zf*~A>9A2?p(GB)T48`L@r84~7=k^HBk5ENNkv)(S5J~ciLR=!Q?uZ^wo4U@$75CX* zva2lP+!ghE%VzmH-sRr&e@}Mde|uj13-o~sRQqsreA;WNB&aZ1VB?p6L$l*Q>{2pZ zUV@R#p`^uq`SL}`50iR|{uo0v&qGi~l;c1vuq^*rmnu3mk{=47?Qq$w&OD95=qRYkQ#0beZ3 z#LoWOJG6^{SLuy+YfHkb+zO$wMr_HvsPf91n=C7Uihk!s1H{#zOdd}reK|FYYNU&5 z-eYFbH7aXDx`-iKpy%m=5Qq{i=+X4*XoB-6=7~2L8&3k6U)*6*sr>TF3re(r@h{M{ ziXvu61ZFqqXJ2KG^MfS=e3zGS5;fktJP;kxQkzH61^WVaxgx9>R?}y2WFwn-Cs%7~ zg7;^e0^PQbzic6EL8M5yq?@%K@^*gKv*LZ33?_UJMBhhy-a4J&Q;8#_vJ}ysv|yvG zQW@MrzGcCue41gDx;k~^B&q<8*p@`7TrV#;my+8wdRky9jNM4d8H(&OMMKqYi49Hg zOekHd4WfUgl1ZDem)1>Cd$sOgC}(w8PPX5l59DDxERBd%vCye?J`GC zCQ8y&@**_ZCG)6ESQ2A6nIH;l_t<*FDlEm_j!<84lVi9RzMh8dtQ4`lo2gl-u`aHQ z@}_8!qMbc^SApnRa0_UOJaGM6ZgP-fVa-V%2`Yo~q6yfB`R7Tb4m*4IPAfSOcTB2% z;je_!l-;0i*i?K+L@tA0)a|gH`{&%DcXd0j$G2D2CgqxKK!7Aw;zTK;`j>Zae*^}6 zY%*%XGN6p>tQl%UBzMJsrk~Oi-W`klqOyF##5J4c_`mE3ND$+Hf_g4HlF8%5^MW(0 za)V`{@u?f6!|aQ5Tq+Xp)9*mkX3iyrit5$xr{D z-UdzYeT^b76xvJeLzOKhP1EY+n7+2js%1BtaP_W^r0cNY!=8z2%rf67wnxWq!rB-F z`)WWTWidc)--NCA3{`aA7lvR`yUL2!7;rV8Mlp_PmS4i0^}S{tc;x1%>}b61>13>U z3nMIFvH2_ki6t*u=MG>^1tmP+F@iv9ivR;LuHk`3bGo+`FR-?GEF}@F(brCuTa+d0 zr`Idvyo1go?~YCn#veiSHVS!{^C{(gbc7LX@7Ti{4!-1l<`6(z4&%uju`$qCuWbO& z_dlNgcyxUD-}|SBNAKC_-aft%prO8W!(RruXoR61WR1%`4N(;hF0L4T+_=##tD82m zqDSsZ>4>H@nHg~w0j;uG5;+TLN}>`PY$xpft%mQ(oLA^YjhO9}J= z6!4!}RZ{$-l5L}I$pM0>;0#UfgQO5=gOd7id6)9JDh&9hH5duZix)0X6d!n6EZBLR zc36tCJd%$~?&UJYuuJ8-)`v(}l}@Ud4dl=qe&L(Ds#I66>RG;0#v`nOlbn=LMwxL9 zY&UaW%uRT-|K`ncoA{n_#dDP%rx9uO?ED_INoTVbyHn>SYnAOY4o><*Cfe1E+&k$i zBr^w|w2->RXz(FAEa2K{!Tt&lP9cB2bZJYtj5~ zZT%4~8sZidyM2x_CG)K1$3|SxjFXzF0dj4t0%uJPl}Dp^udp*a^xg(vw@&Lj#yj3zu66Bg-`=mD-V>FbNc_SXG5*s`kYAsi#~rddfz-r_Jtraz)!C zn^W&fMYZPMf_1m2yoD6_HaO>^kVvyXyAD9({Ml2Uh1Psn_iL(FD9W=eF-X^~CGI^X zbYl)~Ati=4(MaFYJ$$=eV=Nf>k5Yij?d6zA(|DY4dhzjCjjj481Xs7L~(a3(&zoTuAq$k5pR2CU$hU>r#w+RfY zx=Aku*sg9uGyxOCkj=2d+k4||>V1zN4(AQ%7^^U6ihL$OATh{fBIYo0Zww;H4(>S57G~NbfZtvW%lM%9gO=B1x*nR@s948hp<@?k2DrPPsMZisoDw)J3SnsnA>$9Q>_l2>CWhjf1Xom(T2<9(FSe7 zL_5eZ+(&Nk9EqdUik>6);hbwm;`8h1bjnigCIkMQ);h8iF>dj*HAI~b9t?+$AL?X* zoRw|cTF&|?KkT$U_H{s~3l4LP5rH}RoJ8LN+5v~tyMe?yBrCa3nca5{iwvE~JE^H1 z6`x8riw_i@n8ApKmvefHzo9!Rcn%hLCa@m`V@!M~9EWWf9f)-v2hf(slmkH&1kZPO zCCQV#Lz9UvO|iKR5=|z^0nzHJ!mtkvt_SdW+qdk)8nCLL(P}Z z(#9sbgX4bBFRe-b#eGHl*E9I$8&QQo@&y;&Viba4HZM}U$kjMH9)g;b;Wi81OzVEC z?ICW5u9i@HDr&R2VB2~unAJ!ElmtZ`^oX(Mc6eWFcHt!G70_wHaRHHElX z-BG}NgzOo!kDE_F_a!SWzB?8Lj*5&A6jT(ki;!vAsd*3rVUUknGQHAep`4r+&D%?fbZb@63$S}bSl*Mv<@CNFniqN*+W9*t%v zlYY{5mtlugy{A(YKjZEO==tXSf&eD&&!Y*8;w{7(R{;-3fDo1); z^u^s2ahXq_#!oQrah?PR4^X1OaJs20Iwfs0sy&dRz8!IY;O{rzd@~F-VU`o&VlI1R zq=|RS?#38qu;BvKO`M`CHY_RbZO=e*qPuB4NpUI*&m+k~f%d-bKxDln3ZY{Q)WAk9 zR=W%wtlsBCAvv>XcM;c;L7ZSjdXfc=4%yFR<@tkaN0tJ_$_m6TmXcv9c3}RskX)&2 z6XX@^x+#~knhr2WDBi-&{wG+!f`i-Rmfz|p7`yOFB`&rmClGGJDTDoD@AUO*Mwww@ zI3N+DD}xSIVg>Z^?kB}!Q49Q5yf&q4T|`|A(M5qa#Z@apL2D;gfVBZmrGHSiCMB%2zKv83v94YWRg9W9~yz5!8|_QKXMw?>6@kIWNs zV6!#b6}F82oT-NymAUp-;JmN0wVRGx?1&`D4fN=*WTz0Tp4oxbB&F+$jQ(Y6wTCMV z!K0&mEpDO+i4xLdIK)Tp3#W*O{>`+NGX%GXBMHdpnpP`5!lQFL(F*Ku&J?<>&1VPq zw62mjIrTzuDQdNRtyt}6&gs|IqMV0LEnemXmf?-M!*f=5^dNrOvlhhj;6{T9yP`AJ zm31PflLlT{%M4g>&zZW0(mj2t(30)* zvt(Z4)i}wT9X{UmFv#Q)o!L%QteDo(4bwKzGf&;+-7vU|+;?h-9b|VMttyfm2s||q zgzR=jt_1C>2mHp;9!Xu3nFXaLbRSOE%@l2vC`e$FE>|&I5#jsz)>eecoreK|7H_&- zw>K{-`-Fh%yAnx1&>eDW?EVUz*k?|W(NMaxazb<`j!lto)FVN*jDI4YYJlz{$tMMMY-csQ$VBXrk>&VnH{0cS?- za1|*XX5{1h!@op&r#}ebtXzVq&#S}Vc>;2i{i=~jxLs=&S?wqRfk6dZM4R>@@ZV+L z)OI{va#rUs&Fp*K0_r*sx#$8IB0xQuctAc;5z=v=S%Ay=ydT6rBzAgZeZBt zYp2eE6aPK^l!`-unH;>QqgFd72bvog53vvA78^ZJzNQp-*-cjYI}SE>A!qi9to#Hx zFvk02T$+dvq;5nkTV?oYD(@-)2uLKpm1GShmv>cpgC-L-MyS99ktx6};R}a+Rqq{O zH+eBDZz8&%EbDCM_uh+2jj1J7ehiTM^Xc^><2W6Hz!V_f+jrCIZq<~RRl2&ultgG^ z%ur$8WoZC#k)x$Jdvg3a%g97=iO#8x+dsjxLSz%RFsPT;7p#y+4+$QsPf&hJs{*%n zDA+a%MOi_8g*UNfV2bvHb%P!Yeza$c+4c3cDXNNhfX6l*&EJOv>n{_C#6K{wKI=wk z8|MT&=kyjZMslvDX;-dF>q7l>XPo~cp()oz9!r#INlE8il;~*Fo;KBs`zj3jB87cGLSfL>4W&G#pX7-_ z-XuY|S>i1V<@v#5aV*{>!j2qVUPUi=zxg_({N$=KNQ|FT7ME?sr%axXhH2SQ;HMoM zLgbC`jgw{OCNw6TX01JG$aiMhqDccXxV=`amk_2GJ(b@xRM8B_T_YX_bkus1k&QF`D+JYT7h~|qjZSHG>B=buW%9U}-#-e~r zb1J;GoerYyS+so-ZT~ge{&BedZn%9C{qXK|t92cTp8$%WjiqBd6`}EzhdC(3ij7P= z#Qu{f*EbXp!j)Lxu%V&}q5mi4%wI;5V3?IR6P6A*cn$jw`eJIs37G5d`1$ThpF4D> zaTbTOv)6j9u*Xfc&3BMSWT!#mHM$#W~D%s5~N??^^edB;YY^9_a_YKh?7^sX_x=$(4;Y~JW#d|T+E_dR63p6Nt zyqoMjCvbFS++0=c1Dg;y%cOa(%*3q8Lc>dKJB?@emI0(|P<!zS1F8o2b4pXPL-U~v zT2_j0@rAOxx012RJn{WcV*^oF?)DvnRZ(02&vMKR2CUh_aQ2@uryPoplv1J!Y=Ptk zRyVI}&Z$MIw9p>wa#3ESMvk;^IvQi07RwEen0Bgk6;p{VJX>?<2@7kf+%seOb2nXN zD(ISOLvC`aY)*Z; zqEm(W`@>&AF#>cfAiiJ;x#s_tHI&}qBH~fmO1V~XP7|}2%jkk4K(%ip+sBOXq92`$1Wq+!QnDW?8Hx38Kte}&7w$et& z>dQdV!Rd6b-FD5t&KhiuQL5}Nu!V15uSLwpCh7)N+hlnlt?QQ6YGJ}`xAK36(*=*( zitz3l>TbVv7vHYo>B$3kqpGAioH)W%yQJ8_X*(NdA(>AFGJ&@&Ex$6Bmi~%53rWk% zUv;u``Q51Gwjf<~kT8~v`tBCdz>)2%?*Y7_5#NI}rXRmoF4hl=^(96{ z`mF%|wjYHd+)Kuh*8V0xWsOY#d2;lgi@SE`5=Vp`m*`2l%8?#D?=%;s==rnta#fGa zS05wH8-Qhggts-SXb>F+?AK`9)C&X;rmrfXhgvpN;0zQ@j4l!Mo}?t8`^U{-T=WWK zPAO=nrl%Vt$y1|l2b8g+myoVohr#Mor&;P_kZLjf1L;+=ie=LQ%d@rFZYaOZ(|ob6 z+E(f`bCqEnG+)qW`~3L$Bx`iu2)a!nVSp4V+%)TP>NSdJ^Yx-VTt(P?TklqGhCo%5 zo}uMDK$E>_&zeIV>D=KI5aY&*|&di2P9B$%kTCWhu-z@aI$ zJ=sVR!~W7s4m>2Ge1{l{d^kbFp9v-EtI`Hz0+)10K|4w8AB^}sX{50U-Hhj#=GI4F z2-){Q7`+(P8LS^>?Te)fqi7DCzwROvw-9O4m^=urRtBD`2ji@`M4K)%*CxN34tY@P zFvqHzk;N71Qg6D**TX0cP6xVGQ4&<18}?__;GKJR3&*hVAc|$4@QB`LJVb3BzNBCv z&x7}gxOi0NZ1)_g3w_-?@5id6p5n39EF9~7Wupf<469|P>5)!gszWlvO$GJX0mu#< zCMdc8;Si1xM{kaX(f1tL@gi#wdq`E32$GKvF$Q*XoN@G|2YT1#%hfWiue-18b^DAkh#@ZBB1XCtP9}Yf5FLs~z1BNw%NchKnA+`ezCfQqsf|-TG0kYD36&vHHVc}BjN?azM5z>%t9N7 zNAv7Vl{I~YH}?!^&yIqTF6_W=3jekh7+n%}3n4e`7gecmx7or=(>3q8s(x;vWMfL=qt9*Cw}4!|DsXb6YSteLdgE za&SNzHpj?rP|3jRW^y_$?&LxpRsI?tYl$d_A6nl4Xts<18Q~L%ov8$KRUV`&aIiAG z;}Nv|1%1LVQnr7d5Q}8(({uKz<5jBzDko zvYR#)!y!quxigmbqnO+u{zTWh$Eewk6Cy5SOz*81x_Vbs5;7T=kROo0wZ+uV ztsj5F4zf|7GeO!iukQfiRrO%7j~BpUjKE(mtd@x;iG?bwpm)n)(X3dIOF>-(!J6KG zT39k7U<&0nrR>7B^IUebTpYOX2&jbdcHgKD!%Ov*r`wh0I_LWA-nl-%cdpMKI@c{w z)kf^m1zO8peJ0*mRob{yJ#5AA8DAB|Cwqy06;4$f@#=x7d-g@mxZVog`O!i8%Wg+I zdjnDt+~c}H<}o0Vn=lj{+JLx=(|2WDrYxV(D8=zhkaW{JjIP9`BlF^UmRneroVf@BZ0?!ju!T+_1kOSUt%mi`tOcXp zP;^u>^u`s$1yON4%n_CKYIbV_-A$nY#*0)m%h#z=DT4#|M~ z9}eL}|K{&$aal4|1h6Gt;9N>p2lz`p9LWf^^lfqkX*t~2v#HxvU0`A^U#+dm_HF9^ zm^@4<0f`>GZAh$8%96-A1`FjS5rJ6=)A7w!KE3i!uC zbAxe?EqmB?k<(40N@s-=L8;bs>TKG96Hcu(QIIH>`&CwuLiPdk!rkLZ9IG}ZS)!5K z=lQL=%d_(Sv~?`DH@O}HDcI029r*nAI<%X$ZKbAT0(8%4ApQlD-30~P;owU`1Yui*wu37Ygi#dEMi0eq5+C0aGy_xhaQ8YrZXdGvmJbRAtZ+%gKna!t z_MTvYjx(*=*KA^G`eH2?i$U>6Zc}c@RiMAH?B5cE!Vwb9M5sx!?N1*^KS@vq;wzWy zv;x_c?eAe?3yk$e32VrH9XPc%Z*Ii{bi!3q07Eid$2YLt*7NX8k!gTNWn&s(#^kC$ z?HRT(z#X!VIOj(H3knAuO}gcWuMQBFO_n7!NbFQ<#R;fZSu!2^VyXR6H|P*jDzTMP zvDg7uyLDx0hqBCywuFJE5l^pEQS-&{=-91@Hdb<{jpUG-DiN$>uFnz4~yOgRNu;x_u#XBJ9vr4_QU|N$1iXMgk?&b zFB->r-nJf52GEFH${%0+f$N|jO4SbasBiimk;~4(sk6eNM~c(Bbc^f(YQ7E-$w$Oub7Ud67EEeV*9#o0 z5+KQoH=Q=*H`X{oD>FRavE6u;kvme|kd{Ol=yC`fZPHt1i|iAMM;{J8Sn8M8IQy>9wzo(bEsEgbATl^d}oeV(*68FvXv{kZ7FJS;=6fCzx z1#pU)l+pM>`BZZ%3)*e41h0QMeCD8jO9w#yH<9ByveO&%fY$>DT2V$CYZu$MBr+dC zkpN!!v`E5WM^EXcp|R;r7iH@f^<=DC;sdmZmz*(5?>4p59+r`ZrM;|08vS^?ZRY2L zwle*y=*S-Mb1UDk7ZdmX5b?gJ+SYdMhG5@{wncVTk-Gf=xtqrDE1`!&;8_98?Rg0~ zsGSYJIwyZH#+Ejdpa`{8@~h!_+uccrNw(|gAnzMd*MYtPvL0^WzT}K`(6_23Tk_d> zx5-y455KPTP|Ba$N1AcICPOJ=nlo3Mwr?{_Dz&b}bWp+^`*va~M)BOr6;AAah1u%~ zSMwQ~xM9jyka>1c69%WRVl08pQ0a#U6Xu_2PVPrUR!w7WDmb(((aDFVlyY~IM>aF& z1nB`B#y>F+vk4AveqwFN3sRJ1C~^-neXYY|OE)cf^(TD{xCk{UG&0f`>ny!or4?%o zQpM@1ro&fY|1Qd=Ci4ow8XP}j&RCCLZFXLl_iEl8Sw=S+U>&?h12f~HIFMs88XQUS zKndn)VopVX{AM@PIWC7DX8W`fG}9UjkR0RW5Z##N^|V~$f&vq7Ta!k;BV^?0LpWcM z@q^a34ui#~^UJd>YHREKYzy1NztFv{^JwQ)q+ci0mxNw8K5gpb>>{42GiP?5k~I|Z zs&jvO9z>`873l`wcI|x#rRH*rFC0RcPU8m%jz*9+IH#yj)}-?K*ivSvu@?e7tRb1t?4H^u{=m8txL!GYaQYw`qx^*XpDt`c^;=UXHhF z65PeY)ve%N>R5#_eezla*l_4&b?Ih?VCEpUS7gw+cCGx&9ldF(*8*nlp%fskCOpL% z7id!_f5OAm$;d>|DIO{@EFNd5lOp)B4Qx22kK5DD>s({V50#Ak0c))yB5Q^j!lus2 z>>Vp1*4#k(gvS*V^{osK)pK0XF9yCq{Ll`;8E1zt&NTb%?wXCVUF_nXjpmN7-Al_v z0Fwx{uuovP0TLcCdi-dff<0)n67}&|N*IdKxt&Yu zEfmzY517a^Eutq0Ocb0i?iT8}L$%wHnIwRZDqvJ?lC6SOYdI@HjpKCWWf`|bVr7hMm*AO5BkbTvT=4XSVG-Mk=msL$b^9Zb4YSuW;u0mUVh&tZ(IDOd#U>A94kk*~)J$3?sW(@+^Qf$6Rz^6jYH&#W z={51I7AyB+K&j>Gax`p(fZ`@3f3vvG#Z@0gV=|AUi<*1Tog3{=0@Cg#)o(kEb$0X5 z+O*Qj)Uds=o7B}ca5>&8p+m`BJtech(B=t-O6r(fz3@6j$ECg`osw&18|8KV)P!h7T|q#8OsUk~&`^-}R~kD*(pE=jiK8bdRftJIcVQ~2;(5`h&eWastC(pCcNjprME zIC0lq&#Bd8d`35YUyz-EP6B*Q_yD_LIyfYHN&odrpMJDE(D!;=clJ1BM~y)Z$Q2>b zIZ?bT`)^6w4p@14$x-fI^#h!$u&aG9)|_qDnmMAmx)I-B ztxoVP5>p@$+kljgD10G~?~+J$)AGtz<|jIvEgfroBT#D=HsnfBG1bMD!U|X8rb4h~ zLML<2YF%I1AuoL)fQF^Lr*vFGRv?*RfucgTT&CwfgcVcVX&sy z1I%o244iF5N2@cV8Yuq~%d&yBEa=JN`|ed}olN>a1QFD%V4+qV5B%^gEWXwYI;JTj z*ZgqsBw`dKqSfNwsG}7$4MxIDBhGHAl0A?=R7UZXYBw6ZnDQxGl{CckV)A$`*(JCs z%SGL{yp{q8rrH{CNPK^v(bTFk>>5sA-2zl~tOEF;At5R^NCu==4_M+>kOS4yeF;U$ zgl1is1Up`5Jhd&9v;v|YXROA0mlo+|=NfX^C6%eI)YvtggJ1_Aoxjnl7kBg7Y`{Z_px;AXZYPc6JAr~s29b`M;X<@I`{%zL2}aJ3^&g5FD!LUeLi zI5y*`dw9{(D*(}Y#?Yt>KXLe@Uh)hG4-aL8e+H(1BWlz~SuP8R=qvz}j+Eli;U5o+ z6-bJ_C*Lje0L+peTKWXecv*Wr<`h$`ab3JwT1qLsl9lC)U{jk^4VPu{DVr(y6O3=m z{Y&`tjT$NXCJ9OCRbV)LF{US1^-d-izseNb2KW4(+?SUfK93` zDxE}LUa1i}liTXb8{_n&JpK^wM7FNw69hO_QYOXe%?z<=Qxt*^Wli=>a=*7>u~qx6 zj$tkcv~%QW1~H3FwT(G`E*4y9>AcY(BU`CaXwB04jx*U%%;_mlwuIqcEWC`2DPGnp zxAhf!eM+P%*liNRZRq7d!Vhjcy=Q<5X?ltDNQFh~+k3;vEKFu#k~x;yMNL4|?^#|U zYQ$7b`8?te>%u_jL>Gv^mw7?;2aykz@(%fso)V}!TiH@Dy-}=_wpdFG!Js*ke(Yv6 z0styGm*j&{J;`h63zv2wLIGSwcw4uDF?zsuK@!x}6Op&w%I!-IQvv-?swO7j11~3& zA(e`<`XY%M5esqB?7i{~U4xJalab*q-FIkJokCU)mziCn^>AhAy{p5c4K_04IUBaF z6RC_Z>NZ>pUv*z2hSrNXeqMOSPqudy)WSX6vBXpw18^DKC0u28R9s?${LKK|@h?dY@ z76OP&QpPK6h?54E6(!6))i-49r0?B%Q3qhmAYI%o;S6>yaR5rrai&sAbAXjvBr%E) zvC81fdgU(OnljRf?B-&a@?o=6g|hGf!+dk_r;k6hO&{(d8&u3AU!R8pIN9;M1G%KM zC$-UGHsv!a3z{3WJ*KWsLqx3wD+n^Q3$#0d9v;|-4jV(aMaKlmN%Lrm8DvIL*72cc z@fUBQo?yuU zQ)Awq0)hSr4_Ji8q=xAI7Z}d;F2NXNe9K@T zXLJ}eK$;%C?rkv4B4?QWlh=ob(SiarquWG&nK$@1t*69{Grj^e8G$0|DgGhNL-T;osNd;k5P-#}S<)7JrdXmM>28aBUagH)^@4={x0+$HUu z`18*_bFP6yOTP`G%94705m&vlzok3>+~4`{-JNfC#>vn1d5^Q9Nhkdr$nE+&Q0FPT zLwdD($xg4unyAFt5LWPVlq=q(w*Btna(s`Rc1P=pHau{7e$!q5=wTk-k0B1_@ zHX!CcTgM{I$SGr=k)0=LJqL6YB5`KAy<7&J^Li=a?l zWtic*oBnVfJ+XT9gpJZTYLfXPUTlsV}&jvQBf+~ zSOlVuWYt#Zh9u0$kwbSe62W8BD3$V8%{GM@!|RZNjsfGIMeWSXtnmxMGmABhNQ%+P zgfRg%Cw{a5ef{$KBCH&7uZA5Au``)Qk0l5rb&|$gM;Hs*M_%{nXu%7d0IawE>BQ-X zM)CG(MV+11^s=ho)e~&)gew~NXq~yD?;b;v5sCgz?|L^E7|f^!s?g=mWQdSUe(qJ8 zST&tCZ4kd#F!g}OqO6)2`P=BL-Q7Wi2^>egkHvLS-V_m^ zoO<>J`~@Y0$ZoUgnq#E`zD!dJ>ydH_x{Qxo>W-T6!=&Mw(xC_2=}R9}u8DYEEzpH} z=G@)g-|CCq7Zkc>_qhgzv|7b~vT|tYG zG#JTKNRmElqkqo;L#}2N(7A^pKYQp_eN*6()(8sd%7feN^!uGZ*t?4k+M>vyS)()R z4IEo7MaM9^oen29%E+OU@x?{j=eVg~?0z+fUh*z^x%-l3`N_mS5l$up>xl{o3QsjS z^OjG8+SloAS~olIB(N$xRmW6{4}^)!L#LJ#Gpm+ z*ncxINs9%&>-K%KS{S8X5M7^r*ra4&#jJH_j4L^ej!Qz7=E|r@wA%6Hs$2t3Tx5=7 zRf{%l*~)K1p~(=hn$R%C&Pq@E0Tn{Wh#{A2w9&-P)jsk9LB-Hiz@z<^6#iMF6Xrv~ z<}Rx8re+7Vl5uZBa%x&9Niu=qq>IvxPho}F!x~6n^=yjE1DSD@u)KIY1WJ1eok*g; zmTPp7a(OgG;KozxbX_;)($V0gI#%tWq_XFD-5mYfvnQ_L3~ryGb(mpa7;Kvd@NVS$ zSoxu{W~*h_fubi9WL(dlOx&c|xRyH{MclMUySuOUHe)Aw0JiVJ@G-hfSeIIs?rGz# z8PgoCIFO^>GdOdqTQj3qnpxT+rQb9awS6J=re)7!I5<#}LA1qzMS#y1xykYDUB!q1 zsYOrRgYH$0LqRt;`Vtx?>C(GmZ#B)P%obgSXUF5CKi@wl#8ErU7|3i(46lqjDJv-p z;1;p7Ei;#DH?!6p>Aq=9y)%(X(X2=w)(LHD(%J@|+{b@=`G-O-!F?+*{&j86{V zzdq>cy$4k-JR>+OT>UYb{lbHU6LxL=ajS1!#rk%AvSMSkQ65kB$giIAsv4WW$INID&&+J z2ocs*vqM5py@ey%BGFVGrzmverd2xLfB%EEGWJ8<$X-P|u$+J9j$4p*E{)o#}Z z5kf*cf%EA3?$-_~ZmwkG?C+%Tpp&)99fv#k-QmgWD8{^&{m)f?{7wpwS$46$jOqFn zxr251dd&`L9E2PS!8!0#wqSXY)3zxiXrxb85fcR!m4}?H2f4=o>+VUr+cuK??q7k( zqXB4B&|$}up+$KdSx&SgAJ0;D-abh~Q6wlarU(WAb;S06-#YsOD9Jfy-&@U_m;kz~ ztGlbKtE=lsRi|(^$xlHxB?APrIg>%^Rlk^0{L^xbUc3_1Hx?OE)-csWJI_3y5auoJ z%6V1In7z6_N{v3>2^Pcu<1JN{@vdOkqfu=}xfr!C)if&4MNUCEh$3a}9sqrv+61_*=jH6q4G5tC z7-KSR=RE$?!FH6*^1-=PB6;!ZNie`Tyb~B%G@&I75P@FxE8!5XdFtxLN9t%*9(KMv zhOme|}X93=MW~yoTG+e`ELM_b%Fw$?tcUSpl4;jKDH*$m ztv3!R@2qXk;nEf8B3`h;@4Cl{#V-l(TZ@GBb1|V1Shf%j(d-I$lq#Q3$7GTC>}h)X z?5SJ@fYg#n2*OmWgD$p=;mZ2j8h&2cVuN3Nq%ZYL3fms~i(JD}mDyQA*%jxZrEk2- z#8$=T+G!bDT9KB~s`7MRIYB7?{`dP}Au@AOEovC;49%b0@CI}f8fGa;UnFLl>&9-2 z+Z|66?f>I-#iMrrv=(i48A!BAP&T_#w0<4LidfsCz5n6$WfxUwLRyxh=H?akOF2n? zQSM(@7Y4Qn923R;QrbKG=Rj?Ljm@h6t80*FbjstR!QgayNk^fvA?$7(GAL9yPcK`z zIyO2`L2X21=K_txz|4!ueEQ2ghs|qxiN`2|Al>;#u_J%$#_88tzqL+bg1^+_z6fh7 zWEdyq;9{1*CVcAfpKT7qTXM)O$@xTzY|3wfn!wq)WWZ9@wjIY0^C@k!8YyQq$_5pi zv519IK0=coOi?UB-_2F5V8>o%7s(n9>vgw#!>6uw4kX%+$k+DQu^?^}%=c+qz+b0& zD>caTkK?Q-W+5CU*?JUXZ%O;YCsp)XLxX%u?6Sgf0QfT7NdSjSs-?T2B7RYxi3<Db(x8B+*sxOqCdbK>9k9IqyXsvyp;~e!2YVlpGGVbe?xIv5Zq&a z@q%7JEq@GT_iGx1|IP|h;G&sRCc|NJd#V1`MoAFELD}8SmLWU2*Ov8{r zJ04OP`jdx{GRN@})4qi3Oo$dLVHleBZy3VnUot0co`T1z%V>C33|%7nDnx8(4V0a#1YPE z3DA3xC*JIt5P8-TEIK*)>*khR+zsqI(B1IMEc?ST65>T{v8!u_K7z*M-{zwxcT$xD^9 zWiS`!5LIm6Pk!jY@F?O)Bq^cTbQxjk{Th0*8hGkj8vxkZA;4xuna5F<-xBoOs>1%VwGntt}xWXL$~J8 zuc@aWaX*MxG4vabPTHezYrUS60-*;}y$X{*(JLSk9&lMkoWv8R2p)Le=^MPkZxl2e zzJNf1M@sYfwCs=5h%*Kcf0Aj5$TB0s(Q@!PinrZ_dTrfZS6GaxT=; zSh(ZlBGP8Gm1V48zB=&qfK;9L%JcCEHX~wyYCNrZ(qLI;bcPN0Vgc$yO+(pruqKRb`#fmDYQO34Ed zAL#<%BwHoKwI z^zfLgdP~O{OM=A&acs4Cf{lmURySIqRc~N7pyv#L3p8k$OFuTR?&^fsS>K9}ZS`TG zomCP?UKdEZkIkBJLTYiGp%UFCfnvpPXS+Y869QBJ+Z=s>QHeW}IE=6>1Ha+?%mfN# z!Jb29h6%%e`TE@%F;l_NalN>ieU~zs=4}$kRmttBg*yRMVvhc?$49g6S5Q;GIXsi% zD;b<;gOB9RF}dh2&5H45zsi=x`p>`FUviIk5{ZIDeU=c&YW9~oa0aXSQw^VGPIv*( zAzypi=(&ATCw9{`ZMkBCITA>ES!%`=RrKSP1fE$C{ae&;aPB90!QPh)V1TF>O)=S^3<9&pn-8$1KFlrf!0OkX(u}1#U`?8*)pdmb(5yGA0Iaal)n76ivsERd63LW&J!U9u_dA$fVSv6Bj-*tUt`o19JIJ0-;iQJb z18e{+Hyp;xB^p&NCm-8bCAn~}_M6Z;TAm&7= zCwY^b?uT8Ts>GYIV5(3*^;?I8B(JOT3}gtH0j^O-V-CL$&Hu=+yv?6NZ1=gH`zaJGzi}+UnBF%tkb)cpKdlOiX0OO|f-d!Go`9cb6N6Q_!R zG(s`o8Hl9`2NS$v?!<=4;@ZIZfCiOTh!gL=zkH^X7v}aDkBoe1F#?XGb3N)`j3+nj zJH&*&1CVUpvMt;;ciXmY+qP}nwr$(o-M!nr+qP}n{`=e;@11wQh;#pnnpLajsvI$6 zt;`%b*F-uecYDKnTO8-})=R6QMguzt#3S^ikX!F%Tv}>qSHAp}$65uX8Ff8)8pxfgb{|STX=wKgNID?Cg0p%D|`D0SplB(bP?6m*`7$f!vK}$FG5A#Irf_hpr^F zPQEEW@~BtPP>n}P8R#xg%J+Q$raNChI=M#$R9dG!j$57lJ9MB$Gji{fIoCe?2nUsP z!D*Cp2E&CVTu-;LsRyW%nuLpr9(ST0tvavxF=fk+AUsI`sZ#9RMaOcF02;8~eeN0e zMVcgHLLr{Adi%ByrM9z-au)QD~ePmkXq3r0Y6O<%x{CALFlz z^sI7&^@??cyrx3nL-qz>3DBYRc9Gg{D*s;Tt0k9q;UHltE|t?t>!AzVEgPj+aszwG zGbU%m*Lc61l=)2jm`nb)@&2g?E5?^DWg7xJE(&s=rZh*4lVch;SxJL}%@kDS=jx&j zb5vR=*D`+s8iqAh^2aMB7m9B0Y7W`{{6%6>DARzhVwsV`*-$0m`2dx;jaJwm zCWcr44Egf8Oi;8Zr7*J3Bu0k>ixc|&>kIN6pRV-Nz<2m(9kC!fMSk*q76u0GhBWxG z|IgFp*I#whVxI!8P{+~CZx)&fZlZ7C)oYOo#kIdDlT1dRHrd0JVp(KTUUZsa+xSoL z+iUP>nC3l2g)3T93R`r+#{KIW#0|>7Sl3Wj*RD`oa<>DVpEq&8jI6h`L<{W`aWAB& z^KZFGWmUY~&t3?o8QPJQW7=wSvfs~4y=6T_0ajt+cTAR5psaCpPc{lrI{KY;{{|Sq z9GG3OGMA=YEqgP8R)L~CnIIE2u73hp?+;2~Ko0Got$#9}+e23)o_(VwVh>#1U9p@X){OJJw7bIfN$r+^y?5ed>uRm$5M=h z%sF^zM|}!~D-&6^v*O|C%Ed#|jh{C|yKQ-y0I%+?P!Unj@efZVUp8u2 z8-#o0g+kJPR;&6%xk_VKMk862Z@JU7=p&~*QSQ4_yc(AyF3wyjzrT5P>=|BCDwJRiWQg%<%Bye)}yDm(WPL8_jZkEK9 z%W39~$E%gs3D|W=p11gETY{@e*?f1uzWDNpkU9T5@L5 zztK1vp(SInc@iphUe zHg44mz4uw7yoV1-?-GKPIHVdscgFpQ!OmF8^xkn$E&LS45fX`JxJZjYEfr@tHzLvq zNRL?mq>5s^32NktI@F+b#k&#m{OrV47{$rKkRd5|06W~Fv?G9S9OA#og*>_nv|~=B zeA%d1-}412=0zGTJ(vV~!ydB}LA=>?sPwuMY_YS%t`IdZut1a)#BE}IqVzzhdZAR0 zT!c~#_ENr?w`C9Z?tK7(&16h@pnEqxGajX$16Dh9V+DmAB>hD9Zo~?9rRBxT*_+8g z!O+ao5g>5v!K4J8)i%PJP7XjctJA7~-F-C__L-s=x1SpPlfPX8B~Y5GT&ffgbG5Qb z7!kUM*o@O~mDc@Jt0BqQL&PQDQ%J?N>&K)5#M1(_{TtEBI7yhR)wVEV{HxaJXqN zMKr97o%A^&QkcpVhRf%;VE*S~W!07T7n7eRk^?cAW~%H-G#qp6ah(MuPD+Ecr*5mw zOflz~0ZMM6U$7}E)PG*ev)D;=g&VK3^;_9b30aAS58A{*3_`ZL-*4vEk3ZmH6laAf zI;jG9Piaz~jOMiS|4uO|$Wq8SK!d#7j0TGSflR|}KR)0VwIT@fGIZHZhCAY3h?Pv* zhtN)34NJcz8#IYphSV1ou{uJbZA|Qg9WzYAJBi3*J~d;X@d17V!-s`+_7}V83&IU^ zK65lL1E(YsRFNPW4OCr*kZi>w(E5aIdZ~MyAhce=uOp2*U2K@LZGa z0mSM9@PWKgz<~70+cSN5q|cA!acMn7cP{IN;Y&rVTqC`h9xkDRvEv9?wS~xq-ZT}M zDO(aWQ^C%&IjK_OJE9S6Jcw>`-D`&(V>45fvvjb+7?0I#jzXqw&@dUyFY`PeKnakW zX)Z&>0aZhq=yM;@4h{lLYvW`Ii*uvr2#C#@3(Hg}x$KWX5X5n6L1cDsVubb?7(Ou1 zD@2a2y|EHzv#NhLRF&X_Nwe*AJVZ;1=pya)#|#?vE>Cb{xUvhVokf@LbD2=CtTqTk zGObTqSC7IBkr&`Qlki0`h_>6`32`tGT9_$^Vx3~*y9T25*KCq}$05<&#`ZtH8Qi;o zB~2ouBb(0k7thD6K zxH&*++6oQ~Db5bRABgPq7e^LX^gJRiehB38lr%bi(Bw+ryF*Ljr<22?i8fgOjD<-y zT-Ws;IB(YY8=%_GU{^v>-{#0$$mT9~!%&|Aj?D4<(L6l+RS#p_Uuk0BZ0|^Mj}&S% z3Uoz1BuP$w$X-uNSYSKI{cogQ(3TuG8Jxo2jx%6em;MK{H?SU^mC8bX$vGT-$dR4> zs!|lZ-35iFHR!vIw^>M++xqv3byxQi*M)1$ovaFn^tWMTDjO z*}zHevUjveUMQy9&(2PQ_de#DtcdZ6Ns66pLXt#E+f&3V@T6OlCmAD^*a^1LMvcO# z`dG}jc1qoC=OVJn(lJ?}g1$?HH%+BvI;BXD*WxZ( zv5IIk?M2%}gNV@JIQlC$M5i!xZMv760@@Nu)FAP@X5Vtm|MYf1TJ|gTG|&f6Xb%v= zi750lqo8#LN4>hfi&92vLl%r0FKfR!AsW_~xC1fA75w4UWsU}`-%#2BM=t^GMCl1O zmK~;5d5pxf0YNn@#9T9<>!r=*mH`DW;>**tkTYS*<-OD{-%v#&zDC5KjYCjrodHr3 z{NvfJ%?f5&%qwkrDzkF6B&@f53HW8dEwZJ`u(2^_9qXYMXk&zN76*U`n`W&I&HBrf?^cVChse!^ zSupr){e_EarG3cYW^yBwngNtQCxZj5AJ-_}SDYuQ1B_MlN>d3_<8WRM8*DRvxMFK( z(|V)c9=4O>NMJ^r%M%!UXs;C23&~=;LJ9iD3{+if;q}7nrMW1boFi38w|<7-HdmF$ ze1yfh-3HGEe0&_?T&|YoWCtzwx)Xz>aajvdOM}r4WIm|Mz zi9|wmENL9hjO;ae><%<9<8~oSuaP({peBtwxHtT&0*$R6F|mib+`#!=$E}$bZPtX{ z@pipVLJjn_w7q3GHNeufBxkA{X#DZ2dDWPr4rApk5$!koHv@1u>{WbH0FI+&?Tg=! zo{Uk7Dv}X{^({fazpAs^f?$03cA`HO>lXd+dikEFGkKviseLl(Ib$s}>cjl&b)TlS z3s#jSg9?*(Ms6G^zq7FkB4C|4QHIV5lr z)|w`@;S|xJe<+RikaU}Tshg^Z%sO_=meI`$MG|wA(zl|^voR!?-S>*CAUUo~~(IA&3M>7lBI68Os}QyimtXCc|ci9(S& zqQG)*RF`Mg&<^H{9)AqnM&*#J9%p_}jvfeW3g&Rn>x}xU9fFF1EDEIun9z}8^>X!# z;@7Vuv&(cUjd+a_&%z4AIwrgJO#vF;EuQ*IcIrk;S{t%hbu-~Nuc7&CWuCTl59 zUVs_abR08`T_N8u^`K&g9*~uD$AlJ5#yUp}x*zySNWHI&gePM~%4a0wsLvAIgEn9a zu62~-l0043pA1|$Nvx>e^x8IG!-Z*Q{bFOA5j!eyLds_PPHV7exN8EI{pXI)yzzy1 zs@?*FEi%7%-;~|4*ZH}Em`NhKj5h-v%)i1FMm6>3qR>mm0{BKbZ<@-mMTvJ`3Yo1# zDMNfS+hWICyJRadh2aoP@O}$JHbJ{@P98%SOa}4!7pm~-DpPDDL=ifVw$w5k(C;wX zdiIddS(|NBxL}rHr>m0c)aXC~R)MHpsmTS48RCx@MFbC4)N%T;-g*o+#QVP~)1zCR z`{+LPNWXrb1d@cs8=N^(PqYLs*S4mE=}4`~eT!}#3jO|h0M`K7!^SQSx9)~Vv+O4%N~swclcf(| zHiRn36|B2!fVu7r{I!r`ZE1n0+Co^;$d*c;1yrp7bNgqk+NT@5gxQh!0Cr`+3CCbS zPE5BNdsg@!L}@vGbT-G}8zzUEV(tVYxWGvbq8OnV4BgJv4FY#!fBR^Wb}gu&Edw@U zo@)#{wY;Q`l~;iu51R!i3UePxaO|M(w>Jm9m{au`OtWt=FbPGi#x^f0BMX4?g^8@U<}oKBh1HC} zK(B`-S8Z$`;fFWmxUwdX#d(ZyuB~8pT0oiI)sc=2=0OaCqwP{{@!IGVBPK~a*K@y=qLi4_IjW{H&MqcT%eKJWR$UqCfI z?a@AwY?CuSGOKlk%4UZGDd^#rl!G69(3^Im)NG8w9n`DbKGr1?U2t$szDyN`Eul}Z z_@vE$7uZFburv?VnD6#?%$b$huRI#vytF zoZ6w*k6o3~O$tSTd@%hkH}2?PE^0GsE?PFk?-pZorDYkko)rdLgF(GCVi)8nb1*oc zGZ3By)^94Y3JWzVJnoP-%cJL#aQ+*U6YunDkt&12J`%!`!1`4&K@12L&O7&K;wduD zFX@)~ydX34X$Y5%ABt3YEUauUdM=JbD5)HH@mMeMWt(O9n5Cz`aA4B?#bM+ zLS!mkmJL%`u+=#h~!r-!X5L`N(qASX3OjFI)+^o?8xEfMeSDYzyS@k1#TbkS z0o<)8jAy&2$pjgTa{3t5Uvy_|9uju5pPw$Q;aYC2WX5~4i3*%rL-I=GtTz}^H38N9 zr<+*iOIFer%gNCrd+$C|F$|1K=ZI*9r>D6+31Ai~hW4UH-zDu0k9B=WGr>zk^DYw;Wqhyzu@C?%PXW*hvIbSjY^_Rf{nV^s zu9pCF6@RD@NZN^OpVzj`XOatllbDO!pQL*}M8d>;1@q|p+r88|)hzYyF}&ha*$oo6 z8nE&rC~xb*6(cBYaAHhj+8*wo_}zIphe(VC%*pL``U-&)U*Oo%vsjP4>LTK;7;oKm9Cl2`4Ho z?|ZiR+3K>>$!0(IbnxC4KeECr^@h0-SV(%gJ#A{if+B;1*0i(@31+y)aFAwy&-=~T z{&eMN4;Q0nH^tv)(sHi=ubB{4G02crZyW}em*FogY(er)F4*soOf(Jy z!x)F*6eK$$PUXzyx%oih)z|C+LaEC(~1`-nmN#Rm|C5Ez3f}DF6 z&U>wJgbJbJ5N1iXJKMZKGoXq*%@!3ZSceGurLUzC)zPbE{1g zBtgM_W0rWC#ViQFYo(&vX|+e1@Oa$UsS#%8Mjwwr_0p%mH*4KhEOwj{uk%Ec?;@wh ztTaXSSt0t;tuF1F7YChay901MRu4oirLI2^Ll(=I3gNK->?{I~rDw!#{P^(t0mB=A zK26>}ac__-hW5$COv&GBgmjbQ>Zwoa@qh!vsF}LM@n?+B6jSojpm{4o_pb*gD{yB& zhJ^}?hj?Y6@}W7wScADqFQT7+FmWC+9j#{A{oX?v{5D>XxUO^TUJ<*;?WDrSTW2!} zU#eza+@9QYx3_NK_kaS8memKwxEtKJPq5$Zt=R{e4Uew_vY##^Uh2hr2`E1=&#Pgi zl*P++GJap{kfu}=)oz*U_|&p{WSREq9~s)nl6_a~C^@x+nh6ON2HHh0K_BJ~=7n2H`E_3kUmt~x=41EM4~8O=u*(L2 zq|^G(Btm#@<{iZF0BBx*yx-ra<^$xzFzUQCXV2I_jL6ifjI}OB6&39b>hbb@f7F}Q zdxAleVg4kppd0E@^acfJNsLpqU#z()$2^j-k_B7MI3xwhQUG}PGF<<{YKE0Ju3vj{ zl!geI|MCrcwqBr@CluACuw^eHf^*-PVSf5Wp_k=hgoKG?K!3c$eJ{iabuI<;KBf{$ zByT7@fbGxrfyEi%)BF3eFohpYMMh1zrqSfR+D>!y?k)--<~BLifA+GkvX6=_0T8Hr z5o*c0voo6>zy=u7;LiulIIk{eCN7`ntmj5!h<>c5vl%V^1g+$hkth~|9j(~7mi)zh z*~xg?VCjda;=MC|fP%qfyxKWP7{m93c{BTy833u0H%=^dI!oqrg_3%=7AdqFp zA*{`=jT@Gk2eznfrqr!BGv#Q9MHf!Z>!E%X0ZsG0|Lsu01!gKsko!^oRTbgLgMUN< zHxv0)NCYv1a*NexVwZ=dhbnlkGsziFkl<-iJ`?(sid}+lc+Xh-Y~3&HV%wNO{)c*F zVh}z4MRC=JCS$@d6XDb`qO=1dskJW*2Bs682Q!I;l5X3`o;St13p1WS1B7l-dc#e@ zUBD$?HX$39)zNQ5acRQzMG%WA9g}U-Wo)FL+IE zp(yRrqX07SQvDX028<#YlnOpth7z5ZGnr20zt1xCAFnR5^ac_0cp%qI6-ji=MY{N6imd3xm>s&3q`L>Myb^;!^ydCZ2z9x`_HKwqt=etNS%yqQT zchYHeQ7Fy}we4`$Kx4G0DlYpE#y^JKR(7?7fmIDVRh$HIm8 zGnJaO$5m+6G)nhE65Nk3daENWk_)q+i~E_XK?*xQ7FgnxBV&3d+wgc(*N2d1(&%!C zMiLD+=2xoXTW9oV_)lp|lb@{+K<1LjT{ zBnGe7rSz_2iKwIW7Pkv)e*P^gl1)9L+>picj*(ToazD~&aQpkhP zL7pnkAc3qvjQF9HfsX3c<7^v7gbk6m$0tcMz7`y24$_>uFr4Y9xQC#d-=+kCjPel# z@-uFxgvT!II>Tb+Ro>YBh;Io@V7Z)Mf3x{t<&$FbXVCBClgx2ME%|||EF<=ebkxFb znvB>IUH4rXa3v;7>nHu&B}ryDV}9jHo2Ao)RNi7F4U7cWQVY!vGwX8@N(AAA`n5Is zMlUcvHVM1i%p-`$SK#91B6+dPk3Hm6+M}~trXhm;w!c3&vcd8ej9+3en75z#{N* zwcGk+LLB`Q97=V-)(kb+bPI3nm!~lcO zvqcth;;P9Ta5Ydv+l(#DR*y6~!52LkZX%b*|5*MdXU^*ZWnJys1aHg+5tMH!__Bce%P!*H zU|K_-up$pgo`nu&Q9mZIdZgOnwTt^3@>dg)5k*99;1CA@thd#X*;@ln2z1FgCtC|H z%!})d5@oy^l9D-1i}S$6t~eC3uQ`4t>~AUBGFw+7-m3!(m4PR`Lk@ zj~${+PRP}De#P*7&>0KYtsZQluF)4Fa4&~Be$m-T*)$OHQJSc@6UDl*1W36N_%Rk> ztH1yYg4O!ohB(yTwq+w9Y>>zb!LI09gePW*bQ+*P%eh%Jy;51@5v=5%(g-2h(#68s zR3(&`pvdnhLB$EAdo~Iu*)vdxVOkz)TyJ%sZgz*2hPsD*Y1qd(UYsXsDebTBUcgfw zr#6AY2RB`Q>V@r;Z%v6kT*toLsQJCx)GM}+azp+V&8n=%g>XVgk(c3M1vp)S-`yB` zab+?EApVYznQj5Ut>hK|0JAlUE7*uYxmiGj-(Us_`YY;T$rRg#X+8rvk1?&tgCy>{ zy=G>}?CJ~8$b10uZDcw5&?JjspIhxNa4hB_so8LmB_{PR!(Ze+Wf@g{LOLvR??xC^ zRwterporCK$Hd{O--df9iSsjN%F84bjNR+}Qe8v7X*5wR%2qND$di-=F)$MAZ{riD zV%$qcS+k!C7Zdqq20smGl59+&?A!j7+_rep*&9E0$Lb6H{%p0@qXl1YY4^TK^%ptl zUUsOg{*$qXDrY)OZn;NDz{rBFJKv|2Z@h|R0_Dz=Yt6m!c7dv+&tw}dnbqG`wFo}@ zLBH)F?Sm_Yd*uEEmXzVI;>o~Cnx~*=G07|XXSxFV_wv3qkeEevM;HflC+BvpQ%K~aXHXhA-{td@>-L;{yocl+qN$4qgxIP(hOb`B3TLoyVYHDJ zlLN7Zt9{ZUH$^NB^8~Soqks@JyRv*}m|NNnJFaAKl-~?n`hE^P-j)x*+nYgIS#hwB zhNfqIr*(ElYTBro+aF~=9m1xc{E=CVGREj?8PdJwYe#H#TQ+zf)9*OsFQ#;!-}BF2 z9qY4mV`pbqQ+?-)i)!F?FXN)^E$!|1t`<>M1!Y^QyPjFc^x#^!UK`azi^S`O$K@yU zWzvRxzORjc#_~S)Ok9EjBy3GJ+#naTs)8D|*Pz;%NxVLTq42n==RpTS`uHXqFF2x) zn>8^W>4uWBWR;)F4)5s%KIgsN=hgj~F?qu3Ktu3!^K^p51CO)9`gd(i~g?VD<(IFnz&*=o#Z_T(Ft zXMk)j8|@U@P17CM@VRJ#VgW922d#cnaP-{QO#U23ypXA#DU_>9{)qY$Hm*8amMzLtl?c*%= zp}B!IyAt^38ruUybJkTa*C;os3$??c<%5;&a9qJ68BI6Uq^Rmpwmo7K7)8f7^S@)p z_EHSJ@NBSqKw*z^c=c&AO8$rl&8}re$fg=lFVc1`nq3>&LV5o105C-+;rT0_~P$O;gIQZnnsFboC9^lLaWO zeGHJCkfABbz#&VKPz9OD?2)GqF#3!i&NAz|&ap8E|JA!s7Vu-chLPk-Dvu6Zo z!{nWxiWC;j=v)97hYIQ|#%C%0yQB!;g6tMaf$K{gx^qKzZy#MKtHX}-N+o_7J1r3; zE~l+#wF#o$`=~1Rnupeo`vbdbBW%hcf4<=P%f_zbocjuW@^W z^KC07%k52+VSi$chV#*eblK_ixZ?*XF9i&O3;+NC0U#?IBz@Q}0LKdm05J7a$bM=K z?VO#hO=#$885n8VXpJqLoM|jk zJxe$ftui&h0D|WNdUzqJ(ZU!!POb{=u#z(^md);KcA6c73B~z7VFBid)SR|5!Jl*E z;aN5IS}gueb_5UOn!_$jPM1oge@JB>&4TurYBqFg9>DptW?evrSQ2k6oij_(U0(t5F6D(Iw7pH|dZfJ}D&q z1+Nk!%?RS=lXOWf67F{$J=)StCzEGAoz29S$8jqefp8!j2=6`CeW&FPWRe4hq=6`6 z4V)#rip8prM*#H|dAlJ@&$4h)T0@c!1u-*A4kd`%2!xclUof&7#9xOUCp}2OCyLnvQtQxW_Xxnx3OR!G9-(_%I@cmi_bVUS6^#O}<4dghJ99zLq>+n`8N1p~ znn=TAJzqd-zCMIrhAQ(Rs>*1C2;FY~!bWeWqr3O{(?2P<-g*O#eRmrHl22X(FiZf; zevcNg5%Z9CaZtJ7MHpp1G@ISrc_+ncw+db+9uep-1%)NbNRu!;IV*SxZiwr_ohnJ1 zIYZ~M*_ifvWeMII!gXS0sJzE%VlaZwdquj>sG7;w4aYsf9aE!yMz;_OTg~-Y*1FV^ zPqZy3wyjMx)CNOSH^$w420JYJ4WXgofQ=Q#-cda`_3a>eR&?X66s3ZTmjvtqi3T%V z0jh$vxmkPS(CSJ1q7-W*JIUUZXHGk_7-NX)etfL)A0z@s154CmSE$5r@D8&_2I9v2 z5XB3C^?;X}nRtc#s*j=z7Kx(|r2nZ!0#Ke5kU!c3{!{)pEpoQA*RwWpHL<33c6XK< zqx(rBdk6&ZKe4n|GE=mFaQ;ec~$BmPQiFAOV$1|`zJU0tqJ{}DgK_Pxi=?nbQ|hki{B1D4}LP)R3E0>5z)E- z&szhblv<;6=fq4(T3OtV;lPD@=VGsd@b`cV};V3%c_}&>>86Aor^eR~9bI@CEvQ$zyrY1it^E)^HH{*|Z;8 zP54n+-2X*g6-9*P6oq|eCmjp@oDMO*$c?#BI zVD{!=M8_W)=WzEK{U*4`2IeMn7>+h&Qq(@nP1N|>+{WK;dz3`6K*6Z=x@k~&_^jaq zIZ9x|w^ZYzz9U90D|mVM-tzO6A=h#v$+c*&^9;p8pGxgOcoQcUztj0hrIaMzlt2Yl zT|1^q>a?o%LURS~XopL(c`uB?5IFFAvf+_uCXvUjck9$fq;|kk_8`;FX62}&fWH0x zq{>N2N?sTriBZ3k0vL6Ov^uXcJdb{K9A{p0zC;u~*I;TQWeu(C0(NjgB-aWbZZ|YF z(ezj&UID{UNYgjbWDRZc!~yR{*ygp&?$ z^-oIqHxz=xe{S9XA((%n{nO(Ajn<>|pV9u?{^g}We`xJrVL1eV#gE5GRQYio|Cg5m z{wr7~?vslq2?qiASK<6QYh-QbVr*gRL1WxsYiYnp z^RFFHV6 zS~%5czcyX4|HhNus7#Z(d+cIYFL=sGC<>|Ht^rGTnhLhpqW`@r7fAA0oPGAK#72cI-(`@|p=*$iz#b~IBIhxW_ zY7-%|yM}Q8EPP;O+Y7rtdB&;4ib9=x)2Coo+lkoMgs%;<`j3n1ifB1*nFGg&?5|&b zU$XlP7Pqw<%VTbM=k|1hlvOkQ($zaw>(BK?u8Qv+cXD;{kQLbHR<4p`sXgMRHFL~w zk&&uB4?%f)Q+$*+odyBS$dP~Q_#@+yeQT5|8jiamC4Z(Y1CNHySz@{Y_duch9T3FDc<@03Z!c}$W@O8#ivux3##TX^doEEb!zD- z8p1^PTp*`m`aEf;#sl>cv5Tio2(qlSW+UR9NMQu?issyt$qM{BE!S20&sNLTyvw~F z(-TfgW&Wv6nYHm!#-^K+dn0HhSHWqqi7-2mGYk+Nwz1E@b?4_XMQ_CD$!5t(D2RQY zKb{>FKWsUvB-VaKlMZp=hLHrv3=I<9_C65bt^_YMcn`0Vm9l=>Y`*sjm=-iAWWVo3 zl<%{GTt=IN8B;FgUJBPXI1#U)<660}D?eDfUn3!U+7q+FH#b6k38?d|V@XEt8>4nE1;0g#Wj(E-Fw8OC3)b68yM|F?axgpX~7e*I140Z0rr3e{3~I zP48c}>bG2mp9wA%Qsr_wu8$9Iqp6Sa6PM0~6;gp@a*9|JE0RbG2T+F)xrL6gi!I+*4p=!A7B@{#*};YO#7%%e0p_E($2 z`)mKUuReP2%{C=*&KCv6fzXg($i3&hsdo0bF(YwiL-)|?K;gnmyLdRPt6TBZuLXMo z*NNuXxlGgmczU~^yiUujy|?d707?!)@pAfPz1h~w?s<3rj8$37r-~gPI^vaVd|Yk{ zl1Z$hE4zqJ^>D6^ubk7<^EEOvyFgx5(~H-08qZ;(7^7J&#A+|F52aeypV>tKPkAKd^2x%p#UB9!z$HiK*#q?Mf_UB@gY%^&hh>uonUsf54J+t#=?o$?Kgz zp;)LX(O{>n zuO+AkL^+!tsIKnJK7_iHgBr55CZ1R8mSkvn(O>r+fp$+XQkQdT4nkBqjZrYVINMN> zPLAvNz#fD5v|^gC&>BGw6a!RNrCv;PM5dN}f5$S3Ymg!zjIyYk7jVJ+dR+bh+<-kA z>>Im26sQJfa8j_yaFGP!8U3?~0t{4edSb>kPT@;a=yf9m9C%((6?k%__%~$vppEc( zGJQ-CB1toR6gAwE=yl-ENXSS9*R`UX?_hgmXi@`ULY)toVZTa<77QoEO}LEUGzU#K z*N15P)(3m7*xu})K|`B^Uc`Zt!Uisl;0|uVkW?gLQD4YOhfu)fBAEjm7Pf%r@UFt} zonB|0$-G~LajS*u1J49n&&)#ET5);)0pDG3DhUNkRa z3U`-En>8Dc7oLa7I1SiXRONyBJT2&9Ikcq2Vz5|s`ctm`sJ3%&kz3rTxw0i`TfS4b z4SYptOtxEqv!q{3qwCFJH;D4(_3($~CF{@@9m7gz;{mWxB+LpRbG@3h+j7~oCOM4k z_-}BLB8H&j{0`m;Nh}fEiU_gQ+=GmwfUvDZ-E8de(;w$2g4$U+LF~jImJHxzLklxs zMdafK`^FZPOGJujT%n3R&M8iH)Su+xtI0v^FhQ8qOq7*(&%o%dva{Uvmn=^IBu279_;J`tA<8GV=nsx$@G(_i zRzs=k!hwVf|_#jS~%Q|m_c8M7t zu~?z@=0R+?v&gp8+}Crvy9)Nkk=y@K6gqb3c6zfYl@!)Xll;A~@Yy{VW*Q~&!$^`$ zr#lr@?)4Gx-+Y4V|0cME$vHKz4Fn)W1qOif|L}>Ev!jKrnX!qf(+{T@Z_30muO^fp z^Y{%$p1vQ>`?~3{^Lu}My}W%)+5YI~`{=jp?)rYN$!dW=}r25KHcBfd_R=gec#Q;**SM_`d#R~eX;a- zf3t00ecV}nzs$FG_)X&ZejQ$apY(m-El=1@PxpAgJAHe8-%h?h`HuI9e6)P$eUWT` zE%1Hr+I@z7JmU3yruBS2TrTJJd?xZ8lzrTReeOT&?ecv;Ecbl8jAuE2ZccwbUi*#e zeV>0yb$1`q`F%fq+};2D|83a&ecSKrwye&t`|~g@@0;bh?t6EA`bRDd&+m+H^!0Yy z?^Wq5JJ0u0&+p^4>>B>P=STJH>OLN~eHX5;^1kn$pBel<9^JOTPJ6zm?H>E#*X_0) zeLunU_)h#jJ>hyjGr#WrUY?c@*1uoqelEwI-&dO7*B9Pr2j8draaqsNk7$|SS6iN9sf1h^$u6WKn{513Ve(n6WzUF&>pT2$9^ZTBE|E_z^dw=ff zWVz;>zW!c!$K%)%i+xVm_c{1~4%xT-rk?YBzdi7HuAcK=zwUW`JL9&u{bJen-I@OX zKk)pzXw| zzmA^oML(?f-<5gW-^*O%ht|Hw$7A`y7{idOuhwhEGwe^ zyWX>+l~aWyEc<5;(Q&-f%U8c!OWn5Kb`P%J==t;a=cC^Hl2q4Xh3My7?)1xl%T?mJ zD7ih#%l%&buQMrncT&Eibgv{mKLf^z|Kmr`$hZ5&uo0Uc$A{hY-0_Y2^y2Z&O23iZ zw#O?)>vhlP#{0V(_tVqL|Hs~yz%_BK@wQK^)e3l`9EsL?mCF-Qj;M%uLMX;N(3vQ2nZrKq{0%d+h>THgSD_#B~L53!q(I~QMFzP@*z&d9%UeERhCK@iLZ zXTSrfj?fv?SnXajI%Gd(9lEP(q9A7ApS_B3t7`;g#p3PJTXjCreB3EnRp%Gaj-W!# zBC^XP<`oCmNST^Ns9TB5%O5zRHr(IP32z9rZ=f^O2gEw1PD#GMP#Z>^Y%ecYBEF`a z%;Pe>yl!e3n&+%$s{6j{a zeWwaPM7R~651pmHa(Zr2Tio_*;(toSenU7UOE95{mvge6gsOG;PH}$h3vx?2=>efG zJxDfoKlxwC~J*88RA1Ty_M>vBRooyyw2jH9HVN zC4R7{kkA2s1^)r!{|q4qOueD|%c|nqb%9gyx}K^WX1A_-=2Sg)PKg?)U!;o!F1Y3! zk9Y(8y%LX(Zk&2%tuFg&iCR;4?8?l8x^g{`bL|3jY(L(oNL!z#3OI;#P zw}ts8OwpBNCZf>YOfhAYw0OAt>d`x1&eGJ#j2oHcyo zv3Hz0U$k?r@mIF<5>dh2!C2f@BavHFriE~m5?2(Jt@hwnw$zyNdQK#lr%k?^$!Z%6 z?qIcPOV6%kp0`JCrCg0E2l0T&>|_IKCa+S;>fqH(y-KyjOf3W`Y*41h5wm3%^`MaC z{k+e*B{GJRBgV89E>P+03U%$&Ubp~;RgV}@n2_C8UO=E8dM>p5IyQlh^ z#)btSY^qOlOSLnN4GE5}tN+d|b(3jX&HlFCv39}HmGym2souK{9m9(DZ#6Be^I02w z-p%OZFj(PcbT;@6Xeq9DcTC0Yj@1di>uwYs%yl-he+9<&$y{dy&N~~MCqH#E-i<(I zMU9{1fYTt^$;o&as64MKduqG8x*wcFRVGxIJqyrA&$b=_+1j>MPR35jJ6w#Nc(BMr z`6>Nwvt4w1(&!-9mh{B#WLojdq_uW(bxBj~owr#V_f~cMzrPhI~+O|b%G$-m@>4_@AIqlkA(tN4xNn%jM-Q_XYtrfN&v_^v3 zHAqc6xTtL7t+R#;I5$?B7PzkH;=|Je6P6vnvN0op^C(YFI?l#ZEPx)yS-D)3oYz>? zDxAL-Q3%!@OV8$$dRI6bm&G0=?e>@5=9zX< zFL+Jpv$?sE`G%VjO7ACxKW$$VI$O_#^wY}tw7pKb z%_p8tkCxkMa4Xhu_o&3!^q+R$i#4>5ui2ZK>+a8;(V|dhd@C6x9A|sGUXD^X715%B zD;FOJ*FJ?Z`T`rl8UZc3!*x22-c#F*ysAGM@^2ImCAh+_2AZ+0fxL#JZQ@CUP$q4e zaF5_<8(kRMVCj~GM|@X!t5*hE3OF`|&^Fo~k?Tj0P9*Q5T(@YX`PUx`z5I@bckile z9xY*}L~e_ETTFD{He(TNZ|`(-TfL_zoyHpmOU#;dCsp4FQ{(O=9PGN2b)lndH`mw; zq4!LZy%lzJh2w2sv9h9jQiRq{7k;{MH>?N+Q}Y@1?2%5iN+k=m;5pzlgjA|;I7h8Z zhpJWv&cma%Ek2o6GeW493yd>dnJuT8!FmN*x|ua;Xd{p6-RG*_!+AzCuNUWQW#L#w zax(5d*Rp!9+jE@=*KZ;3-V3%&P(RD%UhIwuY2Fqb$H;1TTS(XP%50%^-c@pMiRe24 zVsoK#7WE)!Dp!WlCxW2;ilO}6WmMM&NxG1Ak*MC4UoPm5>BRGi?2_crn`7vCtO`SQ zX@5&|j?FEi0W;nxIm9XbHSi~?P?-%XRYJ`WhGmz)hN$j#5NS}O5f;f)8yk34!q5=L z;Vut5Z+Zbcm9N2z^J;iT?Hg}jUAkMN6ltaZV9ym?3x8y!et;8|d+mEGoiJG+=V{Nk zA%f^yAj~Ntc&Dwn1JxO>Om|B6@N$V`w{xpAv(l&EHTN&9E{c&(bJ9w-Ybu*mofc-S z;@IMAH=NvkGi>t;$4kDtB}LX!tF~%IS~o49R2?2>yxh^>*RHroK`ITIzqM@2|Jv(f zn9{QD{k~a`i-KnrGRcQ~nKIt0Wc+Y3oP4K=Detc8k1PDQi=8?5?_QiC@{IK9@ZQ>@q z=4JE_PHd#(l*A<&@dY5jkeyXMM zbf?k|3orV~KCW7Kf7?5G>fr|APQJgV4f=DOp>bK8x+AMRJab0d-KHH`2ESx}Qy5L| zYG!7*tHyap3wLBi-@en5{D@c|*SY)36$|mmifrqiLzgrzzaiS64}2JaY`Uq8@9<}@ zIEhyiyl2jVwnGrmVY?#fDMAJC`^f;HTTIsPW=```)y9u1LeZY- zv?LG5Sa>J@RY>+FuOwd6ayX{54OiJ-%oiHhS860xn-7ERM2#(#2xwI5L) zlaKP@{)jO1$;|M$CEY95r(bHa`?@+HEPaWiif?;fQT5C;X)PD?*W`MrF);dgd!E(n z%W!9=;of-}^G@_Kee<;#`2=>U*gaZ5;5+C+ z^4W49w`k!U#;NXvxtXmSl+>Q&BjVAt)~kw-sf&R_Te^urQAq6o_rXM<^jawY%01fi zwUgRGq&LNMa)uafnr9~G9!Xd^T zXxcF;^JbXAitd}frcaBarQCO*=l1Q?VjO5Pp5zss{D=l=+(HnEiPK%**s`LhQfa&1 z3jg(m)RY}*zU|M7WTn&0wOnkPPED$g4;zg{L%xzQ5b{78q3Xo25M{@bn(y#Ps>_KU zgNcQ_lEc`_-PI`1eKBwpNxOkv)1yhdQ_*l_)55e=9GeDDyd&-ItVM5st&=x3$%TDu z7)1hUcj$FOsD&?zX34BNI>59{&)T8cuRtnNQ)$V#`)P@jn&yaUdNK5Y!`YveU4>y^Mc|8sbT-m*ZF>3xn zbg&*Va$ql{azGxC{y?Gpx)-X>w@xW%4&%8H8Dcgn&-N9tIGX=RW zl-UqguHJo#Y}$qR><@M*d{m%na*HByeWh9y_a=RDujVj4jqV%dcaq*na?0@6x9By$8RHB=59z>BMCDe{nYkJDm1HD!urmUB`xHDdz<4>D?>^HLPmV<(C? z5H5f{y+>=r?FfFNRz@_NQ|Oh^o))WB?$i_|CMpP{u5?^R&f53#tDw+5!+>)hM|^qp zJkIFlnRkHbkXvhgd@#)v=P^P^ewnUxKjSIeSx{{U6p|TjL*se{;nk5 zp)0m3Lr#VLsNloI2;m~=5v4P7#4g5D{~pqIskh$=TYMN~ojUY#eDH5U8<8TYLAzLe zaJ9$1(mG>m7L=UUeQ2|IvZMWGy(H&51#0)%~-M%anbT-?;!BAH$|DhR1VhZ`N%n-}I>^PS6 zf!U@j-eJOa-6M|{eZO+-caf{>r$t@<;=KOVKTc{M4W_@SU*^jH+Vnl*irs1v2Whw1 z#Fa?rrhhuCWq~gJX}8JNH{rZTXTAo%K2+$S=bgHMT6LD#{!ocm7yJ%dts`Hyw_Z$` z>^`k<%jJuz%SaZi$Lj)-0WP)b-F@|!!!F~_Ej!Y=k?Q$GiPD|FK=k{?2A)9)^0}Ee zLfDI+A~^kwoTK?|4=x^A@S)SHv6nsBBk-9=PR-mhy;~GRLcI50QBL1+?$nkADA9jp z6wf`l`4b=QTXRu<;n}fB@ii34s9xW?)Z4zYW!7Chy6~{XezEY!YtF6oTRLuA!|X?& zjAVH=*1!(-P--%@s*>2=ro`(B?z--fwY@O-5&wsk#P1q6*Xs%#BE3>evZ}0!?TJb* z&w~$#y+Nq8I@-FMX6G7qLRdH>JXumn4%9u;&9OVyM zjCLQ0BC^YT6b_jA?|K$KBPlBPO3g&$()%;+-qu#I+2*hItE9`1N?h)VTU`g0lD`oe zi*vUdXO0cWOM`m4mwZmAKZAu zN$7n4_V%>m@L9(9je4@*IqDg>%fzkVe7T96{rPuJCh8BLLmV-oXbjH-KSK|xbwqSl zQMma{=dj73`O^QcG9n45Qd!#W#u$% zwiz8P=GrPh>4%1GHn`m3;Mvl@%mC?1O#&)HMhBFQ2p4CD9FHFaw0FgyiDK$36o)*0 zl;AcuL?vMmJkU#g)Y+qXw#;b#9icGf_l5Y_+&OJKBcWhzlF+&aLY#DET71ku8f>MKx7H>hpAihGj38Amw+qR$ElEL0m(uEO zE;`k+PD29M8Ob@XokRSPP%t(*^@XxzRl`q}CWk^M+8w@UtC&(SmUk*mt+_oa{aX7Q zLO!Q5?I|*L@%pfPMNDwDdxb47)hV%3-62HBuImBfD43h(yQDHl&5P@txwPg*uTxuQ{7P-Q`>Y&{&}Wp{^e+ml+LIgDh#E2Pom+Y)-jnZ7#R z66xl@p_(BTyho_cM#dSU@|&w}6&Ab;+OqsCoa}ZsjsTbM6V(NUmfSFK#WUmkt<&MKAnLb4lQS&8w^D_XQw-ttN>xmNwMxV_uT#r>TjCa)AJM=~0^ zD=&M8l-M8cE3l}t$@}L*c#-^sf;ZqVOVRA&ucs9J`@lk278aBih0KPkI2jDJ$F}oz zrFA1GMV9!MSZBXXWI8@Sw8~bs%|lO6Qc6H<{SJlF9TwIfmO}P z1{5?o09joF^n`@r0(7dW!Osp3Xkb{O&@>eosb2EAW~5q!)Om0CMb73&g#@Mzqb;ND zlA0}|(P7FF!M=T=k&NYR>o0%S%T(vAuzX zvW@k2ru`$MZ>4bLg-65^vg>HDu(k_&4M>!H7 zIxXg-1E-dY>}xJG1X#a@o=yuT`{95NH) zp~hYIvD}6sNJf@qzO{xDxnxq0#XKurh`8%ADmUQb%@;B zp7`*Ja%#zZm*;i5Ayw8Gi7DjMXNDVurCgl|_(3WDV&7bSXkT;S7SWl1GwJ3z-yQk4 zKEtc^&`ycs%^^fgkD$fAj6dk!dI|UEijwZFJ~)psnrTz~=whW?t1~YB3eB!D9uXJf zJbY<(%y=!=)(N=f-bKA@YR3iO|FF@cVC>jy;8gwy4vqx6XF#<6J0qeQc%P zpoHs^47B#ACFYtxXD!j-kf}Ej?rDw+_mHXV-##)Dc~sU=!e$+QAVz$A2A9x>d@EFz}Ubj>F|-TSJSEJ zQy3$s{zke+8Pe?^=Y7{`COU=+?OtOZvD{+QAaoC(aqWM$0$KDw4i*>UdkG!T3*;Gq zBOgK7`zl*lnWKOQrJp+a*4m5p#C@= z`dkkFq6}TV@Lnz27pgZrHXjL$t?8b>aSICKX)+#u;eG*1o{1Ir%?64-|P`;|2pjt2QNtXMOPj5 z2U%k#%*-B^5O5!YW-URkrHL-Qf|wAKN)4F_sc?`^A+_UO8-uvd6Y1M2eX^}_`NN;U zL|Cbp`U1RHfD7wUb3pwF1i>7h5?V}13W*)iJuvp~Bk&|Q)++s+NBlN`x}gtQvh-WY z`i-QsyO0694B4Z)3k&rptkXSCl= z$R}qqY?%8eDjB<0+|Qq3n$(ft6Rdzy|IeC0TW~`&w}k&;&hQ*DeN4x)CuXRB+w!Sb z&d9$1B?hnF1n}x*1c5*eX7^HS!Kr?ME+OfgvN*?Qj^fuOGrx&iCNo+0G3s|~V#(*z zr+)vhhn0W+v;CHjChD7B=)8YUG9qJfz0V@0EpBEQg=qrI6PPLdV+sYsIrk?_{yUXl z8Pd$^@$B`kD)-a>ig?un^X7Iph0X0PVvSvkzI0gZoYef-b1RRBZNK<)d**?c zxziSPX=imt@-ABL`E`QWn2yI5wF&&V{F~3|f#+N{x&{A@f$wlpDfrKWw^IIcaj@9o zcftr=$sVp)5HCB+JC{k-T#dCUzkis9Z?>aO!1jaJ&0!7z&5d z=YAtD_+7yJ$g2zm`|juwXg#8r{11=#!_@v;j)n|{x6f-fMWJSx3JCVRj|%Vu;`m1t z{Z9;@vc>CRDVt8D&?CJe97Tyj5D0S{$#iNDUqzGJD{Srxp|dsd6t0_>dlsM21vP-j z;38NCEMdBkf)RhVK9+Hmrh=s$1|`&fNZ|w(;LtUaF$M|Tkqm^qs&|lC&`JCT%Q^LpQgzvuA zH@h$)d;83Y`-`Xh-dMcF#|)z|O<;KfGX<{2{2?oQP^D)2$(d$VM8#DAcSd+m29Z5D-iUy@kG@k4h8NeGrR;{ zZGlipz7pu65`YK@ zMU4WbnnpofA+mqaD4_N7;W^$}&@l=d{{nIH_%PEe3vxu9Rfw~P4~HSneTefJ;^gvS zGsL+aah4*^Zsc6Vxejp_Ax`8ou}se_XgT71+$b2=$%jdZb0*@TI(ng{-Z?O(J0(H_UujLidFs6);LZIw~|me8Z~nrb@rpN#qxf;);LZG|6aoO zr>H6G0%va;Q#{+RZ?)sNa8-%iBUY2v?VsKE#kLuK5vxnbgwK^2dt~AGb!xM3eqKD$ z?}ydPzX%tT*!|)pnlUL%Od#ZNLc}!No-}H>?WIiN+i}&?x;xO~bGx0k; z7jl@{WO4j_Ppb|yD!C6=%J-0Tl5JEHv%+_uw6AT`U1piDq4ZAM zg?E`HzFVZ1+CE5}g9`I)RTItVz8ca$AJ}kn&JEvRr2YcI_dwGPW`yqrshtNF-e6wy zJt;N+fK?Rps_&0dJ=Rf?%qzZ*QhC-^*O}*hzn4CX4P112r;wqjh$s-VRezY z&-e5!Ws9f_Of%nOv)1pOdED$<-!n5mt$-ubXiN^t)l&wC|7*o@6xzK;Qiq$2C+_3L zIyV_NoK7h1Oe5*tVkq20>6C;zl|n&o7u6M(qyrY8s1E!aA+9hk6g=&sy2A!^(99=l zfapQ8#eO1dv&Zac~>k|l4XEqOxv(NRWLmb{)u zDkgpJC^K1>tVN42BF%P`87oU(P29fxK3GGq<0QL~7QICeR&MNrO*V-p$37v8);AIufC2)aak*b~YEE#Dos z$-zr=XzPXXlcC|_ExdFKEw3*=-rJ^MZ0L<&>1}fgA5u#jCR*^~E4*x+@gdc;VPXR} z-p$L#6dzJf8xU9HrHg1^cE^A2Wiw1%h?jmu^X-fe^RyWzO5mk)XkT*T*Ld2zM~vu* zU*u^s0UvUoHcXt)j(_N3(}@eopbZlv+TyJ}Y@Xvnl4!%k`K|F^dDz^?h1{kgqR8Eb ziZhO;t#6J$<8Jc{&NzxTqd9(_yUlT&aX2lgDSnc>%~4$CC0bHLe2kmT!QrCuSz1|L z{0cXlO}LPsm3AjJA~qN@LQmSd_lY< z%e7Eaua`v;u_%2k0a3Uys}D9{fMx;F3q-Rat|%@GJmpdOunGe-2pFCq1j(5q`z%l} zlo3bdPCNth1RN2KHzc$OM&wI0PXewzH{bq_615;ps4VELZ2fB;h54pk3FR5BE0jD6 zhD7Uv&AYmOF3b33g_3o_W6DLsGROjcEL?f}@_+J210yAi%nRJTW&T4#zb{^6GR3=> zX%BMw*#hXg)pP9<#Y@h`iT)A0m$!vmOKwen7xmn!IM&~JcVbKUZppSZt8(ph#n;p_ z$t$T%kF_loR~_DVGM`Qr*{@U+GkMuznN103Sxd5JMXkZJnD-{gO70HykELms*M_%{ zin%FG?k0{JifOoypha!;T9>gOal!`&zt7#|vAUuKPI6hG|3zBv^Kly@^_t}u_HeO?#MFj(90+EW5v8vSlVu@3}hn649hQ$ShR&W~(2@Fb)b}Pjb;?G3l8VDp>EC@@;cmMT zG4mk*VWGy^wUTK|PL}U81G4&x)X zV|}N4?&#R@xxrYI>4$dA)<3dkEPq;^{%O56n*BnN?i#hRjngjcAJV9>I_Gp4PkVh0Z z_%!wJJ63=GpRr$0Tm1d6A1-|R{prOY< z8KW~rV&m#>KR+{O-IUf1x95I-YRrl$r5k?z=5zlsbEll#u=txJzGI}OSZ%mEXB0tq z%&N&v>#j~c@=Cb3b&Sg7s&%WUe!g|g^2tRXBjl`;n7U@mm?e`@A)YMj@oWG*WYf#z z2ccu_uM^{`(p%QFc7CZZ;gNZ7TFxo^#bZC8mXl@w+1NExbK32T#>9`4S-z%q%($%* zf_n%RdkCRaP)Y)&auCXngiw|!C4*24*R?Wxuwb*(Bo*Xr-Fcriu2)*f?B(^Ra^bizaq)av748p zOKk1VeLpA~w*Hj6^+?Jh36-&|h}Bio{6fAU>Cd*Ckn?Vm_r+eCf^*gHf}ZDl;}qV8 zUk9s}Z?{ymL^(N}oP8;h~&%dcBW& zRa}pHU5a>houkseKgT~2_3}%AK$7!~E#k#v66ca-#*0}zDc1Eu*DK4~SLC!@Bn8iD zUz)SqHzijhc_wRyR>p-{N)~zk7dd+^s_gs>me!uqsv`NRiE*0u5A2`puX6MYR;+c( zPhm?SLG6E-QZAviIj_yv)o7{dwv*BmNFlQe8*6XPFFe2+4!YK?bMrq8?k2d#$eYUf zmp@|li*}#qDEyc*RwDT`){NCvU-%h+Mw&Q#==e4{)6x@?cUjsoQ+e{NQ0=NaejYPO z^!ulJ1SJ*65z$h?4wrl7Ze4Ptx@JpPpU{b@iKr*@WJ>U4-cpvS@0E65WMlfZX)a}~ zh##tq`~{oPQxuR>QqrfntYYcvR5kcj%8)|l+8xfZJ(W^0jaSNY{8m?I7?`fEn&{{8 zIZ0_Y_X^x2OLqx9*LOBu_H3UENoPKHfr~y0#QE*ha<2T8qA%exfu*~qYLTDXSW@Kd z@~-NLhg?sW0}dLDf=ecJ7wY^j&tw~x=GrP9Kf!oX?R-Jo_Qzd~d^<*6`R<&maXk;HlK5(3>=VK~*DgzC77| z!As=9^1|_f%hs|Npl8hrGnS^MZ$iAftZxdqUaL&w)I32RlejWDt%8)1jb6_37;RP< z?;;xT$qv=Ij#KMWzH+DGzBys_@x$3a-ivm;>*x%zYzOY}@e+AS- zKvbJmXIl4PC%ehF> zBX8DlP&FSesjVtiGo`7Svi0;1*|}d1!8JzI^dX0S>ObVMhph*#ZH%C$z9iW-7u>Ez z{_>rurnhF!bIzFOe0dwr@*HheJ!w5336>|3xv>ZC7Sg(^H>w9VreAEDbO(tyA(R~y zo?K8v0m0YRwm8e?JIJYDe?IQ&hDkbg^BM`qEWG2ujoEb{32-8EHKl!~4>C@>&AGFKVaN>_4$ry*<}nOA2Y_2+$PW0^ z;aOWib=CuCwZd1WQ}6RZrAjVos5Isnd=9j#cN*en};{IBKP18(wW)TM>D3L zD4$C_YomdDo*J39x9R=Z_0GnzyF*DoH|hyv!J} zFUB1?`s2P`_;(>D1 zV$GeaMn&>gGnP-hG`8R;3(mx4H0l`Odtt^Ff8qti)jL)A6+8y|iExkdLa$@Np!3!d znw0CO2Zn*>4;5pmah|_S_`&F_!1Eo3Um=c+38qG05AMaOz-gDV~=n$gB{qfE1M?`xmv1n{|BHa+LV~-P2_veD~nsF*2+82HrR_$ z4_{G&A?oQXD!uKMFXk)CqrIOZJxvlInfd_fZptnbh1eMe{?WNR{5z0B5!ttN++YMK zv)FPBc3xk#l@grQDYCo82uP}ZMd|cY@^+QykULbRXjd6LxW6>GzcRSLI=H_!xQ`gz z-x%0SCM%R9chF8UIp*2GUg7zmyAs_Srw#Zs&K%tTI=Igs+~*DM9}eyx5ANxM`zPqW zonR-pVnkhL+rlu&VqD~^-SM_8V?XXgxfYj(2A2p0SfFU1!L_Ribm8G@;&_c3nZZ1| zhX?X0lt1zf?LYVl?hiYiI_WV|ISl^-dFm|R5VMp&4dB#S%CA1GKH7)O2fw-gzddAY znCH9S<_`hVB6#)n^cjlg%%w9Fk=ps)-+32*{S5^$4iI|5J@5x8W6{Z{bi+RYXr36n zzO%3StmQ##MgufOe>AE?pN>G1-4@btl)qEgyngv>2-;+RWBDI}qz&f&%m0_qoz;1U zfAleaA3VEj+(p6z;hF~VrO@fODC3?}``JhXv;U|YEl*b3#ilBrG(zA3(PmYobU`X2 zwuLq~>*vXj+pSwe^L`7Q$5c+X(Fw@}a5;RZ$U-MX*48<(qIj4f?SC^qO6nDOOSMGC zzZ=|%U{UYw+N1MI4c7+zX@ItKpK;7+WLdoPaN%B1GgA9xw+kG4OJy~k$a>XGeV5V2 zTaYzWQz>9TeFI)#JKP8UH6N1oI+{vRSfZdm6Kn)Z60r=HGq`nO)5EaO}m&X6X!xG%8d>4IJgbFh9RrB-((z0?A71 zGdm~Mon-Uh4KqC1as`&1Ez9`ai^9Gw-d^*mnrD-|&0ADP0i=J^f1F5p7)P%wfAh3{ znpxi1(Q>$#yHeOE;!kio#HKQ03x$$D7(@$j~wC}CgJkS%q!gGjRW_$#M@{Dou?&q8t%m9KQcFRla~wJUmxG97UV_SyWMCQ z$rvCL*oG$GAwEerhE9*6y$W-sO|ndqu~?-7xh*K$Io~Y3{&uy)6T6kx$(Iw2b)PFN zXbU>)oWC)>{zA3GW4o0W$uf70PgN+;T7%4;i(Tme7T7dGz{{86;#M2u($%*B2)?Ec zcDDpdjdVFcr5{Qxy5@sZ=(Y;enW(X=i7f}6r9NcT*>|e&Lxfx5`OsN#=Di!;LC7a=DV?K!&~)g-q@#Yelp-YXp-xZ-9)h!A0nmd-5bTiN1t18@N55S9j_;bD z0mxTK2}qYVP^bgXMO1`10S|m99pd+FUC#V(lqbg@_uIP8=9|4!Cx1$+lKf0Fr)N%* zI463pw^L5ssotlPhq!nzzcwu!{9b{?AE1!#P3F-|#q5kY&(^yq{r0bupSyR~04v0 z4ruGkUD}0Fm?r*Ld4h|KeiHRtkcJ-hW1=u{nw&J!_liSvGGep<%gC5X|GNt}q^Be- ze}1BDXJS(L-RUtgR<_y)<#rh}Bg9mkQf_2#m9=X=q)!f6RaM$gEzb()Ob>{&^3<-C zlOh)Pp2#!!2x?eZr!)<_?}dxc@Veb}R2whfx2JfV|KFQJCS^F_C^%VR_PFpJ<1F+f z*`&7Hw#e9@(6Z)~@~*_<@PHY%iB{LNr4^oA6|eUnMrERd!jEXsmBbDYGDA&R!{muk zU3xRK*|Og3k<_)u85+q=soHb}ce~=l{-MU*RpIZT&_Zj(X8?!32iPy99WK7&-)`dA z7_KH+o!V5W?V|V&YNE8;vj^Ghamt;y&yWMuZR*VCijSoFT#IS`nx@^H@IXngjHX&` zywY$=xznm%TTW@08#>hEB4ltN8ju}TDChZS5xYgi&tC2xS*#XNW8JNL%|+_3qR{L$LODde74A2S^#ei=bZ@^FDW&nW z>Bjm`N^y~v1vmo6!T4V2#XnS#$}cuNmFKWL=vur?K)sc`j`_-ur(Awu>29jpcwB7} zX~DeqUvjRTOF28`_mTCeP9?!^T{mQ&8RP;b7~%kbKokNNLQ_Yh;%a4O*-frGG__SV z#hg>8TpTm5{SFG5pz4id%X+b!JaiapeKlx)8hJezQUltS%yV6ycWntSfMa!1$6Q^i zws>aXr>1HhwwlBq&tE}Gov&D)Q-3MNqzkQd2J}GnS0)wDSA3qM9fFqfM4?M98ZSgW zPUY9qan;fcV36GIt@z`O5_ z{X_}lAD?}ZGh=qrXYphG6js}OzV`ztli4RGt|J{;s3?&;HaunZG)X_!7u()VqPMDg z&Iz@3B=W*`iCo$66fI=LoWocVj>gY!3fi`Dx!8m%NgP1EARFLe&;iJRAOy^hrx;tW zr`(vPa-J3O1TEV?DlEH|xeAdf^=R~d^ZHP7IBVzjsuL%Sw~^$&v(wIviAtG1Jvkh$ zTheDvm%P?5NKbdU#uVb8%gE6_Vu~dQ7OMkqAJ@Rc%o$+N#na%om_5I3J&e} zFecqVRi?NxcixSZZ>I5>Tpf&Zo+enZ1l=~|Mx zy4^`y04HS$PKC;9FsKrq2qBWX}SA4#yDkicOm+)f!gBl%a>48y7~ z{EhdJCd%6#$^8(rUu9$b{r8Y2%Panrt9?6VJlYgw?7oevEcR%w)9nTiw{ck&ue?0@>h}l&4_3HHp2mVKpNN!slx>* z_)zT>JCpkXn^Q<%sVFkv?epz(|15?P!%SHrM4M)4gm>dlwPd4(2pV&S1`AD*3e4z* zYC!<7n?WmJr5MSm`1hASCNjbPwGJc`#Z&pYq*PTz`9v9>f2}tM&G^!wdMVnwV8@cG zR`d&LBomcWEqQ3*)v74dALdZt$mu81XfV##rTi>o@N?}Z2a}DXc^iz(uoFixRF48u z93O4=2E2~>yF7o0A8KU@Tdk%(Ai1VMz-h0^7I5K=fhlREkcT>u6-VO${?8Y7i%vx| zNL;m8Z`xCKN}sF&wYHguRuIY5+8&oG_*5l>Bv7-1Xl?8ik?bEP(K}4&1uu|6Kk?rs zD4wTX?@ZZ_3x4#6gZh0D_&c2?qyd;sfT?WPV3ito6*ev1L!4bM=nAdL7c^#OcIv>PDBm(V%tUyj;2>VIes{*5X50VkpJ{oA`{%&-3-s^2Gi8@A5y0LW?2szi{h<93*7(7ifmrJoYyJK! zTEAGM25Zz{jT)>`gEeZfM$JFJQ3G`D%T{iX$XPA1dDGL$1&x&ZO0K6KD^E;#00=PP zAYUYggrFAS0q6zDx)+SXH1P@Z#FDzeIndX9^9Oh>cxET#=x;D0Bk-Gn-9e11F;zp zY&!J+Vm26i&kXjm9qdIzm=$1FfLQ@%1(+3JR)ARnW(AlPe54ip_IehAs1X@r#@=3o zDFJ(Z5oQIL6<}6?SpjARm=$1FfLQ@%1(+3JR)ARnW(EI9D}cVON(rUNV=U}k_71z1Ulm4ttONr)|B`@dMi zhOJgbObN^DSYF587=XPo0DEHqRu*Cpv|Cl`^0n^kMIiL98!`^#!rA5bFzKeL<`*i1h{k@qIz;%{*BD z7VF<){adVmi*@g@?)^WZdylvDzRV{z&@O(UaEw2>LFWSA%o`K_DkX@hAbqhVXr+km zfc+pJ4i+g1h&|L+r~)LsP0(S20JMTT;5~vZsDzV6_5wx^wGFBSN#HFa9=va(LKo&f z4qQyQFC5>6378VFoPb#YW(AlPU{>&dVg=>PO-nXxox38Sbou&{nOn`52NW+~RnoNO z+OmMcj}W%nFU@?|J-;Mm%O?=BV79->e?DD!pDJEhIG^w)W6H#o`AJF(EF)nV3Cl?T z7go>;+|LFI00|J<0Zjx_0GyU;;D!##{q~R>{Wk{O&=EM=`?f4W+?T6X6x}$YJIV3DRsH{5 zk!mVk9f?txCa^q#nF3ZQU}YgzD`55GCu|k~w>IQKo+?0W2TD8;ECBf;P!9tK0HuyX z_W_xz)H7prB*v_{@?)D@&czcy!QZ`jeDT|}Uq9i3NI(#Qmp~6deV_zTV9@>VqzHXb zH)sOI;2O{YfiPZ#5tu%PWd~|Ecmg&9B@rfIO87lFfeXrjF|Zd=F#%J;$LEAb$w|~E zdt}_@IYpxY5PYa&3;V4l<+%pLLiK7|IZre0%SlC0wxd# zP%p>^co=kG6s8F*Phh5i6$)5ch}8;M{fIRS{B^%?9~HUosGR&5PP#A_GZDqs96k>Veb3aJvCzWGFC5R^)gm3WA!ptFJtxcUsNw+ z@8iS<#jrs!Y)}kqd}EDotnrOCzOlwP*7(L6-&o@tn=8gXxADQB+aSWA69faQ5Yz)D z0P#USz$i=;Sf0R40V@=+vJk5ku=){e7GMpee`ULn0gk72&EFU*r$z_0`m5zE7XF;( zow0P;r782cH*LTCX-v$_lToc%PSz5ZpGnQQv$UkMVmf!so}Xq_dG9#ima1*SD0CBt zp<1AV0j7h0Wj>(9z)wL)AEXcLo55BQ^#)Mkf(V#V`X-47R1T2F0Mh}M4=^+MpA-e- z%3Th5Veq%pfu;$Ms}J-<1TH8AZwoFWs2qF%h>JiG_-%k%s9Z*$y(k$r1~H)Q4JU|( ziCl0K7>KCNUV2{AMuivm#Bi^iLqK{V=$zHoy~i$ ziw!{`ucduiz2G2&#VdkxucPny(W7Cj68idAl$fhH-G6hNrNbpI>ed>LD%>sDL(xu#FDVi9#O8 zRzlXNzJy>RTn^d{sNQPP&nt~eY6|InZNgs|g>-(KC)K{uQt0e`-@Y;3TkYVpO8!df z6}G6YRn#UthWOyM2^|@QH@VJbx01V-d8-ka$z5GuYJ}?Kt~*|8a;23<6ePHwHsL-- z;iGQnvg^sbo7v5YWwJIf3VJH<94fcK3dzyuk+E^ z9;M}@vVDV=&ywv;YklOl`>pkvw|(JSAN=+QYkX#HS6$;HvHjU`DR;Zv@^LBpq5ze(LEU*AvNCs%)=x(`+V zftpXMzLlEK9eq_bpWFJ+R{8v*zhRY6n10hrpHTgjl|CUToYyxTgrD^nuJj4i?^Q*> zO4Y|#UscuTsQ!3WA20nV6(4tfR}~+Uev`6~oqme4&p{Nd^bM7L_Uk`b;iIEJbGeV2 zzTq;TrTV=~edP5oEcKbMue#J{wth?6QetMI0loJo-5{>(>EX;~{?lby?!qQFbq95a zZgm_1*+AA03hKdY9Tt5Zyw-kERnS_SMYn?1S}*bpT5GXrOVC>LMKVEa_bh5XzjpVc zjPq-EEjoFAt-&Ib^J}*+l0Uz8+alq)wYrPc&)wHr^zFH|YZrB&WhE%W&8#>SZYhQ~ zvu-HbHM1f<5Uwd|HnZLWTrF#fA_5B)O!m{I{}i6Gb}DE-Wqq$uQ_9+;;9bgEr+_PEX)0uuuv8UHOIS-4;3q73 zh0rG~F@>xm)_4WeBGwlQFr6io52dqu%dkJz#muXVF-$@}@MFgFKwavXKwXV{Mnm<+60;vvOD)=AQ>XaB2}jvafM1FlnMp6dewO6uar4nB2I~C}CsJ_Mhhk?%Vi{(b5e; z-Dl>x?As_~l(0VN+?jdAeH&*OE!7TMerBG|zKs$_30gs=r{^i{+c?2!>DnO2)AJ3P6>BW$>o5R@1=uhD#CuVI2l(DuN2bn}g!hD+6hx=+nZHs9E4n6N77 z+^KmK^NkILOIHRhKQ)hRzVU@&f=W@{zj{c zWxJgHgS^7`ldUSGcRBk6iLUNnU{&#-UCvOD7iB-qvZBSv*)2$PWxtC>MX-_czM#wt z`z0+ZAR}kfAdTSt$@?oTjhqdGGSBZf*k7S%qf8HOwuL5u6 zygo?d%zvqQ3$V7fe1D$`v_L7);;zM^6xS3eUZlmnxVvj8QXC3Jin|ndhZMJB#k~;R zf@?zlp>xj6nKNh3+Tl8Fe-p>w(>lMCCRKm? zApU3Ud!+vTZhVR_E#wS#W%O<7Xb&>D6)bvSiSnx)Qxvcuh5TOt3b(z^JmzX@?s7sWJ6 z8TVvJTT#S>!GVQgAOTaSI%PK+dv6t@>c|RF#Z8dKrF@p zMalp)O67;=r%?hGM`td_z&- zRok z8}K;ykR>>Wd&msz#64sTe#Jdx0LI}S(sN90mU&GW!a&V#Op_Ph85{li#SQ@AQw=T4x?sEoO{l_OKo1N14k{Q8BWgk5 zdo%rDSYva+K$vLrW_DOw-KIMN^smFvDhnuXK@^r&u}L`G_qG}ml@DRMYRv*O@wa9z zFwM4PftbvvX)&5s-zAXj#(3zwEtB1L?rUOopE`wkNR(-_(AQ*)`(;Hl5GDSEgDuX4 zM8kSNml`MXT0c{gp92h+RHWgi|5Oddu4tOL~1CpREPIv5>8Q!Q==Ja^LO{1nZ|=J)d*?oG{ zSLW2ch{J3Re=qlA*W@+!V^5bo@VhmWVB%FEv$OP`Yn~gy#U=1es~I`ud~Zi@Un@38 zRGQIdhGHZC2D$_RBRTjyKlV=q*0Mobpl56?@09SkjrIRu#$>C@#`qJf{`NfP|3iqP zG3Av11)dDm38Me&NJ(gSXGlp9bz`tfXm?>yP7rlw5KL%)z~J@qZxF4g4+#5jp*@Y> z$yfBj-{U_0D__yS;SN2H?+Tpl2L2bsvke`u2>zS!sQ*q@S{=l+w=Cl+SO)TNQJd|E zJG09b(l*CbBLX@c(&5ut+keCBvHCr_@yM+X+x~(L3;R+$HZ#KWP_~MTCt*J^Tz&xy zT`J?<4D~O)XblAwT{MM86$%GEsXLpD~}lDqgEVwH^NP_J+g~f8@IEHSo^oKQf`sRn)C|- zSYWIIVzXFT8rEs2npcw&0*+$lwU0i_k~#JnvPyrWwXWMOi3?b$>`;B; zG9auaJ?dW`LYHn5ogD019SzfVIKT&?MO{hzbndHBKMNWZ4=r7n557o`t1ccsX z{|;uTq461i2eh1mm!ZGIS%w*A=S$Ap1ge#B|brudehB!}~3+{4~ zxe!Hd)KIbSM5zR(+9?MH7M34i`9ms-zREUgDL1=P4*OH_ugp-`(OSH@PQHv%C98e3pN z1Ebt1rI6@2;h|>|s#m<3w=(5cj)mSz=39xVTn7uTSe-XeUAb#vPxSL`v;s<1;u=`? zRhMmW{{i}FxOs|y2w|LcG5tTl;Q&6!>kmPSzhr;-7o?X|OdSggLB{?VdS%g*pws4* z@UA}fKSHxr*MRCD!Ruw$1LZ%0AWoOqn?FMJzW9#rA3?rUX3~of#Hew+hErrTm{3(5 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

      Ty#r3WI|Z$Y%wT>=?CZ{C8Cuc0l92%*OE z9G;@GW=R%mNn9Qca$FM*?2_96yOMxiZ-8CVYk*ymf?KjUvq5D@_ikf(26i0?;VKZq zRCA(%+zWWC5WoRxt!j@ZFtY~^umo@r4&Z>)WYN!i{HvR>Jlo6W|AzyRRMBoK8gyH- zUzrP%3Y3R|X0zay)WtY~aqCwXBY6&X6)gcu7MKn%8DVo0HmQDta;t=DB&f2_sv|~a z%xc8)Zia$q(SnZlpov{~IooheiNT5%)odnGR1R$7?E?@+`yN4i5J3)zV31LCCejXC z*HR}rIu-WP?Z-Z?QfE7@RizqXGkJRz*JuF(v5X;K!_i3?b^r=$fTL0YNDZx}rTRSx zvm9K;`&lulN(LZR<_Y}N3H-!f{{P|!iq%y2RFbP;1DhCS5@-1@71u!V`I!&e>%!we zWt6RejI>~h;dx7<1MeV!r=IU<;Ht9GEQ0FeZJ^zHxT|?1%}cXhuqcaO4wm1Y za235CxJstk50d>LNOmtf$V}@Dk{vi0L;3|2AUU%~IByH-w>$=r@H>be?^h)76Qde{ zdHwf%3I};k+G+s`E(>5nuu)mTkedpv87+7>AD62*lLh$`0dT%*z^nlA3jt#&$1+xeCqT|vLHO{5nyjmxroX6puf z3^Zfk>1GAD*{!!XGZ_|J4my#xD>78xnMjy-DVZw@mMyBxt95`J>I)0Ne*I~on!UZC zB%M_vU#Wa#ptD0NpTrLRr#*n!P6AwAb~bLd<-1ezhBm3p0Q|%%cN>@G0f0G|-_zP- zGo7N^ndv0}n_ox#kHQm44O|DZE=bj1t<MRITP7BZwH}TN&quPsRF8$msO_OfE>NG_Z$c3{6C_(ZuEP5 zpC%`kMwRF8&pBFRr_Ux1@^4>z`EV)_6GI0T#x#;t`(J6<^65Eb zlGdH($7N9h234-WHo&L|5X-++yD)L#cVcw^j+HI#A3hH)oQJy4Lw}!#)aSV}7e;EQ z7RmVagHFo3Hpfso|D#2gt)A2=avv;VwVO1kJG8$$8bgq7ru}jM_$b>{Zoju&44|vO zT!?Dcs@2iL$s5w$MhUw0y)z(!fJgo4HzbD2ogjie%c0HmOpyCt7DQ*DL(rQ2|4%Wr zT$4B-nPxxLD$BE%u6b$u&v1Vy+2#%9C#ZVpCr_5p>)%Z{L?^#UD~U!=1Vp~tUbt9U zLcH~1T0UcY)RR4sH@6U((#h+YIPYH{wkvSxm$DhR-oK;Ea#zh$+|oR2-wsuu+46jp z{-n6`^z8h^^%wo_tLN`*>sESq>kPm7CnN^E_>#1GB#iX9r|tTkp}l3h-TXG~D|27v zSJ6Za-&vKwzEZLDWmlE#$?S^*W6$4qr92J$V$f*#ZeZ?qEyXdGwcOy|?>+^$FkM*}rOR_{qOli3=Pr z|HYUz&%A+PlSW#iewus5g?C-g%A)GK-?=~HB^8g*U3;~stC|ZZzP;c)+H)@PcintP z-lp)Mr~ca3t)-SG^n6Z=8aaI3va)gTMQHVr`s|Ny10tGrF7^Y}f1J)avGguYy6dlt zy5Olg?ZV`$8v}oh%{CGe<;d4w^_+pmjFkr$tI{~h@93P5rINXyzWFl}iCzZ|{NChS z|9J@g_^0hx7q3VDJSlFpj4S$hwsHDD$!A}`>Ubu5>+{bSZP&-mfBtcL=2<;YI@CY^ z*Q{Ip)q#L5i}PvaQ|QI_er>&XqIgphMsMLH;g9Q3Tkgt(Y)w+rn~9(Q-5PyCW^|wa z+xE9_ZcZMHe=;d7;~W{^!hQqp^X~8>Bk@SkZ2zG(jXyCX?HcP$8f_Bm5mkSFiTmh@ zdD3_kzd*rw|L>2}SI;kfYe{6j1)q;)jbm>uPpl0(%N?wk*Nsd$R`fh5Ts;0Kz0r8& z0^)5odsiY1f9ss3?Ru1ZJ91WyZOkGI)mT6Y_my7eMC+kY#b+7=Xrd$LEoMXC1;0sV za{T>&)i|jJsjHKuDOpAUL^c8txmYv{dE4>ybd~29xxCT2;*hg%aA{TP1Aj{wBG)xm zSTAsbk35)idemcleM0r?_P3r7syWpK3zRSJY44P(t9G0 zI5zzF-}YLN42|{T&q?HwFm~_QaECMJZqJG90Rg|1xv%LRKatj5>ikkx_|4xdaVhH2 zpI^wYp8Z*D>FT$x;*T#|&Qygyk&zlT;j@hg5?@8V8Jlk3dqq2T{?3Q~=nGFKu!(yg z9yrh#(c|{=^idt*{(9h|^Qk3{ zjUI`6kImMH|J2RM(Q5sl@2@zQLtnaBm~^r3kBagw^FO|dG;0*gHdZ(u!jA2KR>f#< z?D=PicP`Q2q|qQzn(#U4#t3@o-55dh-|KTmP-rYa><|S{@CppW%>_ZYKG%MO+v5Djs;Wjp2 zW|}bq*`9?Mj~5FUT?KbZjW3hkEB>f#yzB1YpORqJ$e-U>fvHeK4iPf$e2;t2ZAPhX zB%tTE7{J?ju16tSaeCRH(8JE~(?+AVt z7&~4coXVIg+t!^sAX&FCmW*q>^XtZnv-Lzzw=>P!;HmJ$rYH6Fk4}2t82I|YkKO`~ zg3{E@!B;Ap;v20(y6Yy+Q4;gP13sV0{(zJa-lOXMx-rgA%#wxrWQ&SAaYtQqVZaeo zht;#H#mKF-p-~rPW5KfvZntW>BpTMh?E^~_dz2#!n|iBRdlKV1Ui}$+Xv%U6o4tMH z;{OgF*z#;tTX|mlrdXWtKs(26-?W!U9r`lENDK%&(lg_taCn?BP`$9g8mKFa7<;1( zrTFIQc)@A8E@Dk2Nbwh;MsL3m3N)vH4>TU2fN%N>_gq&v)R)L#LjC z&+6XA46aL${WtC>hDOqZSSV~--xVwYXQW`!kUl-cnt%IllB zshX#p@O!(|5$M@fE|dEe0c-yUESSd?C4YYS?|vcB9@zp2*ZBNb2Df}CBQbRMk`h_` z&8;`&3w!>D&)9bM1Fb4}&qCqE`dM-P=Fg#3h5ur8Mc|W1|EHxT6ly=-__A?UOd|hN z7U}nhG#J;cJ>U9s;v%@p3o&ZhK0C1L+yBSZx5qQt|NnpP&wY2gJLqtiO4;236`>+Y zT%8q3XO+X!Nl|2Cj=S!nBx#k3LaS7g!zwWh*Ii*r89A&nRvU(8Yt8Ju>-)Mszkh!J zc+7TP@AvEddOcsy*Wvx%HI6Q{nadvjrd|xIV9oq6CS6jpv!AZ&JkiYH^WMa-rmcA#gumt13Pt365fG!4KZSw%3O?LYfYn-`Xpy>no;Emvu7*ZqEMhnM>823UtG3hrOVo}g9j9DLga)4Q-IYSVQ# zKK*q3Zyp%#hbz1}=t?Y!Z#~Qj8glF>6}G8#AX|bC(BP6|HOxV?f|?nAy|f32v4@su z?3q31FRh46vhNr8lLZO6CQ)2{A6M9QIufjFnU!|^%jPszXf^HtYH%JB8UBW&lB@0 zTG4{5GYe5lM9p+~SJ!bLMIO&UK{ia8vks*UY=UK+pAS;3oC_DUUY$K`#ZtwA9^R@( z8*~vyMPf4vlZ=52JW?+h)yz~v4U)`e5}EP=)DVk+o-q7GGamC;x(H^I+?+XVC6<>o zlTaNOq$zc?1q73v`n`+ajsrckOdD+&v#7mbPd^=f(gq_mr-R_CbV6{$CP2h%)r%&a zxeuj;-J1%+dk={HM=vRTw5^{`w`&E5>^yU@pYH8i#PD87{ps@nag+EYDiDfoP?9m4 zy<)UsLx1ePemW*8q-kFF)HA@T#^kK%_YUol!Ac(qKzx@SAX3;8r+)nWE)G6fE5fvI z4;j+g`aBSN(3`Lm!xUB`^!61~I|jXNS?l}hWS_uh^xCdEQ&73VlrS&~@W(X|L5WQn z@TTXj(Oi^rF9Ve1Vk=>hGE8sH_O}@3m^@t$vtO({G(>0o!&{16=Lfh*z+HY1=w$He zk%fw5>cq(5M(Vh|gTKW|s!Y4<0ua)iU|n$tXiJkdtU|8)opJ?(#Jd`Pjej?k4~)QM zhBc$lcWrk9Oq~z@Y1!k=-|SZTKb>7z{DEwU&lf1&@DO(Op1!+X$E%S8(Lq&G!=kAqWeY}2> zMBnaHd&-&qz{9mKew{8Re=Wr;jEHt!pMIVnNfc#YHK7Rm?c5m+_6OC5BA@h`7dirlQ~+ zyEpWDmxDa_tsjTp!WRkH)C1zKpWJVe;sRsO`mFup4L`fG`o%{Y(yD#?kq;wtcWE_q zC`>jWF_%BA7Ia)J}1O^f2cht?MG7V-e#<8QvLu3b$L_uA27%srfxXMN37TnK-=Gkk6R&X{7T<77!?TB`<#dSSs!%iY~MjT^Del8JjkmP41DrlO#GpKHnEAL{ zF+(dlQl;dO@nvNKS6C>*5u8fUUv2-2r~9gtnn`%yG_8U)hmv~_KGY%kQ+~e(ld;$2 zl4&*-cqx#If9I?YzSN(dUuR|G-aFt&!9da!#%m*kKMC~7fG@MrQY}KVYM1;V43%WaLYA`l3`1k(v0DUy1dob}T+VdwHM0a5ilCU`x#0_E+ zDSjUkhQAytxem;CJyaWmQqa+G4KivrP{XriV7p58YmK0>3`+%A;2mAx^g&ZqC3(&0 zjUn0O0j|K%VCe7!F$Nza=w%C50SjV58SAx??x%7CA+p@GF*=`9j60wkmU3CSae?U! zz?$mMmE}eYAKMRBB04<&-MA_AL&SRA=M(PtUs83&l_?2jAPH*K8b|q+#W&o+(tV7QY>2bmL zn@NJh_l=q${=2*JIGqu8`T7?3#ZhYL_2@|5BDnt_coYwV zzY~CmQL|rbyeEk5L@-W(Xd(>R`v!V^pQC{$N4!9}PTTFHjp@3m!$UEhvO3f6R1vwT z!obtJJq^W;0aZg$bMnIHWFM`bYodRg@iELQGhVz%GPLoVuZUFLJ@mP~CguQ- z?HzTTeDS9!=K;ac%S(JcuTat3dWtj05E~h{A%D!nB1Ly}#tB3G*ouj7;upF(9>n~u zz>t^01pgK6(9St~GR@eNod*if2yp60{PX_`gf>~+Gf?=_Be15p!^7OhqZG3w&9?a9 zD@M8Xd{vtRFkqcSqVa_vZ@i*gt!y2Zg9 zR|Qd>PV+=a>!mp?xU-+7@?G}GkK4Kh|ZtSt#VvyV29i|6m-2zo)4O=;F z9i)?jq4c=fMnXP3LMj?|q584u#*zvqyx0P_1Y~GM?oiK|MtrPd6(KZ-Zf!!*?qXH= z*TGKfAgOELU|V_hpoHP<;Wb5?$H~SR2;EmIeqJC*KAL5+P<8nXJ21l7z1_wjcbzdn z-;m!k!;<{;r2!j~O&_lMWnige)cgXKWRT`i&_{cf#GjU0q`0N#%#es(yLS#Y9}YB# zShgLEk48PvK zb36z^&sx80V3qbg#%b9@VLky^zum1=VM%^`3eb9QuU7P&!_Ic6Ega?uhOZNr+L%eN z=b(>J)bSR-e>y<#KUIujwWCobx1Q%T&kG>E?BgK=w|DiABQVnkj#fw7TrBng%TpiI zH2FQFiy(Do7k#qBlCpg&0RTRgMnfcBb@Lep$+Mj|WaH8hund+^`dY!rZp||dHq8BZ z&=`F|Mj6sIs@iF2MH0Vy)_Sz+$VH>Raly{~$8W0aXp`JTUwg5=ahkxM*-SvMq<9(R z_2Pq|p9J2Z3>{ZtM`Vk)OSN21Ock@O0qR_%nSRwkjtZoI*S4({?66nLy*w- z=s*T}V<_F8e3cw#FS}hE(|DY)<#9u-$vhvM5AH&h*$1n1vlm1a(tQ{Rfcz%jx#nmp zO%pnPRhVE2c>UL4!ds6KX*X+-jCxqAO6(aa$j#Gmbz>(iZJydJfq5npzu-~y1(sp= zB@_z4OZE@q3lbAv!t^&6VXANg0K0r{iG8_kM;L@39rRz@#*pIVdW0 z81h`&zX9-4dIJ`V*B$CU{bE;%3Ia>IY8E7A(gq-rum++kDh2V$nL)6sIw=HTjtr`z z-_}66-#Hf=9kzQj>9tshJ!4yw4#F%dSZ9a{no>bmfVpBcz=jstthoR+vpLJ74Gh2c zj*2oKd4aq{E-qHNo!LI5I=8z)r9Zd|f32gPJ_CIrv%s3E*xN(h3pVAO)=X)_e{yL@ z&KSHyy91#Ii5Q;0R+1`uFMziA>kXQ?aTOokVTHHcClsT%m$XZL0pJo}h*l44U;)Vq zP+aq~pn#1(di}Ko>3K;9*D9dT_QTPqZLeh@W1$Sny@*A?xw!iEHzkR3`DbkI~413Bt3-E`8FM~$4t=i0BxIyHL_^BN3n`FF@ zVK>i7RUTP06_J$Fx)C2Umnb^0x z!OI5l;C|a|7|KNw=(r1+phXMY{tWCk#XbYI`{@wSuodnAT*5{!z}87KW3&#T_!_6e zrb;9_>j&<$MEN%6yE>Wc!bFT0uj@*M>)VTXBOE-5TGEaGItbI%9LnLoTuMS&kwz8# zf4X|n99%vC%B=1lG!~Qxl%AMG;-{U zLYh%Wp7#jgU{ahRer5$X6u^v>Z$%g$wl()aCrbk2jGm!86QFP`t})6L>LgJzG(-^I zI!td*xkJ?7p7O6l4E_b8{GRr|@_XbejQ3@R`S;E zYH+Ls68DMj67TnX_c03aY2^a>f%&YTQ2=pi6d}u|H}MW`(kQT*k+-9tPOX#Bu-qj6 zLGU2PryW>4o%`8)C5Y=QjAZ_vd|eU)`MfNZcMnewX@LwjtZhGvd%i0&?X#9Q{`|^A zI?m+8L4!k}-%fBufjueB8{3WHTP&#mLSsPC6Ab9N&xTcmQfC$7rPQz3etHjT6T@l_`PCKmjJVX`3Oiyw3< zzWRX`q-jtFt6!M(i#^|sBFbLGaNnrzeG!muaqK`*cH&D@|T!$^FApEry(#xfG+-^9D)lfbPkNC`4~O4mJb zt7uZZk0gppE)tO{#GPYxNW6HZR(yI~#kn`IyL&(FwT5f?`0Afvxa!f3CJR)FU}f%# z{j?<&uTO)snx6(bG+P3BTH@E)!`zn%CK*8L?+&@yG>*9XfsfkT<`6n7z{A}cB58wd|bu6 z9C&>%M=1_7_g%&PF&{j7L8U%fglKO07qOB(WKSc_m; z*~g4@&%wYPD*svA6?3g}z^izxcL;rLd_ufdX`B?dr|Y2W!v=5J>1tAnI=ouR5!p~8 zbo<5Qf9}@xi>(`$PAqF;AGLP0+KQ;DwRT&RtcCoF@sK7h1j zSiCW~ZHM7kLPO~+i0_C!pC}nuLxT`KoCNiWQ#E993^OPnvKs+2lOF&0S&5YhJwtt< zje)IPkC41WFo#)yt$ zGI=G?EPo-mP4ZUw{4rFC)FsN$n=mEU3;4rjJ6zB-53)O4bs0JqEc`I)CwZn)v(purpYrS`!{v zF~Yv3eSfGTpy$nzBnc8Pm}!V{|D(b&Y%C8|TZHv9$*m2pj{fDwx2()!jApxl<(|pn z?hQ7aHAtERdUhQKxxc*7YQ|ESAE3B=dmI|W)B~AtwD0Z%GHq4`Gw4r)YEfyz6PhL< z?v!8va79hnjjulVM}>+|i<6K@n0WEGfwa!trs=E~IE|csfCt2WM_x2>3!P<~q?|9n zuIuzM1JMcJ1fs}4DlEo<+2YR|<(^hP>SEBi!rvgTxx!DWSdW^k&sPw&aHa|dKPMv+ zq16_^Qgn+!Rn|aHJ5^Z!_GB^WFF#u zRQy>0B7L4P$sLRAt*UuFA^c^`gIh7JbP0PPJ`C zLT!^*Z6~UmQTbZsjBTMm-N6=g`f#K7LZ{FR5KQ0vX%P9W4LuKAS7`VJ8aq<@&KKyF@`ej~+}1aT&cBvG}F>e)UHTI6r&N;<>y+^)O}F?MT!>l9xkUu;=SI#XvN30?}EAA4-C-sk`%9i*L^VJFt5^J{&~gWgduywI9-?^!!O| z)~!tJHN6%Wng*y0Pg{q-^-!9^Ze0$sTQ_lX--4h16JQ7M!dS(Cx|rD38@<&a@7ks{ zT{0bZ*r-ke-l3P;NP^Z!=!2mZM?gVLN39{~w+aeW$CgQsF1=~{JX;4 z>45m{&(P>D)iq9fME9v2?>h4PPYhY*~If=0I%9KK+OO~~9*>m?U35BSG z|FR|eKN|K0qx)&5W>A&b&@*E!G*IraCw3stDnGDRhhL&mpos5=-UxfB#STg0#|FAh z#U?Oy0fwWLJ8__=$8k#W>rFk~-Qc3`L#?DSeA>5oJIFMs?^Zw$lH~#Qixq6%riZYh zPom;88Fuqo-kEkB*a1f96zjfdbS)S?;$Lt+Yp|ZYb5g$wY3R93R5%6=v7>_}Ky7B4 zaPp^?v+S`YQSBs~e~g6KJHZ5YYg7D_z_RB+(XPrVgS1RFOsL%h*Coa9V* z1uv#LpL&ijaC!+@99rD`O$|RLUlD@J?55!>jGIwLO(jk*i7X{-bBy!{)guJm>JqD_7mB{2B(-e*FRUT$dZ6aSC zCn1qyKM+g;Po~{l%p1WuCeNFYeG)bKuq5`yvxZWGTmtEv+0yx}m$jApUugU^iN4|> z7iUzMAif#0H2goL!_|0qDQs|^_1llDi#QX(P2Ak(6{7m8X9Y{^@)L<}%N+^Ao1i~TI)d6hWidO&pkkz*W-elUwa;5ct8(@d52Za_(3NpW8J!jKz)32dZf#h`k++?)sTI9#e((pHF{es z11&$BPkmD*x`XKkIue~KJ~nk|*6KZi46&CMvhXMg93@ZfR7&Qh^QE0d^dNIL#RzVU z{>tdpM6e^PE5EC{X$IwBBX|4-^VjMeb>3q`NG_^kw)E7TK9S>HD+_%pz>Zxv-ZTJ*QtO2ZdV{wGm8Ve zd#N1-udD1TTGC*pzp1|!D12CN|FO;rgu;5o1`NivT z%H!_Hb_PjvBkK&oRYHGluX}n{2T=wk@)GQ}Tt#HB8#5^?CgS3jP-%g{B}9{Kbp20=BB2ZRXvhwkbW2r@J>wE8 z3NVahYzln}wK%CK6go0q<=*|cX{Rhf3yW?2Uweih23sDUC!nY3eeyVv4Xbto?2D`H z0m}y+OtlQ3XFDT^@~+gLbcKAvp5)cUhRBPO#}gj+WJZT5>NmHdIwifcS07*f+>i6; znYKPg^Z$fV7=JcSthEvxs+gjWe{64>%0Lq<_RwnlG8^A;t6%#~LA14ajvIhtRhft5#1%ox?+`~zt)UD9Mbs=D`I+%#~$GMj-x%~DS2557P@7D zO%sv6(GfNJH3u`t*VC(B`z=J!y2h_7%t?KZ(d-osunnU4nfJ4Z*~E)BMiqt|Hb}h# zyX8~GZv(VEi>ii?@%zh-uf5~lI=>8>jZFL};~Op!_Y4)RIzCp#DH@dZ_IKyW ztys?zw=IbiYxh{@heF13Sics2^bZb+{KsY}uxl=4}c*a9j!nhb_ zg)-OYS_=wxthH?bNHWghn`wf$-dn0_|G}^M9j9TRS+!Ctxp9aRb-IXCH&)L)U5xr& z5sPn~E{w=mr#odfeix(TRIIV&^SlJ?MRj$~*VYcLKH@DiOebKVuRlyLo!)^XjVE`h zzUp?X{64C3rZ$|8-3-ygL9gl<3Q8#AV(Df*R)uK16Jm(G)#!B!AG)BVlm6iujO*+x zwi2fl9?VrLQhJ_50V6Mf4fwfm)M0?AVPp>()cl~l*{Tlq?g!nMYFVeGi3?61cXvmu*adVo!EtLEm%7SH| z58>XShse;dxX(1o?fw>jhWvopAM_ljKHuE{$B}6JP=l`KbQVq_=eSXIy;!j-p;@%NMbVxZN4+5{l7?{C5* zu12DRsRAc4Ci7l!$Hj#ciwf}rSBd6iYxk4@yq+H8j*z!YNB;P(l)3z9>!l8NmN-=` z40M}}ELexqrfx0%4vBHipnswYdAD>ju-FRmpt!N20<#(pJCzrj;El)sv{Zf45s9}- zskq*=Tuc-}Vl&wAH*SS@3lVcN7AWZdWGvZP-dXi+}5S^57I$}vf&%*#^PyZve06wxAY7^i;+(GDDm}iQ}Hwc+3VDW;&Ldu znCcz4Hrldc7%WNqt%hBSDh>)zuh2&K^|)nJ@bmyxLVtG|IoktF=gqYLY;0(s(kGH* zMa>AlyrJ$-MT}am-uy{~{t|HgZ>Ntxuy`2j+#czF5@a)5_+gBYJ?n$}jq%grp00^~ zD;g$F0nNGk{O??Ax|aPVpR{j~fpz!1{{)`3U|_TizmZiAtrQdgBGh>FhNq4=tcLF< z_SA1dy5kxZ>}GuQN?(NA3bOogM^I~?BLsBA-yb+4MaN8NER1GCD2XG^dWJr=mwmoz z&>kcbWX1)^kLD%zy5De_2iK0DaGS9;^ym{vG5nqw<14fM+EzcntD}NHuQpUURXFj$ zcGo2n-SBnNritKHhS9_zaAb6iz7wjur?=Bxs&@9vn&ct5a3+I41#p6e>kc~A!40|* zQr;fxdOMlN!46VQU^0{Aqil0R5YHi0D$%@?MJ>4US*HwRnQl zKXs&@8x8GP8Dcygzx|^IQ~hohA|11&!S$N;a9C)bA9UR~y`IuF6~4toblgI9m$w%W zfFCS@#O(MGu(H)q3swx-)<6JMQQ{x%VaTl>Y11?<>-p|UF+{#4lbLoP#x#SLSNE`C zqARp<#>{Odag5yVICr0&3Fzl>4^&gf&O5uo#C5oNegE9`vdNb}%^Ut_cy{cL>rejq z@6>gF*6HlXHkn(n5yw$u|%x+Q7z8CvtmV%WrTS1 zR{p2fyT(*RbawtdJfmD0FCbZQHl;u5{H6_q>rpRLv} zO7TQD!9N23s08wgeZp?P_F?SOhcKq)Lwu@f^al9IvwKUeI-~pwdQxjg?)!ag; zwhJF+9-<}t_3`Nbf-&Q-m3MnPz~Jf>i6SVo)}VCQS52y~!G+`**xomK;q4*2@Wl)c z?GlcwRgDh4hUG0ntLga0H%e8(G2?>p5J$~D3x3x=tN9@HVD%-#wbw6jp^vFx#rF~V zi&JQd^~mx-T9R5ruB^Fw|dBX?9L^vfrBhmG;Sa zyv#t>)3*AFIUamd^Klun1DiWilO_89q;%fi19Cbo^xBA9NV!MD$FVSVi;&GXPIX!y z!%rT*+DX>`*5D5}`t|)q+_Lm@RznUHu`raXzw5c<|8`&uHT`tWs?qsd~NH zNF~_-TpnHaTxF~i*wi%2?ZTaQS^3rEVeHPWa{rH{-xoHyoPGoMr>Dw(8BC_KHVWr3 z84GF|OKS=w;zcP6&kTFypq@YQKZ!%VYJ!}pthAJOCfCX>2d4FnNhL3U9|X5gVHY>h zC*!B)|H@q$x?}Xm5mS7Hyn3oRM)K9#g%2$c9>IT63^1m``=8oTM=$HHb%41urV83+ zkCL|fRe!iEx1%}B<0MS1;BzsSyU^Al^|&ro;2GbT@J%f@?LC8g3;AnAZbws`di1>J zGTi5y#Jz#4q&55}CGJQ5ECAjV>`5^m5M{_H&o}_M$DgQenV`y2OOU@aVcAo^$V_BC#_|#ShaSpz)_+~M^_ZZSwL$W&pRYa^vQuQi=CM13(vV-w zOX$2Qnym%p?4iax_DG)Ej8fS>Y28%nGM_if=AHVt6;mRf#)G@QU z%BuMXh1)}Z9jT?i7grkY?d|G1DCPkX9Mt&J^A4q08&hEYVs))DeDQjrNARx&b=*6b z^e0lRiyG)t5SF@FS`f1@J?62cz*{eycAaDs?wBy`UWP7(+`&`EIIkCO*9L3tjN1hp zLAU>JqF<4&v^526wxb=vOznS`2hg6^mbUe%reT|Z<2BN+l`HP*x5!mihczuzsq4~7 z3yiNf+6Z=Ah7SD+W6^TX7t@npPjxE42BJ}I;iTEjdEuh*ggH=oi6tL5|4PSBq=b++ zf?r8ygjXBa920izOqW^F4D*Y5_taEc3$a zWczHUaIm#^cqe}uYBAprO1aB^p+1$Ep+=a}kJS!+>T$n}m6b~rKCfyWZ63fnrhAr$ zVnIu(tOg4JA$q1^;}3kQ)82H@%L9vPFK|!4_q!k};mfDMs+@KctGcwSSViXkO=aDB zOx#keE;ibl+k|guJOLB&mJ<_Ix4}ec$+r1d(W$C~#7#rXi|M3$rM+7A{{q?KtV;&6 z@Sv8EZ6eB(*sT}FHxiNN35B?SdRq_Y663Mo{3bl|Xm>$_Y8tw=f-r^0EyBuvLbkSx zF*e0|=Q_|;!jgp#ad{)Jhf`}uj?WOFg%asV0O-w__$M(~8uKYE)KEuNc8`or$vSWV z?s4A(6udNi%5Ox(o%c7WEp|En>=|6=Qea6$kA?ye&8P@Y$;3VUJiKU+)OH2VWSk_x zt-@DW;3Cz0Nj>6p`)Kme>lgpg$S(Xm>?m|QdPSD(=lyZ()J!+sDf+*|F>lj5wvnTQ zU)~+?^zx8?@4HuX=Hqb8g;BJsS6XaHLMAuS9Sc=mBEx1OmLHg-s@KgE3QUolM3SX3 z(knhm9pnfzk8v=rlcOzapIUORoO}t}-+J%W@)w!8DXQscRlUh%^isXa3}oYOjG-QK zkf)o~Vi^_>us!-`v(Z$wg`;ttTyaw0DGX{+zYtors_#wg)$eqD0QzxFBP}!@OB3wW zr_VHv8~s{`$dI@f{rX|psm!I8FI?s767m1hO(Hw$@f z>UqM9c6Ff8v{^kx7S6N3X~+Tnf!S!j`iP@(hI~x0ewvWls%F)N<;#!MF^lA`S>^1#&1#y^v_-v6s5_y* zD$HwDKMEf{ zR?8@qZ>S{|=TEbwkqNctIDlHc93v-PCOwifFOj#3u*q1`6WZ6~($E;k8m9V=Bkdpc zR!7=%HS@m?BC?)68-1zH`0vy*=!oPw%6)4Ed2;Vd*a7&~J?`RV*e}OA)b~F2u6Eze zVOHElEN0?DlXmsoI$3@`X$dXPE52Nv=3oq#7o5~Dl6#)ipO7m;^fTqIjDS4zRzLy1Yq$7<`ukn= zD@x!RLbb>iP_4jUG$xf)cpwy!OG1QJspL%}yXjc@lcpKOT+;~qbPDs@)i0Kc1iPQk z!e76{_jO!B<+6R-X95iNdd0iTy+ec>>X4`Mw{@UOpHyreJYrcNM&MvPfrE4qcONCb z1H_f($_;g4OpsQv1*9c=fwW`~k^3bExx{>ao$6C9=`Z9~JvQIS_PDE|t4*v=_Tfdx z@b+5WWm1v+_gbV-o>(U+mg`dR#CnE}aaS53)|o)8h(K)e36M7Vgx1WO=HgWqWL9C` z0!Z*_2P9;)fnvFN@(p#|hajo<6Oa_IdKBOK~dpm-lEJ9Fj2nb3)0fJIbfS|k( z5Hy1jlna8cuEp#Q09HuPYBDCVw zGA83*&L7pLcuhThI)1rc^`l1`Gz|=1lQ~7f8iJFkwr%5G<1_b zaW;NI?Q3vUFl=86P6`w1$WOrhi~=w}<35-l*(36v0fi=c3C%1G+oadt9brty?phkl z)Q=r#g=&psO^{E;_BJrT6%WjhEiM4}7w~`y$SvycLdGW`0(`H?Jq0hRr_Vr3>*-VQ z@o9`#SwE zlz?CWyr|w}3i_blWEy%I9y@|2JuzGts#?LPuoCbo+KM!My?$*Pqbv{BDDZ(*AZztM z?naGHWo(}Yq1)s!L0WkP09XzHRlw6UA*lt(75w^09hoV2jcd>Vb)+CZqA@ARIuZ3R z^l81xbg+YoDWHkGl$MZ2vY<^*BQ2%LcM<6>%`5&>H>HLU)Eia_gtZGmh%td#G4R7$ zkqCX?2 zp47Js@jdH77IJ5Uy1LU*K2L~0O#u*GAV2_)`xknH zP^~?o+HS(Hh8$>Lf0KqzBx2THB4$|-F-zk>L*ykV^bJI~_pC$xw-J^iA{LM%M65?Z z0VuOxHK$)%mY>i-V?&|Z=KHLZ5IW~%&UTj01$)`2&NE7`hA+N&~zN#%y6g`;AtF;U4IwLPo zTNJVn>fZ?62M4$7nbL77sW$hXOHa#9L+<6lGJ?Z-+z9QY>#%=Lo^j@>+26*B;KjJMZ47F#J|Z*yM!Oez zNyAgRNnpn-*Cb6io>6t>uDI3v63I&GSA!oA-g~cn#oB;=nsh6M(N_^pmNQfF^tZCV zqCe=Fh+NPbvM{{bAaZkffQ$%QJ$E&ZOsvLln_9|uJ8)CnFCiP_gJkp+^s1wW(Cucb z?%KSREJH+LDK2yFxKHQ4sG)e1S8Y+v2`TJhd|D&^vH17HKBIVo72~dz7fhdaHT95O zCb@^sz}Ii$iRP~tPV%{`vv2=WKJ&&IzwB#kxJ$-m#JTKo6@Lr%doUb?e!bHqYWI%*>vbC z$quR*_7j6KC?wh4ONECtpp7nz z<;1Dx%!hShoof{a6M2Z!8CsQg6+U;VqW9vsPKlNA@x^hH(JAPo2a=JI^zx!Kk=w$^ zr!EKdx6&L1FnZ__oFS!!pTG*32cnXHyQB;z|$kdFAO?>zkuP>RTQuRSKK5)$C z6l}0>^<&PsDwim*s(7ljYv5v#!!N7R6rH65Ua^ z0Q{2R`QA5`JB2={dbL%NzQU%hejdq{FN88)n{tjsTJ~b^{61tVwX9TWa3;}lA?b9H zGgN?{Av_Tj#$U@)bk}$fLLaI9J5O9ig-)TOSl8Mu{G65JcpE;2FSl!L`?%QndS!8^ z8F)meO`_9N0w@I`wBimqMU98|6w{U?DvvPLh1T zua0wwWM0B*N+cteIe+s+{!=?XE~eeG9VgMIlFL&im2)kmPALjtl_kb~UO+}Zk>Smw8qDWH{|8AvoGRqWsQ*8(l&82@@7+)T0^;1ySIOa>cNq! zolr0?^Zm?~SdJ%s^@=c>Vj)gq1&`iI7HYTp%}S0UPeGqOk&eGD{z0{b1DTc$k?U3E zCUHfLVVN}tZlq0W{fQfN0_^|$LpJFCMbgU*jdArdkvNTUIiD+2XEWV6oo;yrT+hWl zc<&0@Bxhc6(|>gthOdUk>n`ma?keM=y)Etos{YyiM|(2JM8<}hK)*}NC&jt_Aj-EYy{OrMD+q0{O zZEoYY8wTe^$Ep{f9X-tGztWGj+-WvxzSFY!*P@(JITMFcY%eukwoPuj7@9b;-g|A3 zJDNPQnY2l~R^YC?zoK{VYO6|{)uxqmS39l#D`$*h)M`6z&{?-(=d-loh+(V#Ihvaz zn|wBzuBC1;-Kg4V`ZA4lHt_7s%CWI4D;LH7Ryi})`Kw9wB!B+OfM$zRqEY@+6K4AV znK0UacEU9Oj+JgL#{Qv-o5dM^15Q6FKhu96|Jm7p= z_1sNk9+>8agJEc=tc{r5~ar-UHM5M~a zl@lswRW7e|uC%PQfd8gfuBe`{G=ehnPF{aEq2YWrzGR&o~O~JDcgq%&f1-wah7z}d^qm}G91+ZXMauq!G2o5w%^#ls2=z0 z)J$-D7ge>+q%4Qoyy29@)b%gd>2og!B$*#~G0#oTWj%DiuX^DA^=d}{&NBHW^R${| z^F&(WqzzVf_lNhNJwCi@IBXc5C)VkIa!+?olfL~Zru>wbDYJGDr1VprZ_*yP@%O#f zEg86dPqcFmvfXKvYu(C#{Q;wHXI#`zJV8F|b$0qILy6l6{@ zf0`Y`Dk;}RDZ)8J*Uv}J#qBD()^r`HE{sx8gThDs=u^9#6FL+HCa+prIzb_ z^^3cr^k$+nUB@wUJ)`6l2Rp--I0rT6gi&+EHlcUAl#G({(kR}A?ex4TUh4n;UT+dk z`r=Pso$7L$+BFbue0P*(G*ZgVOX-cm5dp@D;^l7_TSV~+nuNQ)`X{eWZ9GhM9kj8f zcSSxcDZdfLV>StweD>$9PAxb_t(Mpnzvzm5UQ#|OipSZmT97O`${9M|S#xBlIAbn1 zOfEZFIusW1qc}Hbsmhuy3E_m_f+uhxpZ%#W1+2HySpJKEN$l7$L&dFgbyINGo=!oV z_ZNT6#aHUcmc#~yoBSwN<EKFQWi zXd2v0DaUtwE)JlvV;z4;Jy#X*YNfObCFR?rRLipKl+ny4Yrmmv3{zu!7` zc}$dQL-taY3tPAFs-)t%f3;VX%6pFJ^4Ged5;jvfQygSU?fyLu6yyBy|Jh?TJ#M*>%Ut*mgZOwyZA0{Gjl}{*tE@BhT$Cy&yS+es26<1*zFk^i`r{1wJ*}d*2ce$zVe9rb-FA5=bpul`i&C+& z>%3mDWxY1GZ=|%$R*4B)ceF`Jd%;HgY@~2;@OH5%O4XTt5BVW|>zv9Cp`uL#RSnXb zoRadRQ7Q$<@{-LJ+t@O?3~qV62T>|Rc7V@hpPeP>O{y+zjgv+3#R7?w@D$37KSx4q zSVPuwJa%%%wiU?J{t9*! z+u&v}blpV#hUDZob7fh_g!7uLN{W=HCG)149j?fC(+IMFAf{ik3H?Yd#IEaKjqWb1 zDK%V;x7OSnUBhXsnOs_%`^5Ny#?9=2)8L!K#S**p&>x56t5>#T_dCeX&R^92oHHtij<0{BFC1)b*NzJ`EOb00 z8aZOHTO8VtRK3bK{J=*^XO?l@OgwcZX1`8%Ix!b8ippef$6Xv5+RLc$H5-(9|H8M@ zEKCh14yUoo%T7_(!{!LSKf{Z*X|8ZGzLGWhymBgJ+xUidOexTJ!JQ z##(P`j{%2Ct-|jI4g3Xd#`_8Vw*^H-@VUoG+tQxy56_=fM(i@}yG-kaS1kdnv-$N= zy})nB3^lIgL;WMJ0QUJWZtOx{RrVa(YHpcPkVe&q{aG~ti#CmEYL}$i8mLEEj*~vM z%a25J2If^XigyFAnOP+cl%G1@a67&#x@p<6?IR5tUiQotU2g_U3*U?7%}0T~XZEem zJQa?XF8_vAX@M}-Twr?7vnxaL)yZ46iFpfv{5L{A^-wGMg;suVJiw7_BTk&h5e{Ly zb>8s8M**^PnPs`P2-SNJ8vGdXQq9YB6|9W=5qyFffSzk6)oa^-rNN5`LL26xD!HRr zDzRz;R&)v+a2-qa~Nd+~`g?3PZLbaBC(|MmH;Zm80 zv3@4+i^N+A;D?@0TLs~rVY7@WN}0pw#;X2bEJrPX#67%U*g3ceuKIMIn-SU1UJ!~_ zo+cB>R+RmUT*Z6`jss#+{tr`s)F@*g`Iu7RWfQCgKYwU9y<#nUo64!a>?PHtr7j%* z@=?Q@-jiBCl@)Y0 z{lN%vBlDmk!16DorkY#WG5W%Vp75{uoRVS5a4L~Wo=I}u*b7Cs`Sk4Q0B8U*TB81< z>j#kA=evJ`(x4kz##6yU`D;m|^0LEttF(6}o4{s;n(4|f_6C0?cdLoW`GYUW0!}IP zN`L!c*Rf}rmL<;Ox01xB?wM=~yx@bzLfk4D>=|YLg^!zwZpmArVkyQ=&EQ}Ik$W3& z&c>V&#^qpHeOq{o9?1v~_3g2*2XwR7kCR9H?nNUtn6fOTJ0P4g;6_M-o&X=ZBnU^#L8m=jDeP0ioK{W zBy{PZI~)ohB*?a3H&pOV_$7fhLMJWzh+>%}yb17!?m=UgVr%>sL`&6fFa;X4q{ zs+e9SAFqcZb)r;|NR(=HWf)S$0w=k2p&ESS>Yt z|0fWVw5cu?;Wm%98SdnhR$P zEghN4Ii58lyM`5clo{-l+ni#F`ppZo~DHXt%9bDLggV z2A1rH?O)JB2eax=+Ayox5y_VDlNntDdF%5k0FPTAz~wo@PipsS79SK>{(j!uz37%E%`{&gAL2sP%Y*MhCpurqBK7G)_ZI#5>)RfEnl2JIBF|tOKU5 zDhIGaYwn16E&FOmt7Kd1Y_!0AE84vwR(N(k`I`JJvcr(y(X0s7HVOUu2w$xFRtO&h zE88RX@cL%^$ufA&Mj)y?m2+hseKsavn~26G-})yf;QldB!I^f0LeTw}_JHa=V zQx1(oXLD=D>C&QhbQ(F%SLdMbcFtXuc^?({62p;cLnt5E!a*}L_{_T?je+p0LA4?F6I=uPmwxrR*~7C^VQKKwpxvl<@MT&HW>sAx+c7{}mzQARGXCN8?fsV!GIi8E zrENmLLC*)q?9uH0h<1lhybqY>uWw)_xA+wk`knJqb|Tpq9x*}PIn40-EX*(y-L8>$ zY*jubH?2X>l@k=%@rvM!wZ!6^mLj6-K;&u~Ym(05% z&@OGw+ubW8#HAyFDX%D1+QhOVNq$*lchv+J&Q9%QK>4kCBt<_~mM zaF?XFIbZgEtQ7jql4@7dECKnXpP(hsdrQ<$l*1QXkR3@&r9~4bwuH;m10HEoa`00A zw`DN1dnPU01-!6rH$!vms9?%*-b$xpSFg94=Cs^?U?Qqv_UA8WdEBxgW~P-ia!fzA z!qHsRmbP5$#tzpu+KVQ&)Gq>(II;J8>H{;r76lAep1BRARxl|v;k4|&> z303K0ta8b14BTz%PSpj&l}FVBLr?#nmOPL1>4>)W7e*-gLief@*dR2+vZQuOOE`f- z#5yG&P1)}36nGB-n??N~AvJm1b38du`RYvJN@xrcI0RdI9ag;d`xRXdi6DPVh9mEz zBvz{SfOo-(1g0(B{o!Dd;)er5e3Hk#ksI6%O<0O8 zybdZ_6zL8K8OEor?1<6$S~9G~5=pwk&z>_o_`RgEDP<8^B3r zqdnp@CZM0%DInb+*a#jpd?@^PG_PuazCQ0ye9-hnkp=CzLf#~EgHL`J`UsZ+BM-i_ z!aKewVwN_y+#kvJYD_o2qbvtcmcFEW>!|SCTxe|+U~61Gj)~WrkL1YLb{{c~#=S5e zs~A#mAZ0US99crxLbr5CU`#ireKdw-Q6o&!jy}%1Gwuy*#`QqBxu=@@tfN2?Db5Vo z&It~DUx&8UB3(I^;n-`fM_4T{a3O=lC3sB)A=i$}t#v;Qk!a!O;Nu+9M%e{s5P|iO zN+~1nr1|tzX72?Us(Bw>!Q@-x&9Bzv@!G~pKXp*!qIffsS81`;VZ7UKXt_%#={J~k zI}L8Q>%L5vnySYmi6Ix!Gi$bC8-4q{LW)L`&UyC^Mn+*o-F7&etRT2xq`2aN!LpK+ zRcDaaE9fmGvFL>1xPjF1RVhcU$<^@ARkCm9J~dqtVaA)DK}l2 zN$sn|yU@+aaXo-?lEE#?BrA<=q7A@9AyHiQVMVjVl0t&N@f$YIO|-}LO!Qr?^wR(BF5V_{8Wi%Oj1 zY#B*DoXq3QNez>b=d0MxFY^9fA=1xCKHvYPS95Y*13^(gf{-s@*93E?$1s~O|Wk*>toI>2F z-@}ao>rcv+Dxo51ZVkuImzyJ$hb{)ULRo^&n7-@e^a0LR2ks~?adcgs6 z__lbnsmhqx{!GzYxwl?^P^X8UMk@SW1eZ#Pf@PmpiCu`HdD+C`Lp8KXA=5^KoEU2# zQ-}>q5QP1tus@-l58V?q=Psm99&w;8pHUK{@m2*t01w62d~I=vo5fi2_AF<+XnNq1 z@%rD&(5T12$qiW1wc%VR=;3kGmUZ2wXos>>AncM&)`e=jGp?&kZ-CReo_%K*;#qJgeKOH5;#Cdp=S!ye2aZzR2VL*7haJ zPie8|W+Xen<FugxLD0WyM zsy|@n^j;eOu=_E~*GSO<$LZ*{0?;cY3-K6vrM|1Bl+&+~JF<}8MZnTPTgGEok*tMS zpQAbhEm)#__fb?!HQK>1jzA4Vu*>C9BG@}q%vgfWXz&sxg~CT(^p6-G}r z@JE!DSOCiI0NGZSG3TOm+u*Uau=@*gX>_xHS4QPdQ@Fd11XV^UTXym6Qv-Vw{!$uL z^Px4*O}{Chdh6Ij*%sTudwW6ecG`8?%k2OKAvYsq!N?^(?L3yK_yxL~qzjH;@{nea zIOATeFrBmv+7GWN8HVna)zL{MvY{zLneiX9+21;3R!RPFfMCaQ%y$bqkG(1z*@Bmo z=<{|RF#WcxRlhdnJV`i}7%5uTFb83r>(xYRdXEC^>R;==7WQxIuse!hJKG5Cei_Io zH=M#{vp<;gI6uc|nOx-ba9*DcGsdzcu10WJ6%Qp*EVIBH`1ax%X)~TYDq*{Vw1qNUYo6Q zgaotT)Z~rE`hWA#CHv8fUh8@1Xo=Y7@`NU)OKlhM8^e}zW#Z;bcs*vV-sOVc>=`}T z@eGGEYQ}3zf%JgI2j25Bay&-^~@QdO{2kZUc08ct$;t$8_m{6nP0mr8yXk0kfnA~fu zk)YjVbOD}S$nZzK!t)6^a0(jZ<)^;HuwoYUz9}qEX|@`un*b?+?u?K8=nXBB$ROyD z>d+Y%@M`NDS!q&JbP(jK+6;+TwaMwJrLoO^f!_+lhH3_JW8Oz9Og#BpS&OUJ6U(wenYHGx$-bKH)xNAIr z7T443_fK!`mouAMj{Kv&rqZ2pmEY=k6Hsa=At(H$HL2VosUza7TV_mI?r9!=$X?Ol z$)WFMSM>+ApHUD#NMaYFZmBlI`v1)*M)3T*SZlP;D(c!Ofn^E#w2`vx3hv}@*-|U) zSdDzz=qB^qdsXtinq(E}m@Dn7^o{;bXcbe1C)X?Q$@$|ZHw~54iGFepnJQkjCU|`u z`QdtcI+p+T4Yr<=j)y71swL3qrW(8~e>LJk^kZHSJAgNyzoC@Ln;Wn1X`vrU?n%wT z#R_``>Q0ScmI>>FesM&Wh$e}uaO_K;UAW?HUZNBSF1-H(E(kbq5rP93oZ0^$xVZTr zaAAQY5kP2*!F8jyv1a5r?^;>qUf@1XDitR(QUgpttg`6DAghgXc%~fq8@Qbkk3G2y zyXg*SqZ?vm^wxHgV)Cgv!~N>m$>wP#&u@USk7=Xn?g^E9P?>s-`owl5T(=t*?SW-E zvh`p&dVj2I(BH~m*80*!Dw?JaiFwByD(5Owp(TmD^b_PD~> zWXd%sjxg8h?Ag@;UFiI^#DRo%59Kww5?n^xNKR*-nJNO@lPak4&p$3jp4zDXW$vai}-^N5XV5g-1m___@h|eel7-m zZ?zc6G$PZB?Wu#}0@>QaKhbMxb?AMWS=9i!Wql3zf!7nrmdqmx+53ehqf19(E2)uX zEJ+aRfbHbgtrKJ=h!1-RZVPbZK8gL)#k$0>qn&Y}=KaD)r%(+!kI_NZCg^LSBK+gv z9Nm8Q%Ur1OGdVPG+dX#N%L0;^BFBa|@P_TWCIZ3(&I>Nq)nV2Rb2$ezM;~ z;T#h zwZeiJdv3381uQ!eKpAc2UT*8$quG?D*^xb{CwW{UKYb-Q`HEtT^<8Cpp%rt$8AvRF zSOL6qY^QzCbm$mS#_OA&F7>+fa5DMTx!1#WM#MgDTHncl+vm=NCm&%qEQI4? zwGo4qZ%w<))sone^Zx1w*{3#PmH)`$(|sl9#T$5;C%>iLNAZXto%Zh(VFgT6o$Azw znZ88_6I1OBKUU>~JH80$mlzJLr#6hsrax6qokZ;QUcfzdh9N58x=cQKQCWDiVB_9i za=K$BujA)L^A!9!qz)@v*)&h14;)RC2zbcp*o%Euv^Sz=pWGgdi2G_V#*Xy>PSVA( z4|u5Wbjf{GBm00p&$jV|h%@H)-^?Ja%oUNJCO3$t1(iU5! zTFEin{xr?1k}JcxL!I(>qP|=(_C$EXDe1U!^RN-fSvpmIVdBcp;RNr7spDz92=4ch zxQ;c-PvXBvnK#>g72!8x^+L0%@GT{LY3(R8w1ee^vmXDO*TNk2sH^n^Ut=eH4WCnn zE>Vdx^W!s|)N=C=py)-{_=hQRB&ynP7!9%eV$0}zX+RGh)6Kb|Hd(Z?BxvsFI$mX1 z*Fb$(UIun36(eyPm9WW^Q#l8lhTP%HGq8hIWGmX?S2Fo74b4F`nIkOa`M}Ew=c=n!b?modprr@Tt8dT-cj=IDQ$VWIjt^Gylo?iul~c4`2e3jz7n>6 zq~G}>`_8bWbq%yrwI3ckwi~tnVk3Ud4=*!GtO6lfd#Lh-C;NbIHJpBLH%d&kL?yVCxBw}U(@bs zg{8y)n7!d=H>1N>(*MX6hx6E{>7XL?!*_s_)c?On+DAn|YVaA%)l`w=Mi>Vt~I z3V}P@0X|I-T9H|bcM5+8(e&Z&__@P{gW5j&ep*&HnK<}VGCP_2q<1wu>4p4qRG=T{ zC)qe#v#)ik9?l77VY2B zIT$>h&me*lxhuD>dO#4W=2!lu5$rP0Q`teG-Z<&=0tl0rahtP0hz}e$+iw)`!!;?J zC?#oM@Bl+i>%1km;^qycxwnxiil+|2Q4!zOmL(pHmy%W~!CvGgy24Mn5a18Z!I2WG z1CEqLC<*o)XU<(dIg7pmYK2Y{fGL<%l5gRMUgi&;$8n7L%2@kgYjKODw<*sZo&>KU z2&RGu70f1VIYd^{?Kw1rNdPC&d$!>){|}sCD(L^@5bP0*!&d1gH?{@)96?AF9#EWA zwmP)P4nUS!NDQ=}z_d}HP&`v4I<(Rpu}>08Q@K6jD#|-xcnx!#=U9%~5d9$px@XC- zq{<}25~4?sd@A~Q4(N>hHV33}9?t=$aMJmJjr^2?Ce?f3tx;?Upfz~tC`N$ES)9C8 zIr3%D7RY2-LPVt!KdIaUj}hKXr1n{se8MYPlicCc>~#d@RLWr-o2hpgPO(F-@xz<^ zJch^_;PP*R^Hy$JS#!}$n9GhO09N#$g|iA;3^n85!+R--kW$>(QSeCu z%NjU@lPxTqYzf|E6+*V8Co1w4pX@o*U?E?4p0pC*W7JY?$9N~nYZ`WgE!cJh%%iVE zB4|!?dy&7XiVYeQA0CIB<#$-R>CyYqom7OvxdSAyf z+WC|f->jr*|HWAwL(P5AEK91*XrjVTG2fm;5|#0>$;1_SACrxiB{%eI9sQG;5^3#N;DRe+vA%Erj`pRbvTK znO-FuySZEy^-VbIXR3M~GYhrl)zgBv{fNb}0NIs^*EKx_7LBC7+v-LG(mJu8oJ||D z8#GahMR&$w1#_W~ltW2~QpMr1`anyb`?A z=ZM}{q4e+oK2b;nWP1OO<(-(=Yh1kuT@o0R@Iu&~Io5YGLZ$6wMHLxE^_6acR)+Yk z-Aw41CBuy>#|^Y_Cff&2vGlT)A5}yug6ug?oZCvo*+$@)!U5$}SUS5)%{asRBb`c6 zKRy3-@XQOE(s2DgR6lldUkG;H&5NLRKNNx`uLZLy!WUZN7|$uWVd+~|d!Jh;d^|ok zn{@ARjXHNJQ5bbm|NS&?VXHi47;pO4E2eFC>hlt}C-bt&t4@;PpF&YRw9-=S%zL>V zTZmle!{b{`_8gR7t{s36NYqQq^IjN4?T6t_vyZER8JHzXy( zaJc>TiLs&~=+F?dmtbCYvwz9`z2}^D^VtEt`jXtLudHz00a&sb`WTGy`zDcNo8E+% zk)#O)>GeCuE6c*0NQIBJ*2ygR*84ic&3?a*cS`X0M_NI9l)@^fImK6O6*q}jH&c}1 zZspVdL+P9=Jx5dT(K(dR7r#|k|I1z|s|=2))>h7#3tsJaZYL>SZKX7&UelhYh@$dM zehe=&A$S2>%hmgnn9Ha z+CztrzF?N;Hvw;_;5q7Eoj>tK&{*G6;klgpP-a%btEt#tO{XdyV*3C4vaWAT6&#S_@qeRMPOv>y4%^YBIv0sJ;yFQ+>w+0MVX`zEz^1^ek z)gN{RKr_A-`a^5%T;l@`W@iBp0noN zF2xs+2cm%X#EhPYZXK-a?N~VUKtxl{QJ+f(bNKQd4q$IQ~u(ONU*zPZxQ=>C;5 z9P*M3MqG7@%R?5VydF%k8ZM7*ZdUIZriYR%dEexngDH(&cbH@7gtyf$Q{$<7h*FOS4^5_5$s0sjWO5z}u2=kze4c#wqV__yXkzGLEIGCxvQl}kJg+2i1 zJc|L4rJ;as2K#0lRGUKz7xG!Xr`}<1Uy8=Dp_F0xT+X(54|2jWGT8gX5OTZ@geUuQJap&nUQnX)@XyEnrAK=i0mm9!<0yM6S zhn>>_)yCU)fGv$wt>sc94a}yH)Fd;l5V@5D*wI?YnO{TqVVY-mX%g&Aw4o{CU#g)K z{oukSd8OJ?e|{XV@a;`I?aJ!g1OWBZMCJTwzJ3+-Co~5S8mL{8a7m>HyckdHnUk5P z6h+Emd&HWP%V%b(SK{rtzFLlUgloodArW{04?BqVqClj8U!Uxd?vctvXGH*Agf;_*06LLH42Y`LP+0hx(=4s0^kD-lQpGugMqIiNpu0s0mn*7yJhtxsPt7u!9YO$YS;rJYWv+cU)7RvSi??cNq{Ta`G0I1PDNiXMjj34lf3N@$DOP2iL|YDGSHl=)x4#fxSyB@i=l z8rbk34IF~g!0OEIRS->iAPa5Gps$2h5dI*~gnb~PgUD8Nuavt)F=8(wi?VU~j&Rjt zED^RO$nDjvD!@_v_Rg53E9|x=jUxda^D&};11&Pa-S=;=@F`|wdc&` zT;o%+gv;=e)Wdj^fMk}Mt?;E767ZcjBs}GD&t4dgei-jnmeL$;wj`I`sGY^lHG!Sh0N^oSsbar7DO^i^Z{E;C=% z0ZEaiIne;#l*&0dVW|E~!ZYCR4f*tt>D1G19DcRjA%q}4dar;UN=aAur^q=RHn1es z4iO4#3}88sEnjoDt6Vnk4DfA%k;>^4ek)X(>s5M)sh6fyq3ZR6GatacAzdT-DRDCx zFZrbKltbn#zy0$?u#2;>VU8g&Lj%3-n1sAxk0I(&@3ilgj-Ls|M8<*A0@Av|%#^+R z2ex*cQRaV-H7rZEf*a257Ef)wY)VoSPXkNq`-`5^NY5vhJpE9I-G|FmbD=Z6N{ddk z);;d39{YYP)cj9Q_zs%CA+GM4AP)D1m8Wu;h=tc3_6p-%&i5Ix%VUwRDg<&z9$qi3 z#P^sn8ECMfZXRg4)6$H=ug?NI2LxgI^XeXJ$~|~@@<}+rL$T78d7;gLW%d?5?tj;j z{)w05{fXBcWjazu|CLj`yb!q{lDie(GJb;N772yBI16<7#LZx=6-#&nv-J!!Gm;*( zs8^{zd?Uu%$?j>bO1qoL0FhD+b9H-%x^JDVQRi)IgEfD=gO8PIiOYHD)BA8^3^XGL z*E&@4`cC(1qs&`WbD$?Ty9Q|MWp~ZZVC@yGNu`9Ye(W;FwZE$Zf6Y2$TDl=%KJBQh zsI1?${qQT{8c)XhkCgPKp<*K5+_QkG(Wy>A>GD1Lyhc@UC)lK(p0;GCA)(`*Qb6ZZ zc5|i~&)n{>SkOFte}WXsOdk|X71pqq>YQM;vm(BLn#mwisC`|)8FbNaC3fwwN#)^ris`R=t?T1bWm5UV{>Np9F2} zT?QgEc%LN!(sBn58M*bt=zu3*@%RAN&)kLGEx1gvgmbN=ke{#un$313uq<%>-41BF zCDnt`A?a==I3Tlw4+oeLY=!9B9Lzyf%ugT=7(4Nl(&WLmgRKc_2Rs$bS0>pbY4CIc z_SANaMxd=lDV97}-0tN~bPqOqAcwgevV_ubYe(PU31WzN*#jCL5n;Bt;G|n>=LRz$ zFad&m8*fH49BeB)tSCIu8UW2?uWZ(S$@c4Om((`({=Zb1K+MqlL!;0ROR5F+BQ7>1 zxx+Ky088E!G#y8!Sj!<&9h!Ft?T#s?1(imgMmL3A7^7DO(tJXrUzKXd$kD$rLR@8; zJh%JQ6bEnGJ~Nl=XPg_n%mpoeAJy@CW0f(@eng)|UI|@?k}UhI89mF;)MnvKZGz-K z1VVu$5COq$xSFOCe*YIB^>>5gaW)Oi#+^EC{O1>m9_&@@$)RQu^k)|G4|F{XSpaRe z>?1K+B`wV!9`F=)8i8p=Tn@!UlP!5p)Rz+VCwTh=$k<1`LzC3o^MUQM`V$+}2e3~e zSIw1=-uHHNa4_|kNm}*2!8}H3_f=*k&2Y@X4c8^ZhZU>LBazY)jko&mDr&aKg|U#oLy=a3tbO_JqSu!|V2%*TT<5NHLlA`AunB z6K&XnR?4O)yI)~NJ0@|4?_6P#+T&ki4V5Ftn8z%qz$v`osp4%PX&I;u$|Cv!mqx>| zgL}vf!V})w`mARu>E!Jrxg*uOUxvtGy(M7C`G=c$dlIxyfi+X&Y|&D0(fw+SVw^J` zQO0FxIm>(ESBxd~j>XmP;+-ua%dCaLoo^zW$E44a@1VTLyq

      0n*`mAsp(S&wK* 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 X9{)kvt!eW$kg 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�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 npko>lb``GM^VK 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�gEJsLE+OQoK`2hybV$vgm=SqZ7W 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%0ANk(gTZ}L*3th2@LdeR7HS|BXxsQ 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≫s32|>qtf$( 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[0-9a-zA-Z_-]+)$', APIv1UnRegistry.as_view()), + url(r'^api/multicloud-azure/v1/(?P[0-9a-zA-Z_-]+)' + r'/(?P[0-9a-zA-Z_-]+)/infra_workload$', + InfraWorkload.as_view()), + + url(r'^api/multicloud-azure/v1/(?P[0-9a-zA-Z_-]+)/' + r'(?P[0-9a-zA-Z_-]+)/infra_workload/' + r'(?P[0-9a-zA-Z\-\_]+)$', + GetStackView.as_view()), + ] urlpatterns = format_suffix_patterns(urlpatterns) diff --git a/azure/multicloud_azure/swagger/views/infra_workload/__init__.py b/azure/multicloud_azure/swagger/views/infra_workload/__init__.py new file mode 100644 index 0000000..a952e9e --- /dev/null +++ b/azure/multicloud_azure/swagger/views/infra_workload/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) 2018 Amdocs +# +# 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. diff --git a/azure/multicloud_azure/swagger/views/infra_workload/views.py b/azure/multicloud_azure/swagger/views/infra_workload/views.py new file mode 100644 index 0000000..c44eba2 --- /dev/null +++ b/azure/multicloud_azure/swagger/views/infra_workload/views.py @@ -0,0 +1,82 @@ +# Copyright (c) 2018 Amdocs +# +# 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. + +import logging +import json + +from rest_framework import status +from rest_framework.response import Response +from rest_framework.views import APIView + +from multicloud_azure.pub.aria.service import AriaServiceImpl + +logger = logging.getLogger(__name__) + + +class InfraWorkload(APIView): + + def post(self, request, cloud_owner, cloud_region_id): + data = request.data + template_data = data["infra-template"] + payload = data["infra-payload"] + inputs = json.loads(payload) + template_name = inputs['template_data']['stack_name'] + service_op = AriaServiceImpl() + try: + stack = service_op.deploy_service(template_name, template_data, + inputs, logger) + if stack[1] != 200: + return Response(data=stack[0], status=stack[1]) + except Exception as e: + + if hasattr(e, "http_status"): + return Response(data={'error': str(e)}, status=e.http_status) + else: + return Response(data={'error': str(e)}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) + rsp = { + "template_type": "heat", + "workload_id": stack[0] + } + return Response(data=rsp, status=status.HTTP_202_ACCEPTED) + + +class GetStackView(APIView): + + def get(self, request, cloud_owner, cloud_region_id, workload_id): + service_op = AriaServiceImpl() + try: + stack = service_op.show_execution(workload_id) + if stack[1] != 200: + return Response(data=stack[0], status=stack[1]) + body = json.loads(stack[0]) + stack_status = body["status"] + response = "unknown" + if stack_status == "pending" or stack_status == "started": + response = "CREATE_IN_PROGRESS" + elif stack_status == "succeeded": + response = "CREATE_COMPLETE" + elif stack_status == "failed" or stack_status == "cancelled": + response = "CREATE_FAILED" + rsp = { + "template_type": "heat", + "workload_id": workload_id, + "workload_status": response + } + return Response(data=rsp, status=stack[1]) + except Exception as e: + + if hasattr(e, "http_status"): + return Response(data={'error': str(e)}, status=e.http_status) + else: + return Response(data={'error': str(e)}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR) diff --git a/azure/multicloud_azure/tests/test_aria_view.py b/azure/multicloud_azure/tests/test_aria_view.py new file mode 100644 index 0000000..69c18e7 --- /dev/null +++ b/azure/multicloud_azure/tests/test_aria_view.py @@ -0,0 +1,171 @@ +# Copyright (c) 2018 Amdocs +# +# 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. + +import unittest +import mock +import json +from rest_framework import status +from aria.cli.core import aria + +from multicloud_azure.swagger.views.infra_workload.views import InfraWorkload +from multicloud_azure.swagger.views.infra_workload.views import GetStackView +from multicloud_azure.pub.aria.service import AriaServiceImpl + + +class InfraViewTest(unittest.TestCase): + + def setUp(self): + self.fsv = InfraWorkload() + + def tearDown(self): + pass + + def test_service_get_fail(self): + req = mock.Mock() + dict = {'infra-template': 'aria', 'infra-payload': json.dumps( + {'name': 'abc', 'template_data': {'stack_name': 'stack'}})} + req.data = dict + resp = self.fsv.post(req, "abc", "def") + self.assertEqual(status.HTTP_500_INTERNAL_SERVER_ERROR, + resp.status_code) + + +class StackViewTest(unittest.TestCase): + + def setUp(self): + self.fsv = GetStackView() + + def tearDown(self): + pass + + def test_service_get_fail(self): + + class Request: + def __init__(self, query_params): + self.query_params = query_params + req = Request({'k': 'v'}) + self.assertNotEqual(status.HTTP_500_INTERNAL_SERVER_ERROR, + self.fsv.get(req, "abc", "def", 123)) + + +class WorkoadViewTest(unittest.TestCase): + + def setUp(self): + self.fsv = AriaServiceImpl() + + def tearDown(self): + pass + + @mock.patch.object(AriaServiceImpl, 'deploy_service') + def test_deploy_service(self, mock_service_info): + + class Service: + def __init__(self, name, body, input, logger): + self.name = name + self.body = body + self.input = input + self.logger = logger + s = Service("abc", "def", "ghi", "OK") + mock_service_info.return_value = s + service_op = AriaServiceImpl() + self.assertNotEqual(200, service_op.deploy_service("a1", "b1", "c1", + "OK")) + + @mock.patch.object(AriaServiceImpl, 'install_template_private') + @aria.pass_model_storage + @aria.pass_resource_storage + @aria.pass_plugin_manager + @aria.pass_logger + def test_install_template(self, mock_template_info, model_storage, + resource_storage, plugin_manager, logger): + + class Workload: + def __init__(self, name, body): + self.name = name + self.body = body + service = Workload("a", "w1") + mock_template_info.return_value = service + + class Request: + def __init__(self, query_params): + self.query_params = query_params + req = Request({'k': 'v'}) + self.assertNotEqual(200, + self.fsv.install_template_private(req, "a1", "b1", + model_storage, + resource_storage, + plugin_manager, + logger)) + + @mock.patch.object(AriaServiceImpl, 'create_service') + @aria.pass_model_storage + @aria.pass_resource_storage + @aria.pass_plugin_manager + @aria.pass_logger + def test_create_service(self, mock_template_info, model_storage, + resource_storage, plugin_manager, logger): + class Workload: + def __init__(self, id, name, input): + self.id = id + self.name = name + self.input = input + + f1 = Workload(1, "a", "w1") + f2 = Workload(2, "b", "w2") + service = [f1, f2] + mock_template_info.return_value = service + + class Request: + def __init__(self, query_params): + self.query_params = query_params + + req = Request({'k': 'v'}) + self.assertNotEqual(200, + self.fsv.create_service(req, 123, "a1", "b1", + model_storage, + resource_storage, + plugin_manager, + logger)) + + @mock.patch.object(AriaServiceImpl, 'start_execution') + @aria.pass_model_storage + @aria.pass_resource_storage + @aria.pass_plugin_manager + @aria.pass_logger + def test_start_execution(self, mock_template_info, model_storage, + resource_storage, plugin_manager, logger): + class Workload: + def __init__(self, status_id, execution_id, name, input): + self.status_id = status_id + self.execution_id = execution_id + self.input = input + self.name = name + + service = Workload(1, 2, "a", "w") + mock_template_info.return_value = service + + class Request: + def __init__(self, query_params): + self.query_params = query_params + + req = Request({'k': 'v'}) + self.assertNotEqual(200, + self.fsv.start_execution(req, 123, 456, "a1", "b1", + model_storage, + resource_storage, + plugin_manager, + logger)) + + def test_show_execution(self): + service_op = AriaServiceImpl() + self.assertNotEqual(200, + service_op.show_execution(123)) diff --git a/azure/requirements.txt b/azure/requirements.txt index f7225e9..3f3fa5d 100644 --- a/azure/requirements.txt +++ b/azure/requirements.txt @@ -27,18 +27,19 @@ unittest_xml_reporting==1.12.0 onappylog>=1.0.6 # for event -oslo_messaging +#oslo_messaging # for pecan framework uwsgi pecan>=1.2.1 -oslo.concurrency>=3.21.0 -oslo.config>=4.11.0 -oslo.service>=1.25.0 +#oslo.concurrency>=3.21.0 +#oslo.config>=4.11.0 +#oslo.service>=1.25.0 eventlet>=0.20.0 PyYAML>=3.1.0 #azure +requests==2.16.0 azure-mgmt-resource==2.0.0 azure-mgmt-compute==4.0.1 azure-mgmt-authorization==0.50.0 diff --git a/azure/tox.ini b/azure/tox.ini index 4c2c67e..58fd7a6 100644 --- a/azure/tox.ini +++ b/azure/tox.ini @@ -6,14 +6,17 @@ skipsdist = true downloadcache = ~/cache/pip [testenv] -deps = -r{toxinidir}/requirements.txt +deps = + -r{toxinidir}/requirements.txt commands = /usr/bin/find . -type f -name "*.py[c|o]" -delete + pip install {toxinidir}/aria/aria-extension-cloudify/src/aria + pip install {toxinidir}/aria/aria-extension-cloudify python manage.py test multicloud_azure [testenv:pep8] deps=flake8 -commands=flake8 +commands=flake8 --exclude='./aria/**,./*tox*/**' [testenv:py27] commands = diff --git a/pom.xml b/pom.xml index 744a192..82f704d 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ py Python **/*.py - **/tests/*,setup.py + **/tests/*,setup.py,**/aria/* -- 2.16.6

      _S|OWEQww= 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

    QH6r$dQ(ODfPpFwZ2xZ{czeT@yBs=P+dj5Lk=U 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

    k1 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�L$CN3~1y|;uFRf6!CVARd5n=mA!S_nW3bj5OhyC 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 @2iZuh-A0)|&ff{LN|$fpnf$x5 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 +43;%BZr_#*jkL9MZ1=y@ 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