Valet Documentation

Added REST API Documentation
Added Valet Plugins Documentation
Added Apache License info
This commit is contained in:
Tanvir Talukder 2016-12-12 09:36:35 -06:00 committed by Omar Rivera
parent ae593ca663
commit e30684b0c3
97 changed files with 2920 additions and 138 deletions

1
.gitignore vendored
View File

@ -65,6 +65,7 @@ ostro-daemon.pid
.pydevproject
.testrepository
.settings
.settings/
# Translations
*.mo

176
LICENSE Normal file
View File

@ -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.

33
README.md Normal file
View File

@ -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.

111
doc/ha.md Normal file
View File

@ -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 <jdandrea@research.att.com>

92
doc/ostro.md Normal file
View File

@ -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

257
doc/ostro_listener.md Normal file
View File

@ -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 <jdandrea@research.att.com>

42
doc/ostro_release.md Normal file
View File

@ -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.

782
doc/rest_api.md Normal file
View File

@ -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"
}
}
```

34
doc/valet.md Normal file
View File

@ -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 <jdandrea@research.att.com>

255
doc/valet_api.md Normal file
View File

@ -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 <jdandrea@research.att.com>

179
doc/valet_os.md Normal file
View File

@ -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 -> <class 'heat.engine.plugins.GroupAssignment.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 <jdandrea@research.att.com>

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.
#################################################################################################################

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.
#################################################################################################################

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.
#################################################################################################################

View File

@ -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.
#################################################################################################################

View File

@ -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

View File

@ -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

View File

@ -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.
#################################################################################################################

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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/*

34
valet_plugins/README.md Normal file
View File

@ -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 <jdandrea@research.att.com>