From e30684b0c35e106cda2c930b72c7451b41137448 Mon Sep 17 00:00:00 2001 From: Tanvir Talukder Date: Mon, 12 Dec 2016 09:36:35 -0600 Subject: [PATCH] Valet Documentation Added REST API Documentation Added Valet Plugins Documentation Added Apache License info --- .gitignore | 1 + LICENSE | 176 ++++ README.md | 33 + doc/ha.md | 111 +++ doc/ostro.md | 92 +++ doc/ostro_listener.md | 257 ++++++ doc/ostro_release.md | 42 + doc/rest_api.md | 782 ++++++++++++++++++ doc/valet.md | 34 + doc/valet_api.md | 255 ++++++ doc/valet_os.md | 179 ++++ etc/valet/api/config.py | 11 + .../notification_listener.py | 11 + valet/api/common/__init__.py | 11 + valet/api/conf.py | 11 + valet/cli/groupcli.py | 12 +- valet/cli/valetcli.py | 12 +- valet/engine/conf.py | 11 + valet/engine/listener/listener_manager.py | 11 + .../optimizer/app_manager/app_handler.py | 12 +- .../optimizer/app_manager/app_topology.py | 12 +- .../app_manager/app_topology_base.py | 12 +- .../app_manager/app_topology_parser.py | 12 +- .../optimizer/app_manager/application.py | 12 +- .../optimizer/db_connect/configuration.py | 12 +- valet/engine/optimizer/db_connect/event.py | 12 +- .../optimizer/db_connect/music_handler.py | 12 +- .../optimizer/ostro/constraint_solver.py | 12 +- .../optimizer/ostro/openstack_filters.py | 12 +- .../engine/optimizer/ostro/openstack_utils.py | 12 +- valet/engine/optimizer/ostro/optimizer.py | 12 +- valet/engine/optimizer/ostro/ostro.py | 12 +- valet/engine/optimizer/ostro/search.py | 12 +- valet/engine/optimizer/ostro/search_base.py | 12 +- .../optimizer/ostro_server/configuration.py | 12 +- valet/engine/optimizer/ostro_server/daemon.py | 12 +- .../optimizer/ostro_server/db_cleaner.py | 12 +- .../optimizer/ostro_server/ostro_daemon.py | 12 +- valet/engine/optimizer/util/util.py | 12 +- valet/engine/resource_manager/compute.py | 12 +- .../resource_manager/compute_manager.py | 12 +- .../resource_manager/compute_simulator.py | 12 +- valet/engine/resource_manager/resource.py | 12 +- .../engine/resource_manager/resource_base.py | 12 +- .../simulation/compute_simulator.py | 12 +- .../simulation/topology_simulator.py | 12 +- valet/engine/resource_manager/topology.py | 12 +- .../resource_manager/topology_manager.py | 12 +- .../resource_manager/topology_simulator.py | 12 +- valet/tests/api/controllers/__init__.py | 11 + valet/tests/base.py | 11 + .../valet_validator/common/__init__.py | 11 + .../functional/valet_validator/common/auth.py | 11 + .../functional/valet_validator/common/init.py | 11 + .../valet_validator/common/resources.py | 11 + .../valet_validator/compute/analyzer.py | 11 + .../valet_validator/group_api/valet_group.py | 11 + .../valet_validator/orchestration/loader.py | 11 + .../valet_validator/tests/functional_base.py | 11 + .../valet_validator/tests/test_affinity.py | 11 + .../tests/test_affinity_3_Instances.py | 11 + .../valet_validator/tests/test_diversity.py | 11 + .../valet_validator/tests/test_exclusivity.py | 11 + .../valet_validator/tests/test_groups.py | 11 + .../valet_validator/tests/test_nested.py | 11 + valet/tests/tempest/scenario/analyzer.py | 11 + .../tests/tempest/scenario/general_logger.py | 11 + valet/tests/tempest/scenario/resources.py | 11 + valet/tests/tempest/scenario/scenario_base.py | 11 + .../tempest/scenario/tests/test_affinity.py | 11 + .../tempest/scenario/tests/test_diversity.py | 11 + .../scenario/tests/test_exclusivity.py | 11 + .../tempest/scenario/tests/test_nested.py | 11 + valet/tests/tempest/scenario/valet_group.py | 11 + valet/tests/unit/api/common/test_hooks.py | 11 + valet/tests/unit/api/common/test_identity.py | 11 + valet/tests/unit/api/common/test_messaging.py | 11 + .../unit/api/common/test_ostro_helper.py | 11 + valet/tests/unit/api/db/test_groups.py | 11 + valet/tests/unit/api/db/test_ostro.py | 11 + valet/tests/unit/api/db/test_placements.py | 11 + valet/tests/unit/api/db/test_plans.py | 11 + valet/tests/unit/api/v1/api_base.py | 11 + valet/tests/unit/api/v1/test_groups.py | 11 + valet/tests/unit/api/v1/test_placements.py | 11 + valet/tests/unit/api/v1/test_plans.py | 11 + valet/tests/unit/api/v1/test_root.py | 11 + valet/tests/unit/api/v1/test_status.py | 11 + valet/tests/unit/api/v1/test_v1.py | 11 + valet/tests/unit/cli/test_groupcli.py | 11 + valet/tests/unit/cli/test_valetcli.py | 11 + valet/tests/unit/engine/test_config.py | 11 + valet/tests/unit/engine/test_search.py | 11 + valet/tests/unit/engine/test_topology.py | 11 + valet/tests/unit/test_general.py | 11 + valet_plugins/.gitignore | 106 --- valet_plugins/README.md | 34 + 97 files changed, 2920 insertions(+), 138 deletions(-) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 doc/ha.md create mode 100644 doc/ostro.md create mode 100644 doc/ostro_listener.md create mode 100644 doc/ostro_release.md create mode 100644 doc/rest_api.md create mode 100644 doc/valet.md create mode 100644 doc/valet_api.md create mode 100644 doc/valet_os.md delete mode 100644 valet_plugins/.gitignore create mode 100644 valet_plugins/README.md diff --git a/.gitignore b/.gitignore index 81fc93f..c9aba86 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,7 @@ ostro-daemon.pid .pydevproject .testrepository .settings +.settings/ # Translations *.mo diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..68c771a --- /dev/null +++ b/LICENSE @@ -0,0 +1,176 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..09ecc69 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# Valet + +Valet is a cloud resource placement optimization service. Valet gives OpenStack the ability to optimize cloud resources while simultaneously meeting a cloud application's QoS requirements. Through model driven orchestration, the target state of Valet is to provide “holistic OpenStack data-plane resource placement”. Valet provides an api service, a placement optimizer (Ostro), a high availability data storage and persistence layer (Music), and a set of OpenStack plugins. + +## Why Valet exists: + +For large-scale, multi-tenant cloud operators, there is a large demand for tenant specific service requests. This demand drives the growth of the number of cloud availability zones and compartmentalization of the cloud, which then leads to increased provisioning and sub-optimal use of cloud and staff resources. Also, security requirements lead us to place specialized network appliances of these tenants separately into “exclusive” hosts that do not have internet connectivity. + +Valet responds to the challenges outlined above by enhancing OpenStack Nova scheduling to develop resource management optimization. By planning the placement of all the cloud resources for an application in a holistic manner, there is opportunity to reduce cross-rack traffic, reduce resource fragmentation, and save on operating costs. + +## Learn more about Valet: + +* [OpenStack Newton Summit Presentation](https://www.openstack.org/videos/video/valet-holistic-data-center-optimization-for-openstack) (Austin, TX, 27 April 2016) +* [Presentation Slides](http://www.research.att.com/export/sites/att_labs/techdocs/TD_101806.pdf) (PDF) + +## Valet consists of the following components: + +* [valet-openstack](https://github.com/att-comdev/valet/blob/master/doc/valet_os.md): a set of OpenStack plugins used to interact with Valet +* [valet-api](https://github.com/att-comdev/valet/blob/master/doc/valet_api.md): an API engine used to interact with Valet +* [Ostro](https://github.com/att-comdev/valet/blob/master/doc/ostro.md): a placement optimization engine +* Music: a data storage and persistence service +* [ostro-listener](https://github.com/att-comdev/valet/blob/master/doc/ostro_listener.md): a message bus listener used in conjunction with Ostro and Music +* [havalet](https://github.com/att-comdev/valet/blob/master/doc/ha.md): a service that assists in providing high availability for Valet + +## Additional documents: + +* [OpenStack Heat Resource Plugins](https://github.com/att-comdev/valet/blob/master/valet_plugins/valet_plugins/heat/README.md): Heat resources +* [Placement API](https://github.com/att-comdev/valet/blob/master/doc/valet_api.md): API requests/responses +* [Using Postman with valet-api](https://github.com/att-comdev/valet/blob/master/valet/tests/api/README.md): Postman support + +## License: + +Valet is distributed under the terms of the Apache License, Version 2.0. The full terms and conditions of this license are detailed in the LICENSE file. diff --git a/doc/ha.md b/doc/ha.md new file mode 100644 index 0000000..242d50d --- /dev/null +++ b/doc/ha.md @@ -0,0 +1,111 @@ +High Availability Valet Tools +============================= + +This tool monitors one or more configured processes to maintain high +availability. + +~~~~ {.bash} +$ python ./ha_valet.py [-p name] +~~~~ + +ha\_valet.cfg +------------- + +The ha\_valet configuration file contains a list of dictionaries. List +keys are logical process names. List values are dictionaries +representing a monitored Valet-related process. + +Each dictionary **must** contain the following properties: + + host + user + port + protocol + start_command + stop_command + test_command + +Optional properties include: + + order + priority + standy_by_list + +### Notes + +- The return value of `test_command` **must not** be 0 and should + reflect the monitored process priority (see next section). + +- `stand_by_list` is an optional comma-delimited list of hosts used in + conjunction with active/stand-by scenarios. ha\_valet will attempt + to restart the instance with the lower priority. If that instance + fails to start, ha\_valet will try restarting the process of the + next host in the list. + +- `priority` is used to establish the primary/secondary hierarchy. It + **must** be greater than 0. The lower the number, the higher the + priority. + +### Monitored Process Priority + +Monitored process priority is used in conjunction with active/stand-by +scenarios. Unless a process is down, its priority **must** be greater +than 0. The lower the number, the higher the priority. + +For example, an instance returning `1` (in response to `test_command`) +will take precedence over an instance returning `2`. A priority of 0 +means the process is down. + +Examples +-------- + +### Host A + + :Ostro + host = Host_A + stand_by_list = Host_A,Host_B + user = stack + port = 8091 + protocol = http + priority = 1 + start_command="ssh %s@%s 'cd @OSTRO_SERVER_DIR@ ; sudo python ./ostro_daemon.py start'" % (user, host) + stop_command="ssh %s@%s 'cd @OSTRO_SERVER_DIR@ ; sudo python ./ostro_daemon.py stop'" % (user, host) + test_command="ssh %s@%s 'exit $(@OSTRO_SERVER_DIR@ ; sudo python ./ostro_daemon.py status ; echo $?)'" % (user, host) + + :Allegro + host = Host_A + user = stack + port = 8090 + protocol = http + priority = 1 + start_command="sudo python @ALLEGRO_WSGI_DIR@/wsgi.py &" + stop_command="sudo pkill -f wsgi" + test_command="netstat -nap | grep %s | grep LISTEN | wc -l | exit $(awk \'{print $1}\')" % (port) + +### Host B (172.20.90.130) + + :Ostro + host = Host_B + stand_by_list = Host_A,Host_B + user = stack + port = 8091 + protocol = http + priority = 2 + start_command="ssh %s@%s 'cd @OSTRO_SERVER_DIR@ ; sudo python ./ostro_daemon.py start'" % (user, host) + stop_command="ssh %s@%s 'cd @OSTRO_SERVER_DIR@ ; sudo python ./ostro_daemon.py stop'" % (user, host) + test_command="ssh %s@%s 'exit $(@OSTRO_SERVER_DIR@ ; sudo python ./ostro_daemon.py status ; echo $?)'" % (user, host) + + :Allegro + host = Host_B + user = stack + port = 8090 + protocol = http + priority = 1 + start_command="sudo python @ALLEGRO_WSGI_DIR@/wsgi.py &" + stop_command="sudo pkill -f wsgi" + test_command="netstat -nap | grep %s | grep LISTEN | wc -l | exit $(awk \'{print $1}\')" % (port) + +Contact +------- + +Joe D'Andrea \ No newline at end of file diff --git a/doc/ostro.md b/doc/ostro.md new file mode 100644 index 0000000..493620b --- /dev/null +++ b/doc/ostro.md @@ -0,0 +1,92 @@ +Ostro version 2.0.2 Usage Guide + +USAGE + +1: Configure Ostro + +Set authentication in "ostro\_server/ostro.auth" file. User must have +the permission to access OpenStack Nova to let Ostro extract underlying +cloud infrastructure information. + +You must check “ostro\_server/ostro.cfg” to correctly run Ostro. Here, +explain the configuration parameters found in “ostro.cfg”. + +Configuration consists of 1) system, 2) logging, and 3) management +parts. + +1.1 System configuration - first, you define the base directory in +“root\_loc”, where Ostro is installed. - “mode” can be either “live” or +“sim”. “live” means Ostro runs over the real OpenStack site, while “sim” +means Ostro can be tested over a simulated datacenter. To configure the +simulated datacenter, you should check “ostro\_server/ostro\_sim.cfg”. - +“control\_loc” is to set URL where OpenStack controller is deployed. +From the URL, Ostro will get some data from Nova and Keystone (Cinder +will be in the next version). - currently, Ostro communicates with +Keystone and Nova via REST APIs. Those APIs are set in “keystone\_*” and +“nova\_*”. - “db\_\*” indicates parameters to be used for handling Music +database such as Cassandra keyspace and table names. +"replication\_factor" means how many Music instances run. "db\_hosts" +includes the ips where Music instances run. - “ip” indicates the IP +address of VM, where this Ostro instance runs. If Ostro instances are +installed in multiple VMs, you should set “ip” in each configuration. + +1.2 Logging configuration You can set up the logging configuration +including logger name, logging level, and directory. If you set the +logging level as “debug”, Ostro will leave detailed record. Ostro also +records two time-series data as text files (i.e., resource\_log and +app\_log). Due to the large size of these logs, we limit the number of +log files and the maximum size of each log file in “max\_num\_of\_logs” +and “max\_log\_size”. When “max\_num\_of\_logs” is 20 and once it +reaches the 21st log file, Ostro over-writes in the 1st file (i.e., +rotate the logging). "max\_main\_log\_size" means the max size of the +main Ostro log defined in "logger\_name" in the location "logging\_loc". + +1.3 Management configuration - “datacenter\_name” indicates the name of +site (region), where Ostro takes care of. This will be used as key value +when getting site topology data. - +“num\_of\_region\_chars”, “rack\_code\_list”, and “node\_code\_list” are +used to define the machine naming convention. In current version, Ostro +parses each hosting server machine name to figure out the region code +and rack name, where each hosting machine is located. This is based on +the current naming convention document. Current naming convention is as +follow, 3 chars of CLLI + region number + 'r' + rack id number + 1 char +of node type + node id number. For example, “pdk15r05c001” indicates the +first KVM compute server (i.e., 'c001') in the fifth rack (i.e., 'r05') +in the fifteenth DeKalb-Peachtree Airport Region (i.e., 'pdk15'). In +“num\_of\_region\_chars”, set the number of chars that indicates the +region code. In the above example, 'pdk' is the region code. In +“rack\_code\_list”, set 1 char of rack indicator. This should be 'r'. In +“node\_code\_list”, set all of chars, each of which indicates the node +type. Currently, 'a': network, 'c': KVM compute, 'u': ESXi compute, 'f': +?, 'o': operation, 'p': power, 's': storage. - “compute\_trigger\_time” +and “compute\_trigger\_frequency” are for setting when Nova is called to +set information that is used for decision making such as a list of +hosting servers and their resource capacities, host aggregates, and +availability zone etc. The value of “compute\_trigger\_time” is based on +24-hour (e.g., “13:00” means 1pm). The value of +“compute\_trigger\_frequency” is seconds (e.g., “3” means every 3 +seconds). Ostro checks first “compute\_trigger\_frequency”. If this +value is “0”, then uses “compute\_trigger\_time”. - +“topology\_trigger\_time” and “topology\_trigger\_frequency” are similar +with the above, but these are for setting the site layout/topology. Note +that currently, Nova must be called first and then, topology next. So, +“compute\_trigger\_time” must be earlier than “topology\_trigger\_time”. +- “default\_*” is for setting default overcommit ratios. - “static\_*” +is for setting standby resource amount as percentage. Standby means +Ostro will set aside certain amount resources (CPU, memory, and disk) as +unused for load spikes of tenant applications. This will be changed more +dynamically in the future version. - “auth\_loc” indicates the directory +of the authentication file. Admin must have the permission to access +OpenStack Nova to let Ostro extract underlying cloud infrastructure +information. + +2: Start/Stop Ostro daemon + +Ostro will run as a daemon process. Go to “ostro\_server” directory, +then start Ostro daemon as follow, + + python ostro_daemon.py start + +To stop this daemon process: + + python ostro_daemon.py stop diff --git a/doc/ostro_listener.md b/doc/ostro_listener.md new file mode 100644 index 0000000..11ec580 --- /dev/null +++ b/doc/ostro_listener.md @@ -0,0 +1,257 @@ +OpenStack Event Listener for Ostro +================================== + +This script listens for specific messages needed by Ostro to maintain +up-to-date cloud state. It can persist digested versions of the messages +to Music, which Ostro then picks up. + +*Note: This version of the listener does not use oslo.messaging. It +listens directly to RabbitMQ. Future revisions are expected to use +oslo.messaging in order to keep the means of transport abstract.* + +Prerequisites +------------- + +Prior to installation: + +- Ubuntu 14.04 LTS +- Python 2.7.6 with pip +- Access to an OpenStack Kilo cloud (RabbitMQ in particular) +- Access to Music and Ostro + +Throughout this document, the following installation-specific items are +required. Have values for these prepared and ready before continuing. +Suggestions for values are provided in this document where applicable. + + Name Description Example + ----------------------------- --------------------------------------------------- ------------------------------------------- + `$USER` User id `user1234` + `$VENV` Python virtual environment path (if any) `/etc/ostro-listener/venv` + `$OSTRO_LISTENER_PATH` Local git repository's `ostro_listener` directory `/home/user1234/git/allegro/ostro_listener` + `$CONFIG_FILE` Event Listener configuration file `/etc/ostro-listener/ostro-listener.conf` + `$RABBITMQ_HOST` RabbitMQ hostname or IP address `localhost` + `$RABBITMQ_USERNAME` RabbitMQ username `guest` + `$RABBITMQ_PASSWORD_FILE` Full path to RabbitMQ password file `/etc/ostro-listener/passwd` + `$MUSIC_URL` Music API endpoints and port in URL format `http://127.0.0.1:8080/` + `$MUSIC_KEYSPACE` Music keyspace `valet` + `$MUSIC_REPLICATION_FACTOR` Music replication factor `1` + +Root or sufficient sudo privileges are required for some steps. + +### A Note About Python Virtual Environments + +It is recommended to consider using a python [virtuals +environment](http://docs.python-guide.org/en/latest/dev/virtualenvs/) +(venv). A venv helps avoid instabilities and conflicts within the +default python environment. + +Installation +------------ + +Install ostro-listener on any node with line-of-sight to the RabbitMQ +endpoint from which messages are to be monitored. + +ostro-listener is located in `ostro_listener`. + +~~~~ {.bash} +$ cd $OSTRO_LISTENER_PATH +$ sudo pip install . +~~~~ + +Command Line Usage +------------------ + + usage: ostro-listener [-h] [-c OSTRO_LISTENER_CONFIG] [-x EXCHANGE] + [-t {topic,fanout}] [-a] [-H HOST] [-p PORT] + [-u USERNAME] [-P PASSWDFILE] [-o {yaml,json,dict}] [-s] + [-m MUSIC] [-k KEYSPACE] [-r REPLICATION_FACTOR] + + Ostro-specific OpenStack Event Listener + + optional arguments: + -h, --help show this help message and exit + -c OSTRO_LISTENER_CONFIG, --conf_file OSTRO_LISTENER_CONFIG + Defaults to env[OSTRO_LISTENER_CONFIG] + -x EXCHANGE, --exchange EXCHANGE + rabbit exchange to listen to + -t {topic,fanout}, --exchange_type {topic,fanout} + type of exchange (default="topic") + -a, --auto_delete autodelete exchange (default=False) + -H HOST, --host HOST compute node on which rabbitmq is running + -p PORT, --port PORT port on which rabbitmq is running + -u USERNAME, --username USERNAME + rabbitmq username (default="guest") + -P PASSWDFILE, --passwdfile PASSWDFILE + file containing host rabbitmq passwords + -o {yaml,json,dict}, --output_format {yaml,json,dict} + output format (default="dict") + -s, --store store messages in music (default=False) + -m MUSIC, --music MUSIC + music endpoint + -k KEYSPACE, --keyspace KEYSPACE + music keyspace + -r REPLICATION_FACTOR, --replication_factor REPLICATION_FACTOR + music replication factor + +Example Invocation +------------------ + +Split across lines for readability: + + # ostro-listener -x nova -t topic -s + -H $RABBITMQ_HOST + -u $RABBITMQ_USERNAME + -P $RABBITMQ_PASSWORD_FILE + -m $MUSIC_URL + -k $MUSIC_KEYSPACE + -r $MUSIC_REPLICATION_FACTOR + +*Note: This script has kept its original flexibility in that it may also +be used to listen to other exchanges/topics.* + +Always use the nova exchange (`-x nova`) and topic exchange type +(`-t topic`) when using in conjunction with Ostro and Music. + +**IMPORTANT**: Always use topic exchanges for "listening on the wire" to +OpenStack message traffic. Failure to do so could risk other RabbitMQ +users (e.g., OpenStack services) missing important messages, and then +you will be sad. + +Password File +------------- + +A sample password file can be found in +`$OSTRO_LISTENER_PATH/etc/ostro_listener/passwd.txt`. + +Copy this file to another location before editing, for example +`/etc/ostro-listener/passwd`. + +The password file must be protected. In particular, it must not be +readable by group/other users. It is often set to root ownership. + +Within the file, separate hosts/IPs and passwords with a single space. +For example: + + 127.0.0.1 password + localhost password + myhost password + myhost.at.att.com password + +Hosts/IPs will match based on the value of `$RABBITMQ_HOST`. + +Using a Configuration File +-------------------------- + +A sample configuration file can be found in +`$OSTRO_LISTENER_PATH/etc/ostro_listener/ostro-listener.conf.txt`: + +~~~~ {.ini} +[DEFAULT] +exchange = nova +exchange_type = topic +auto_delete = false +host = localhost +port = 5672 +username = guest +passwdfile = /etc/ostro-listener/passwd +output_format = dict +store = true +music = http://127.0.0.1:8080/ +keyspace = music +replication_factor = 1 +~~~~ + +Copy this file to another location before editing. + +Configuration files may be referenced in one of two ways, through the +`--config-file` option: + +~~~~ {.bash} +# ostro-listener --config-file $CONFIG_FILE +~~~~ + +... or via an environment variable: + +~~~~ {.bash} +# export OSTRO_EVENT_LISTENER_CONFIG=$CONFIG_FILE +# ostro-listener +~~~~ + +Running as an Ubuntu Service +---------------------------- + +A sample Ubuntu init.d script can be found in +`$OSTRO_LISTENER_PATH/etc/ostro_listener/ostro-listener.initd.txt`. + +To use, first copy this script to `/etc/init.d/ostro-listener`: + +~~~~ {.bash} +$ sudo cp $OSTRO_LISTENER_PATH/etc/ostro_listener/ostro-listener.initd.txt /etc/init.d/ostro-listener +$ sudo chmod 755 /etc/init.d/ostro-listener +~~~~ + +If ostro-listener was installed in a Python virtual environment, edit +`/etc/init.d/ostro-listener`, uncomment the `export VENV` line, and +adjust as needed. For example, if the virtual environment is installed +in `/etc/ostro-listener/venv`, assign `VENV` as follows: + +~~~~ {.bash} +export VENV=/etc/ostro-listener/venv +~~~~ + +Create `/var/log` and `/var/run` directories for use by the service: + +~~~~ {.bash} +$ sudo mkdir /var/log/ostro-listener +$ sudo mkdir /var/run/ostro-listener +$ sudo chmod 750 /var/log/ostro-listener +$ sudo chmod 755 /var/run/ostro-listener +~~~~ + +Set the run level defaults, then enable ostro-listener as a service: + +~~~~ {.bash} +$ sudo update-rc.d ostro-listener defaults +$ sudo update-rc.d ostro-listener enable +~~~~ + +To start the ostro-listener service: + +~~~~ {.bash} +$ sudo service ostro-listener start +~~~~ + +While running, a process ID file will be found in +`/var/run/ostro-listener/ostro-listener.pid`, and a log file will be +found in `/var/log/ostro-listener/ostro-listener.log`. The log is +appended to upon subsequent starts. Log rotation is left to the +discretion of the server administrator. + +To stop the ostro-listener service: + +~~~~ {.bash} +$ sudo service ostro-listener stop +~~~~ + +The process ID file will be removed from `/var/run/ostro-listener` upon +stopping. + +Uninstallation +-------------- + +Activate a virtual environment (venv) first if necessary. + +Disable ostro-listener as a service, then uninstall: + +~~~~ {.bash} +$ sudo update-rc.d ostro-listener disable +$ sudo pip uninstall ostro-listener +~~~~ + +Remove previously made configuration file changes, files, and other +settings as needed. + +Contact +------- + +Joe D'Andrea diff --git a/doc/ostro_release.md b/doc/ostro_release.md new file mode 100644 index 0000000..ae04014 --- /dev/null +++ b/doc/ostro_release.md @@ -0,0 +1,42 @@ +Valet1.0/Ostro features + +- Optimal VM placement Use the decent algorithm, compute the holistic + optimal placement for all VMs of given application. Working on + NUMAAffinityFilter and PCIPassthroughFilter. + +- Constraint solving (filtering) Current constraints (i.e., filters) + include CoreFilter, RamFilter, DiskFilter, host aggregates, + availability zones. Possibly, the decision making of Ostro is + different from Nova when tenant attempts to use other filters + available in Nova. In this case, Ostro yields its decision to Nova + scheduler unless the tenant uses affinity, diversity, and + exclusivity in Heat template. However, we will restrict some Nova + filters if it affects cloud security, reliability, and efficiency. + +- Affinity, Diversity, and Exclusivity in either host or rack level In + addition of the above filters, support affinity, diversity + (anti-affinity), and exclusivity. The rack level can be supported + when the topology/layout information of site is available. + Currently, use the host machine naming convention. If a site does + not follow the naming convention, the rack level request will be + rejected. Note that you can use the mix of these special filters and + the basic filters. + +- Resource standby When allocating resources (CPU, memory, disk, and + later network bandwidth), Ostro intentionally leaves a certain + percentage of resources as unused. This is because of the concern of + load spikes of tenant applications. Later, we will deploy more + dynamic mechanism in the future version of Ostro. + +- High availability Ostro replicas run as active-passive way. When + active Ostro fails, automatically the passive one is activated via + HAValet. All data is updated in MUSIC database at runtime whenever + it is changed. When the passive Ostro is activated, it gets data + from MUSIC to initialize its status rather than from OpenStack. + Ostro also takes ping messages to show if it is alive or not. + +- Runtime update via the Oslo message bus or RO Working on this. + +- Migration tip Working on this. + + diff --git a/doc/rest_api.md b/doc/rest_api.md new file mode 100644 index 0000000..b84c838 --- /dev/null +++ b/doc/rest_api.md @@ -0,0 +1,782 @@ +# Placement API v1 - CURRENT + +Determines placement for cloud resources. + +## General API information + +Authenticated calls that target a known URI but that use an HTTP method the implementation does not support return a 405 Method Not Allowed status. In addition, the HTTP OPTIONS method is supported for each known URI. In both cases, the Allow response header indicates the supported HTTP methods. See the [API Errors](#api-errors) section for more information about the error response structure. + + +## API versions + +### List all Placement API versions + +**GET** `/` + +**Normal response codes:** 200 + +```json +{ + "versions": [ + { + "status": "CURRENT", + "id": "v1.0", + "links": [ + { + "href": "http://127.0.0.1:8090/v1/", + "rel": "self" + } + ] + } + ] +} +``` + +This operation does not accept a request body. + +## Groups + +### Create a group + +**POST** `/v1/groups` + +**Normal response codes:** 201 +**Error response codes:** badRequest (400), unauthorized (401), internalServerError (500) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-----------|-------|------|-------------| +| description | plain | xsd:string | A description for the new group. | +| name | plain | xsd:string | A name for the new group. Must only contain letters, numbers, hypens, full stops, underscores, and tildes (RFC 3986, Section 2.3). This parameter is immutable. | +| type | plain | xsd:string | A type for the new group. Presently, the only valid value is `exclusivity`. This parameter is immutable. | + +#### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| description | plain | xsd:string | The group description. | +| id | plain | csapi:UUID | The UUID of the group. | +| members | plain | xsd:list | A list of group members. Initially empty. | +| name | plain | xsd:string | The group name. | +| type | plain | xsd:string | The group type. | + +```json +{ + "name": "group", + "description": "My Awesome Group", + "type": "exclusivity" +} +``` + +```json +{ + "description": "My Awesome Group", + "type": "exclusivity", + "id": "7de4790e-08f2-44b7-8332-7a41fab36a41", + "members": [], + "name": "group" +} +``` + +* * * * * * * * * * * + +### List active groups + +**GET** `/v1/groups` + +**Normal response codes:** 200 +**Error response codes:** unauthorized (401) + +#### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| description | plain | xsd:string | The group description. | +| id | plain | csapi:UUID | The UUID of the group. | +| members | plain | xsd:list | A list of group members. Initially empty. | +| name | plain | xsd:string | The group name. | +| type | plain | xsd:string | The group type. | + +This operation does not accept a request body. + +```json +{ + "groups": [ + { + "description": "My Awesome Group", + "type": "exclusivity", + "id": "7de4790e-08f2-44b7-8332-7a41fab36a41", + "members": [], + "name": "group" + } + ] +} +``` + +* * * * * * * * * * * + +### Show group details + +**GET** `/v1/groups/{group_id}` + +**Normal response codes:** 200 +**Error response codes:** unauthorized (401), itemNotFound (404) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| group_id | plain | csapi:UUID | The UUID of the group. | + +#### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| description | plain | xsd:string | The group description. | +| id | plain | csapi:UUID | The UUID of the group. | +| members | plain | xsd:list | A list of group members. | +| name | plain | xsd:string | The group name. | +| type | plain | xsd:string | The group type. | + +```json +{ + "group": { + "description": "My Awesome Group", + "type": "exclusivity", + "id": "7de4790e-08f2-44b7-8332-7a41fab36a41", + "members": [], + "name": "group" + } +} +``` + +This operation does not accept a request body. + +* * * * * * * * * * * + +### Update a group + +**PUT** `/v1/groups/{group_id}` + +**Normal response codes:** 201 +**Error response codes:** badRequest (400), unauthorized (401), itemNotFound (404) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| description | plain | xsd:string | A description for the group. Replaces the original description. | +| group_id | plain | csapi:UUID | The UUID of the group. | + +#### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| description | plain | xsd:string | The group description. | +| id | plain | csapi:UUID | The UUID of the group. | +| members | plain | xsd:list | A list of group members. | +| name | plain | xsd:string | The group name. | +| type | plain | xsd:string | The group type. | + +```json +{ + "description": "My Extra Awesome Group" +} +``` + +```json +{ + "description": "My Extra Awesome Group", + "type": "exclusivity", + "id": "7de4790e-08f2-44b7-8332-7a41fab36a41", + "members": [], + "name": "group" +} +``` + +* * * * * * * * * * * + +### Delete a group + +**DELETE** `/v1/groups/{group_id}` + +**Normal response codes:** 204 +**Error response codes:** badRequest (400), unauthorized (401), itemNotFound (404), conflict (409) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| group_id | plain | csapi:UUID | The UUID of the group. | + +This operation does not accept a request body and does not return a response body. + +* * * * * * * * * * * + +### Add members to a group + +**PUT** `/v1/groups/{group_id}/members` + +**Normal response codes:** 201 +**Error response codes:** badRequest (400), unauthorized (401), itemNotFound (404), conflict (409) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| group_id | plain | csapi:UUID | The UUID of the group. | +| members | plain | xsd:list | A list of group members. This is added to any previous list of members. All members must be valid tenant UUIDs. | + +#### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| description | plain | xsd:string | The group description. | +| id | plain | csapi:UUID | The UUID of the group. | +| members | plain | xsd:list | A list of group members. | +| name | plain | xsd:string | The group name. | +| type | plain | xsd:string | The group type. | + +```json +{ + "members": [ + "b7d0e9b175294b649464caa3411adb3f" + ] +} +``` + +```json +{ + "description": "My Awesome Group", + "type": "exclusivity", + "id": "bf49803b-48b6-4a13-9191-98dde1dbd5e4", + "members": [ + "b7d0e9b175294b649464caa3411adb3f", + "65c3e5ee5ee0428caa5e5275c58ead61" + ], + "name": "group" +} +``` + +* * * * * * * * * * * + +### Verify membership in a group + +**GET** `/v1/groups/{group_id}/members/{member_id}` + +**Normal response codes:** 204 +**Error response codes:** badRequest (400), unauthorized (401), itemNotFound (404) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| group_id | plain | csapi:UUID | The UUID of the group. | +| member_id | plain | csapi:UUID | The UUID of one potential group member. Members are tenant UUIDs. | + +This operation does not accept a request body and does not return a response body. + +* * * * * * * * * * * + +### Delete member from a group + +**DELETE** `/v1/groups/{group_id}/members/{member_id}` + +**Normal response codes:** 204 +**Error response codes:** badRequest (400), unauthorized (401), itemNotFound (404) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| group_id | plain | csapi:UUID | The UUID of the group. | +| member_id | plain | csapi:UUID | The UUID of one potential group member. Members are tenant UUIDs. | + +This operation does not accept a request body and does not return a response body. + +* * * * * * * * * * * + +### Delete all members from a group + +**DELETE** `/v1/groups/{group_id}/members` + +**Normal response codes:** 204 +**Error response codes:** badRequest (400), unauthorized (401), itemNotFound (404) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| group_id | plain | csapi:UUID | The UUID of the group. | + +This operation does not accept a request body and does not return a response body. + +## Status + +### Get summary status of all subsystems + +**HEAD** `/v1/status` + +**Normal response codes:** 200 +**Error response codes:** internalServerError (500) + +This operation does not accept a request body and does not return a response body. + +### List detailed status of all subsystems + +**GET** `/v1/status` + +**Normal response codes:** 200 +**Error response codes:** internalServerError (500) + +#### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| status | plain | xsd:dict | A dictionary of statuses from each subsystem, keyed by name. | + +This operation does not accept a request body. + +```json +{ + "status": { + "ostro": { + "status": { + "message": "ping", + "type": "ok" + }, + "resources": { + "ip": "135.197.226.83" + } + } + } +} +``` + +## Placements + +### List active placements + +**GET** `/v1/placements` + +**Normal response codes:** 200 +**Error response codes:** unauthorized (401) + +#### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| id | plain | csapi:UUID | The UUID of the placement. | +| location | plain | xsd:string | The placement location of the resource. | +| name | plain | xsd:string | The name of the resource. | +| orchestration_id | plain | csapi:UUID | The UUID provided by an orchestration engine (e.g., heat-engine) prior to instantiation of the resource. | +| resource_id | plain | csapi:UUID | The physical UUID of the resource. The value is unknown until a placement has been reserved for the first time. | +| plan_id | plain | csapi:UUID | The UUID of the plan. | +| reserved | plain | xsd:boolean | Set to true if the placement was successfully reserved. | + +This operation does not accept a request body. + +```json +{ + "placements": [ + { + "plan_id": "e01ae778-52c8-4e52-9f32-a486584f0e89", + "name": "my-instance-1", + "orchestration_id": "f8cfab7e-83d0-4a7d-8551-905ea8a43a39", + "resource_id": "240b2fe5-2e01-4cfb-982c-67e3f1553386", + "location": "qos104", + "reserved": true, + "id": "55f4aee9-b7df-44d0-85d3-3234c08dbfb4" + }, + { + "plan_id": "c8b8e9d9-227f-4652-8a18-523cd37b86c0", + "name": "ad_hoc_instance", + "orchestration_id": "23ffc206-cb57-4b99-9393-6e01837855bc", + "resource_id": null, + "location": "qos101", + "reserved": false, + "id": "dbbc9ae2-3ba2-4409-8765-03cdbfcd0dcb" + } + ] +} +``` + +### Show placement details with no reservation + +**GET** `/v1/placements/{placement_id}` + +**Normal response codes:** 200 +**Error response codes:** unauthorized (401), itemNotFound (404) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| placement_id | plain | csapi:UUID | The UUID of the placement or its associated orchestration UUID. | + +#### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| id | plain | csapi:UUID | The UUID of the placement. | +| location | plain | xsd:string | The placement location of the resource. | +| name | plain | xsd:string | The name of the resource. | +| orchestration_id | plain | csapi:UUID | The UUID provided by an orchestration engine (e.g., heat-engine) prior to instantiation of the resource. | +| resource_id | plain | csapi:UUID | The physical UUID of the resource. The value is unknown until a placement has been reserved for the first time. | +| plan_id | plain | csapi:UUID | The UUID of the plan. | +| reserved | plain | xsd:boolean | Set to true if the placement was successfully reserved. | + +This operation does not accept a request body. + +```json +{ + "placement": { + "plan_id": "a78d1936-0b63-4ce3-9450-832f71ebf160", + "name": "my_instance", + "orchestration_id": "b71bedad-dd57-4942-a7bd-ab074b72d652", + "resource_id": null, + "location": "qos105", + "reserved": false, + "id": "b7116936-5210-448a-b21f-c35f33e9bcc2" + } +} +``` + +### Reserve a placement with possible replanning + +**POST** `/v1/placements/{placement_id}` + +**Normal response codes:** 201 +**Error response codes:** unauthorized (401), itemNotFound (404), internalServerError (500) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| locations | plain | xsd:list | A list of available locations. If the placement was not planned in one of these locations, the placement for this resource (and any others in the same plan not yet reserved) will be replanned on-the-fly. | +| resource_id | plain | csapi:UUID | The physical UUID of the resource. | +| placement_id | plain | csapi:UUID | The UUID of the placement or its associated orchestration UUID. | + +#### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| id | plain | csapi:UUID | The UUID of the placement. | +| location | plain | xsd:string | The placement location of the resource. | +| name | plain | xsd:string | The name of the resource. | +| orchestration_id | plain | csapi:UUID | The UUID provided by an orchestration engine (e.g., heat-engine) prior to instantiation of the resource. | +| resource_id | plain | csapi:UUID | The physical UUID of the resource. | +| plan_id | plain | csapi:UUID | The UUID of the plan. | +| reserved | plain | xsd:boolean | Set to true if the placement was successfully reserved. | + +```json +{ + "locations": ["qos101", "qos102", "qos104", "qos106", "qos107"], + "resource_id": "240b2fe5-2e01-4cfb-982c-67e3f1553386" +} +``` + +```json +{ + "placement": { + "plan_id": "a78d1936-0b63-4ce3-9450-832f71ebf160", + "name": "my_instance", + "orchestration_id": "b71bedad-dd57-4942-a7bd-ab074b72d652", + "resource_id": "240b2fe5-2e01-4cfb-982c-67e3f1553386", + "location": "qos101", + "reserved": true, + "id": "b7116936-5210-448a-b21f-c35f33e9bcc2" + } +} +``` + +## Plans + +### Create a plan + +**POST** `/v1/plans` + +**Normal response codes:** 201 +**Error response codes:** badRequest (400), unauthorized (401), internalServerError (500) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| plan_name | plain | xsd:string | The name of the plan. | +| resources | plain | xsd:dict | A dictionary of resources to be planned. Each is keyed by an orchestration uuid. This is a UUID provided by an orchestration engine (e.g., heat-engine) prior to instantiation of a resource. The dictionary contains three keys: | +| | | | **name**: resource name | +| | | | **type**: resource type (in Heat Orchestration Template format) | +| | | | **properties**: resource properties (in Heat Orchestration Template format) | +| stack_id | plain | csapi:UUID | The UUID of the stack. | + +#### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| stack_id | plain | csapi:UUID | The UUID of the stack. | +| id | plain | csapi:UUID | The UUID of the plan. | +| placements | plain | xsd:dict | A dictionary of planned resources. Each is keyed by an orchestration uuid. This is a UUID provided by an orchestration engine (e.g., heat-engine) prior to instantiation of a resource. The dictionary contains two keys: | +| | | | **location**: resource placement | +| | | | **name**: resource name | +| name | plain | xsd:string | The name of the plan. | + +```json +{ + "plan_name": "e624474b-fc80-4053-ab5f-45cc1030e692", + "resources": { + "b71bedad-dd57-4942-a7bd-ab074b72d652": { + "properties": { + "flavor": "m1.small", + "image": "ubuntu12_04", + "key_name": "demo", + "networks": [ + { + "network": "demo-net" + } + ] + }, + "type": "OS::Nova::Server", + "name": "my_instance" + } + }, + "stack_id": "e624474b-fc80-4053-ab5f-45cc1030e692" +} +``` + +```json +{ + "plan" { + "stack_id": "e624474b-fc80-4053-ab5f-45cc1030e692", + "id": "1853a7e7-0075-465b-9019-8908db680f2e", + "placements": { + "b71bedad-dd57-4942-a7bd-ab074b72d652": { + "location": "qos103", + "name": "my_instance" + } + }, + "name": "e624474b-fc80-4053-ab5f-45cc1030e692" + } +} +``` + +### List active plans + +**GET** `/v1/plans` + +**Normal response codes:** 200 +**Error response codes:** unauthorized (401) + +#### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| stack_id | plain | csapi:UUID | The UUID of the stack. | +| id | plain | csapi:UUID | The UUID of the plan. | +| placements | plain | xsd:dict | A dictionary of planned resources. Each is keyed by an orchestration uuid. This is a UUID provided by an orchestration engine (e.g., heat) prior to instantiation of a resource. The dictionary contains two keys: | +| | | | **location**: resource placement | +| | | | **name**: resource name | +| name | plain | xsd:string | The name of the plan. | + +This operation does not accept a request body. + +```json +{ + "plans": [ + { + "stack_id": "e624474b-fc80-4053-ab5f-45cc1030e692", + "id": "f1a81397-e4d4-46de-8445-dfadef633beb", + "placements": { + "b71bedad-dd57-4942-a7bd-ab074b72d652": { + "location": "qos101", + "name": "my_instance" + } + }, + "name": "e624474b-fc80-4053-ab5f-45cc1030e692" + }, + { + "stack_id": "8e06301e-7375-465f-9fc7-70fb13763927", + "id": "f56391b0-61bb-4e18-b9ca-23c0ff2e4508", + "placements": { + "8e06301e-7375-465f-9fc7-70fb13763927": { + "location": "qos101", + "name": "ad_hoc_instance" + } + }, + "name": "8e06301e-7375-465f-9fc7-70fb13763927" + } + ] +} +``` + +### Show plan details + +**GET** `/v1/plans/{plan_id}` + +**Normal response codes:** 200 +**Error response codes:** unauthorized (401), itemNotFound (404) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| plan_id | plain | csapi:UUID | The UUID of the plan or its associated stack UUID. | + +#### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| stack_id | plain | csapi:UUID | The UUID of the stack. | +| id | plain | csapi:UUID | The UUID of the plan. | +| placements | plain | xsd:dict | A dictionary of planned resources. Each is keyed by an orchestration UUID. This is provided by an orchestration engine (e.g., heat) prior to instantiation of a resource. The dictionary contains two keys: | +| | | | **location**: resource placement | +| | | | **name**: resource name | +| name | plain | xsd:string | The name of the plan. | + +This operation does not accept a request body. + +```json +{ + "plan": { + "stack_id": "e624474b-fc80-4053-ab5f-45cc1030e692", + "id": "1853a7e7-0075-465b-9019-8908db680f2e", + "placements": { + "b71bedad-dd57-4942-a7bd-ab074b72d652": { + "location": "qos103", + "name": "my_instance" + } + }, + "name": "e624474b-fc80-4053-ab5f-45cc1030e692" + } +} +``` + +### Update a plan + +**PUT** `/v1/plans/{plan_id}` + +**Normal response codes:** 201 +**Error response codes:** badRequest (400), unauthorized (401), itemNotFound (404) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| plan_id | plain | csapi:UUID | The UUID of the plan or its associated stack id. | +| action | plain | xsd:string | The plan update action. There is only one valid option at this time. | +| | | | **migrate**: Replan a single resource | +| excluded_hosts | plain | xsd:list | A list of hosts that must not be considered when replanning | +| resources | plain | xsd:list | When action="migrate" this is a list of length one. The lone item is either a physical resource id or an orchestration id. | + +#### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| stack_id | plain | csapi:UUID | The UUID of the stack. | +| id | plain | csapi:UUID | The UUID of the plan. | +| placements | plain | xsd:dict | A dictionary of planned resources. Each is keyed by an orchestration uuid. This is provided by an orchestration engine (e.g., heat) prior to instantiation of a resource. The dictionary contains two keys: | +| | | | **location**: resource placement | +| | | | **name**: resource name | + +```json +{ + "action": "migrate", + "excluded_hosts": ["qos104", "qos106", "qos107"], + "resources": ["b71bedad-dd57-4942-a7bd-ab074b72d652"] +} +``` + +```json +{ + "plan": { + "stack_id": "e624474b-fc80-4053-ab5f-45cc1030e692", + "id": "a78d1936-0b63-4ce3-9450-832f71ebf160", + "placements": { + "b71bedad-dd57-4942-a7bd-ab074b72d652": { + "location": "qos105", + "name": "my_instance" + } + }, + "name": "e624474b-fc80-4053-ab5f-45cc1030e692" + } +} +``` + +### Delete a plan + +**DELETE** `/v1/plans/{plan_id}` + +**Normal response codes:** 204 +**Error response codes:** badRequest (400), unauthorized (401), itemNotFound (404) + +#### Request parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| plan_id | plain | csapi:UUID | The UUID of the plan or its associated stack id. | + +This operation does not accept a request body and does not return a response body. + +## API Errors + +In the event of an error with a status other than unauthorized (401), a detailed repsonse body is returned. + +### Response parameters + +| Parameter | Style | Type | Description | +|-------------|-------|------------|---------------------------------------------------| +| title | plain | xsd:string | Human-readable name. | +| explanation | plain | xsd:string | Detailed explanation with remediation (if any). | +| code | plain | xsd:int | HTTP Status Code. | +| error | plain | xsd:dict | Error dictionary. Keys include **message**, **traceback** (currently reserved / unused), and **type**. | +| message | plain | xsd:string | Internal error message. | +| traceback | plain | xsd:string | Python traceback (if available). | +| type | plain | xsd:string | HTTP Status class name (from python-webob) | + +#### Examples + +A group with the name "gro up" is considered a bad request because the name contains a space. + +```json +{ + "title": "Bad Request", + "explanation": "-> name -> gro up did not pass validation against callable: group_name_type (must contain only uppercase and lowercase letters, decimal digits, hyphens, periods, underscores, and tildes [RFC 3986, Section 2.3])", + "code": 400, + "error": { + "message": "The server could not comply with the request since it is either malformed or otherwise incorrect.", + "traceback": null, + "type": "HTTPBadRequest" + } +} +``` + +The HTTP COPY method was attempted but is not allowed. + +```json +{ + "title": "Method Not Allowed", + "explanation": "The COPY method is not allowed.", + "code": 405, + "error": { + "message": "The server could not comply with the request since it is either malformed or otherwise incorrect.", + "traceback": null, + "type": "HTTPMethodNotAllowed" + } +} +``` + +A Valet Group was not found. + +```json +{ + "title": "Not Found", + "explanation": "Group not found", + "code": 404, + "error": { + "message": "The resource could not be found.", + "traceback": null, + "type": "HTTPNotFound" + } +} +``` diff --git a/doc/valet.md b/doc/valet.md new file mode 100644 index 0000000..fb1520d --- /dev/null +++ b/doc/valet.md @@ -0,0 +1,34 @@ +# Valet + +Valet gives OpenStack the ability to optimize cloud resources while simultaneously meeting a cloud application's QoS requirements. Valet provides an api service, a placement optimizer (Ostro), a high availability data storage and persistence layer (Music), and a set of OpenStack plugins. + +**IMPORTANT**: [Overall Installation of Valet is covered in a separate document](https://github.com/att-comdev/valet/blob/master/doc/valet_os.md). + +Learn more about Valet: + +* [OpenStack Newton Summit Presentation](https://www.openstack.org/videos/video/valet-holistic-data-center-optimization-for-openstack) (Austin, TX, 27 April 2016) +* [Presentation Slides](http://www.research.att.com/export/sites/att_labs/techdocs/TD_101806.pdf) (PDF) + +Valet consists of the following components: + +* [valet-openstack](https://github.com/att-comdev/valet/blob/master/doc/valet_os.md): a set of OpenStack plugins used to interact with Valet +* [valet-api](https://github.com/att-comdev/valet/blob/master/doc/valet_api.md): an API engine used to interact with Valet +* [Ostro](https://github.com/att-comdev/valet/blob/master/doc/ostro.md): a placement optimization engine +* Music: a data storage and persistence service +* [ostro-listener](https://github.com/att-comdev/valet/blob/master/doc/ostro_listener.md): a message bus listener used in conjunction with Ostro and Music +* [havalet](https://github.com/att-comdev/valet/blob/master/doc/ha.md): a service that assists in providing high availability for Valet + +Additional documents: + +* [OpenStack Heat Resource Plugins](https://github.com/att-comdev/valet/blob/master/valet_plugins/valet_plugins/heat/README.md): Heat resources +* [Placement API](https://github.com/att-comdev/valet/blob/master/doc/valet_api.md): API requests/responses +* [Using Postman with valet-api](https://github.com/att-comdev/valet/blob/master/valet/tests/api/README.md): Postman support + +## Thank You + +Alicia Abella, Saar Alaluf, Bharath Balasubramanian, Roy Ben Hai, Shimon Benattar, Yael Ben Shalom, Benny Bustan, Rachel Cohen, Joe D'Andrea, Harel Dorfman, Boaz Elitzur, P.K. Esrawan, Inbal Harduf, Matti Hiltunen, Doron Honigsberg, Kaustubh Joshi, Gueyoung Jung, Gerald Karam, David Khanin, Israel Kliger, Erez Korn, Max Osipov, Chris Rice, Amnon Sagiv, Gideon Shafran, Galit Shemesh, Anna Yefimov; AT&T Advanced Technology and Architecture, AT&T Technology Development - AIC, Additional partners in AT&T Domain 2.0. Apologies if we missed anyone (please advise via email!). + +## Contact + +Joe D'Andrea + diff --git a/doc/valet_api.md b/doc/valet_api.md new file mode 100644 index 0000000..5ce0df8 --- /dev/null +++ b/doc/valet_api.md @@ -0,0 +1,255 @@ +# valet-api + +Valet gives OpenStack the ability to optimize cloud resources while simultaneously meeting a cloud application's QoS requirements. Valet provides an api service, an optimizer (Ostro), and a set of OpenStack plugins. + +This document covers installation of valet-api, the API engine used to interact with Valet. + +**IMPORTANT**: [Overall Installation of Valet is covered in a separate document](https://github.com/att-comdev/valet/blob/master/doc/valet_os.md). These instructions are to be used by the Bedminster and Tel Aviv development teams. + +## Prerequisites + +Prior to installation: + +* Ubuntu 14.04 LTS +* Python 2.7.6 with pip +* An OpenStack Kilo cloud +* Music 6.0 +* [Ostro](https://github.com/att-comdev/valet/blob/master/doc/ostro.md) 2.0 + +Throughout this document, the following installation-specific items are required. Have values for these prepared and ready before continuing. Suggestions for values are provided in this document where applicable. + +| Name | Description | Example | +|------|-------------|-------| +| ``$USER`` | User id | ``user1234`` | +| ``$VENV`` | Python virtual environment path (if any) | ``/etc/valet/venv`` | +| ``$VALET_API_PATH`` | Local git repository's ``valet_api`` directory | ``/home/user1234/git/valet/valet_api`` | +| ``$VALET_HOST`` | valet-api hostname | ``localhost`` | +| ``$VALET_USERNAME`` | OpenStack placement service username | ``valet`` | +| ``$VALET_PASSWORD`` | OpenStack placement service password | | +| ``$VALET_TENANT_NAME`` | OpenStack placement service default tenant | ``service`` | +| ``$KEYSTONE_AUTH_API`` | Keystone Auth API publicurl endpoint | ``http://controller:5000/`` | +| ``$VALET_CONFIG_PATH`` | Valet configuration directory | ``/var/www/valet`` | +| ``$APACHE2_CONFIG_PATH`` | apache2 httpd server configuration path | ``/etc/apache2`` | +| ``$OSLO_MSG_USERNAME`` | Oslo Messaging Service username | ``messaging`` | +| ``$OSLO_MSG_PASSWORD`` | Oslo Message Service password | | +| ``$OSLO_MSG_HOST`` | Oslo Messaging Service host | ``controller`` | + +Root or sufficient sudo privileges are required for some steps. + +### A Note About Python Virtual Environments + +It is recommended to install and configure valet-api within a python [virtual environment](http://docs.python-guide.org/en/latest/dev/virtualenvs/) (venv), This helps avoid instabilities and conflicts within the default python environment. + +## Installation + +Install valet-api on a host that can reach all OpenStack Keystone endpoints (public, internal, and admin). This can be a controller node or a separate host. Likewise, valet-api, Ostro, and Music may be installed on the same host or separate hosts. + +valet-api is located in ``valet_api``. + +```bash +$ cd $VALET_API_PATH +$ sudo pip install . +``` + +If the following error appears when installing valet-api, and SSL access is required (e.g., if Keystone can only be reached via SSL), use a newer Python 2.7 Ubuntu package. + +```bash +[InsecurePlatformWarning](https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning): A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. +``` + +## User Account + +Create an Ubuntu user/group for the valet service user (usually ``valet``): + +```bash +$ sudo adduser --gecos "valet service user" valet +``` + +If the Ubuntu-assigned uid/gid requires adjustment: + +```bash +$ sudo usermod -u $DESIRED_ID -U valet +$ sudo groupmod -g $DESIRED_ID valet +``` + +## Configuration + +Copy ``$VALET_API_PATH/etc/valet_api/config.py`` to a suitable configuration path (``$VALET_CONFIG_PATH``) outside of the git repository prior to editing. (Always edit the copy, never the original.) As the config file will contain sensitive passwords, ``$VALET_CONFIG_PATH`` must have limited visibility and be accessible only to the user running valet-api. + +Edit the following sections in the ``config.py`` copy. See the [valet-openstack README](https://github.com/att-comdev/valet/blob/master/doc/valet_os.md) for additional context around the ``server`` and ``identity`` sections. + +*Note: In OpenStack parlance, Valet is canonically referred to as a **placement service**.* + +### Server + +* Set ``port`` to match the port number used by OpenStack Keystone's placement service (usually ``8090``). +* ``host`` can remain ``0.0.0.0``. + +```python +server = { + 'port': '8090', + 'host': '0.0.0.0' +} +``` + +### Identity + +* Set ``username`` and ``password`` to the OpenStack placement service user. +* Set ``project_name`` to the OpenStack placement service user's tenant name. +* Set ``auth_url`` to the OpenStack Keystone API publicurl endpoint. + +```python +identity = { + 'config': { + 'username': '$VALET_USERNAME', + 'password': '$VALET_PASSWORD', + 'project_name': '$VALET_TENANT_NAME', + 'auth_url': '$KEYSTONE_AUTH_API', + } +} +``` + +Once authenticated via Keystone's *publicurl* endpoint, valet-api uses Keystone's *adminurl* endpoint for further API calls. Access to the adminurl endpoint is required for: + +* Authentication (AuthN) of OpenStack users for valet-api access. +* Authorization (AuthZ) of OpenStack users for valet-api access. This is presently limited to users assigned an ``admin`` role. +* Obtaining a list of all OpenStack cloud tenants (used by Valet Groups). + +*Note: Formal Role-Based Access Control (RBAC) support (via oslo-policy) is expected in a future release.* + +If the Keystone adminurl endpoint is not reachable, Valet will not be able to obtain a complete tenant list. To mitigate: + +* Add an additional identity config setting named ``'interface'``, set to ``'public'``. +* In the OpenStack cloud, ensure the valet user (``$VALET_USERNAME``) is a member of every tenant. Keep membership current as needed. + +### Messaging + +* Set ``transport_url`` to match the OpenStack Oslo Messaging Service endpoint. + +```python +messaging = { + 'config': { + 'transport_url': 'rabbit://$OSLO_MSG_USERNAME:$OSLO_MSG_PASSWORD@$OSLO_MSG_HOST:5672/', + } +} +``` + +### Music + +* Set ``host``, ``port``, ``keyspace``, and ``replication_factor`` as needed for access to Music. +* Alternately, set ``hosts`` (plural form) to a python list of hosts if more than one host is used (e.g., ``'[host1, host2, host3]'``). + +For example, if Music is hosted on ``127.0.0.1`` port ``8080`` with a keyspace of ``valet`` and replication factor of ``3``: + +```python +music = { + 'host': '127.0.0.1', + 'port': '8080', + 'keyspace': 'valet', + 'replication_factor': 3, +} +``` + +*Notes: If ``host`` and ``hosts`` are both set, ``host`` is used and ``hosts`` is ignored. Music does not use AuthN or AuthZ at this time.* + +## Data Storage Initialization + +Use the ``pecan populate`` command to initialize data storage: + +```bash +$ pecan populate $VALET_CONFIG_PATH/config.py +``` + +Any previously created tables will be left as-is and not deleted/re-created. + +*Note: Music does not support migrations. If necessary, schema changes in future versions will be noted here with specific upgrade instructions.* + +## Running for the first time + +Use the ``pecan serve`` command to run valet-api and verify installation. + +```bash +$ pecan serve $VALET_CONFIG_PATH/config.py +``` + +Browse to ``http://$VALET_HOST:8090/`` (no AuthN/AuthZ required). Check for a response, for example: + +```json +{ + "versions": [ + { + "status": "CURRENT", + "id": "v1.0", + "links": [ + { + "href": "http://127.0.0.1:8090/v1/", + "rel": "self" + } + ] + } + ] +} +``` + +valet-api comes with a [Postman](http://www.getpostman.com/) collection of sample API calls, located in ``$VALET_API_PATH/valet_api/tests``. [Learn more](https://github.com/att-comdev/valet/blob/master/valet/tests/api/README.md). + +See the ``doc`` directory for placement service. + +*IMPORTANT: Do not use ``pecan serve`` to run valet-api in a production environment. A number of production-quality WSGI-compatible environments are available (e.g., apache2 httpd).* + +## Configuring apache2 httpd + +This section describes an example WSGI installation using apache2 httpd. + +### Prerequisites + +* apache2 httpd +* libapache2-mod-wsgi (3.4 at a minimum, 3.5 recommended by the author) +* A ``valet`` service user account/group on the host where valet-api is installed. + +### Configuration + +Set up directories and ownership: + +```bash +$ sudo mkdir $VALET_CONFIG_PATH +$ sudo mkdir /var/log/apache2/valet +$ sudo cp -p $VALET_API_PATH/etc/valet_api/app.wsgi $VALET_API_PATH/etc/valet_api/config.py $VALET_CONFIG_PATH +$ sudo chown -R valet:valet /var/log/apache2/valet $VALET_CONFIG_PATH +``` + +Set up valet-api as a site: + +```bash +$ sudo cd $APACHE2_CONFIG_PATH/sites-available +$ sudo cp -p $VALET_API_PATH/etc/valet_api/app.apache2 valet.conf +$ sudo chown root:root valet.conf +``` + +*Note: ``$APACHE2_CONFIG_PATH`` may be ``/opt/apache2`` or ``/etc/apache2`` depending on the installation.* + +If valet-api was installed in a python virtual environment, append ``python-home=$VENV`` to ``WSGIDaemonProcess`` within ``valet.conf``. Apache will then use the correct python environment and libraries. + +Enable valet-api, ensure the configuration syntax is valid, and restart: + +```bash +$ cd $APACHE2_CONFIG_PATH/sites-enabled +$ sudo ln -s ../sites-available/valet.conf . +$ sudo apachectl -t +Syntax OK +$ sudo apachectl graceful +``` + +## Uninstallation + +Activate a virtual environment (venv) first if necessary, then uninstall with: + +```bash +$ sudo pip uninstall valet-api +``` + +Remove previously made configuration file changes, OpenStack user accounts, and other settings as needed. + +## Contact + +Joe D'Andrea diff --git a/doc/valet_os.md b/doc/valet_os.md new file mode 100644 index 0000000..c9ee1e5 --- /dev/null +++ b/doc/valet_os.md @@ -0,0 +1,179 @@ +# valet-openstack + +Valet gives OpenStack the ability to optimize cloud resources while simultaneously meeting a cloud application's QoS requirements. Valet provides an api service, an optimizer (Ostro), and a set of OpenStack plugins. + +This document covers installation of valet-openstack, a set of OpenStack plugins used to interact with Valet. + +**IMPORTANT**: Overall Installation of Valet is covered in a separate document. These instructions are a component of the overall instructions. + +## Prerequisites + +Prior to installation: + +* Ubuntu 14.04 LTS +* Python 2.7.6 with pip +* An OpenStack Kilo cloud +* Access to a [valet-api](https://github.com/att-comdev/valet/blob/master/doc/valet_api.md) endpoint + +Throughout this document, the following installation-specific items are required. Have values for these prepared and ready before continuing. Suggestions for values are provided in this document where applicable. + +| Name | Description | Example | +|------|-------------|-------| +| ``USER`` | User id | ``user1234`` | +| ``$VENV`` | Python virtual environment path (if any) | ``/etc/valet/venv`` | +| ``$VALET_OS_PATH`` | Local git repository's ``valet_os`` directory | ``/home/user1234/git/valet/valet_os`` | +| ``$VALET_HOST`` | valet-api hostname | ``localhost`` | +| ``$VALET_USERNAME`` | OpenStack placement service username | ``valet`` | +| ``$VALET_PASSWORD`` | OpenStack placement service password | | +| ``$VALET_TENANT_NAME`` | OpenStack placement service default tenant | ``service`` | +| ``$VALET_FAILURE_MODE`` | Desired failure mode for Nova ValetFilter | ``reject`` | +| ``$KEYSTONE_AUTH_API`` | Keystone Auth API publicurl endpoint | ``http://controller:5000/`` | +| ``$KEYSTONE_REGION`` | Keystone Region | ``RegionOne`` | + +Root or sufficient sudo privileges are required for some steps. + +### A Note About Python Virtual Environments + +As valet-openstack works in concert with OpenStack services, if heat and nova have been installed in a python [virtual environment](http://docs.python-guide.org/en/latest/dev/virtualenvs/) (venv), valet-openstack must be installed and configured in the same environment. (A venv helps avoid instabilities and conflicts within the default python environment.) + +## Installation + +Install valet-openstack on the OpenStack controller node containing heat-engine and nova-scheduler. If these services are distributed across multiple nodes, install and configure valet-openstack as appropriate on each node. + +valet-openstack is located in ``valet_os``. + +```bash +$ cd $VALET_OS_PATH +$ sudo pip install . +``` + +## OpenStack Configuration + +valet-openstack requires edits to the heat and nova configuration files, and a stop/start of the heat-engine and nova-scheduler services. + +### Prerequisites + +The following keystone commands must be performed by an OpenStack cloud administrator. + +Add a user (``$VALET_USERNAME``), giving it an ``admin`` role in one tenant (``$VALET_TENANT_NAME``, usually ``service``): + +```bash +$ keystone user-create --name $VALET_USERNAME --pass $VALET_PASSWORD +$ keystone user-role-add --user $VALET_USERNAME --tenant $VALET_TENANT_NAME --role admin +``` + +Create the service entity and API endpoints. While this is not used by Valet 1.0, it is being reserved for future use. + +```bash +$ keystone service-create --type placement --name valet --description "OpenStack Placement" +$ keystone endpoint-create --region $KEYSTONE_REGION --service valet --publicurl 'http://$VALET_HOST:8090/v1' --adminurl 'http://$VALET_HOST:8090/v1' --internalurl 'http://$VALET_HOST:8090/v1' +``` + +*Note: In OpenStack parlance, Valet is canonically referred to as a **placement service**.* + +The administrator may choose to use differing hostnames/IPs for public vs. admin vs. internal URLs, depending on local architecture and requirements. + +### Heat + +The following changes are made in ``/etc/heat/heat.conf``. + +Set ``plugin_dirs`` in the ``[DEFAULT]`` section such that Heat can locate and use the Valet Stack Lifecycle Plugin. + +```ini +[DEFAULT] +plugin_dirs = /usr/local/etc/valet_os/heat +``` + +*Note: If a virtual environment is in use, change the path to be relative to the virtual environment's location, e.g. ``$VENV/etc/valet_os/heat``.* + +If ``plugin_dirs`` is already present, separate entries by commas. The order of entries does not matter. See the OpenStack [heat.conf](http://docs.openstack.org/kilo/config-reference/content/ch_configuring-openstack-orchestration.html) documentation for more information. + +Enable stack lifecycle scheduler hints in the ``[DEFAULT]`` section: + +```ini +[DEFAULT] +stack_scheduler_hints = True +``` + +Add a ``[valet]`` section. This will be used by the Valet Stack Lifecycle Plugin: + +```ini +[valet] +url = http://$VALET_HOST:8090/v1 +``` + +Restart heat-engine using separate stop and start directives: + +```bash +$ sudo service heat-engine stop +$ sudo service heat-engine start +``` + +Examine the heat-engine log (usually in ``/var/log/heat/heat-engine.log``). The ``ATT::Valet`` plugin should be found and registered: + +```log +INFO heat.engine.environment [-] Registered: [Plugin](User:False) ATT::Valet::GroupAssignment -> +``` + +The heat command line interface (python-heatclient) can also be used to verify plugin registration: + +```bash +$ heat resource-type-list | grep ATT +| ATT::Valet::GroupAssignment | +``` + +### Nova + +The following changes are made in ``/etc/nova/nova.conf``. + +The ``nova-scheduler`` service requires manual configuration so that Nova can locate and use Valet's Scheduler Filter. + +Edit the ``[DEFAULT]`` section so that ``scheduler_available_filters`` and ``scheduler_default_filters`` reference Valet, for example: + +```ini +[DEFAULT] +scheduler_available_filters = nova.scheduler.filters.all_filters +scheduler_available_filters = valet_os.nova.valet_filter.ValetFilter +scheduler_default_filters = RetryFilter, AvailabilityZoneFilter, RamFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter, ValetFilter +``` + +When referring to additional filter plugins, multiple ``scheduler_available_filters`` lines are required. The first line explicitly makes all of nova's default filters available. The second line makes Valet's filter available. Additional lines may be required for additional plugins. + +When setting ``scheduler_default_filters``, ensure that ``ValetFilter`` is placed last so that Valet has the final say in scheduling decisions. + +*Note: ``scheduler_available_filters`` denotes filters that are available for use. ``scheduler_default_filters`` denotes filters that are enabled by default.* + +Add a ``[valet]`` section. This will be used by the Valet Scheduler Filter: + +```ini +[valet] +url = http://$VALET_HOST:8090/v1 +failure_mode = $VALET_FAILURE_MODE +admin_tenant_name = $VALET_TENANT_NAME +admin_username = $VALET_USERNAME +admin_password = $VALET_PASSWORD +admin_auth_url = $KEYSTONE_AUTH_API +``` + +``$VALET_FAILURE_MODE`` refers to the action ``ValetFilter`` takes in the effect of a scheduling failure. It can be set to ``yield`` (defer to the other filter choices) or ``reject`` (block all other filter choices). The default action is ``reject`` so as to protect the integrity of Valet exclusivity groups. If exclusivity groups will never be used, or maintaining exclusivity group integrity is not required/practical, it may be desirable to set this to ``yield``. + +Restart nova-scheduler using separate stop and start directives: + +```bash +$ sudo service nova-scheduler stop +$ sudo service nova-scheduler start +``` + +## Uninstallation + +Activate a virtual environment (venv) first if necessary, then uninstall with: + +```bash +$ sudo pip uninstall valet-openstack +``` + +Remove previously made configuration file changes, OpenStack user accounts, and other settings as needed. + +## Contact + +Joe D'Andrea diff --git a/etc/valet/api/config.py b/etc/valet/api/config.py index faab4e5..4850962 100644 --- a/etc/valet/api/config.py +++ b/etc/valet/api/config.py @@ -1,3 +1,14 @@ +# 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 oslo_config import cfg from pecan.hooks import TransactionHook from valet.api.db import models diff --git a/etc/valet/openstack/notification_listener/notification_listener.py b/etc/valet/openstack/notification_listener/notification_listener.py index a6f5402..5532e8f 100644 --- a/etc/valet/openstack/notification_listener/notification_listener.py +++ b/etc/valet/openstack/notification_listener/notification_listener.py @@ -1,3 +1,14 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. import json from oslo_config import cfg import oslo_messaging diff --git a/valet/api/common/__init__.py b/valet/api/common/__init__.py index 11cb891..16a1385 100644 --- a/valet/api/common/__init__.py +++ b/valet/api/common/__init__.py @@ -1,3 +1,14 @@ +# 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 ctypes diff --git a/valet/api/conf.py b/valet/api/conf.py index fc20fbb..176ca99 100644 --- a/valet/api/conf.py +++ b/valet/api/conf.py @@ -1,3 +1,14 @@ +# 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 oslo_config import cfg diff --git a/valet/cli/groupcli.py b/valet/cli/groupcli.py index 92f5c52..c58352e 100644 --- a/valet/cli/groupcli.py +++ b/valet/cli/groupcli.py @@ -1,4 +1,14 @@ -#!/usr/bin/python +# 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 argparse import json from oslo_config import cfg diff --git a/valet/cli/valetcli.py b/valet/cli/valetcli.py index 76d7667..3c26f4c 100755 --- a/valet/cli/valetcli.py +++ b/valet/cli/valetcli.py @@ -1,4 +1,14 @@ -#!/usr/bin/python +# 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 argparse import sys import valet.cli.groupcli as groupcli diff --git a/valet/engine/conf.py b/valet/engine/conf.py index 532b704..5692fa1 100644 --- a/valet/engine/conf.py +++ b/valet/engine/conf.py @@ -1,3 +1,14 @@ +# 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 oslo_config import cfg from valet.api import conf as api diff --git a/valet/engine/listener/listener_manager.py b/valet/engine/listener/listener_manager.py index a16ce18..d12d401 100644 --- a/valet/engine/listener/listener_manager.py +++ b/valet/engine/listener/listener_manager.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Nov 29, 2016 diff --git a/valet/engine/optimizer/app_manager/app_handler.py b/valet/engine/optimizer/app_manager/app_handler.py index 47e53b2..ba545af 100755 --- a/valet/engine/optimizer/app_manager/app_handler.py +++ b/valet/engine/optimizer/app_manager/app_handler.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 27, 2016 diff --git a/valet/engine/optimizer/app_manager/app_topology.py b/valet/engine/optimizer/app_manager/app_topology.py index 249d9c5..eb6eafd 100755 --- a/valet/engine/optimizer/app_manager/app_topology.py +++ b/valet/engine/optimizer/app_manager/app_topology.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 22, 2016 diff --git a/valet/engine/optimizer/app_manager/app_topology_base.py b/valet/engine/optimizer/app_manager/app_topology_base.py index 00e5c41..e75e877 100755 --- a/valet/engine/optimizer/app_manager/app_topology_base.py +++ b/valet/engine/optimizer/app_manager/app_topology_base.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 22, 2016 diff --git a/valet/engine/optimizer/app_manager/app_topology_parser.py b/valet/engine/optimizer/app_manager/app_topology_parser.py index a7a2550..d9e577a 100755 --- a/valet/engine/optimizer/app_manager/app_topology_parser.py +++ b/valet/engine/optimizer/app_manager/app_topology_parser.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 27, 2016 diff --git a/valet/engine/optimizer/app_manager/application.py b/valet/engine/optimizer/app_manager/application.py index 2f0e80a..dc81b72 100755 --- a/valet/engine/optimizer/app_manager/application.py +++ b/valet/engine/optimizer/app_manager/application.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Feb. 9, 2016 diff --git a/valet/engine/optimizer/db_connect/configuration.py b/valet/engine/optimizer/db_connect/configuration.py index 6dedc25..3876040 100644 --- a/valet/engine/optimizer/db_connect/configuration.py +++ b/valet/engine/optimizer/db_connect/configuration.py @@ -1,4 +1,14 @@ -#!/bin/python +# 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/valet/engine/optimizer/db_connect/event.py b/valet/engine/optimizer/db_connect/event.py index 709c47c..a7c26e0 100644 --- a/valet/engine/optimizer/db_connect/event.py +++ b/valet/engine/optimizer/db_connect/event.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Feb. 9, 2016 diff --git a/valet/engine/optimizer/db_connect/music_handler.py b/valet/engine/optimizer/db_connect/music_handler.py index 1b632ec..bd9a831 100644 --- a/valet/engine/optimizer/db_connect/music_handler.py +++ b/valet/engine/optimizer/db_connect/music_handler.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 27, 2016 diff --git a/valet/engine/optimizer/ostro/constraint_solver.py b/valet/engine/optimizer/ostro/constraint_solver.py index bbf99a6..b4d5b94 100755 --- a/valet/engine/optimizer/ostro/constraint_solver.py +++ b/valet/engine/optimizer/ostro/constraint_solver.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 27, 2016 diff --git a/valet/engine/optimizer/ostro/openstack_filters.py b/valet/engine/optimizer/ostro/openstack_filters.py index 46e73ff..e7ef680 100755 --- a/valet/engine/optimizer/ostro/openstack_filters.py +++ b/valet/engine/optimizer/ostro/openstack_filters.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Mar. 15, 2016 diff --git a/valet/engine/optimizer/ostro/openstack_utils.py b/valet/engine/optimizer/ostro/openstack_utils.py index 1993b21..8ab1986 100755 --- a/valet/engine/optimizer/ostro/openstack_utils.py +++ b/valet/engine/optimizer/ostro/openstack_utils.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Mar. 15, 2016 diff --git a/valet/engine/optimizer/ostro/optimizer.py b/valet/engine/optimizer/ostro/optimizer.py index e816974..760c212 100755 --- a/valet/engine/optimizer/ostro/optimizer.py +++ b/valet/engine/optimizer/ostro/optimizer.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 27, 2016 diff --git a/valet/engine/optimizer/ostro/ostro.py b/valet/engine/optimizer/ostro/ostro.py index 631a1da..46b9a36 100755 --- a/valet/engine/optimizer/ostro/ostro.py +++ b/valet/engine/optimizer/ostro/ostro.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Oct. 1, 2016 diff --git a/valet/engine/optimizer/ostro/search.py b/valet/engine/optimizer/ostro/search.py index 997aa81..9264464 100755 --- a/valet/engine/optimizer/ostro/search.py +++ b/valet/engine/optimizer/ostro/search.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 27, 2016 diff --git a/valet/engine/optimizer/ostro/search_base.py b/valet/engine/optimizer/ostro/search_base.py index c2efefd..9089a0b 100755 --- a/valet/engine/optimizer/ostro/search_base.py +++ b/valet/engine/optimizer/ostro/search_base.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 22, 2016 diff --git a/valet/engine/optimizer/ostro_server/configuration.py b/valet/engine/optimizer/ostro_server/configuration.py index 7cfe8ef..a68dc0a 100755 --- a/valet/engine/optimizer/ostro_server/configuration.py +++ b/valet/engine/optimizer/ostro_server/configuration.py @@ -1,4 +1,14 @@ -#!/bin/python +# 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. ################################################################################################################# # Author: Gueyoung Jung # Contact: gjung@research.att.com diff --git a/valet/engine/optimizer/ostro_server/daemon.py b/valet/engine/optimizer/ostro_server/daemon.py index 9a98c49..7a61a38 100644 --- a/valet/engine/optimizer/ostro_server/daemon.py +++ b/valet/engine/optimizer/ostro_server/daemon.py @@ -1,4 +1,14 @@ -#!/usr/bin/env python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Mar. 1, 2016 diff --git a/valet/engine/optimizer/ostro_server/db_cleaner.py b/valet/engine/optimizer/ostro_server/db_cleaner.py index 4efe157..865508f 100644 --- a/valet/engine/optimizer/ostro_server/db_cleaner.py +++ b/valet/engine/optimizer/ostro_server/db_cleaner.py @@ -1,4 +1,14 @@ -#!/bin/python +# 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/valet/engine/optimizer/ostro_server/ostro_daemon.py b/valet/engine/optimizer/ostro_server/ostro_daemon.py index 037a2e9..08b8f64 100755 --- a/valet/engine/optimizer/ostro_server/ostro_daemon.py +++ b/valet/engine/optimizer/ostro_server/ostro_daemon.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 22, 2016 diff --git a/valet/engine/optimizer/util/util.py b/valet/engine/optimizer/util/util.py index f69e6bf..74b2e39 100755 --- a/valet/engine/optimizer/util/util.py +++ b/valet/engine/optimizer/util/util.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Feb. 9, 2016 diff --git a/valet/engine/resource_manager/compute.py b/valet/engine/resource_manager/compute.py index 3832554..f259e22 100755 --- a/valet/engine/resource_manager/compute.py +++ b/valet/engine/resource_manager/compute.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 27, 2016 diff --git a/valet/engine/resource_manager/compute_manager.py b/valet/engine/resource_manager/compute_manager.py index d34801d..e53a4e2 100755 --- a/valet/engine/resource_manager/compute_manager.py +++ b/valet/engine/resource_manager/compute_manager.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 22, 2016 diff --git a/valet/engine/resource_manager/compute_simulator.py b/valet/engine/resource_manager/compute_simulator.py index 032428f..4659370 100644 --- a/valet/engine/resource_manager/compute_simulator.py +++ b/valet/engine/resource_manager/compute_simulator.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 4, 2016 diff --git a/valet/engine/resource_manager/resource.py b/valet/engine/resource_manager/resource.py index 98e32c3..df9d080 100755 --- a/valet/engine/resource_manager/resource.py +++ b/valet/engine/resource_manager/resource.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 27, 2016 diff --git a/valet/engine/resource_manager/resource_base.py b/valet/engine/resource_manager/resource_base.py index a013702..fe6a050 100755 --- a/valet/engine/resource_manager/resource_base.py +++ b/valet/engine/resource_manager/resource_base.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 27, 2016 diff --git a/valet/engine/resource_manager/simulation/compute_simulator.py b/valet/engine/resource_manager/simulation/compute_simulator.py index bcdf6d6..896a4ee 100644 --- a/valet/engine/resource_manager/simulation/compute_simulator.py +++ b/valet/engine/resource_manager/simulation/compute_simulator.py @@ -1,4 +1,14 @@ -#!/bin/python +# 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/valet/engine/resource_manager/simulation/topology_simulator.py b/valet/engine/resource_manager/simulation/topology_simulator.py index 5a47151..96ae223 100644 --- a/valet/engine/resource_manager/simulation/topology_simulator.py +++ b/valet/engine/resource_manager/simulation/topology_simulator.py @@ -1,4 +1,14 @@ -#!/bin/python +# 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/valet/engine/resource_manager/topology.py b/valet/engine/resource_manager/topology.py index 23ca5f1..0fb00e9 100755 --- a/valet/engine/resource_manager/topology.py +++ b/valet/engine/resource_manager/topology.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Aug. 12, 2016 diff --git a/valet/engine/resource_manager/topology_manager.py b/valet/engine/resource_manager/topology_manager.py index 13a3d43..fa004ab 100755 --- a/valet/engine/resource_manager/topology_manager.py +++ b/valet/engine/resource_manager/topology_manager.py @@ -1,4 +1,14 @@ -#!/bin/python +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. # Modified: Sep. 22, 2016 diff --git a/valet/engine/resource_manager/topology_simulator.py b/valet/engine/resource_manager/topology_simulator.py index 5a47151..96ae223 100644 --- a/valet/engine/resource_manager/topology_simulator.py +++ b/valet/engine/resource_manager/topology_simulator.py @@ -1,4 +1,14 @@ -#!/bin/python +# 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/valet/tests/api/controllers/__init__.py b/valet/tests/api/controllers/__init__.py index 8ad56b9..43a3e5d 100644 --- a/valet/tests/api/controllers/__init__.py +++ b/valet/tests/api/controllers/__init__.py @@ -1,3 +1,14 @@ +# 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 uuid import UUID diff --git a/valet/tests/base.py b/valet/tests/base.py index 393df20..27f5b6e 100644 --- a/valet/tests/base.py +++ b/valet/tests/base.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 5, 2016 diff --git a/valet/tests/functional/valet_validator/common/__init__.py b/valet/tests/functional/valet_validator/common/__init__.py index 9717586..80f46f4 100644 --- a/valet/tests/functional/valet_validator/common/__init__.py +++ b/valet/tests/functional/valet_validator/common/__init__.py @@ -1,3 +1,14 @@ +# 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 oslo_log import log as logging import time from valet.tests.functional.valet_validator.common.init import CONF, COLORS diff --git a/valet/tests/functional/valet_validator/common/auth.py b/valet/tests/functional/valet_validator/common/auth.py index 9211625..aaec5c0 100644 --- a/valet/tests/functional/valet_validator/common/auth.py +++ b/valet/tests/functional/valet_validator/common/auth.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 4, 2016 diff --git a/valet/tests/functional/valet_validator/common/init.py b/valet/tests/functional/valet_validator/common/init.py index ee28f6e..75bbd0f 100644 --- a/valet/tests/functional/valet_validator/common/init.py +++ b/valet/tests/functional/valet_validator/common/init.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 5, 2016 diff --git a/valet/tests/functional/valet_validator/common/resources.py b/valet/tests/functional/valet_validator/common/resources.py index dd8f5bf..2fcc688 100644 --- a/valet/tests/functional/valet_validator/common/resources.py +++ b/valet/tests/functional/valet_validator/common/resources.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 23, 2016 diff --git a/valet/tests/functional/valet_validator/compute/analyzer.py b/valet/tests/functional/valet_validator/compute/analyzer.py index 06dd1f6..6d7534f 100644 --- a/valet/tests/functional/valet_validator/compute/analyzer.py +++ b/valet/tests/functional/valet_validator/compute/analyzer.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 4, 2016 diff --git a/valet/tests/functional/valet_validator/group_api/valet_group.py b/valet/tests/functional/valet_validator/group_api/valet_group.py index 06d3bb5..20e5581 100644 --- a/valet/tests/functional/valet_validator/group_api/valet_group.py +++ b/valet/tests/functional/valet_validator/group_api/valet_group.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Jul 3, 2016 diff --git a/valet/tests/functional/valet_validator/orchestration/loader.py b/valet/tests/functional/valet_validator/orchestration/loader.py index cbf6fc1..3c66b4c 100644 --- a/valet/tests/functional/valet_validator/orchestration/loader.py +++ b/valet/tests/functional/valet_validator/orchestration/loader.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 2, 2016 diff --git a/valet/tests/functional/valet_validator/tests/functional_base.py b/valet/tests/functional/valet_validator/tests/functional_base.py index 3dcc910..4645c04 100644 --- a/valet/tests/functional/valet_validator/tests/functional_base.py +++ b/valet/tests/functional/valet_validator/tests/functional_base.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 5, 2016 diff --git a/valet/tests/functional/valet_validator/tests/test_affinity.py b/valet/tests/functional/valet_validator/tests/test_affinity.py index 53c1851..1da15e1 100644 --- a/valet/tests/functional/valet_validator/tests/test_affinity.py +++ b/valet/tests/functional/valet_validator/tests/test_affinity.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 4, 2016 diff --git a/valet/tests/functional/valet_validator/tests/test_affinity_3_Instances.py b/valet/tests/functional/valet_validator/tests/test_affinity_3_Instances.py index 3a22d94..7e2423d 100644 --- a/valet/tests/functional/valet_validator/tests/test_affinity_3_Instances.py +++ b/valet/tests/functional/valet_validator/tests/test_affinity_3_Instances.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 4, 2016 diff --git a/valet/tests/functional/valet_validator/tests/test_diversity.py b/valet/tests/functional/valet_validator/tests/test_diversity.py index ea5f7aa..262964c 100644 --- a/valet/tests/functional/valet_validator/tests/test_diversity.py +++ b/valet/tests/functional/valet_validator/tests/test_diversity.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 4, 2016 diff --git a/valet/tests/functional/valet_validator/tests/test_exclusivity.py b/valet/tests/functional/valet_validator/tests/test_exclusivity.py index 6868518..8b3ad2a 100644 --- a/valet/tests/functional/valet_validator/tests/test_exclusivity.py +++ b/valet/tests/functional/valet_validator/tests/test_exclusivity.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Jun 1, 2016 diff --git a/valet/tests/functional/valet_validator/tests/test_groups.py b/valet/tests/functional/valet_validator/tests/test_groups.py index 56aca46..2490bea 100644 --- a/valet/tests/functional/valet_validator/tests/test_groups.py +++ b/valet/tests/functional/valet_validator/tests/test_groups.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Jul 4, 2016 diff --git a/valet/tests/functional/valet_validator/tests/test_nested.py b/valet/tests/functional/valet_validator/tests/test_nested.py index 647961d..6a05068 100644 --- a/valet/tests/functional/valet_validator/tests/test_nested.py +++ b/valet/tests/functional/valet_validator/tests/test_nested.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 18, 2016 diff --git a/valet/tests/tempest/scenario/analyzer.py b/valet/tests/tempest/scenario/analyzer.py index 8f88b06..a3379ff 100644 --- a/valet/tests/tempest/scenario/analyzer.py +++ b/valet/tests/tempest/scenario/analyzer.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Nov 8, 2016 diff --git a/valet/tests/tempest/scenario/general_logger.py b/valet/tests/tempest/scenario/general_logger.py index 270193b..63601d5 100644 --- a/valet/tests/tempest/scenario/general_logger.py +++ b/valet/tests/tempest/scenario/general_logger.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Nov 10, 2016 diff --git a/valet/tests/tempest/scenario/resources.py b/valet/tests/tempest/scenario/resources.py index dd8f5bf..2fcc688 100644 --- a/valet/tests/tempest/scenario/resources.py +++ b/valet/tests/tempest/scenario/resources.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 23, 2016 diff --git a/valet/tests/tempest/scenario/scenario_base.py b/valet/tests/tempest/scenario/scenario_base.py index 3fd004b..a0d7473 100644 --- a/valet/tests/tempest/scenario/scenario_base.py +++ b/valet/tests/tempest/scenario/scenario_base.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Nov 6, 2016 diff --git a/valet/tests/tempest/scenario/tests/test_affinity.py b/valet/tests/tempest/scenario/tests/test_affinity.py index 3b507b9..02d82cc 100644 --- a/valet/tests/tempest/scenario/tests/test_affinity.py +++ b/valet/tests/tempest/scenario/tests/test_affinity.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 4, 2016 diff --git a/valet/tests/tempest/scenario/tests/test_diversity.py b/valet/tests/tempest/scenario/tests/test_diversity.py index 655d317..b7ab82b 100644 --- a/valet/tests/tempest/scenario/tests/test_diversity.py +++ b/valet/tests/tempest/scenario/tests/test_diversity.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 4, 2016 diff --git a/valet/tests/tempest/scenario/tests/test_exclusivity.py b/valet/tests/tempest/scenario/tests/test_exclusivity.py index 67e4201..a9abe22 100644 --- a/valet/tests/tempest/scenario/tests/test_exclusivity.py +++ b/valet/tests/tempest/scenario/tests/test_exclusivity.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 4, 2016 diff --git a/valet/tests/tempest/scenario/tests/test_nested.py b/valet/tests/tempest/scenario/tests/test_nested.py index fb1b4a9..01e5f47 100644 --- a/valet/tests/tempest/scenario/tests/test_nested.py +++ b/valet/tests/tempest/scenario/tests/test_nested.py @@ -1,3 +1,14 @@ +# 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. ''' Created on May 4, 2016 diff --git a/valet/tests/tempest/scenario/valet_group.py b/valet/tests/tempest/scenario/valet_group.py index bc2e34b..8dd280c 100644 --- a/valet/tests/tempest/scenario/valet_group.py +++ b/valet/tests/tempest/scenario/valet_group.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Jul 3, 2016 diff --git a/valet/tests/unit/api/common/test_hooks.py b/valet/tests/unit/api/common/test_hooks.py index aa56bd7..f37f993 100644 --- a/valet/tests/unit/api/common/test_hooks.py +++ b/valet/tests/unit/api/common/test_hooks.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 29, 2016 diff --git a/valet/tests/unit/api/common/test_identity.py b/valet/tests/unit/api/common/test_identity.py index 3189d2b..bd7aaa9 100644 --- a/valet/tests/unit/api/common/test_identity.py +++ b/valet/tests/unit/api/common/test_identity.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 29, 2016 diff --git a/valet/tests/unit/api/common/test_messaging.py b/valet/tests/unit/api/common/test_messaging.py index 5f58d87..d62e8ae 100644 --- a/valet/tests/unit/api/common/test_messaging.py +++ b/valet/tests/unit/api/common/test_messaging.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 28, 2016 diff --git a/valet/tests/unit/api/common/test_ostro_helper.py b/valet/tests/unit/api/common/test_ostro_helper.py index 15bf8c7..9019989 100644 --- a/valet/tests/unit/api/common/test_ostro_helper.py +++ b/valet/tests/unit/api/common/test_ostro_helper.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 27, 2016 diff --git a/valet/tests/unit/api/db/test_groups.py b/valet/tests/unit/api/db/test_groups.py index 17e1cbb..dc408bd 100644 --- a/valet/tests/unit/api/db/test_groups.py +++ b/valet/tests/unit/api/db/test_groups.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 26, 2016 diff --git a/valet/tests/unit/api/db/test_ostro.py b/valet/tests/unit/api/db/test_ostro.py index a8498f7..cbf6e93 100644 --- a/valet/tests/unit/api/db/test_ostro.py +++ b/valet/tests/unit/api/db/test_ostro.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 26, 2016 diff --git a/valet/tests/unit/api/db/test_placements.py b/valet/tests/unit/api/db/test_placements.py index c259ea9..a2ed40a 100644 --- a/valet/tests/unit/api/db/test_placements.py +++ b/valet/tests/unit/api/db/test_placements.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 26, 2016 diff --git a/valet/tests/unit/api/db/test_plans.py b/valet/tests/unit/api/db/test_plans.py index 9949339..a8e3f1c 100644 --- a/valet/tests/unit/api/db/test_plans.py +++ b/valet/tests/unit/api/db/test_plans.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 26, 2016 diff --git a/valet/tests/unit/api/v1/api_base.py b/valet/tests/unit/api/v1/api_base.py index 50b155a..f53731a 100644 --- a/valet/tests/unit/api/v1/api_base.py +++ b/valet/tests/unit/api/v1/api_base.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 25, 2016 diff --git a/valet/tests/unit/api/v1/test_groups.py b/valet/tests/unit/api/v1/test_groups.py index a9175ad..596b3e0 100644 --- a/valet/tests/unit/api/v1/test_groups.py +++ b/valet/tests/unit/api/v1/test_groups.py @@ -1,3 +1,14 @@ +# 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 mock import pecan diff --git a/valet/tests/unit/api/v1/test_placements.py b/valet/tests/unit/api/v1/test_placements.py index 7ef1e3f..15e800b 100644 --- a/valet/tests/unit/api/v1/test_placements.py +++ b/valet/tests/unit/api/v1/test_placements.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 19, 2016 diff --git a/valet/tests/unit/api/v1/test_plans.py b/valet/tests/unit/api/v1/test_plans.py index fb58433..9bd88c6 100644 --- a/valet/tests/unit/api/v1/test_plans.py +++ b/valet/tests/unit/api/v1/test_plans.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 25, 2016 diff --git a/valet/tests/unit/api/v1/test_root.py b/valet/tests/unit/api/v1/test_root.py index 145560f..106cc92 100644 --- a/valet/tests/unit/api/v1/test_root.py +++ b/valet/tests/unit/api/v1/test_root.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 26, 2016 diff --git a/valet/tests/unit/api/v1/test_status.py b/valet/tests/unit/api/v1/test_status.py index af64def..71863f9 100644 --- a/valet/tests/unit/api/v1/test_status.py +++ b/valet/tests/unit/api/v1/test_status.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 26, 2016 diff --git a/valet/tests/unit/api/v1/test_v1.py b/valet/tests/unit/api/v1/test_v1.py index 2b08737..d67de61 100644 --- a/valet/tests/unit/api/v1/test_v1.py +++ b/valet/tests/unit/api/v1/test_v1.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 22, 2016 diff --git a/valet/tests/unit/cli/test_groupcli.py b/valet/tests/unit/cli/test_groupcli.py index d7fd6da..1f5fb95 100644 --- a/valet/tests/unit/cli/test_groupcli.py +++ b/valet/tests/unit/cli/test_groupcli.py @@ -1,3 +1,14 @@ +# 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 mock # from valet.cli.groupcli import cmd_details import valet.cli.groupcli as grpcli diff --git a/valet/tests/unit/cli/test_valetcli.py b/valet/tests/unit/cli/test_valetcli.py index 6107ae6..09b9cce 100644 --- a/valet/tests/unit/cli/test_valetcli.py +++ b/valet/tests/unit/cli/test_valetcli.py @@ -1,3 +1,14 @@ +# 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 mock from valet.cli.valetcli import Cli from valet.tests.base import Base diff --git a/valet/tests/unit/engine/test_config.py b/valet/tests/unit/engine/test_config.py index 828867e..423e23d 100644 --- a/valet/tests/unit/engine/test_config.py +++ b/valet/tests/unit/engine/test_config.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Aug 17, 2016 diff --git a/valet/tests/unit/engine/test_search.py b/valet/tests/unit/engine/test_search.py index 5ad72ac..f3b3983 100644 --- a/valet/tests/unit/engine/test_search.py +++ b/valet/tests/unit/engine/test_search.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Sep 26, 2016 diff --git a/valet/tests/unit/engine/test_topology.py b/valet/tests/unit/engine/test_topology.py index 19c3dd5..5cc3bc8 100644 --- a/valet/tests/unit/engine/test_topology.py +++ b/valet/tests/unit/engine/test_topology.py @@ -1,3 +1,14 @@ +# 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. ''' Created on Aug 17, 2016 diff --git a/valet/tests/unit/test_general.py b/valet/tests/unit/test_general.py index 9ea5e77..5078c78 100644 --- a/valet/tests/unit/test_general.py +++ b/valet/tests/unit/test_general.py @@ -1,3 +1,14 @@ +# 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 valet.tests.base import Base diff --git a/valet_plugins/.gitignore b/valet_plugins/.gitignore deleted file mode 100644 index 560590d..0000000 --- a/valet_plugins/.gitignore +++ /dev/null @@ -1,106 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] - -#ignore thumbnails created by windows -Thumbs.db -#Ignore files build by Visual Studio -*.obj -*.exe -*.pdb -*.user -*.aps -*.pch -*.vspscc -*_i.c -*_p.c -*.ncb -*.suo -*.tlb -*.tlh -*.bak -*.cache -*.ilk -*.log -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.eggs/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.cache -nosetests.xml -coverage.xml -.project -.pydevproject -.settings/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -#ignore thumbnails created by windows -Thumbs.db -#Ignore files build by Visual Studio -*.obj -*.exe -*.pdb -*.user -*.aps -*.pch -*.vspscc -*_i.c -*_p.c -*.ncb -*.suo -*.tlb -*.tlh -*.bak -*.cache -*.ilk -[Bb]in -[Dd]ebug*/ -*.lib -*.sbr -obj/ -[Rr]elease*/ -_ReSharper*/ -[Tt]est[Rr]esult* -.idea/* diff --git a/valet_plugins/README.md b/valet_plugins/README.md new file mode 100644 index 0000000..fb1520d --- /dev/null +++ b/valet_plugins/README.md @@ -0,0 +1,34 @@ +# Valet + +Valet gives OpenStack the ability to optimize cloud resources while simultaneously meeting a cloud application's QoS requirements. Valet provides an api service, a placement optimizer (Ostro), a high availability data storage and persistence layer (Music), and a set of OpenStack plugins. + +**IMPORTANT**: [Overall Installation of Valet is covered in a separate document](https://github.com/att-comdev/valet/blob/master/doc/valet_os.md). + +Learn more about Valet: + +* [OpenStack Newton Summit Presentation](https://www.openstack.org/videos/video/valet-holistic-data-center-optimization-for-openstack) (Austin, TX, 27 April 2016) +* [Presentation Slides](http://www.research.att.com/export/sites/att_labs/techdocs/TD_101806.pdf) (PDF) + +Valet consists of the following components: + +* [valet-openstack](https://github.com/att-comdev/valet/blob/master/doc/valet_os.md): a set of OpenStack plugins used to interact with Valet +* [valet-api](https://github.com/att-comdev/valet/blob/master/doc/valet_api.md): an API engine used to interact with Valet +* [Ostro](https://github.com/att-comdev/valet/blob/master/doc/ostro.md): a placement optimization engine +* Music: a data storage and persistence service +* [ostro-listener](https://github.com/att-comdev/valet/blob/master/doc/ostro_listener.md): a message bus listener used in conjunction with Ostro and Music +* [havalet](https://github.com/att-comdev/valet/blob/master/doc/ha.md): a service that assists in providing high availability for Valet + +Additional documents: + +* [OpenStack Heat Resource Plugins](https://github.com/att-comdev/valet/blob/master/valet_plugins/valet_plugins/heat/README.md): Heat resources +* [Placement API](https://github.com/att-comdev/valet/blob/master/doc/valet_api.md): API requests/responses +* [Using Postman with valet-api](https://github.com/att-comdev/valet/blob/master/valet/tests/api/README.md): Postman support + +## Thank You + +Alicia Abella, Saar Alaluf, Bharath Balasubramanian, Roy Ben Hai, Shimon Benattar, Yael Ben Shalom, Benny Bustan, Rachel Cohen, Joe D'Andrea, Harel Dorfman, Boaz Elitzur, P.K. Esrawan, Inbal Harduf, Matti Hiltunen, Doron Honigsberg, Kaustubh Joshi, Gueyoung Jung, Gerald Karam, David Khanin, Israel Kliger, Erez Korn, Max Osipov, Chris Rice, Amnon Sagiv, Gideon Shafran, Galit Shemesh, Anna Yefimov; AT&T Advanced Technology and Architecture, AT&T Technology Development - AIC, Additional partners in AT&T Domain 2.0. Apologies if we missed anyone (please advise via email!). + +## Contact + +Joe D'Andrea +