# HG changeset patch # User Danek Duvall # Date 1429558551 25200 # Node ID 4b1def16fe9b8856e3aa513b03e92451b7958444 # Parent 097063f324c05853d9f950d170eda0839c276b02 PSARC 2015/110 OpenStack service updates for Juno PSARC 2014/302 oslo.messaging - OpenStack RPC and notifications PSARC 2014/303 concurrent.futures - high-level Python interface for asynchronous execution PSARC 2014/304 networkx - Python module for complex networks PSARC 2014/305 taskflow - Python module for task execution PSARC 2014/329 pycadf - Python interface for CADF (cloud auditing) PSARC 2014/330 posix_ipc - POSIX IPC primitives for Python PSARC 2014/331 oauthlib - Python implementation of OAuth request-signing logic PSARC 2014/377 noVNC - A browser based VNC client PSARC 2015/058 oslo - OpenStack common libraries (context, db, i18n, middleware, serialization, utils, vmware) PSARC 2015/059 glance_store - Glance storage library PSARC 2015/060 ipaddr - an IPv4/IPv6 manipulation library in Python PSARC 2015/061 simplegeneric - single-dispatch generic Python functions PSARC 2015/062 wsme - Web Services Made Easy PSARC 2015/063 retrying - General purpose Python retrying library PSARC 2015/065 osprofiler - an OpenStack cross-project profiling library PSARC 2015/066 OpenStack client for Sahara (Hadoop as a Service) PSARC 2015/067 keystonemiddleware - Middleware for OpenStack Identity PSARC 2015/068 pyScss - Compiler for the SCSS flavor of the Sass language PSARC 2015/069 django-pyscss - pyScss support for Django PSARC 2015/073 barbicanclient - OpenStack client for Barbican (Key Management) PSARC 2015/074 pysendfile - Python interface to sendfile PSARC 2015/097 ldappool - a connection pool for python-ldap PSARC 2015/098 rfc3986 - URI reference validation module for Python PSARC 2015/102 iniparse - python .ini file parsing module 20667775 OpenStack service updates for Juno (Umbrella) 17511386 sqlalchemy-migrate should lose its bypass-gen tags once sqlalchemy is in the CBE 18293987 /usr/bin/alembic should be shipped 18293992 boto's demo scripts aren't delivered executable 18377642 py.test has a requirement on py 18615101 Horizon should prevent network, subnet, and port names with hyphens in them 18772068 instance failed to launch with NoValidHost but no reason 18887457 openstack shouldn't deliver .po files 18905324 hostname.xml should set config/ignore_dhcp_hostname = true 18961031 Duplicate names for role-create and user-create are allowed 19015363 Users should not be allowed to attempt to create volumes when quota exceed 19044301 boto's dependencies need work 19050335 user appears logged in but unauthorised after horizon reboot 19131218 solaris.css: 'Delete Interface' button in Router pop-up menu broken 19131507 solaris.css: 'Project Limits' section of Launch Instance pop-up menu broken 19144215 Instance manipulation buttons greyed out after all instances terminated 19249066 heat stack-preview doesn't appear to do anything 19313272 Need bottom slidebar in horizon for small browser windows 19439030 'nova migration-list' returns python error 19462265 The Python module oslo.messaging should be added to Userland 19462397 The Python module futures should be added to Userland 19476604 The Python module networkx should be added to Userland 19476953 The Python module taskflow should be added to Userland 19519227 The Python module pycadf should be added to Userland 19557488 The noVNC client should be added to Userland 19582394 The Python module posix_ipc should be added to Userland 19596691 instance failed to launch, cinder hit resource busy in stmfadm 19598430 The Python module oauthlib should be added to Userland 19649055 FC connection fails when the target_lun is assigned 0 19815780 nova package should have dependencies on brand-solaris and brand-solaris-kz 19883623 Image snapshots are missing 'instance_uuid' property 19887874 horizon should set up apache log rotation 19888859 six should enable its tests now. 19987962 Cinder lists additional volumes attached to instance with linuxy device names 20046570 rabbitmq & rad-evs-controller should be added to group package 20052466 remove _ai_health_check() from driver.py now that 18857274 is integrated 20164815 The Python module django-pyscss should be added to Userland 20173049 The Python module retrying should be added to Userland 20174489 The Python module WSME should be added to Userland 20176001 The Python module keystonemiddleware should be added to Userland 20182039 The Python module pysendfile should be added to Userland 20200162 The Python module pyScss should be added to Userland 20202461 Websockify is broken on SPARC because of unnecessary byte swapping 20202582 Solaris zones nova compute driver needs console access support 20222184 horizon doesn't send start request on shutdown instance 20312312 The Python module python-saharaclient should be added to Userland 20388250 problem in SERVICE/GLANCE 20433402 The fix for 20388250 is incomplete 20514287 wrong vnic label name used for dhcp vnic in evs 20596802 The Python module oslo.middleware should be added to Userland 20596803 The Python module barbicanclient should be added to Userland 20596804 The Python module oslo.context should be added to Userland 20596805 The Python module iniparse should be added to Userland 20596806 The Python module oslo.vmware should be added to Userland 20596807 The Python module osprofiler should be added to Userland 20596808 The Python module oslo.i18n should be added to Userland 20596809 The Python module oslo.utils should be added to Userland 20596811 The Python module ipaddr should be added to Userland 20596812 The Python module glance_store should be added to Userland 20596813 The Python module oslo.serialization should be added to Userland 20596814 The Python module oslo.db should be added to Userland 20596815 The Python module simplegeneric should be added to Userland 20602690 The Python module ldappool should be added to Userland 20602722 The Python module rfc3986 should be added to Userland 20638369 compilemessages.py requires GNU msgfmt without calling gmsgfmt 20715741 cinder 2014.2.2 20715742 glance 2014.2.2 20715743 heat 2014.2.2 20715744 horizon 2014.2.2 20715745 keystone 2014.2.2 20715746 neutron 2014.2.2 20715747 nova 2014.2.2 20715748 swift 2.2.2 20715749 alembic 0.7.4 20715750 amqp 1.4.6 20715751 boto 2.34.0 20715752 ceilometerclient 1.0.12 20715753 cinderclient 1.1.1 20715754 cliff 1.9.0 20715756 django 1.4.19 20739229 Update django to 1.4.20 20715757 django_compressor 1.4 20715758 django_openstack_auth 1.1.9 20715759 eventlet 0.15.2 20715761 glanceclient 0.15.0 20715762 greenlet 0.4.5 20715763 heatclient 0.2.12 20715764 keystoneclient 1.0.0 20715765 kombu 3.0.7 20715766 mysql 1.2.5 20715767 netaddr 0.7.13 20715769 netifaces 0.10.4 20715770 neutronclient 2.3.10 20715771 novaclient 2.20.0 20715772 oslo.config 1.6.0 20715773 py 1.4.26 20715774 pyflakes 0.8.1 20715775 pytest 2.6.4 20715776 pytz 2014.10 20715777 requests 2.6.0 20715778 simplejson 3.6.5 20715779 six 1.9.0 20715780 sqlalchemy-migrate 0.9.1 20715781 sqlalchemy 0.9.8 20715782 stevedore 1.2.0 20715783 swiftclient 2.3.1 20715784 tox 1.8.1 20715785 troveclient 1.0.8 20715786 virtualenv 12.0.7 20715787 websockify 0.6.0 20739215 problem in PYTHON-MOD/DJANGO 20739295 problem in PYTHON-MOD/DJANGO 20816861 zone-vnc-console instance goes in to maintenance 20829672 support flat network type in neutron diff -r 097063f324c0 -r 4b1def16fe9b components/dnsmasq/patches/03_client_mac.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/dnsmasq/patches/03_client_mac.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,43 @@ +Solaris doesn't have an easy way to retrieve the MAC address of the client +that is soliciting the DHCPv6 IP address. This fix uses a simple way to +retrieve the client MAC address from the client's EUI64 link-local address. + + +*** dnsmasq-2.68/src/dhcp6.c 2013-12-08 07:58:29.000000000 -0800 +--- NEW/src/dhcp6.c 2015-02-23 18:33:30.937299563 -0800 +*************** +*** 231,236 **** +--- 231,253 ---- + + void get_client_mac(struct in6_addr *client, int iface, unsigned char *mac, unsigned int *maclenp, unsigned int *mactypep) + { ++ #ifdef HAVE_SOLARIS_NETWORK ++ /* Solaris does not have an easy way to retrieve MAC address for a given IPv6 address from the kernel. ++ For now the following workaround should work for OpenStack's needs. */ ++ uint8_t *addr6; ++ ++ *maclenp = ETHER_ADDR_LEN; ++ *mactypep = ARPHRD_ETHER; ++ /* Take the EUI64 based client's link-local address and convert it to client's MAC address. ++ For example: from fe80::f816:3eff:fe5c:df43 link-local address we arrive at fa:16:3e:5c:df:43 */ ++ addr6 = client->s6_addr; ++ mac[0] = addr6[8] ^ 0x2; ++ mac[1] = addr6[9]; ++ mac[2] = addr6[10]; ++ mac[3] = addr6[13]; ++ mac[4] = addr6[14]; ++ mac[5]= addr6[15]; ++ #else + /* Recieving a packet from a host does not populate the neighbour + cache, so we send a neighbour discovery request if we can't + find the sender. Repeat a few times in case of packet loss. */ +*************** +*** 276,281 **** +--- 293,299 ---- + + *maclenp = mac_param.maclen; + *mactypep = ARPHRD_ETHER; ++ #endif /* HAVE_SOLARIS_NETWORK */ + } + + static int find_mac(int family, char *addrp, char *mac, size_t maclen, void *parmv) diff -r 097063f324c0 -r 4b1def16fe9b components/novnc/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/novnc/Makefile Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,54 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# +include ../../make-rules/shared-macros.mk + +COMPONENT_NAME= noVNC +COMPONENT_VERSION= 0.5 +COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION) +COMPONENT_ARCHIVE= v$(COMPONENT_VERSION).tar.gz +COMPONENT_ARCHIVE_HASH= \ + sha256:6d702a628c85384118d85d51225770a78dd62d805229f56e42b92798c87baa31 +COMPONENT_ARCHIVE_URL= https://github.com/kanaka/noVNC/archive/$(COMPONENT_ARCHIVE) +COMPONENT_PROJECT_URL= http://kanaka.github.io/noVNC +COMPONENT_BUGDB= utility/novnc + +TPNO= 18799 + +include $(WS_TOP)/make-rules/prep.mk +include $(WS_TOP)/make-rules/ips.mk + +ASLR_MODE = $(ASLR_NOT_APPLICABLE) + +# common targets +build: prep + +install: build + +test: $(NO_TESTS) + +clean:: + $(RM) -r $(BUILD_DIR) + +BUILD_PKG_DEPENDENCIES = $(BUILD_TOOLS) + +include $(WS_TOP)/make-rules/depend.mk diff -r 097063f324c0 -r 4b1def16fe9b components/novnc/novnc.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/novnc/novnc.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,928 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + +-------------------------------------------------------------------------------- + +Copyright (c) 2012, Joel Martin +Copyright (C) 2013, Samuel Mannehed for Cendio AB +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +Copyright (c) 2012, Joel Martin +Copyright (C) 2013, Samuel Mannehed for Cendio AB +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Ported from Flashlight VNC ActionScript implementation: + http://www.wizhelp.com/flashlight-vnc/ + +Full attribution follows: + +------------------------------------------------------------------------- + +This DES class has been extracted from package Acme.Crypto for use in VNC. +The unnecessary odd parity code has been removed. + +These changes are: + Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. + +This software is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + +DesCipher - the DES encryption method + +The meat of this code is by Dave Zimmerman , and is: + +Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved. + +Permission to use, copy, modify, and distribute this software +and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and +without fee is hereby granted, provided that this copyright notice is kept +intact. + +WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY +OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE +FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR +DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. + +THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE +CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE +PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT +NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE +SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE +SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE +PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). WIDGET WORKSHOP +SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR +HIGH RISK ACTIVITIES. + + +The rest is: + +Copyright (C) 1996 by Jef Poskanzer . All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +Visit the ACME Labs Java page for up-to-date versions of this and other +fine Java utilities: http://www.acme.com/java/ + +-------------------------------------------------------------------------------- + +Copyright 2009 Matt McInerney + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +-------------------------------------------------------------------------------- + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE +BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE +CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE +IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + +"Adaptation" means a work based upon the Work, or upon the Work and other +pre-existing works, such as a translation, adaptation, derivative work, +arrangement of music or other alterations of a literary or artistic work, or +phonogram or performance and includes cinematographic adaptations or any other +form in which the Work may be recast, transformed, or adapted including in any +form recognizably derived from the original, except that a work that +constitutes a Collection will not be considered an Adaptation for the purpose +of this License. For the avoidance of doubt, where the Work is a musical work, +performance or phonogram, the synchronization of the Work in timed-relation +with a moving image ("synching") will be considered an Adaptation for the +purpose of this License. +"Collection" means a collection of literary or artistic works, such as +encyclopedias and anthologies, or performances, phonograms or broadcasts, or +other works or subject matter other than works listed in Section 1(f) below, +which, by reason of the selection and arrangement of their contents, constitute +intellectual creations, in which the Work is included in its entirety in +unmodified form along with one or more other contributions, each constituting +separate and independent works in themselves, which together are assembled into +a collective whole. A work that constitutes a Collection will not be considered +an Adaptation (as defined below) for the purposes of this License. +"Creative Commons Compatible License" means a license that is listed at +http://creativecommons.org/compatiblelicenses that has been approved by +Creative Commons as being essentially equivalent to this License, including, at +a minimum, because that license: (i) contains terms that have the same purpose, +meaning and effect as the License Elements of this License; and, (ii) +explicitly permits the relicensing of adaptations of works made available under +that license under this License or a Creative Commons jurisdiction license with +the same License Elements as this License. +"Distribute" means to make available to the public the original and copies of +the Work or Adaptation, as appropriate, through sale or other transfer of +ownership. +"License Elements" means the following high-level license attributes as +selected by Licensor and indicated in the title of this License: Attribution, +ShareAlike. +"Licensor" means the individual, individuals, entity or entities that offer(s) +the Work under the terms of this License. +"Original Author" means, in the case of a literary or artistic work, the +individual, individuals, entity or entities who created the Work or if no +individual or entity can be identified, the publisher; and in addition (i) in +the case of a performance the actors, singers, musicians, dancers, and other +persons who act, sing, deliver, declaim, play in, interpret or otherwise +perform literary or artistic works or expressions of folklore; (ii) in the case +of a phonogram the producer being the person or legal entity who first fixes +the sounds of a performance or other sounds; and, (iii) in the case of +broadcasts, the organization that transmits the broadcast. +"Work" means the literary and/or artistic work offered under the terms of this +License including without limitation any production in the literary, scientific +and artistic domain, whatever may be the mode or form of its expression +including digital form, such as a book, pamphlet and other writing; a lecture, +address, sermon or other work of the same nature; a dramatic or +dramatico-musical work; a choreographic work or entertainment in dumb show; a +musical composition with or without words; a cinematographic work to which are +assimilated works expressed by a process analogous to cinematography; a work of +drawing, painting, architecture, sculpture, engraving or lithography; a +photographic work to which are assimilated works expressed by a process +analogous to photography; a work of applied art; an illustration, map, plan, +sketch or three-dimensional work relative to geography, topography, +architecture or science; a performance; a broadcast; a phonogram; a compilation +of data to the extent it is protected as a copyrightable work; or a work +performed by a variety or circus performer to the extent it is not otherwise +considered a literary or artistic work. +"You" means an individual or entity exercising rights under this License who +has not previously violated the terms of this License with respect to the Work, +or who has received express permission from the Licensor to exercise rights +under this License despite a previous violation. +"Publicly Perform" means to perform public recitations of the Work and to +communicate to the public those public recitations, by any means or process, +including by wire or wireless means or public digital performances; to make +available to the public Works in such a way that members of the public may +access these Works from a place and at a place individually chosen by them; to +perform the Work to the public by any means or process and the communication to +the public of the performances of the Work, including by public digital +performance; to broadcast and rebroadcast the Work by any means including +signs, sounds or images. +"Reproduce" means to make copies of the Work by any means including without +limitation by sound or visual recordings and the right of fixation and +reproducing fixations of the Work, including storage of a protected performance +or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. + +Nothing in this License is intended to reduce, limit, +or restrict any uses free from copyright or rights arising from limitations or +exceptions that are provided for in connection with the copyright protection +under copyright law or other applicable laws. + +3. License Grant. + +Subject to the terms and conditions of this License, Licensor +hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the +duration of the applicable copyright) license to exercise the rights in the +Work as stated below: + +to Reproduce the Work, to incorporate the Work into one or more Collections, +and to Reproduce the Work as incorporated in the Collections; +to create and Reproduce Adaptations provided that any such Adaptation, +including any translation in any medium, takes reasonable steps to clearly +label, demarcate or otherwise identify that changes were made to the original +Work. For example, a translation could be marked "The original work was +translated from English to Spanish," or a modification could indicate "The +original work has been modified."; +to Distribute and Publicly Perform the Work including as incorporated in +Collections; and, +to Distribute and Publicly Perform Adaptations. +For the avoidance of doubt: + +Non-waivable Compulsory License Schemes. In those jurisdictions in which the +right to collect royalties through any statutory or compulsory licensing scheme +cannot be waived, the Licensor reserves the exclusive right to collect such +royalties for any exercise by You of the rights granted under this License; +Waivable Compulsory License Schemes. In those jurisdictions in which the right +to collect royalties through any statutory or compulsory licensing scheme can +be waived, the Licensor waives the exclusive right to collect such royalties +for any exercise by You of the rights granted under this License; and, +Voluntary License Schemes. The Licensor waives the right to collect royalties, +whether individually or, in the event that the Licensor is a member of a +collecting society that administers voluntary licensing schemes, via that +society, from any exercise by You of the rights granted under this License. +The above rights may be exercised in all media and formats whether now known or +hereafter devised. The above rights include the right to make such +modifications as are technically necessary to exercise the rights in other +media and formats. Subject to Section 8(f), all rights not expressly granted by +Licensor are hereby reserved. + +4. Restrictions. + +The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + +You may Distribute or Publicly Perform the Work only under the terms of this +License. You must include a copy of, or the Uniform Resource Identifier (URI) +for, this License with every copy of the Work You Distribute or Publicly +Perform. You may not offer or impose any terms on the Work that restrict the +terms of this License or the ability of the recipient of the Work to exercise +the rights granted to that recipient under the terms of the License. You may +not sublicense the Work. You must keep intact all notices that refer to this +License and to the disclaimer of warranties with every copy of the Work You +Distribute or Publicly Perform. When You Distribute or Publicly Perform the +Work, You may not impose any effective technological measures on the Work that +restrict the ability of a recipient of the Work from You to exercise the rights +granted to that recipient under the terms of the License. This Section 4(a) +applies to the Work as incorporated in a Collection, but this does not require +the Collection apart from the Work itself to be made subject to the terms of +this License. If You create a Collection, upon notice from any Licensor You +must, to the extent practicable, remove from the Collection any credit as +required by Section 4(c), as requested. If You create an Adaptation, upon +notice from any Licensor You must, to the extent practicable, remove from the +Adaptation any credit as required by Section 4(c), as requested. +You may Distribute or Publicly Perform an Adaptation only under the terms of: +(i) this License; (ii) a later version of this License with the same License +Elements as this License; (iii) a Creative Commons jurisdiction license (either +this or a later license version) that contains the same License Elements as +this License (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons +Compatible License. If you license the Adaptation under one of the licenses +mentioned in (iv), you must comply with the terms of that license. If you +license the Adaptation under the terms of any of the licenses mentioned in (i), +(ii) or (iii) (the "Applicable License"), you must comply with the terms of the +Applicable License generally and the following provisions: (I) You must include +a copy of, or the URI for, the Applicable License with every copy of each +Adaptation You Distribute or Publicly Perform; (II) You may not offer or impose +any terms on the Adaptation that restrict the terms of the Applicable License +or the ability of the recipient of the Adaptation to exercise the rights +granted to that recipient under the terms of the Applicable License; (III) You +must keep intact all notices that refer to the Applicable License and to the +disclaimer of warranties with every copy of the Work as included in the +Adaptation You Distribute or Publicly Perform; (IV) when You Distribute or +Publicly Perform the Adaptation, You may not impose any effective technological +measures on the Adaptation that restrict the ability of a recipient of the +Adaptation from You to exercise the rights granted to that recipient under the +terms of the Applicable License. This Section 4(b) applies to the Adaptation as +incorporated in a Collection, but this does not require the Collection apart +from the Adaptation itself to be made subject to the terms of the Applicable +License. +If You Distribute, or Publicly Perform the Work or any Adaptations or +Collections, You must, unless a request has been made pursuant to Section 4(a), +keep intact all copyright notices for the Work and provide, reasonable to the +medium or means You are utilizing: (i) the name of the Original Author (or +pseudonym, if applicable) if supplied, and/or if the Original Author and/or +Licensor designate another party or parties (e.g., a sponsor institute, +publishing entity, journal) for attribution ("Attribution Parties") in +Licensor's copyright notice, terms of service or by other reasonable means, the +name of such party or parties; (ii) the title of the Work if supplied; (iii) to +the extent reasonably practicable, the URI, if any, that Licensor specifies to +be associated with the Work, unless such URI does not refer to the copyright +notice or licensing information for the Work; and (iv) , consistent with +Ssection 3(b), in the case of an Adaptation, a credit identifying the use of +the Work in the Adaptation (e.g., "French translation of the Work by Original +Author," or "Screenplay based on original Work by Original Author"). The credit +required by this Section 4(c) may be implemented in any reasonable manner; +provided, however, that in the case of a Adaptation or Collection, at a minimum +such credit will appear, if a credit for all contributing authors of the +Adaptation or Collection appears, then as part of these credits and in a manner +at least as prominent as the credits for the other contributing authors. For +the avoidance of doubt, You may only use the credit required by this Section +for the purpose of attribution in the manner set out above and, by exercising +Your rights under this License, You may not implicitly or explicitly assert or +imply any connection with, sponsorship or endorsement by the Original Author, +Licensor and/or Attribution Parties, as appropriate, of You or Your use of the +Work, without the separate, express prior written permission of the Original +Author, Licensor and/or Attribution Parties. +Except as otherwise agreed in writing by the Licensor or as may be otherwise +permitted by applicable law, if You Reproduce, Distribute or Publicly Perform +the Work either by itself or as part of any Adaptations or Collections, You +must not distort, mutilate, modify or take other derogatory action in relation +to the Work which would be prejudicial to the Original Author's honor or +reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which +any exercise of the right granted in Section 3(b) of this License (the right to +make Adaptations) would be deemed to be a distortion, mutilation, modification +or other derogatory action prejudicial to the Original Author's honor and +reputation, the Licensor will waive or not assert, as appropriate, this +Section, to the fullest extent permitted by the applicable national law, to +enable You to reasonably exercise Your right under Section 3(b) of this License +(right to make Adaptations) but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS +THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND +CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, +WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A +PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, +ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. +SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH +EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. + +EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN +NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, +INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS +LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. Termination + +This License and the rights granted hereunder will terminate automatically upon +any breach by You of the terms of this License. Individuals or entities who +have received Adaptations or Collections from You under this License, however, +will not have their licenses terminated provided such individuals or entities +remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 +will survive any termination of this License. +Subject to the above terms and conditions, the license granted here is +perpetual (for the duration of the applicable copyright in the Work). +Notwithstanding the above, Licensor reserves the right to release the Work +under different license terms or to stop distributing the Work at any time; +provided, however that any such election will not serve to withdraw this +License (or any other license that has been, or is required to be, granted +under the terms of this License), and this License will continue in full force +and effect unless terminated as stated above. + +8. Miscellaneous + +Each time You Distribute or Publicly Perform the Work or a Collection, the +Licensor offers to the recipient a license to the Work on the same terms and +conditions as the license granted to You under this License. +Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to +the recipient a license to the original Work on the same terms and conditions +as the license granted to You under this License. +If any provision of this License is invalid or unenforceable under applicable +law, it shall not affect the validity or enforceability of the remainder of the +terms of this License, and without further action by the parties to this +agreement, such provision shall be reformed to the minimum extent necessary to +make such provision valid and enforceable. +No term or provision of this License shall be deemed waived and no breach +consented to unless such waiver or consent shall be in writing and signed by +the party to be charged with such waiver or consent. +This License constitutes the entire agreement between the parties with respect +to the Work licensed here. There are no understandings, agreements or +representations with respect to the Work not specified here. Licensor shall not +be bound by any additional provisions that may appear in any communication from +You. This License may not be modified without the mutual written agreement of +the Licensor and You. +The rights granted under, and the subject matter referenced, in this License +were drafted utilizing the terminology of the Berne Convention for the +Protection of Literary and Artistic Works (as amended on September 28, 1979), +the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO +Performances and Phonograms Treaty of 1996 and the Universal Copyright +Convention (as revised on July 24, 1971). These rights and subject matter take +effect in the relevant jurisdiction in which the License terms are sought to be +enforced according to the corresponding provisions of the implementation of +those treaty provisions in the applicable national law. If the standard suite +of rights granted under applicable copyright law includes additional rights not +granted under this License, such additional rights are deemed to be included in +the License; this License is not intended to restrict the license of any rights +under applicable law. + +-------------------------------------------------------------------------------- + +Copyright (c) 2011 by Erik Moller +All rights reserved. + +This software is provided 'as-is', without any express +or implied warranty. In no event will the authors be +held liable for any damages arising from the use of +this software. + +Permission is granted to anyone to use this software +for any purpose, including commercial applications, +and to alter it and redistribute it freely, subject to +the following restrictions: + +1. The origin of this software must not be + misrepresented; you must not claim that you + wrote the original software. If you use this + software in a product, an acknowledgment in + the product documentation would be appreciated + but is not required. + +2. Altered source versions must be plainly marked + as such, and must not be misrepresented as + being the original software. + +3. This notice may not be removed or altered from + any source distribution. + diff -r 097063f324c0 -r 4b1def16fe9b components/novnc/novnc.p5m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/novnc/novnc.p5m Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,84 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# + + set action.hash %<1>> +set name=pkg.fmri value=pkg:/web/novnc@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION) +set name=pkg.summary value="Browser based VNC client" +set name=pkg.description \ + value="noVNC is a browser based VNC client implemented using HTML5 Canvas and WebSockets. It requires either a VNC server with WebSockets support or alternatively, websockify to bridge between a browser and the VNC server." +set name=com.oracle.info.description value="the noVNC module" +set name=com.oracle.info.tpno value=$(TPNO) +set name=info.classification \ + value="org.opensolaris.category.2008:Web Services/Communications" +set name=info.source-url value=$(COMPONENT_ARCHIVE_URL) +set name=info.upstream value="Joel Martin " +set name=info.upstream-url value=$(COMPONENT_PROJECT_URL) +set name=org.opensolaris.arc-caseid value=PSARC/2014/377 +set name=org.opensolaris.consolidation value=$(CONSOLIDATION) +link path=usr/share/novnc/favicon.ico target=images/favicon.ico +file path=usr/share/novnc/images/alt.png +file path=usr/share/novnc/images/clipboard.png +file path=usr/share/novnc/images/connect.png +file path=usr/share/novnc/images/ctrl.png +file path=usr/share/novnc/images/ctrlaltdel.png +file path=usr/share/novnc/images/disconnect.png +file path=usr/share/novnc/images/drag.png +file path=usr/share/novnc/images/esc.png +file path=usr/share/novnc/images/favicon.ico +file path=usr/share/novnc/images/favicon.png +file path=usr/share/novnc/images/keyboard.png +file path=usr/share/novnc/images/mouse_left.png +file path=usr/share/novnc/images/mouse_middle.png +file path=usr/share/novnc/images/mouse_none.png +file path=usr/share/novnc/images/mouse_right.png +file path=usr/share/novnc/images/power.png +file path=usr/share/novnc/images/screen_320x460.png +file path=usr/share/novnc/images/screen_57x57.png +file path=usr/share/novnc/images/screen_700x700.png +file path=usr/share/novnc/images/settings.png +file path=usr/share/novnc/images/showextrakeys.png +file path=usr/share/novnc/images/tab.png +file path=usr/share/novnc/include/Orbitron700.ttf +file path=usr/share/novnc/include/Orbitron700.woff +file path=usr/share/novnc/include/base.css +file path=usr/share/novnc/include/base64.js +file path=usr/share/novnc/include/black.css +file path=usr/share/novnc/include/blue.css +file path=usr/share/novnc/include/des.js +file path=usr/share/novnc/include/display.js +file path=usr/share/novnc/include/input.js +file path=usr/share/novnc/include/jsunzip.js +file path=usr/share/novnc/include/keyboard.js +file path=usr/share/novnc/include/keysym.js +file path=usr/share/novnc/include/keysymdef.js +file path=usr/share/novnc/include/logo.js +file path=usr/share/novnc/include/playback.js +file path=usr/share/novnc/include/rfb.js +file path=usr/share/novnc/include/ui.js +file path=usr/share/novnc/include/util.js +file path=usr/share/novnc/include/websock.js +file path=usr/share/novnc/include/webutil.js +file path=usr/share/novnc/vnc.html +file path=usr/share/novnc/vnc_auto.html +license novnc.license license="MPL-2.0, BSD-style, OFL-1.1, CC BY-SA 3.0, Zlib" + diff -r 097063f324c0 -r 4b1def16fe9b components/novnc/resolve.deps --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/novnc/resolve.deps Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,1 @@ +consolidation/userland/userland-incorporation diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/cinder/Makefile --- a/components/openstack/cinder/Makefile Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/cinder/Makefile Mon Apr 20 12:35:51 2015 -0700 @@ -20,25 +20,29 @@ # # -# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. # + include ../../../make-rules/shared-macros.mk COMPONENT_NAME= cinder -COMPONENT_CODENAME= havana -COMPONENT_VERSION= 2013.2.3 +COMPONENT_CODENAME= juno +COMPONENT_VERSION= 2014.2.2 +COMPONENT_BE_VERSION= 2014.2 COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION) COMPONENT_ARCHIVE= $(COMPONENT_SRC).tar.gz COMPONENT_ARCHIVE_HASH= \ - sha256:a2740f0a0481139ae21cdb0868bebcce01b9f19832439b7f3056435e75791194 + sha256:2c779bf9d208163af6c425da9043bbdcb345cebc5c118198482b94062862a117 COMPONENT_ARCHIVE_URL= http://launchpad.net/$(COMPONENT_NAME)/$(COMPONENT_CODENAME)/$(COMPONENT_VERSION)/+download/$(COMPONENT_ARCHIVE) COMPONENT_PROJECT_URL= http://www.openstack.org/ COMPONENT_BUGDB= service/cinder -IPS_COMPONENT_VERSION= 0.$(COMPONENT_VERSION) +IPS_COMPONENT_VERSION= 0.$(COMPONENT_VERSION) + +TPNO= 21819 -include $(WS_TOP)/make-rules/prep.mk -include $(WS_TOP)/make-rules/setup.py.mk -include $(WS_TOP)/make-rules/ips.mk +include $(WS_MAKE_RULES)/prep.mk +include $(WS_MAKE_RULES)/setup.py.mk +include $(WS_MAKE_RULES)/ips.mk ASLR_MODE = $(ASLR_NOT_APPLICABLE) @@ -46,27 +50,34 @@ # only need to deliver one version. The manifest is parameterized, though. PYTHON_VERSIONS= 2.6 +PKG_MACROS += COMPONENT_BE_VERSION=$(COMPONENT_BE_VERSION) PKG_MACROS += PYVER=$(PYTHON_VERSIONS) +PKG_MACROS += PYV=$(shell echo $(PYTHON_VERSIONS) | tr -d .) -# cinder-api, cinder-backup, cinder-scheduler, and cinder-volume -# depend on the cinder-db svc so copy the manifest into the proto -# directory for pkgdepend to find +# +# cinder-api, cinder-backup, cinder-scrubber, and cinder-volume depend +# on cinder-db, and cinder-upgrade so copy all of the service +# manifests into the proto directory for pkgdepend(1) to find. +# COMPONENT_POST_INSTALL_ACTION += \ - ($(MKDIR) $(PROTO_DIR)/lib/svc/manifest/application/openstack; \ - $(CP) files/cinder-api.xml $(PROTO_DIR)/lib/svc/manifest/application/openstack/; \ - $(CP) files/cinder-backup.xml $(PROTO_DIR)/lib/svc/manifest/application/openstack/; \ - $(CP) files/cinder-db.xml $(PROTO_DIR)/lib/svc/manifest/application/openstack/; \ - $(CP) files/cinder-scheduler.xml $(PROTO_DIR)/lib/svc/manifest/application/openstack/; \ - $(CP) files/cinder-volume.xml $(PROTO_DIR)/lib/svc/manifest/application/openstack/; \ - $(MKDIR) $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/solaris; \ + ($(MKDIR) $(PROTO_DIR)/lib/svc/manifest/application/openstack; \ + $(CP) \ + files/cinder-api.xml \ + files/cinder-backup.xml \ + files/cinder-db.xml \ + files/cinder-scheduler.xml \ + files/cinder-upgrade.xml \ + files/cinder-volume.xml \ + $(PROTO_DIR)/lib/svc/manifest/application/openstack; \ + $(CP) \ + files/solaris/solarisfc.py \ + files/solaris/solarisiscsi.py \ + $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/brick/initiator; \ + $(MKDIR) $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/solaris; \ $(TOUCH) $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/solaris/__init__.py; \ $(CP) files/solaris/zfs.py $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/solaris; \ - $(MKDIR) $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/zfssa; \ - $(CP) files/zfssa/__init__.py $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/zfssa; \ - $(CP) files/zfssa/cinder.akwf $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/zfssa; \ - $(CP) files/zfssa/restclient.py $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/zfssa; \ - $(CP) files/zfssa/zfssaiscsi.py $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/zfssa; \ - $(CP) files/zfssa/zfssarest.py $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/zfssa); \ + $(MKDIR) $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/zfssa; \ + $(CP) files/zfssa/cinder.akwf $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/zfssa); \ $(PYTHON) -m compileall $(PROTO_DIR)/$(PYTHON_VENDOR_PACKAGES) # common targets diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/cinder/cinder.p5m --- a/components/openstack/cinder/cinder.p5m Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/cinder/cinder.p5m Mon Apr 20 12:35:51 2015 -0700 @@ -20,7 +20,7 @@ # # -# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. # set name=pkg.fmri \ @@ -28,10 +28,10 @@ set name=pkg.summary value="OpenStack Cinder (Block Storage Service)" set name=pkg.description \ value="OpenStack Cinder provides an infrastructure for managing block storage volumes in OpenStack. It allows block devices to be exposed and connected to compute instances for expanded storage, better performance and integration with enterprise storage platforms." -set name=pkg.human-version value="Havana $(COMPONENT_VERSION)" +set name=pkg.human-version value="Juno $(COMPONENT_VERSION)" set name=com.oracle.info.description \ value="Cinder, the OpenStack block storage service" -set name=com.oracle.info.tpno value=17714 +set name=com.oracle.info.tpno value=$(TPNO) set name=info.classification \ value="org.opensolaris.category.2008:System/Administration and Configuration" \ value="org.opensolaris.category.2008:System/Enterprise Management" \ @@ -40,12 +40,14 @@ set name=info.source-url value=$(COMPONENT_ARCHIVE_URL) set name=info.upstream value="OpenStack " set name=info.upstream-url value=$(COMPONENT_PROJECT_URL) +set name=openstack.upgrade-id reboot-needed=true value=$(COMPONENT_BE_VERSION) set name=org.opensolaris.arc-caseid value=PSARC/2013/350 value=PSARC/2014/054 \ - value=PSARC/2014/208 + value=PSARC/2014/208 value=PSARC/2015/110 set name=org.opensolaris.consolidation value=$(CONSOLIDATION) +# dir path=etc/cinder owner=cinder group=cinder mode=0700 -file files/api-paste.ini path=etc/cinder/api-paste.ini owner=cinder \ - group=cinder mode=0644 overlay=allow preserve=renamenew +file path=etc/cinder/api-paste.ini owner=cinder group=cinder mode=0644 \ + overlay=allow preserve=renamenew file files/cinder.conf path=etc/cinder/cinder.conf owner=cinder group=cinder \ mode=0644 overlay=allow preserve=renamenew file etc/cinder/logging_sample.conf path=etc/cinder/logging.conf owner=cinder \ @@ -64,13 +66,14 @@ file path=lib/svc/manifest/application/openstack/cinder-backup.xml file path=lib/svc/manifest/application/openstack/cinder-db.xml file path=lib/svc/manifest/application/openstack/cinder-scheduler.xml +file path=lib/svc/manifest/application/openstack/cinder-upgrade.xml file path=lib/svc/manifest/application/openstack/cinder-volume.xml file files/cinder-api path=lib/svc/method/cinder-api file files/cinder-backup path=lib/svc/method/cinder-backup file files/cinder-scheduler path=lib/svc/method/cinder-scheduler +file files/cinder-upgrade path=lib/svc/method/cinder-upgrade file files/cinder-volume path=lib/svc/method/cinder-volume file files/cinder-volume-setup path=lib/svc/method/cinder-volume-setup -file path=usr/bin/cinder-clear-rabbit-queues file path=usr/bin/cinder-manage pkg.depend.bypass-generate=.*/bpython.* file usr/bin/cinder-api path=usr/lib/cinder/cinder-api mode=0555 file usr/bin/cinder-backup path=usr/lib/cinder/cinder-backup mode=0555 @@ -83,6 +86,7 @@ file path=usr/lib/python$(PYVER)/vendor-packages/cinder-$(COMPONENT_VERSION)-py$(PYVER).egg-info/dependency_links.txt file path=usr/lib/python$(PYVER)/vendor-packages/cinder-$(COMPONENT_VERSION)-py$(PYVER).egg-info/entry_points.txt file path=usr/lib/python$(PYVER)/vendor-packages/cinder-$(COMPONENT_VERSION)-py$(PYVER).egg-info/not-zip-safe +file path=usr/lib/python$(PYVER)/vendor-packages/cinder-$(COMPONENT_VERSION)-py$(PYVER).egg-info/pbr.json file path=usr/lib/python$(PYVER)/vendor-packages/cinder-$(COMPONENT_VERSION)-py$(PYVER).egg-info/requires.txt file path=usr/lib/python$(PYVER)/vendor-packages/cinder-$(COMPONENT_VERSION)-py$(PYVER).egg-info/top_level.txt file path=usr/lib/python$(PYVER)/vendor-packages/cinder/__init__.py @@ -93,6 +97,9 @@ file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/admin_actions.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/availability_zones.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/backups.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/cgsnapshots.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/consistencygroups.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/extended_services.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/extended_snapshot_attributes.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/hosts.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/image_create.py @@ -100,18 +107,23 @@ file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/quota_classes.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/quotas.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/scheduler_hints.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/scheduler_stats.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/services.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/snapshot_actions.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/types_extra_specs.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/types_manage.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/used_limits.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_actions.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_encryption_metadata.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_host_attribute.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_image_metadata.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_manage.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_mig_status_attribute.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_replication.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_tenant_attribute.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_transfer.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_type_encryption.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_unmanage.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/extensions.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/middleware/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/middleware/auth.py @@ -127,6 +139,10 @@ file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/schemas/v1.1/extensions.rng file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/schemas/v1.1/limits.rng file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/schemas/v1.1/metadata.rng +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/schemas/v1.1/qos_association.rng +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/schemas/v1.1/qos_associations.rng +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/schemas/v1.1/qos_spec.rng +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/schemas/v1.1/qos_specs.rng file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/sizelimit.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/urlmap.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v1/__init__.py @@ -151,8 +167,11 @@ file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/availability_zones.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/backups.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/cgsnapshots.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/consistencygroups.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/limits.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/qos_specs.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/scheduler_stats.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/transfers.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/types.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/versions.py @@ -175,10 +194,10 @@ file path=usr/lib/python$(PYVER)/vendor-packages/cinder/brick/initiator/host_driver.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/brick/initiator/linuxfc.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/brick/initiator/linuxscsi.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/brick/initiator/solarisfc.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/brick/initiator/solarisiscsi.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/brick/iscsi/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/brick/iscsi/iscsi.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/brick/iser/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/brick/iser/iser.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/brick/local_dev/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/brick/local_dev/lvm.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/brick/remotefs/__init__.py @@ -189,6 +208,8 @@ file path=usr/lib/python$(PYVER)/vendor-packages/cinder/compute/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/compute/aggregate_states.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/compute/nova.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/consistencygroup/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/consistencygroup/api.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/context.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/api.py @@ -227,140 +248,90 @@ file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/019_add_migration_status.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/020_add_volume_admin_metadata_table.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/021_add_default_quota_class.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/022_add_reason_column_to_service.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/023_add_expire_reservations_index.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/024_add_replication_support.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/025_add_consistencygroup.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/026_add_consistencygroup_quota_class.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migration.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/models.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/exception.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/flow_utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/hacking/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/hacking/checks.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/i18n.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/image/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/image/glance.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/image/image_utils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/keymgr/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/keymgr/barbican.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/keymgr/conf_key_mgr.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/keymgr/key.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/keymgr/key_mgr.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/keymgr/not_implemented_key_mgr.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ar/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/bg_BG/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/bs/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ca/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/cs/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/da/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/de/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/en_AU/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/en_GB/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/en_US/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/es/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/es_MX/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/fi_FI/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/fil/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/fr/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/hi/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/hr/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/hu/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/id/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/it/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/it_IT/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ja/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ka_GE/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/kn/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ko/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ko_KR/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ms/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/nb/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ne/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/nl_NL/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/pl_PL/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/pt/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/pt_BR/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ro/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ru/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ru_RU/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/sk/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/sl_SI/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/sw_KE/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/tl/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/tl_PH/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/tr/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/tr_TR/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/uk/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/vi_VN/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/zh_CN/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/zh_HK/LC_MESSAGES/cinder.po -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/zh_TW/LC_MESSAGES/cinder.po file path=usr/lib/python$(PYVER)/vendor-packages/cinder/manager.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/README file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/config/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/config/generator.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/context.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/db/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/db/api.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/db/exception.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/db/sqlalchemy/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/db/sqlalchemy/models.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/db/sqlalchemy/session.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/db/sqlalchemy/utils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/eventlet_backdoor.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/excutils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/fileutils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/gettextutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/imageutils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/importutils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/jsonutils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/local.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/lockutils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/log.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/log_handler.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/loopingcall.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/middleware/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/middleware/base.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/middleware/request_id.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/network_utils.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/api.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/log_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/no_op_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/rabbit_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/rpc_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/rpc_notifier2.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/test_notifier.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/periodic_task.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/policy.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/processutils.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rootwrap/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rootwrap/cmd.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rootwrap/filters.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rootwrap/wrapper.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/amqp.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/common.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/dispatcher.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/impl_fake.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/impl_kombu.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/impl_qpid.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/impl_zmq.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/matchmaker.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/matchmaker_redis.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/proxy.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/service.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/zmq_receiver.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/request_utils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/filter.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/base_filter.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/base_handler.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/base_weight.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/filters/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/filters/availability_zone_filter.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/filters/capabilities_filter.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/filters/extra_specs_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/filters/ignore_attempted_hosts_filter.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/filters/json_filter.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/weight.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/weights/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/service.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/sslutils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/strutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/systemd.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/test.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/threadgroup.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/timeutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/units.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/uuidutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/versionutils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/policy.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/quota.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/quota_utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/replication/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/replication/api.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/rpc.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/chance.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/driver.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/filter_scheduler.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/filters/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/filters/affinity_filter.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/filters/capacity_filter.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/filters/retry_filter.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/flows/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/flows/create_volume.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/host_manager.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/manager.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/rpcapi.py @@ -368,20 +339,13 @@ file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/simple.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/weights/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/weights/capacity.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/weights/chance.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/weights/volume_number.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/service.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/taskflow/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/taskflow/decorators.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/taskflow/exceptions.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/taskflow/patterns/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/taskflow/patterns/base.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/taskflow/patterns/linear_flow.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/taskflow/states.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/taskflow/task.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/taskflow/utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/ssh_utils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/test.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/transfer/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/transfer/api.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/units.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/utils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/version.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/__init__.py @@ -390,23 +354,126 @@ file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/driver.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/block_device.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/coraid.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/datera.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_smis_common.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_smis_iscsi.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_cli_fc.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_cli_iscsi.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_vmax_common.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_vmax_fast.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_vmax_fc.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_vmax_iscsi.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_vmax_masking.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_vmax_provision.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_vmax_utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_vnx_cli.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/xtremio.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/eqlx.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/fujitsu_eternus_dx_common.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/fujitsu_eternus_dx_fc.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/fujitsu_eternus_dx_iscsi.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/fusionio/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/fusionio/ioControl.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/glusterfs.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/hds/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/hds/hds.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/hds/hnas_backend.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/hds/hus_backend.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/hds/iscsi.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/hds/nfs.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/hitachi/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/hitachi/hbsd_basiclib.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/hitachi/hbsd_common.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/hitachi/hbsd_fc.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/hitachi/hbsd_horcm.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/hitachi/hbsd_iscsi.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/hitachi/hbsd_snm2.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/huawei/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/huawei/huawei_dorado.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/huawei/huawei_hvs.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/huawei/huawei_t.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/huawei/huawei_utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/huawei/rest_common.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/huawei/ssh_common.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/ibm/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/ibm/gpfs.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/ibm/ibmnas.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/ibm/storwize_svc/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/ibm/storwize_svc/helpers.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/ibm/storwize_svc/replication.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/ibm/storwize_svc/ssh.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/ibm/xiv_ds8k.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/lvm.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/api.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/common.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/eseries/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/eseries/client.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/eseries/iscsi.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/iscsi.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/nfs.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/options.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/ssc_utils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/utils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/nexenta/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/nexenta/iscsi.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/nexenta/jsonrpc.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/nexenta/nfs.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/nexenta/options.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/nexenta/utils.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/nexenta/volume.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/nfs.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/nimble.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/prophetstor/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/prophetstor/dpl_fc.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/prophetstor/dpl_iscsi.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/prophetstor/dplcommon.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/prophetstor/options.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/pure.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/rbd.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/remotefs.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/san/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/san/hp/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/san/hp/hp_3par_common.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/san/hp/hp_3par_fc.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/san/hp/hp_3par_iscsi.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/san/hp/hp_lefthand_cliq_proxy.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/san/hp/hp_lefthand_iscsi.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/san/hp/hp_lefthand_rest_proxy.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/san/hp/hp_msa_client.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/san/hp/hp_msa_common.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/san/hp/hp_msa_fc.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/san/san.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/san/solaris.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/scality.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/sheepdog.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/smbfs.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/solaris/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/solaris/zfs.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/solidfire.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/api.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/datastore.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/error_util.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/io_util.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/pbm.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/read_write_util.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/vim.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/vim_util.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/vmdk.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/vmware_images.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/volumeops.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/wsdl/5.5/core-types.xsd +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/wsdl/5.5/pbm-messagetypes.xsd +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/wsdl/5.5/pbm-types.xsd +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/wsdl/5.5/pbm.wsdl +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/vmware/wsdl/5.5/pbmService.wsdl +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/windows/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/windows/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/windows/remotefs.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/windows/smbfs.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/windows/vhdutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/windows/windows.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/windows/windows_utils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/zadara.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/zfssa/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/zfssa/cinder.akwf @@ -414,24 +481,69 @@ file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/zfssa/zfssaiscsi.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/zfssa/zfssarest.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/flows/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/flows/base.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/flows/create_volume/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/flows/utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/flows/api/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/flows/api/create_volume.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/flows/common.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/flows/manager/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/flows/manager/create_volume.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/flows/manager/manage_existing.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/iscsi.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/manager.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/qos_specs.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/rpcapi.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/utils.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/volume_types.py file path=usr/lib/python$(PYVER)/vendor-packages/cinder/wsgi.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/brocade/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/brocade/brcd_fabric_opts.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/brocade/brcd_fc_san_lookup_service.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/brocade/brcd_fc_zone_client_cli.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/brocade/brcd_fc_zone_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/brocade/fc_zone_constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/cisco/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/cisco/cisco_fabric_opts.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/cisco/cisco_fc_san_lookup_service.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/cisco/cisco_fc_zone_client_cli.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/cisco/cisco_fc_zone_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/cisco/fc_zone_constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/drivers/fc_zone_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/fc_common.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/fc_san_lookup_service.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/fc_zone_manager.py +file path=usr/lib/python$(PYVER)/vendor-packages/cinder/zonemanager/utils.py dir path=var/lib/cinder owner=cinder group=cinder mode=0700 +# group groupname=cinder gid=81 user username=cinder ftpuser=false gcos-field="OpenStack Cinder" group=cinder \ home-dir=/var/lib/cinder uid=81 +# license cinder.license license="Apache v2.0" # force a group dependency on the optional anyjson; pkgdepend work is needed to # flush this out. -depend type=group fmri=library/python-2/anyjson-26 +depend type=group fmri=library/python-2/anyjson-$(PYV) + +# force a group dependency on the optional netaddr; pkgdepend work is needed to +# flush this out. +depend type=group fmri=library/python-2/netaddr-$(PYV) + +# force a group dependency on the optional pywbem; pkgdepend work is needed to +# flush this out. +depend type=group fmri=library/python-2/pywbem + +# force a group dependency on the optional requests; pkgdepend work is needed to +# flush this out. +depend type=group fmri=library/python-2/requests-$(PYV) + +# force a group dependency on the optional simplejson; pkgdepend work is needed +# to flush this out. +depend type=group fmri=library/python-2/simplejson-$(PYV) + +# force a group dependency on the optional suds; pkgdepend work is needed to +# flush this out. +depend type=group fmri=library/python-2/suds-$(PYV) # force a dependency on package delivering fcinfo(1M) depend type=require fmri=__TBD pkg.debug.depend.file=usr/sbin/fcinfo @@ -445,62 +557,83 @@ # force a dependency on package delivering zfs(1M) depend type=require fmri=__TBD pkg.debug.depend.file=usr/sbin/zfs +# force a dependency on argparse; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python-2/argparse-$(PYV) + # force a dependency on babel; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/babel-26 +depend type=require fmri=library/python-2/babel-$(PYV) + +# force a dependency on barbicanclient; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/barbicanclient-$(PYV) + +# force a dependency on glanceclient; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/glanceclient-$(PYV) # force a dependency on greenlet; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/greenlet-26 +depend type=require fmri=library/python-2/greenlet-$(PYV) + +# force a dependency on iso8601; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/iso8601-$(PYV) -# force a dependency on kombu; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/kombu-26 +# force a dependency on keystoneclient; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/keystoneclient-$(PYV) + +# force a dependency on keystonemiddleware; used via a paste.deploy filter +depend type=require fmri=library/python/keystonemiddleware-$(PYV) # force a dependency on lxml; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/lxml-26 +depend type=require fmri=library/python-2/lxml-$(PYV) + +# force a dependency on novaclient; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/novaclient-$(PYV) + +# force a dependency on oslo.db; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/oslo.db-$(PYV) + +# force a dependency on oslo.i18n; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/oslo.i18n-$(PYV) + +# force a dependency on oslo.messaging; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/oslo.messaging-$(PYV) + +# force a dependency on osprofiler; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/osprofiler-$(PYV) # force a dependency on paste; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/paste-26 +depend type=require fmri=library/python-2/paste-$(PYV) # force a dependency on paste.deploy; pkgdepend work is needed to flush this # out. -depend type=require fmri=library/python-2/paste.deploy-26 +depend type=require fmri=library/python-2/paste.deploy-$(PYV) -# force a dependency on pywbem; pkgdepend work is needed to flush this out. -# (dependency is for EMC volume driver) -depend type=require fmri=library/python-2/pywbem +# force a dependency on pbr; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/pbr-$(PYV) # force a dependency on routes; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/routes-26 +depend type=require fmri=library/python-2/routes-$(PYV) # force a dependency on setuptools; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/setuptools-26 +depend type=require fmri=library/python-2/setuptools-$(PYV) -# force a dependency on sqlalchemy; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/sqlalchemy-26 +# force a dependency on six; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/six-$(PYV) # force a dependency on stevedore; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/stevedore-26 +depend type=require fmri=library/python-2/stevedore-$(PYV) + +# force a dependency on swiftclient; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/swiftclient-$(PYV) + +# force a dependency on taskflow; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/taskflow-$(PYV) # force a dependency on webob; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/webob-26 - -# force a dependency on glanceclient; pkgdepend work is needed to flush this -# out. -depend type=require fmri=library/python/glanceclient-26 - -# force a dependency on iso8601; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/iso8601-26 - -# force a dependency on keystoneclient; used via a paste.deploy filter -depend type=require fmri=library/python/keystoneclient-26 +depend type=require fmri=library/python-2/webob-$(PYV) -# force a dependency on novaclient; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/novaclient-26 - -# force a dependency on pbr; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/pbr-26 - -# force a dependency on six; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/six-26 - -# force a dependency on swiftclient; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/swiftclient-26 +# force a dependency on the Solaris Install library; pkgdepend work is needed to +# flush this out. +depend type=require fmri=system/library/install diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/cinder/files/api-paste.ini --- a/components/openstack/cinder/files/api-paste.ini Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -############# -# OpenStack # -############# - -[composite:osapi_volume] -use = call:cinder.api:root_app_factory -/: apiversions -/v1: openstack_volume_api_v1 -/v2: openstack_volume_api_v2 - -[composite:openstack_volume_api_v1] -use = call:cinder.api.middleware.auth:pipeline_factory -noauth = faultwrap sizelimit noauth apiv1 -keystone = faultwrap sizelimit authtoken keystonecontext apiv1 -keystone_nolimit = faultwrap sizelimit authtoken keystonecontext apiv1 - -[composite:openstack_volume_api_v2] -use = call:cinder.api.middleware.auth:pipeline_factory -noauth = faultwrap sizelimit noauth apiv2 -keystone = faultwrap sizelimit authtoken keystonecontext apiv2 -keystone_nolimit = faultwrap sizelimit authtoken keystonecontext apiv2 - -[filter:faultwrap] -paste.filter_factory = cinder.api.middleware.fault:FaultWrapper.factory - -[filter:noauth] -paste.filter_factory = cinder.api.middleware.auth:NoAuthMiddleware.factory - -[filter:sizelimit] -paste.filter_factory = cinder.api.middleware.sizelimit:RequestBodySizeLimiter.factory - -[app:apiv1] -paste.app_factory = cinder.api.v1.router:APIRouter.factory - -[app:apiv2] -paste.app_factory = cinder.api.v2.router:APIRouter.factory - -[pipeline:apiversions] -pipeline = faultwrap osvolumeversionapp - -[app:osvolumeversionapp] -paste.app_factory = cinder.api.versions:Versions.factory - -########## -# Shared # -########## - -[filter:keystonecontext] -paste.filter_factory = cinder.api.middleware.auth:CinderKeystoneContext.factory - -[filter:authtoken] -paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory -auth_uri = http://127.0.0.1:5000/v2.0 -identity_uri = http://127.0.0.1:35357 -admin_tenant_name = %SERVICE_TENANT_NAME% -admin_user = %SERVICE_USER% -admin_password = %SERVICE_PASSWORD% -# signing_dir is configurable, but the default behavior of the authtoken -# middleware should be sufficient. It will create a temporary directory -# in the home directory for the user the cinder process is running as. -signing_dir = /var/lib/cinder/keystone-signing diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/cinder/files/cinder-api.xml --- a/components/openstack/cinder/files/cinder-api.xml Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/cinder/files/cinder-api.xml Mon Apr 20 12:35:51 2015 -0700 @@ -1,7 +1,7 @@ + + + + cinder-api is a server daemon that provides the Cinder API service in - order to provide volume management for the OpenStack Compute service. + order to provide volume management for the OpenStack Compute service. diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/cinder/files/cinder-backup --- a/components/openstack/cinder/files/cinder-backup Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/cinder/files/cinder-backup Mon Apr 20 12:35:51 2015 -0700 @@ -1,6 +1,6 @@ #!/usr/bin/python2.6 -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain @@ -20,7 +20,7 @@ def start(): - smf_include.smf_subprocess("/usr/lib/cinder/cinder-backup") + smf_include.smf_subprocess("/usr/bin/pfexec /usr/lib/cinder/cinder-backup") if __name__ == "__main__": os.putenv("LC_ALL", "C") diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/cinder/files/cinder-backup.xml --- a/components/openstack/cinder/files/cinder-backup.xml Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/cinder/files/cinder-backup.xml Mon Apr 20 12:35:51 2015 -0700 @@ -1,7 +1,7 @@ + + + + + + + + cinder-scheduler picks a cinder-volume node to host the block storage - requested by the OpenStack Compute service. + requested by the OpenStack Compute service. diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/cinder/files/cinder-upgrade --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/cinder/files/cinder-upgrade Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,261 @@ +#!/usr/bin/python2.6 + +# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from ConfigParser import NoOptionError +from datetime import datetime +import errno +import glob +import os +import shutil +from subprocess import check_call, Popen, PIPE +import sys +import time +import traceback + +import iniparse +import smf_include +import sqlalchemy + + +CINDER_CONF_MAPPINGS = { + # Deprecated group/name + ('DEFAULT', 'rabbit_durable_queues'): ('DEFAULT', 'amqp_durable_queues'), + ('rpc_notifier2', 'topics'): ('DEFAULT', 'notification_topics'), + ('DEFAULT', 'osapi_compute_link_prefix'): + ('DEFAULT', 'osapi_volume_base_URL'), + ('DEFAULT', 'backup_service'): ('DEFAULT', 'backup_driver'), + ('DEFAULT', 'pybasedir'): ('DEFAULT', 'state_path'), + ('DEFAULT', 'log_config'): ('DEFAULT', 'log_config_append'), + ('DEFAULT', 'logfile'): ('DEFAULT', 'log_file'), + ('DEFAULT', 'logdir'): ('DEFAULT', 'log_dir'), + ('DEFAULT', 'num_iscsi_scan_tries'): + ('DEFAULT', 'num_volume_device_scan_tries'), + ('DEFAULT', 'db_backend'): ('database', 'backend'), + ('DEFAULT', 'sql_connection'): ('database', 'connection'), + ('DATABASE', 'sql_connection'): ('database', 'connection'), + ('sql', 'connection'): ('database', 'connection'), + ('DEFAULT', 'sql_idle_timeout'): ('database', 'idle_timeout'), + ('DATABASE', 'sql_idle_timeout'): ('database', 'idle_timeout'), + ('sql', 'idle_timeout'): ('database', 'idle_timeout'), + ('DEFAULT', 'sql_min_pool_size'): ('database', 'min_pool_size'), + ('DATABASE', 'sql_min_pool_size'): ('database', 'min_pool_size'), + ('DEFAULT', 'sql_max_pool_size'): ('database', 'max_pool_size'), + ('DATABASE', 'sql_max_pool_size'): ('database', 'max_pool_size'), + ('DEFAULT', 'sql_max_retries'): ('database', 'max_retries'), + ('DATABASE', 'sql_max_retries'): ('database', 'max_retries'), + ('DEFAULT', 'sql_retry_interval'): ('database', 'retry_interval'), + ('DATABASE', 'reconnect_interval'): ('database', 'retry_interval'), + ('DEFAULT', 'sql_max_overflow'): ('database', 'max_overflow'), + ('DATABASE', 'sqlalchemy_max_overflow'): ('database', 'max_overflow'), + ('DEFAULT', 'sql_connection_debug'): ('database', 'connection_debug'), + ('DEFAULT', 'sql_connection_trace'): ('database', 'connection_trace'), + ('DATABASE', 'sqlalchemy_pool_timeout'): ('database', 'pool_timeout'), + ('DEFAULT', 'dbapi_use_tpool'): ('database', 'use_tpool'), + ('DEFAULT', 'memcache_servers'): + ('keystone_authtoken', 'memcached_servers'), + ('DEFAULT', 'matchmaker_ringfile'): ('matchmaker_ring', 'ringfile'), +} + + +def update_mapping(section, key, mapping): + """ look for deprecated variables and, if found, convert it to the new + section/key. + """ + + if (section, key) in mapping: + print "Deprecated value found: [%s] %s" % (section, key) + section, key = mapping[(section, key)] + if section is None and key is None: + print "Removing from configuration" + else: + print "Updating to: [%s] %s" % (section, key) + return section, key + + +def alter_mysql_tables(engine): + """ Convert MySQL tables to use utf8 + """ + + import MySQLdb + + for _none in range(5): + try: + db = MySQLdb.connect(host=engine.url.host, + user=engine.url.username, + passwd=engine.url.password, + db=engine.url.database) + break + except MySQLdb.OperationalError as err: + # mysql is not ready. sleep for 2 more seconds + time.sleep(2) + else: + print "Unable to connect to MySQL: %s" % err + print ("Please verify MySQL is properly configured and online " + "before using svcadm(1M) to clear this service.") + sys.exit(smf_include.SMF_EXIT_ERR_FATAL) + + cursor = db.cursor() + cursor.execute("ALTER DATABASE %s CHARACTER SET = 'utf8'" % + engine.url.database) + cursor.execute("ALTER DATABASE %s COLLATE = 'utf8_general_ci'" % + engine.url.database) + cursor.execute("SHOW tables") + res = cursor.fetchall() + if res: + cursor.execute("SET foreign_key_checks = 0") + for item in res: + cursor.execute("ALTER TABLE %s.%s CONVERT TO " + "CHARACTER SET 'utf8', COLLATE 'utf8_general_ci'" + % (engine.url.database, item[0])) + cursor.execute("SET foreign_key_checks = 1") + db.commit() + db.close() + + +def modify_conf(old_file, mapping=None): + """ Copy over all uncommented options from the old configuration file. In + addition, look for deprecated section/keys and convert them to the new + section/key. + """ + + new_file = old_file + '.new' + + # open the previous version + old = iniparse.ConfigParser() + old.readfp(open(old_file)) + + # open the new version + new = iniparse.ConfigParser() + try: + new.readfp(open(new_file)) + except IOError as err: + if err.errno == errno.ENOENT: + # The upgrade did not deliver a .new file so, return + print "%s not found - continuing with %s" % (new_file, old_file) + return + else: + raise + print "\nupdating %s" % old_file + + # walk every single section for uncommented options + default_items = set(old.items('DEFAULT')) + for section in old.sections() + ['DEFAULT']: + + # DEFAULT items show up in every section so remove them + if section != 'DEFAULT': + section_items = set(old.items(section)) - default_items + else: + section_items = default_items + + for key, value in section_items: + # keep a copy of the old value + oldvalue = value + + if mapping is not None: + section, key = update_mapping(section, key, mapping) + + if section is None and key is None: + # option is deprecated so continue + continue + + if not new.has_section(section): + if section != 'DEFAULT': + new.add_section(section) + + # print to the log when a value for the same section.key is + # changing to a new value + try: + new_value = new.get(section, key) + if new_value != value and '%SERVICE' not in new_value: + print "Changing [%s] %s:\n- %s\n+ %s" % \ + (section, key, oldvalue, new_value) + print + except NoOptionError: + # the new configuration file does not have this option set so + # just continue + pass + + # Only copy the old value to the new conf file if the entry doesn't + # exist or if it contains '%SERVICE' + if not new.has_option(section, key) or \ + '%SERVICE' in new.get(section, key): + new.set(section, key, value) + + # copy the old conf file to a backup + today = datetime.now().strftime("%Y%m%d%H%M%S") + shutil.copy2(old_file, old_file + '.' + today) + + # copy the new conf file in place + with open(old_file, 'wb+') as fh: + new.write(fh) + + +def start(): + # pull out the current version of config/upgrade-id + p = Popen(['/usr/bin/svcprop', '-p', 'config/upgrade-id', + os.environ['SMF_FMRI']], stdout=PIPE, stderr=PIPE) + curr_ver, _err = p.communicate() + curr_ver = curr_ver.strip() + + # extract the openstack-upgrade-id from the pkg + p = Popen(['/usr/bin/pkg', 'contents', '-H', '-t', 'set', '-o', 'value', + '-a', 'name=openstack.upgrade-id', + 'pkg:/cloud/openstack/cinder'], stdout=PIPE, stderr=PIPE) + pkg_ver, _err = p.communicate() + pkg_ver = pkg_ver.strip() + + if curr_ver == pkg_ver: + # No need to upgrade + sys.exit(smf_include.SMF_EXIT_OK) + + # look for any .new files + if glob.glob('/etc/cinder/*.new'): + # the versions are different, so perform an upgrade + # modify the configuration files + modify_conf('/etc/cinder/api-paste.ini') + modify_conf('/etc/cinder/cinder.conf', CINDER_CONF_MAPPINGS) + modify_conf('/etc/cinder/logging.conf') + + config = iniparse.RawConfigParser() + config.read('/etc/cinder/cinder.conf') + # In certain cases the database section does not exist and the + # default database chosen is sqlite. + if config.has_section('database'): + db_connection = config.get('database', 'connection') + + if db_connection.startswith('mysql'): + engine = sqlalchemy.create_engine(db_connection) + if engine.url.username != '%SERVICE_USER%': + alter_mysql_tables(engine) + print "altered character set to utf8 in cinder tables" + + # update the current version + check_call(['/usr/sbin/svccfg', '-s', os.environ['SMF_FMRI'], 'setprop', + 'config/upgrade-id', '=', pkg_ver]) + check_call(['/usr/sbin/svccfg', '-s', os.environ['SMF_FMRI'], 'refresh']) + + sys.exit(smf_include.SMF_EXIT_OK) + + +if __name__ == '__main__': + os.putenv('LC_ALL', 'C') + try: + smf_include.smf_main() + except Exception as err: + print 'Unknown error: %s' % err + print + traceback.print_exc(file=sys.stdout) + sys.exit(smf_include.SMF_EXIT_ERR_FATAL) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/cinder/files/cinder-upgrade.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/cinder/files/cinder-upgrade.xml Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/cinder/files/cinder-volume-setup --- a/components/openstack/cinder/files/cinder-volume-setup Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/cinder/files/cinder-volume-setup Mon Apr 20 12:35:51 2015 -0700 @@ -1,6 +1,6 @@ #!/usr/bin/python2.6 -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/cinder/files/cinder-volume.xml --- a/components/openstack/cinder/files/cinder-volume.xml Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/cinder/files/cinder-volume.xml Mon Apr 20 12:35:51 2015 -0700 @@ -1,7 +1,7 @@ + + + + + @@ -42,6 +48,11 @@ + + + + /invalid so that it can be -# inspected for debugging purposes. -# -# This is number of seconds to leave these invalid images around before they -# are elibible to be reaped. -image_cache_invalid_entry_grace_period = 3600 - # Max cache size in bytes image_cache_max_size = 10737418240 @@ -51,6 +46,7 @@ # glance.store.swift.Store, # glance.store.sheepdog.Store, # glance.store.cinder.Store, +# glance.store.vmware_datastore.Store, # ============ Filesystem Store Options ======================== @@ -160,6 +156,42 @@ # Allow to perform insecure SSL requests to cinder (boolean value) #cinder_api_insecure = False +# ============ VMware Datastore Store Options ===================== + +# ESX/ESXi or vCenter Server target system. +# The server value can be an IP address or a DNS name +# e.g. 127.0.0.1, 127.0.0.1:443, www.vmware-infra.com +#vmware_server_host = + +# Server username (string value) +#vmware_server_username = + +# Server password (string value) +#vmware_server_password = + +# Inventory path to a datacenter (string value) +# Value optional when vmware_server_ip is an ESX/ESXi host: if specified +# should be `ha-datacenter`. +#vmware_datacenter_path = + +# Datastore associated with the datacenter (string value) +#vmware_datastore_name = + +# The number of times we retry on failures +# e.g., socket error, etc (integer value) +#vmware_api_retry_count = 10 + +# The interval used for polling remote tasks +# invoked on VMware ESX/VC server in seconds (integer value) +#vmware_task_poll_interval = 5 + +# Absolute path of the folder containing the images in the datastore +# (string value) +#vmware_store_image_dir = /openstack_glance + +# Allow to perform insecure SSL requests to the target system (boolean value) +#vmware_api_insecure = False + # ================= Security Options ========================== # AES key for encrypting store 'location' metadata, including diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/files/glance-db.xml --- a/components/openstack/glance/files/glance-db.xml Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/glance/files/glance-db.xml Mon Apr 20 12:35:51 2015 -0700 @@ -1,7 +1,7 @@ + + + + + @@ -42,6 +48,11 @@ + + + + +# API to use for accessing data. Default value points to sqlalchemy +# package, it is also possible to use: glance.db.registry.api +#data_api = glance.db.sqlalchemy.api + # ================= Security Options ========================== # AES key for encrypting store 'location' metadata, including @@ -52,9 +59,58 @@ # Should be set to a random string of length 16, 24 or 32 bytes #metadata_encryption_key = <16, 24 or 32 char registry metadata key> +# ================= Database Options ===============+========== + +[database] + +# The SQLAlchemy connection string used to connect to the +# database (string value) +connection=mysql://%SERVICE_USER%:%SERVICE_PASSWORD%@localhost/glance + +# The SQLAlchemy connection string used to connect to the +# slave database (string value) +#slave_connection= + +# timeout before idle sql connections are reaped (integer +# value) +#idle_timeout=3600 + +# Minimum number of SQL connections to keep open in a pool +# (integer value) +#min_pool_size=1 + +# Maximum number of SQL connections to keep open in a pool +# (integer value) +#max_pool_size= + +# maximum db connection retries during startup. (setting -1 +# implies an infinite retry count) (integer value) +#max_retries=10 + +# interval between retries of opening a sql connection +# (integer value) +#retry_interval=10 + +# If set, use this value for max_overflow with sqlalchemy +# (integer value) +#max_overflow= + +# Verbosity of SQL debugging information. 0=None, +# 100=Everything (integer value) +#connection_debug=0 + +# Add python stack traces to SQL as comment strings (boolean +# value) +#connection_trace=false + +# If set, use this value for pool_timeout with sqlalchemy +# (integer value) +#pool_timeout= + +[glance_store] + # ============ Filesystem Store Options ======================== # Directory that the Filesystem backend store # writes image data to filesystem_store_datadir = /var/lib/glance/images/ - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/files/glance-scrubber.xml --- a/components/openstack/glance/files/glance-scrubber.xml Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/glance/files/glance-scrubber.xml Mon Apr 20 12:35:51 2015 -0700 @@ -1,7 +1,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/files/glance.prof_attr --- a/components/openstack/glance/files/glance.prof_attr Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/glance/files/glance.prof_attr Mon Apr 20 12:35:51 2015 -0700 @@ -1,13 +1,9 @@ OpenStack Image Management:RO::\ Manage OpenStack Glance:\ -auths=solaris.admin.edit/etc/glance/api-paste.ini,\ -solaris.admin.edit/etc/glance/glance-api.conf,\ -solaris.admin.edit/etc/glance/glance-cache.conf,\ -solaris.admin.edit/etc/glance/glance-registry-paste.ini,\ -solaris.admin.edit/etc/glance/glance-registry.conf,\ -solaris.admin.edit/etc/glance/glance-scrubber.conf,\ -solaris.admin.edit/etc/glance/logging.conf,\ -solaris.admin.edit/etc/glance/policy.json,\ +auths=solaris.admin.edit/etc/glance/*.conf,\ +solaris.admin.edit/etc/glance/*.ini,\ +solaris.admin.edit/etc/glance/*.json,\ +solaris.admin.edit/etc/glance/metadefs/*.json,\ solaris.smf.manage.glance,\ solaris.smf.value.glance;\ defaultpriv={file_dac_read}\:/var/svc/log/application-openstack-* diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/files/glance.user_attr --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/glance/files/glance.user_attr Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,1 @@ +glance::RO::profiles=OpenStack Image Management diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/glance.p5m --- a/components/openstack/glance/glance.p5m Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/glance/glance.p5m Mon Apr 20 12:35:51 2015 -0700 @@ -20,7 +20,7 @@ # # -# Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. # set name=pkg.fmri \ @@ -28,9 +28,9 @@ set name=pkg.summary value="OpenStack Glance (Image Service)" set name=pkg.description \ value="OpenStack Glance provides services for discovering, registering, and retrieving virtual machine images. Glance has a RESTful API that allows querying of VM image metadata as well as retrieval of the actual image. VM images made available through Glance can be stored in a variety of locations from simple file systems to object-storage systems like OpenStack Swift." -set name=pkg.human-version value="Havana $(COMPONENT_VERSION)" +set name=pkg.human-version value="Juno $(COMPONENT_VERSION)" set name=com.oracle.info.description value="Glance, the OpenStack image service" -set name=com.oracle.info.tpno value=17717 +set name=com.oracle.info.tpno value=$(TPNO) set name=info.classification \ value="org.opensolaris.category.2008:System/Administration and Configuration" \ value="org.opensolaris.category.2008:System/Enterprise Management" \ @@ -39,9 +39,11 @@ set name=info.source-url value=$(COMPONENT_ARCHIVE_URL) set name=info.upstream value="OpenStack " set name=info.upstream-url value=$(COMPONENT_PROJECT_URL) +set name=openstack.upgrade-id reboot-needed=true value=$(COMPONENT_BE_VERSION) set name=org.opensolaris.arc-caseid value=PSARC/2013/350 value=PSARC/2014/055 \ - value=PSARC/2014/207 + value=PSARC/2014/207 value=PSARC/2015/110 set name=org.opensolaris.consolidation value=$(CONSOLIDATION) +# dir path=etc/glance owner=glance group=glance mode=0700 file etc/glance-api-paste.ini path=etc/glance/glance-api-paste.ini \ owner=glance group=glance mode=0644 overlay=allow preserve=renamenew @@ -55,10 +57,67 @@ owner=glance group=glance mode=0644 overlay=allow preserve=renamenew file files/glance-scrubber.conf path=etc/glance/glance-scrubber.conf \ owner=glance group=glance mode=0644 overlay=allow preserve=renamenew +file etc/glance-swift.conf.sample path=etc/glance/glance-swift.conf \ + owner=glance group=glance mode=0644 overlay=allow preserve=renamenew file etc/logging.cnf.sample path=etc/glance/logging.conf owner=glance \ group=glance mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/README path=etc/glance/metadefs/README +file etc/metadefs/compute-aggr-disk-filter.json \ + path=etc/glance/metadefs/compute-aggr-disk-filter.json owner=glance \ + group=glance mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-aggr-iops-filter.json \ + path=etc/glance/metadefs/compute-aggr-iops-filter.json owner=glance \ + group=glance mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-aggr-num-instances.json \ + path=etc/glance/metadefs/compute-aggr-num-instances.json owner=glance \ + group=glance mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-guest-shutdown.json \ + path=etc/glance/metadefs/compute-guest-shutdown.json owner=glance \ + group=glance mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-host-capabilities.json \ + path=etc/glance/metadefs/compute-host-capabilities.json owner=glance \ + group=glance mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-hypervisor.json \ + path=etc/glance/metadefs/compute-hypervisor.json owner=glance \ + group=glance mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-instance-data.json \ + path=etc/glance/metadefs/compute-instance-data.json owner=glance \ + group=glance mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-libvirt.json \ + path=etc/glance/metadefs/compute-libvirt.json owner=glance group=glance \ + mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-quota.json \ + path=etc/glance/metadefs/compute-quota.json owner=glance group=glance \ + mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-randomgen.json \ + path=etc/glance/metadefs/compute-randomgen.json owner=glance group=glance \ + mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-trust.json \ + path=etc/glance/metadefs/compute-trust.json owner=glance group=glance \ + mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-vcputopology.json \ + path=etc/glance/metadefs/compute-vcputopology.json owner=glance \ + group=glance mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-vmware.json \ + path=etc/glance/metadefs/compute-vmware.json owner=glance group=glance \ + mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-watchdog.json \ + path=etc/glance/metadefs/compute-watchdog.json owner=glance group=glance \ + mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/compute-xenapi.json \ + path=etc/glance/metadefs/compute-xenapi.json owner=glance group=glance \ + mode=0644 overlay=allow preserve=renamenew +file etc/metadefs/glance-common-image-props.json \ + path=etc/glance/metadefs/glance-common-image-props.json owner=glance \ + group=glance mode=0644 overlay=allow preserve=renamenew file etc/policy.json path=etc/glance/policy.json owner=glance group=glance \ mode=0644 overlay=allow preserve=renamenew +file etc/property-protections-policies.conf.sample \ + path=etc/glance/property-protections-policies.conf owner=glance \ + group=glance mode=0644 overlay=allow preserve=renamenew +file etc/property-protections-roles.conf.sample \ + path=etc/glance/property-protections-roles.conf owner=glance group=glance \ + mode=0644 overlay=allow preserve=renamenew file etc/schema-image.json path=etc/glance/schema-image.json owner=glance \ group=glance file files/glance.auth_attr \ @@ -67,14 +126,17 @@ path=etc/security/exec_attr.d/cloud:openstack:glance group=sys file files/glance.prof_attr \ path=etc/security/prof_attr.d/cloud:openstack:glance group=sys +file files/glance.user_attr path=etc/user_attr.d/cloud:openstack:glance \ + group=sys file path=lib/svc/manifest/application/openstack/glance-api.xml file path=lib/svc/manifest/application/openstack/glance-db.xml file path=lib/svc/manifest/application/openstack/glance-registry.xml -file files/glance-scrubber.xml \ - path=lib/svc/manifest/application/openstack/glance-scrubber.xml +file path=lib/svc/manifest/application/openstack/glance-scrubber.xml +file path=lib/svc/manifest/application/openstack/glance-upgrade.xml file files/glance-api path=lib/svc/method/glance-api file files/glance-registry path=lib/svc/method/glance-registry file files/glance-scrubber path=lib/svc/method/glance-scrubber +file files/glance-upgrade path=lib/svc/method/glance-upgrade file path=usr/bin/glance-cache-manage file path=usr/bin/glance-cache-prefetcher file path=usr/bin/glance-manage @@ -91,6 +153,7 @@ file path=usr/lib/python$(PYVER)/vendor-packages/glance-$(COMPONENT_VERSION)-py$(PYVER).egg-info/dependency_links.txt file path=usr/lib/python$(PYVER)/vendor-packages/glance-$(COMPONENT_VERSION)-py$(PYVER).egg-info/entry_points.txt file path=usr/lib/python$(PYVER)/vendor-packages/glance-$(COMPONENT_VERSION)-py$(PYVER).egg-info/not-zip-safe +file path=usr/lib/python$(PYVER)/vendor-packages/glance-$(COMPONENT_VERSION)-py$(PYVER).egg-info/pbr.json file path=usr/lib/python$(PYVER)/vendor-packages/glance-$(COMPONENT_VERSION)-py$(PYVER).egg-info/requires.txt file path=usr/lib/python$(PYVER)/vendor-packages/glance-$(COMPONENT_VERSION)-py$(PYVER).egg-info/top_level.txt file path=usr/lib/python$(PYVER)/vendor-packages/glance/__init__.py @@ -118,20 +181,41 @@ file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/image_members.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/image_tags.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/images.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/metadef_namespaces.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/metadef_objects.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/metadef_properties.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/metadef_resource_types.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/model/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/model/metadef_namespace.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/model/metadef_object.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/model/metadef_property_item_type.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/model/metadef_property_type.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/model/metadef_resource_type.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/router.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/schemas.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/tasks.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/versions.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/async/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/async/eventlet_executor.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/api.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/api.py \ + pkg.depend.bypass-generate=.*/glance_store.* \ + pkg.depend.bypass-generate=.*/osprofiler.* file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/cache_cleaner.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/cache_manage.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/cache_prefetcher.py +file \ + path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/cache_prefetcher.py \ + pkg.depend.bypass-generate=.*/glance_store.* file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/cache_pruner.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/control.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/manage.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/registry.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/replicator.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/scrubber.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/manage.py \ + pkg.depend.bypass-generate=.*/oslo/db.* +file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/registry.py \ + pkg.depend.bypass-generate=.*/osprofiler.* +file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/replicator.py \ + pkg.depend.bypass-generate=.*/six.* +file path=usr/lib/python$(PYVER)/vendor-packages/glance/cmd/scrubber.py \ + pkg.depend.bypass-generate=.*/glance_store.* file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/auth.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/client.py @@ -139,13 +223,23 @@ pkg.depend.bypass-generate=.*/paste.* file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/crypt.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/exception.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/ordereddict.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/location_strategy/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/location_strategy/location_order.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/location_strategy/store_type.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/property_utils.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/rpc.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/scripts/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/scripts/image_import/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/scripts/image_import/main.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/scripts/utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/store_utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/swift_store_utils.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/utils.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/wsgi.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/wsme_utils.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/context.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/metadata.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/migration.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/registry/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/registry/api.py @@ -153,6 +247,14 @@ file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/simple/api.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/api.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/metadata.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/metadef_api/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/metadef_api/namespace.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/metadef_api/object.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/metadef_api/property.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/metadef_api/resource_type.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/metadef_api/resource_type_association.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/metadef_api/utils.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/README file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/manage.py @@ -197,12 +299,22 @@ file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/027_checksum_index.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/028_owner_index.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/029_location_meta_data_pickle_to_string.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/030_add_tasks_table.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/031_remove_duplicated_locations.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/032_add_task_info_table.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/033_add_location_status.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/034_add_virtual_size.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/035_add_metadef_tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/036_rename_metadef_schema_columns.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migration.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/models.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/models_metadef.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/domain/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/domain/proxy.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/gateway.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/hacking/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/hacking/checks.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/i18n.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/base.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/cleaner.py @@ -213,65 +325,11 @@ file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/drivers/xattr.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/prefetcher.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/pruner.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ar/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/bg_BG/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/bs/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ca/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/cs/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/da/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/de/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/en_AU/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/en_GB/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/en_US/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/es/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/es_MX/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/fi_FI/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/fil/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/fr/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/hi/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/hr/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/hu/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/id/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/it/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/it_IT/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ja/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ka_GE/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/kn/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ko/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ko_KR/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ms/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/nb/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ne/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/nl_NL/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/pl_PL/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/pt/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/pt_BR/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ro/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ru/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ru_RU/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/sk/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/sl_SI/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/sw_KE/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/tl/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/tl_PH/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/tr/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/tr_TR/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/uk/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/vi_VN/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/zh_CN/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/zh_HK/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/zh_TW/LC_MESSAGES/glance.po -file path=usr/lib/python$(PYVER)/vendor-packages/glance/notifier/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/notifier/notify_kombu.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/notifier/notify_log.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/notifier/notify_noop.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/notifier/notify_qpid.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/notifier/strategy.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/location.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/notifier.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/README file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/context.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/eventlet_backdoor.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/excutils.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/fileutils.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/gettextutils.py @@ -280,23 +338,14 @@ file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/local.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/lockutils.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/log.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/loopingcall.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/network_utils.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/api.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/log_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/no_op_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/rabbit_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/rpc_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/rpc_notifier2.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/test_notifier.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/policy.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/processutils.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/service.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/strutils.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/threadgroup.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/test.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/timeutils.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/uuidutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/units.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/opts.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/quota/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/registry/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/registry/api/__init__.py @@ -313,83 +362,113 @@ file path=usr/lib/python$(PYVER)/vendor-packages/glance/registry/client/v2/api.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/registry/client/v2/client.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/schema.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/base.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/cinder.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/filesystem.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/gridfs.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/http.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/location.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/rbd.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/s3.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/scrubber.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/sheepdog.py -file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/swift.py +file path=usr/lib/python$(PYVER)/vendor-packages/glance/scrubber.py file path=usr/lib/python$(PYVER)/vendor-packages/glance/version.py dir path=var/lib/glance owner=glance group=glance mode=0700 dir path=var/log/glance owner=glance group=glance mode=0700 +# group groupname=glance gid=82 user username=glance ftpuser=false gcos-field="Openstack Glance" group=glance \ home-dir=/var/lib/glance uid=82 +# license glance.license license="Apache v2.0" # force a group dependency on the optional anyjson; pkgdepend work is needed to # flush this out. -depend type=group fmri=library/python-2/anyjson-26 +depend type=group fmri=library/python-2/anyjson-$(PYV) + +# force a group dependency on the optional dnspython; pkgdepend work is needed +# to flush this out. +depend type=group fmri=library/python/dnspython-$(PYV) -# force a group dependency on the optional swiftclient; pkgdepend work is needed +# force a group dependency on the optional pysendfile; pkgdepend work is needed # to flush this out. -depend type=group fmri=library/python/swiftclient-26 +depend type=group fmri=library/python/pysendfile-$(PYV) + +# force a group dependency on the optional simplejson; pkgdepend work is needed +# to flush this out. +depend type=group fmri=library/python-2/simplejson-$(PYV) # force a dependency on argparse; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/argparse-26 +depend type=require fmri=library/python-2/argparse-$(PYV) -# force a dependency on boto; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/boto-26 +# force a dependency on babel; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python-2/babel-$(PYV) -# force a dependency on greenlet; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/greenlet-26 +# force a dependency on glance_store; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/glance_store-$(PYV) # force a dependency on httplib2; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/httplib2-26 +depend type=require fmri=library/python-2/httplib2-$(PYV) + +# force a dependency on iso8601; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/iso8601-$(PYV) # force a dependency on jsonschema; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/jsonschema-26 +depend type=require fmri=library/python-2/jsonschema-$(PYV) + +# force a dependency on keystoneclient; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/keystoneclient-$(PYV) + +# force a dependency on keystonemiddleware; used via a paste.deploy filter +depend type=require fmri=library/python/keystonemiddleware-$(PYV) + +# force a dependency on netaddr; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python-2/netaddr-$(PYV) + +# force a dependency on ordereddict; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python-2/ordereddict-$(PYV) -# force a dependency on kombu; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/kombu-26 +# force a dependency on oslo.db; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/oslo.db-$(PYV) + +# force a dependency on oslo.i18n; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/oslo.i18n-$(PYV) + +# force a dependency on oslo.messaging; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/oslo.messaging-$(PYV) + +# force a dependency on oslo.utils; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/oslo.utils-$(PYV) + +# force a dependency on osprofiler; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/osprofiler-$(PYV) # force a dependency on paste; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/paste-26 +depend type=require fmri=library/python-2/paste-$(PYV) # force a dependency on paste.deploy; pkgdepend work is needed to flush this # out. -depend type=require fmri=library/python-2/paste.deploy-26 +depend type=require fmri=library/python-2/paste.deploy-$(PYV) + +# force a dependency on pbr; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/pbr-$(PYV) + +# force a dependency on posix_ipc; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/posix_ipc-$(PYV) # force a dependency on pyopenssl; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/pyopenssl-26 +depend type=require fmri=library/python-2/pyopenssl-$(PYV) + +# force a dependency on retrying; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/retrying-$(PYV) # force a dependency on routes; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/routes-26 +depend type=require fmri=library/python-2/routes-$(PYV) -# force a dependency on sqlalchemy; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/sqlalchemy-26 +# force a dependency on six; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/six-$(PYV) + +# force a dependency on stevedore; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python-2/stevedore-$(PYV) # force a dependency on webob; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/webob-26 - -# force a dependency on cinderclient; pkgdepend work is needed to flush this -# out. -depend type=require fmri=library/python/cinderclient-26 - -# force a dependency on iso8601; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/iso8601-26 +depend type=require fmri=library/python-2/webob-$(PYV) -# force a dependency on keystoneclient; used via a paste.deploy filter -depend type=require fmri=library/python/keystoneclient-26 +# force a dependency on wsme; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/wsme-$(PYV) -# force a dependency on pbr; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/pbr-26 - -# force a dependency on six; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/six-26 +# force a dependency on xattr; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/xattr-$(PYV) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/patches/01-nopycrypto.patch --- a/components/openstack/glance/patches/01-nopycrypto.patch Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/glance/patches/01-nopycrypto.patch Mon Apr 20 12:35:51 2015 -0700 @@ -4,10 +4,10 @@ Convert urlsafe_encrypt() and urlsafe_decrypt() to use M2Crypto instead of PyCrypto. ---- glance-2013.2.3/glance/common/crypt.py.orig 2014-04-03 11:43:55.000000000 -0700 -+++ glance-2013.2.3/glance/common/crypt.py 2014-05-19 03:47:07.005226253 -0700 -@@ -4,6 +4,8 @@ - # Copyright 2011 OpenStack LLC. +--- glance-2014.2.2/glance/common/crypt.py.~1~ 2014-08-07 12:01:58.000000000 -0700 ++++ glance-2014.2.2/glance/common/crypt.py 2014-08-09 21:36:53.351345980 -0700 +@@ -3,6 +3,8 @@ + # Copyright 2011 OpenStack Foundation # All Rights Reserved. # +# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. @@ -15,7 +15,7 @@ # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at -@@ -21,10 +23,26 @@ +@@ -20,10 +22,26 @@ """ import base64 @@ -45,7 +45,7 @@ def urlsafe_encrypt(key, plaintext, blocksize=16): -@@ -36,20 +54,12 @@ +@@ -35,20 +53,12 @@ :returns : Resulting ciphertext """ @@ -70,7 +70,7 @@ return base64.urlsafe_b64encode(init_vector + padded) -@@ -63,6 +73,7 @@ +@@ -62,6 +72,7 @@ """ # Cast from unicode ciphertext = base64.urlsafe_b64decode(str(ciphertext)) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/patches/02-zfs-uar-formats.patch --- a/components/openstack/glance/patches/02-zfs-uar-formats.patch Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/glance/patches/02-zfs-uar-formats.patch Mon Apr 20 12:35:51 2015 -0700 @@ -1,20 +1,23 @@ In-house patch to add 'uar' and 'zfs' container and disk formats to registered image types. Patch has not yet been submitted upstream. ---- glance-2013.2.3/glance/domain/__init__.py.orig 2014-04-03 11:43:55.000000000 -0700 -+++ glance-2013.2.3/glance/domain/__init__.py 2014-04-10 00:27:51.161800689 -0700 -@@ -23,12 +23,12 @@ - +--- glance-2014.2.2/glance/common/config.py.orig 2014-06-16 14:14:21.107758750 -0600 ++++ glance-2014.2.2/glance/common/config.py 2014-06-16 14:14:34.374672756 -0600 +@@ -41,14 +41,14 @@ + ] image_format_opts = [ cfg.ListOpt('container_formats', -- default=['ami', 'ari', 'aki', 'bare', 'ovf'], -+ default=['ami', 'ari', 'aki', 'bare', 'ovf', 'uar'], +- default=['ami', 'ari', 'aki', 'bare', 'ovf', 'ova'], ++ default=['ami', 'ari', 'aki', 'bare', 'ovf', 'ova', 'uar'], help=_("Supported values for the 'container_format' " - "image attribute")), + "image attribute"), + deprecated_opts=[cfg.DeprecatedOpt('container_formats', + group='DEFAULT')]), cfg.ListOpt('disk_formats', default=['ami', 'ari', 'aki', 'vhd', 'vmdk', 'raw', 'qcow2', - 'vdi', 'iso'], + 'vdi', 'iso', 'zfs'], help=_("Supported values for the 'disk_format' " - "image attribute")), - ] + "image attribute"), + deprecated_opts=[cfg.DeprecatedOpt('disk_formats', + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/patches/03-CVE-2014-0162.patch --- a/components/openstack/glance/patches/03-CVE-2014-0162.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,219 +0,0 @@ -This proposed upstream patch addresses CVE-2014-0162 and is tracked -under Launchpad bug 1298698. Although it's been addressed in Icehouse -2014.1, the patch below is still not yet released for Havana. - -commit 13069a4017d36a549576a21ca3ec5b15c411effc -Author: Zhi Yan Liu -Date: Sat Mar 29 03:35:35 2014 +0800 - - To prevent remote code injection on Sheepdog store - - Change-Id: Iae92eaf9eb023f36a1bab7c20ea41c985f2bf51b - Signed-off-by: Zhi Yan Liu - -diff --git a/glance/store/sheepdog.py b/glance/store/sheepdog.py -index d10aea7..2f75441 100644 ---- a/glance/store/sheepdog.py -+++ b/glance/store/sheepdog.py -@@ -25,6 +25,7 @@ from glance.common import exception - from glance.openstack.common import excutils - import glance.openstack.common.log as logging - from glance.openstack.common import processutils -+from glance.openstack.common import uuidutils - import glance.store - import glance.store.base - import glance.store.location -@@ -32,7 +33,7 @@ import glance.store.location - - LOG = logging.getLogger(__name__) - --DEFAULT_ADDR = 'localhost' -+DEFAULT_ADDR = '127.0.0.1' - DEFAULT_PORT = '7000' - DEFAULT_CHUNKSIZE = 64 # in MiB - -@@ -63,18 +64,14 @@ class SheepdogImage: - self.chunk_size = chunk_size - - def _run_command(self, command, data, *params): -- cmd = ("collie vdi %(command)s -a %(addr)s -p %(port)s %(name)s " -- "%(params)s" % -- {"command": command, -- "addr": self.addr, -- "port": self.port, -- "name": self.name, -- "params": " ".join(map(str, params))}) -+ cmd = ["collie", "vdi"] -+ cmd.extend(command) -+ cmd.extend(["-a", self.addr, "-p", self.port, self.name]) -+ cmd.extend(params) - - try: -- return processutils.execute( -- cmd, process_input=data, shell=True)[0] -- except processutils.ProcessExecutionError as exc: -+ return processutils.execute(*cmd, process_input=data)[0] -+ except (processutils.ProcessExecutionError, OSError) as exc: - LOG.error(exc) - raise glance.store.BackendException(exc) - -@@ -84,7 +81,7 @@ class SheepdogImage: - - Sheepdog Usage: collie vdi list -r -a address -p port image - """ -- out = self._run_command("list -r", None) -+ out = self._run_command(["list", "-r"], None) - return long(out.split(' ')[3]) - - def read(self, offset, count): -@@ -94,7 +91,7 @@ class SheepdogImage: - - Sheepdog Usage: collie vdi read -a address -p port image offset len - """ -- return self._run_command("read", None, str(offset), str(count)) -+ return self._run_command(["read"], None, str(offset), str(count)) - - def write(self, data, offset, count): - """ -@@ -103,7 +100,7 @@ class SheepdogImage: - - Sheepdog Usage: collie vdi write -a address -p port image offset len - """ -- self._run_command("write", data, str(offset), str(count)) -+ self._run_command(["write"], data, str(offset), str(count)) - - def create(self, size): - """ -@@ -111,7 +108,7 @@ class SheepdogImage: - - Sheepdog Usage: collie vdi create -a address -p port image size - """ -- self._run_command("create", None, str(size)) -+ self._run_command(["create"], None, str(size)) - - def delete(self): - """ -@@ -119,7 +116,7 @@ class SheepdogImage: - - Sheepdog Usage: collie vdi delete -a address -p port image - """ -- self._run_command("delete", None) -+ self._run_command(["delete"], None) - - def exist(self): - """ -@@ -127,7 +124,7 @@ class SheepdogImage: - - Sheepdog Usage: collie vdi list -r -a address -p port image - """ -- out = self._run_command("list -r", None) -+ out = self._run_command(["list", "-r"], None) - if not out: - return False - else: -@@ -138,7 +135,7 @@ class StoreLocation(glance.store.location.StoreLocation): - """ - Class describing a Sheepdog URI. This is of the form: - -- sheepdog://image -+ sheepdog://image-id - - """ - -@@ -149,10 +146,14 @@ class StoreLocation(glance.store.location.StoreLocation): - return "sheepdog://%s" % self.image - - def parse_uri(self, uri): -- if not uri.startswith('sheepdog://'): -- raise exception.BadStoreUri(uri, "URI must start with %s://" % -- 'sheepdog') -- self.image = uri[11:] -+ valid_schema = 'sheepdog://' -+ if not uri.startswith(valid_schema): -+ raise exception.BadStoreUri(_("URI must start with %s://") % -+ valid_schema) -+ self.image = uri[len(valid_schema):] -+ if not uuidutils.is_uuid_like(self.image): -+ raise exception.BadStoreUri(_("URI must contains well-formated " -+ "image id")) - - - class ImageIterator(object): -@@ -192,7 +193,7 @@ class Store(glance.store.base.Store): - - try: - self.chunk_size = CONF.sheepdog_store_chunk_size * 1024 * 1024 -- self.addr = CONF.sheepdog_store_address -+ self.addr = CONF.sheepdog_store_address.strip() - self.port = CONF.sheepdog_store_port - except cfg.ConfigFileValueError as e: - reason = _("Error in store configuration: %s") % e -@@ -200,10 +201,18 @@ class Store(glance.store.base.Store): - raise exception.BadStoreConfiguration(store_name='sheepdog', - reason=reason) - -+ if ' ' in self.addr: -+ reason = (_("Invalid address configuration of sheepdog store: %s") -+ % self.addr) -+ LOG.error(reason) -+ raise exception.BadStoreConfiguration(store_name='sheepdog', -+ reason=reason) -+ - try: -- processutils.execute("collie", shell=True) -- except processutils.ProcessExecutionError as exc: -- reason = _("Error in store configuration: %s") % exc -+ cmd = ["collie", "vdi", "list", "-a", self.addr, "-p", self.port] -+ processutils.execute(*cmd) -+ except Exception as e: -+ reason = _("Error in store configuration: %s") % e - LOG.error(reason) - raise exception.BadStoreConfiguration(store_name='sheepdog', - reason=reason) -diff --git a/glance/tests/unit/test_sheepdog_store.py b/glance/tests/unit/test_sheepdog_store.py -index 8eef86b..bea7e29 100644 ---- a/glance/tests/unit/test_sheepdog_store.py -+++ b/glance/tests/unit/test_sheepdog_store.py -@@ -57,4 +57,5 @@ class TestStore(base.StoreClearingUnitTest): - 'fake_image_id', - utils.LimitingReader(StringIO.StringIO('xx'), 1), - 2) -- self.assertEqual(called_commands, ['list -r', 'create', 'delete']) -+ self.assertEqual([['list', '-r'], ['create'], ['delete']], -+ called_commands) -diff --git a/glance/tests/unit/test_store_location.py b/glance/tests/unit/test_store_location.py -index 7eec171..2464ebb 100644 ---- a/glance/tests/unit/test_store_location.py -+++ b/glance/tests/unit/test_store_location.py -@@ -52,7 +52,7 @@ class TestStoreLocation(base.StoreClearingUnitTest): - 'rbd://imagename', - 'rbd://fsid/pool/image/snap', - 'rbd://%2F/%2F/%2F/%2F', -- 'sheepdog://imagename', -+ 'sheepdog://244e75f1-9c69-4167-9db7-1aa7d1973f6c', - 'cinder://12345678-9012-3455-6789-012345678901', - ] - -@@ -367,15 +367,18 @@ class TestStoreLocation(base.StoreClearingUnitTest): - """ - Test the specific StoreLocation for the Sheepdog store - """ -- uri = 'sheepdog://imagename' -+ uri = 'sheepdog://244e75f1-9c69-4167-9db7-1aa7d1973f6c' - loc = glance.store.sheepdog.StoreLocation({}) - loc.parse_uri(uri) -- self.assertEqual('imagename', loc.image) -+ self.assertEqual('244e75f1-9c69-4167-9db7-1aa7d1973f6c', loc.image) - -- bad_uri = 'sheepdog:/image' -+ bad_uri = 'sheepdog:/244e75f1-9c69-4167-9db7-1aa7d1973f6c' - self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri) - -- bad_uri = 'http://image' -+ bad_uri = 'http://244e75f1-9c69-4167-9db7-1aa7d1973f6c' -+ self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri) -+ -+ bad_uri = 'image; name' - self.assertRaises(exception.BadStoreUri, loc.parse_uri, bad_uri) - - def test_cinder_store_good_location(self): diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/patches/03-Partial_Content.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/glance/patches/03-Partial_Content.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,79 @@ +Provide for HTTP Range requests in Glance API, and return correct 206 +Partial Content. + +See community bugs: + https://bugs.launchpad.net/glance/+bug/1399851 + https://bugs.launchpad.net/glance/+bug/1417069 + +--- glance-2014.2.2/glance/api/v2/image_data.py.~1~ 2015-02-05 07:19:44.000000000 -0800 ++++ glance-2014.2.2/glance/api/v2/image_data.py 2015-02-23 14:04:17.091921881 -0800 +@@ -199,6 +199,8 @@ class ResponseSerializer(wsgi.JSONRespon + + def download(self, response, image): + offset, chunk_size = 0, None ++ ++ # Initially attempt to get "Content-Range" request + range_val = response.request.get_content_range() + + if range_val: +@@ -210,6 +212,21 @@ class ResponseSerializer(wsgi.JSONRespon + if range_val.stop is not None: + chunk_size = range_val.stop - offset + ++ # Return 206 Partial Content ++ response.status_int = 206 ++ else: ++ # Try for "Range" request header if ContentRange not present ++ range_obj = response.request.get_range() ++ if range_obj: ++ if range_obj.start is not None: ++ offset = range_obj.start ++ ++ if range_obj.end is not None: ++ chunk_size = range_obj.end - offset ++ ++ # Return 206 Partial Content ++ response.status_int = 206 ++ + response.headers['Content-Type'] = 'application/octet-stream' + + try: +@@ -229,7 +246,9 @@ class ResponseSerializer(wsgi.JSONRespon + response.headers['Content-MD5'] = image.checksum + #NOTE(markwash): "response.app_iter = ..." also erroneously resets the + # content-length +- response.headers['Content-Length'] = str(image.size) ++ # NOTE(mattk): Should be set to chunk_size or image.size ++ response.headers['Content-Length'] = \ ++ str(chunk_size) if chunk_size != 0 else str(image.size) + + def upload(self, response, result): + response.status_int = 204 +--- glance-2014.2.2/glance/common/wsgi.py.~1~ 2015-02-05 07:19:44.000000000 -0800 ++++ glance-2014.2.2/glance/common/wsgi.py 2015-02-23 14:04:17.092284573 -0800 +@@ -556,7 +556,7 @@ class Request(webob.Request): + return self.accept_language.best_match(langs) + + def get_content_range(self): +- """Return the `Range` in a request.""" ++ """Return the `Content-Range` in a request.""" + range_str = self.headers.get('Content-Range') + if range_str is not None: + range_ = webob.byterange.ContentRange.parse(range_str) +@@ -565,6 +565,16 @@ class Request(webob.Request): + raise webob.exc.HTTPBadRequest(explanation=msg) + return range_ + ++ def get_range(self): ++ """Return the 'Range' in a reqyest.""" ++ range_str = self.headers.get('Range') ++ if range_str is not None: ++ range_ = webob.byterange.Range.parse(range_str) ++ if range_ is None: ++ msg = _('Malformed Range header: %s') % range_str ++ raise webob.exc.HTTPBadRequest(explanation=msg) ++ return range_ ++ + + class JSONRequestDeserializer(object): + def has_body(self, request): diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/patches/04-requirements.patch --- a/components/openstack/glance/patches/04-requirements.patch Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/glance/patches/04-requirements.patch Mon Apr 20 12:35:51 2015 -0700 @@ -1,71 +1,93 @@ In-house patch to remove unnecessary dependencies from Glance's requirements files. The specific reasons are as follows: -lxml No longer applicable - (upstream commit b7f9120cd4623d8284c4edfea760ef10e1193492) +boto Not applicable + +cinderclient Not applicable -passlib No longer applicable - (upstream commit b31874284212d49560ddf4f36e5c9ca5d221f605) +greenlet Not applicable + +kombu Not applicable + +oslo.vmware Not applicable pycrypto Not applicable to Solaris (M2Crypto used instead) -wsgiref No longer applicable - (upstream commit b31874284212d49560ddf4f36e5c9ca5d221f605) +swiftclient Not applicable ---- glance-2013.2.3/glance.egg-info/requires.txt.orig 2014-04-03 11:46:54.000000000 -0700 -+++ glance-2013.2.3/glance.egg-info/requires.txt 2014-05-24 23:04:42.210143004 -0700 -@@ -6,20 +6,16 @@ - PasteDeploy>=1.5.0 - Routes>=1.12.3 - WebOb>=1.2.3,<1.3 --wsgiref>=0.1.2 - boto>=2.4.0,!=2.13.0 - sqlalchemy-migrate>=0.7.2 - httplib2 - kombu>=2.4.8 +--- glance-2014.2.2/glance.egg-info/requires.txt.~1~ 2015-02-05 07:21:46.000000000 -0800 ++++ glance-2014.2.2/glance.egg-info/requires.txt 2015-02-23 14:39:12.013101917 -0800 +@@ -1,5 +1,4 @@ + pbr>=0.6,!=0.7,<1.0 +-greenlet>=0.3.2 + SQLAlchemy>=0.8.4,<=0.9.99,!=0.9.0,!=0.9.1,!=0.9.2,!=0.9.3,!=0.9.4,!=0.9.5,!=0.9.6 + anyjson>=0.3.3 + eventlet>=0.15.1,<0.16.0 +@@ -7,11 +6,8 @@ PasteDeploy>=1.5.0 + Routes>=1.12.3,!=2.0 + WebOb>=1.2.3 + argparse +-boto>=2.32.1,<2.35.0 + sqlalchemy-migrate==0.9.1 + httplib2>=0.7.5 +-kombu>=2.5.0 -pycrypto>=2.6 - iso8601>=0.1.8 - oslo.config>=1.2.0 - python-swiftclient>=1.5,<2.0.0 --lxml>=2.3 + iso8601>=0.1.9 + ordereddict + oslo.config>=1.4.0 # Apache-2.0 +@@ -20,11 +16,8 @@ netaddr>=0.7.12 + keystonemiddleware>=1.0.0 + WSME>=0.6 + posix_ipc +-python-swiftclient>=2.2.0 +-oslo.vmware>=0.6.0,<0.9.0 # Apache-2.0 Paste --passlib - jsonschema>=1.3.0,!=1.4.0 - python-cinderclient>=1.0.6 - python-keystoneclient>=0.3.2 + jsonschema>=2.0.0,<3.0.0 +-python-cinderclient>=1.1.0 + python-keystoneclient>=0.10.0 pyOpenSSL>=0.11 --six>=1.4.1 -\ No newline at end of file -+six>=1.4.1 ---- glance-2013.2.3/requirements.txt.orig 2014-04-03 11:43:55.000000000 -0700 -+++ glance-2013.2.3/requirements.txt 2014-05-24 23:05:14.053235541 -0700 -@@ -12,29 +12,20 @@ - PasteDeploy>=1.5.0 - Routes>=1.12.3 - WebOb>=1.2.3,<1.3 --wsgiref>=0.1.2 + six>=1.7.0 +--- glance-2014.2.2/requirements.txt.~1~ 2015-02-05 07:19:44.000000000 -0800 ++++ glance-2014.2.2/requirements.txt 2015-02-23 14:39:03.037319077 -0800 +@@ -3,11 +3,6 @@ + # process, which may cause wedges in the gate later. + + pbr>=0.6,!=0.7,<1.0 +-# +-# The greenlet package must be compiled with gcc and needs +-# the Python.h headers. Make sure you install the python-dev +-# package to get the right headers... +-greenlet>=0.3.2 + + # < 0.8.0/0.8 does not work, see https://bugs.launchpad.net/bugs/1153983 + SQLAlchemy>=0.8.4,<=0.9.99,!=0.9.0,!=0.9.1,!=0.9.2,!=0.9.3,!=0.9.4,!=0.9.5,!=0.9.6 +@@ -17,11 +12,8 @@ PasteDeploy>=1.5.0 + Routes>=1.12.3,!=2.0 + WebOb>=1.2.3 argparse - boto>=2.4.0,!=2.13.0 - sqlalchemy-migrate>=0.7.2 - httplib2 - kombu>=2.4.8 +-boto>=2.32.1,<2.35.0 + sqlalchemy-migrate==0.9.1 + httplib2>=0.7.5 +-kombu>=2.5.0 -pycrypto>=2.6 - iso8601>=0.1.8 - oslo.config>=1.2.0 + iso8601>=0.1.9 + ordereddict + oslo.config>=1.4.0 # Apache-2.0 +@@ -32,17 +24,10 @@ WSME>=0.6 + # For openstack/common/lockutils + posix_ipc - # For Swift storage backend. - python-swiftclient>=1.5,<2.0.0 - --# Note you will need gcc buildtools installed and must --# have installed libxml headers for lxml to be successfully --# installed using pip, therefore you will need to install the --# libxml2-dev and libxslt-dev Ubuntu packages. --lxml>=2.3 +-# For Swift storage backend. +-python-swiftclient>=2.2.0 +- +-# For VMware storage backed. +-oslo.vmware>=0.6.0,<0.9.0 # Apache-2.0 - # For paste.util.template used in keystone.common.template Paste --passlib - jsonschema>=1.3.0,!=1.4.0 - python-cinderclient>=1.0.6 - python-keystoneclient>=0.3.2 + jsonschema>=2.0.0,<3.0.0 +-python-cinderclient>=1.1.0 + python-keystoneclient>=0.10.0 + pyOpenSSL>=0.11 + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/patches/05-CVE-2015-1881.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/glance/patches/05-CVE-2015-1881.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,85 @@ +Errata patch for CVE-2015-1881 +https://review.openstack.org/156553 +git fetch https://review.openstack.org/openstack/glance refs/changes/53/156553/1 && git format-patch -1 --stdout FETCH_HEAD +Fixed upstream and in a future release. +--- +From: abhishekkekane +Date: Thu, 12 Feb 2015 04:09:14 -0800 +Subject: [PATCH] Image data remains in backend for deleted image + +Trying to delete image created using task api (import-from) image gets +deleted from the database, but image data remains in the backend. Import +task does not update the location of the image and it remains None even +image becomes active. Location entry is not added in the database in +image_locations table. + +Added location information to the image before saving the image in +the database. + +SecurityImpact + +Conflicts: + glance/common/scripts/image_import/main.py + +Change-Id: Ie389de6538a9b98dc51c7d781b81b3ab10b83842 +Closes-Bug: #1420696 +(cherry picked from commit 78b5b0a9575cd5e9c4543ec0e8fd6072af1f0ebb) +--- glance-2014.2.2/glance/common/scripts/image_import/main.py ++++ glance-2014.2.2/glance/common/scripts/image_import/main.py +@@ -84,29 +84,29 @@ def import_image(image_repo, image_factory, task_input, task_id, uri): + # NOTE: set image status to saving just before setting data + original_image.status = 'saving' + image_repo.save(original_image) +- set_image_data(original_image, uri, None) +- +- # NOTE: Check if the Image is not deleted after setting the data +- # before setting it's status to active. We need to set the status +- # explicitly here using the Image object returned from image_repo .The +- # Image object returned from create_image method does not have appropriate +- # factories wrapped around it. + image_id = original_image.image_id ++ ++ # NOTE: Retrieving image from the database because the Image object ++ # returned from create_image method does not have appropriate factories ++ # wrapped around it. + new_image = image_repo.get(image_id) +- if new_image.status in ['saving']: +- new_image.status = 'active' +- new_image.size = original_image.size +- new_image.virtual_size = original_image.virtual_size +- new_image.checksum = original_image.checksum ++ set_image_data(new_image, uri, None) ++ ++ # NOTE: Check if the Image is not deleted after setting the data ++ # before saving the active image. Here if image status is ++ # saving, then new_image is saved as it contains updated location, ++ # size, virtual_size and checksum information and the status of ++ # new_image is already set to active in set_image_data() call. ++ image = image_repo.get(image_id) ++ if image.status == 'saving': ++ image_repo.save(new_image) ++ return image_id + else: + msg = _LE("The Image %(image_id)s object being created by this task " + "%(task_id)s, is no longer in valid status for further " + "processing." % {"image_id": new_image.image_id, + "task_id": task_id}) + raise exception.Conflict(msg) +- image_repo.save(new_image) +- +- return image_id + + + def create_image(image_repo, image_factory, image_properties, task_id): +--- glance-2014.2.2/glance/tests/unit/common/scripts/image_import/test_main.py ++++ glance-2014.2.2/glance/tests/unit/common/scripts/image_import/test_main.py +@@ -56,7 +56,8 @@ class TestImageImport(test_utils.BaseTestCase): + image_id, + image_import_script.import_image(image_repo, image_factory, + task_input, None, uri)) +- self.assertEqual('active', image.status) ++ # Check image is in saving state before image_repo.save called ++ self.assertEqual('saving', image.status) + self.assertTrue(image_repo.save.called) + mock_set_img_data.assert_called_once_with(image, uri, None) + self.assertTrue(image_repo.get.called) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/patches/05-launchpad-1255556.patch --- a/components/openstack/glance/patches/05-launchpad-1255556.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,119 +0,0 @@ -Although the following patch has been addressed in Icehouse 2014.1, it -still has not yet been released for Havana. It has been modified to -apply cleanly into our current Havana implementation - -commit 1f6381a73f5c99f1f731d6c4f9defb91bd2d042d -Author: Flavio Percoco -Date: Thu Nov 28 16:17:13 2013 +0100 - - Don't enable all stores by default - - Glance currently enables all stores by default. This patch changes that - by removing all stores that require manual configuration and leaving - those that work right out of the box. - - Current behavior causes a lot of confusion to users since most of those - stores print errors when they're not configured correctly. All extra - stores should be enabled explicitly by users. - - This fix makes tests use http locations. All other locations besides the - default ones should be tested in their own test suites. - - DocImpact - Closes-bug: #1255556 - Change-Id: I82073352641d3eb2ab3d6e9a6b64afc99a30dcc7 - ---- glance-2013.2.3/etc/glance-api.conf.~1~ 2014-04-03 11:43:55.000000000 -0700 -+++ glance-2013.2.3/etc/glance-api.conf 2014-05-29 13:47:44.689586507 -0700 -@@ -13,13 +13,14 @@ - - # List of which store classes and store class locations are - # currently known to glance at startup. -+# Existing but disabled stores: -+# glance.store.rbd.Store, -+# glance.store.s3.Store, -+# glance.store.swift.Store, -+# glance.store.sheepdog.Store, -+# glance.store.cinder.Store, - #known_stores = glance.store.filesystem.Store, --# glance.store.http.Store, --# glance.store.rbd.Store, --# glance.store.s3.Store, --# glance.store.swift.Store, --# glance.store.sheepdog.Store, --# glance.store.cinder.Store, -+# glance.store.http.Store - - - # Maximum image size (in bytes) that may be uploaded through the ---- glance-2013.2.3/glance/store/__init__.py.~1~ 2014-04-03 11:43:55.000000000 -0700 -+++ glance-2013.2.3/glance/store/__init__.py 2014-05-29 13:53:14.827604452 -0700 -@@ -38,12 +38,7 @@ - cfg.ListOpt('known_stores', - default=[ - 'glance.store.filesystem.Store', -- 'glance.store.http.Store', -- 'glance.store.rbd.Store', -- 'glance.store.s3.Store', -- 'glance.store.swift.Store', -- 'glance.store.sheepdog.Store', -- 'glance.store.cinder.Store', -+ 'glance.store.http.Store' - ], - help=_('List of which store classes and store class locations ' - 'are currently known to glance at startup.')), ---- glance-2013.2.3/glance/tests/unit/test_s3_store.py.~1~ 2014-04-03 11:43:55.000000000 -0700 -+++ glance-2013.2.3/glance/tests/unit/test_s3_store.py 2014-05-29 13:43:01.104336073 -0700 -@@ -41,7 +41,8 @@ - 's3_store_access_key': 'user', - 's3_store_secret_key': 'key', - 's3_store_host': 'localhost:8080', -- 's3_store_bucket': 'glance'} -+ 's3_store_bucket': 'glance', -+ 'known_stores': ['glance.store.s3.Store']} - - - # We stub out as little as possible to ensure that the code paths ---- glance-2013.2.3/glance/tests/unit/test_store_image.py.~1~ 2014-04-03 11:43:55.000000000 -0700 -+++ glance-2013.2.3/glance/tests/unit/test_store_image.py 2014-05-29 13:43:01.104846210 -0700 -@@ -20,7 +20,7 @@ - from glance.tests import utils - - --BASE_URI = 'swift+http://storeurl.com/container' -+BASE_URI = 'http://storeurl.com/container' - UUID1 = 'c80a1a6c-bd1f-41c5-90ee-81afedb1d58d' - UUID2 = '971ec09a-8067-4bc8-a91f-ae3557f1c4c7' - USER1 = '54492ba0-f4df-4e4e-be62-27f4d76b29cf' ---- glance-2013.2.3/glance/tests/unit/test_store_location.py.~2~ 2014-05-29 13:43:01.087604346 -0700 -+++ glance-2013.2.3/glance/tests/unit/test_store_location.py 2014-05-29 15:38:15.306762870 -0700 -@@ -30,6 +30,18 @@ - - def setUp(self): - self.config(default_store='file') -+ -+ # NOTE(flaper87): Each store should test -+ # this in their test suite. -+ self.config(known_stores=[ -+ "glance.store.filesystem.Store", -+ "glance.store.http.Store", -+ "glance.store.rbd.Store", -+ "glance.store.s3.Store", -+ "glance.store.swift.Store", -+ "glance.store.sheepdog.Store", -+ "glance.store.cinder.Store", -+ ]) - super(TestStoreLocation, self).setUp() - - def test_get_location_from_uri_back_to_uri(self): ---- glance-2013.2.3/glance/tests/unit/utils.py.~1~ 2014-04-03 11:43:55.000000000 -0700 -+++ glance-2013.2.3/glance/tests/unit/utils.py 2014-05-29 13:43:01.105795472 -0700 -@@ -36,7 +36,7 @@ - USER2 = '0b3b3006-cb76-4517-ae32-51397e22c754' - USER3 = '2hss8dkl-d8jh-88yd-uhs9-879sdjsd8skd' - --BASE_URI = 'swift+http://storeurl.com/container' -+BASE_URI = 'http://storeurl.com/container' - - - def get_fake_request(path='', method='POST', is_admin=False, user=USER1, diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/patches/06-CVE-2014-5356.patch --- a/components/openstack/glance/patches/06-CVE-2014-5356.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,187 +0,0 @@ -Upstream patch to fix CVE-2014-5356. This fix will be included in -future 2013.2.4 and 2014.1.3 releases. - -From 12f43cfed5a47cd16f08b7dad2424da0fc362e47 Mon Sep 17 00:00:00 2001 -From: Tom Leaman -Date: Fri, 2 May 2014 10:09:20 +0000 -Subject: [PATCH] Enforce image_size_cap on v2 upload - -image_size_cap should be checked and enforced on upload - -Enforcement is in two places: -- on image metadata save -- during image save to backend store - -(cherry picked from commit 92ab00fca6926eaf3f7f92a955a5e07140063718) -Conflicts: - glance/location.py - glance/tests/functional/v2/test_images.py - glance/tests/unit/test_store_image.py - -Closes-Bug: 1315321 -Change-Id: I45bfb360703617bc394e9e27fe17adf43b09c0e1 -Co-Author: Manuel Desbonnet ---- - glance/db/__init__.py | 5 ++++ - glance/store/__init__.py | 5 +++- - glance/tests/functional/__init__.py | 2 ++ - glance/tests/functional/v2/test_images.py | 42 +++++++++++++++++++++++++++++ - glance/tests/unit/test_store_image.py | 6 +++-- - glance/tests/unit/utils.py | 5 +++- - 6 files changed, 61 insertions(+), 4 deletions(-) - -diff --git a/glance/db/__init__.py b/glance/db/__init__.py -index 56f4dac..8ac3606 100644 ---- a/glance/db/__init__.py -+++ b/glance/db/__init__.py -@@ -32,6 +32,7 @@ db_opt = cfg.BoolOpt('use_tpool', - 'all DB API calls') - - CONF = cfg.CONF -+CONF.import_opt('image_size_cap', 'glance.common.config') - CONF.import_opt('metadata_encryption_key', 'glance.common.config') - CONF.register_opt(db_opt) - -@@ -148,6 +149,8 @@ class ImageRepo(object): - - def add(self, image): - image_values = self._format_image_to_db(image) -+ if image_values['size'] > CONF.image_size_cap: -+ raise exception.ImageSizeLimitExceeded - # the updated_at value is not set in the _format_image_to_db - # function since it is specific to image create - image_values['updated_at'] = image.updated_at -@@ -159,6 +162,8 @@ class ImageRepo(object): - - def save(self, image): - image_values = self._format_image_to_db(image) -+ if image_values['size'] > CONF.image_size_cap: -+ raise exception.ImageSizeLimitExceeded - try: - new_values = self.db_api.image_update(self.context, - image.image_id, -diff --git a/glance/store/__init__.py b/glance/store/__init__.py -index fa17f4b..fd25e27 100644 ---- a/glance/store/__init__.py -+++ b/glance/store/__init__.py -@@ -646,7 +646,10 @@ class ImageProxy(glance.domain.proxy.Image): - size = 0 # NOTE(markwash): zero -> unknown size - location, size, checksum, loc_meta = self.store_api.add_to_backend( - self.context, CONF.default_store, -- self.image.image_id, utils.CooperativeReader(data), size) -+ self.image.image_id, -+ utils.LimitingReader(utils.CooperativeReader(data), -+ CONF.image_size_cap), -+ size) - self.image.locations = [{'url': location, 'metadata': loc_meta}] - self.image.size = size - self.image.checksum = checksum -diff --git a/glance/tests/functional/__init__.py b/glance/tests/functional/__init__.py -index 1256133..18a1a7e 100644 ---- a/glance/tests/functional/__init__.py -+++ b/glance/tests/functional/__init__.py -@@ -279,6 +279,7 @@ class ApiServer(Server): - self.pid_file = pid_file or os.path.join(self.test_dir, "api.pid") - self.scrubber_datadir = os.path.join(self.test_dir, "scrubber") - self.log_file = os.path.join(self.test_dir, "api.log") -+ self.image_size_cap = 1099511627776 - self.s3_store_host = "s3.amazonaws.com" - self.s3_store_access_key = "" - self.s3_store_secret_key = "" -@@ -332,6 +333,7 @@ metadata_encryption_key = %(metadata_encryption_key)s - registry_host = 127.0.0.1 - registry_port = %(registry_port)s - log_file = %(log_file)s -+image_size_cap = %(image_size_cap)d - s3_store_host = %(s3_store_host)s - s3_store_access_key = %(s3_store_access_key)s - s3_store_secret_key = %(s3_store_secret_key)s -diff --git a/glance/tests/functional/v2/test_images.py b/glance/tests/functional/v2/test_images.py -index a9f9147..c25d4e2 100644 ---- a/glance/tests/functional/v2/test_images.py -+++ b/glance/tests/functional/v2/test_images.py -@@ -259,6 +259,48 @@ class TestImages(functional.FunctionalTest): - - self.stop_servers() - -+ def test_image_size_cap(self): -+ self.api_server.image_size_cap = 128 -+ self.start_servers(**self.__dict__.copy()) -+ # create an image -+ path = self._url('/v2/images') -+ headers = self._headers({'content-type': 'application/json'}) -+ data = json.dumps({'name': 'image-size-cap-test-image', -+ 'type': 'kernel', 'disk_format': 'aki', -+ 'container_format': 'aki'}) -+ response = requests.post(path, headers=headers, data=data) -+ self.assertEqual(201, response.status_code) -+ -+ image = json.loads(response.text) -+ image_id = image['id'] -+ -+ #try to populate it with oversized data -+ path = self._url('/v2/images/%s/file' % image_id) -+ headers = self._headers({'Content-Type': 'application/octet-stream'}) -+ -+ class StreamSim(object): -+ # Using a one-shot iterator to force chunked transfer in the PUT -+ # request -+ def __init__(self, size): -+ self.size = size -+ -+ def __iter__(self): -+ yield 'Z' * self.size -+ -+ response = requests.put(path, headers=headers, data=StreamSim( -+ self.api_server.image_size_cap + 1)) -+ self.assertEqual(413, response.status_code) -+ -+ # hashlib.md5('Z'*129).hexdigest() -+ # == '76522d28cb4418f12704dfa7acd6e7ee' -+ # If the image has this checksum, it means that the whole stream was -+ # accepted and written to the store, which should not be the case. -+ path = self._url('/v2/images/{0}'.format(image_id)) -+ headers = self._headers({'content-type': 'application/json'}) -+ response = requests.get(path, headers=headers) -+ image_checksum = json.loads(response.text).get('checksum') -+ self.assertNotEqual(image_checksum, '76522d28cb4418f12704dfa7acd6e7ee') -+ - def test_permissions(self): - # Create an image that belongs to TENANT1 - path = self._url('/v2/images') -diff --git a/glance/tests/unit/test_store_image.py b/glance/tests/unit/test_store_image.py -index f9f5d85..5bdd51e 100644 ---- a/glance/tests/unit/test_store_image.py -+++ b/glance/tests/unit/test_store_image.py -@@ -126,8 +126,10 @@ class TestStoreImage(utils.BaseTestCase): - - self.stubs.Set(unit_test_utils.FakeStoreAPI, 'get_from_backend', - fake_get_from_backend) -- -- self.assertEquals(image1.get_data().fd, 'ZZZ') -+ # This time, image1.get_data() returns the data wrapped in a -+ # LimitingReader|CooperativeReader pipeline, so peeking under -+ # the hood of those objects to get at the underlying string. -+ self.assertEquals(image1.get_data().data.fd, 'ZZZ') - image1.locations.pop(0) - self.assertEquals(len(image1.locations), 1) - image2.delete() -diff --git a/glance/tests/unit/utils.py b/glance/tests/unit/utils.py -index dff87b1..ec62828 100644 ---- a/glance/tests/unit/utils.py -+++ b/glance/tests/unit/utils.py -@@ -149,7 +149,10 @@ class FakeStoreAPI(object): - if image_id in location: - raise exception.Duplicate() - if not size: -- size = len(data.fd) -+ # 'data' is a string wrapped in a LimitingReader|CooperativeReader -+ # pipeline, so peek under the hood of those objects to get at the -+ # string itself. -+ size = len(data.data.fd) - if (current_store_size + size) > store_max_size: - raise exception.StorageFull() - if context.user == USER2: --- -1.7.9.5 - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/patches/06-CVE-2014-9684.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/glance/patches/06-CVE-2014-9684.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,82 @@ +Errata patch for CVE-2014-9684 +https://review.openstack.org/157067 +git fetch https://review.openstack.org/openstack/glance refs/changes/67/157067/3 && git format-patch -1 --stdout FETCH_HEAD +Fixed upstream and in a future release. +--- +From: Mike Fedosin +Date: Thu, 18 Sep 2014 18:07:42 +0400 +Subject: [PATCH] Initiate deletion of image files if the import was + interrupted + +If the image is deleted by appropriate API call while its content +is still being uploaded in import task in v2, an exception is raised +and it is not handled in the API code. This leads to the fact that +the uploaded image file stays in a storage and clogs it. + +There existed code that safely removes image files if the exception +occurs. + +SecurityImpact + +Conflicts: + glance/common/scripts/image_import/main.py + +Closes-Bug: 1371118 +Change-Id: I4f7d1aa103f4ce7abf4026e7097b9e76c24135fa +(cherry picked from commit 7858d4d95154c8596720365e465cca7858cfec5c) +--- glance-2014.2.2/glance/common/scripts/image_import/main.py ++++ glance-2014.2.2/glance/common/scripts/image_import/main.py +@@ -22,6 +22,7 @@ import six + from glance.api.v2 import images as v2_api + from glance.common import exception + from glance.common.scripts import utils as script_utils ++from glance.common import store_utils + from glance.common import utils as common_utils + from glance import i18n + from glance.openstack.common import excutils +@@ -92,21 +93,30 @@ def import_image(image_repo, image_factory, task_input, task_id, uri): + new_image = image_repo.get(image_id) + set_image_data(new_image, uri, None) + +- # NOTE: Check if the Image is not deleted after setting the data +- # before saving the active image. Here if image status is +- # saving, then new_image is saved as it contains updated location, +- # size, virtual_size and checksum information and the status of +- # new_image is already set to active in set_image_data() call. +- image = image_repo.get(image_id) +- if image.status == 'saving': +- image_repo.save(new_image) +- return image_id +- else: +- msg = _LE("The Image %(image_id)s object being created by this task " +- "%(task_id)s, is no longer in valid status for further " +- "processing." % {"image_id": new_image.image_id, +- "task_id": task_id}) +- raise exception.Conflict(msg) ++ try: ++ # NOTE: Check if the Image is not deleted after setting the data ++ # before saving the active image. Here if image status is ++ # saving, then new_image is saved as it contains updated location, ++ # size, virtual_size and checksum information and the status of ++ # new_image is already set to active in set_image_data() call. ++ image = image_repo.get(image_id) ++ if image.status == 'saving': ++ image_repo.save(new_image) ++ return image_id ++ else: ++ msg = _("The Image %(image_id)s object being created by this task " ++ "%(task_id)s, is no longer in valid status for further " ++ "processing.") % {"image_id": image_id, ++ "task_id": task_id} ++ raise exception.Conflict(msg) ++ except (exception.Conflict, exception.NotFound): ++ with excutils.save_and_reraise_exception(): ++ if new_image.locations: ++ for location in new_image.locations: ++ store_utils.delete_image_location_from_backend( ++ new_image.context, ++ image_id, ++ location) + + + def create_image(image_repo, image_factory, image_properties, task_id): diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/patches/07-CVE-2014-9493.patch --- a/components/openstack/glance/patches/07-CVE-2014-9493.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,140 +0,0 @@ -This patch fixes bug 1400966 for Havana. -https://bugs.launchpad.net/glance/+bug/1400966 - -commit 8bdb7ed9f5beaf816e7abba726904646bf3680dd -Author: Zhi Yan Liu -Date: Mon Dec 15 12:29:55 2014 +0800 - - To prevent client use v2 patch api to handle file and swift location - - The change will be used to restrict client to download and delete any - file in glance-api server. The same resone and logic as what we did in - v1: - https://github.com/openstack/glance/blob/master/glance/api/v1/images.py#L429 - - Closes-Bug: bug/1400966 - DocImpact - - Conflicts: - glance/api/v1/images.py - glance/common/store_utils.py - glance/location.py - glance/tests/functional/v1/test_copy_to_file.py - glance/tests/functional/v2/test_images.py - glance/tests/unit/test_store_image.py - glance/tests/unit/test_store_location.py - glance/tests/unit/utils.py - glance/tests/unit/v1/test_api.py - - (cherry picked from commit 4afdb017aa1ccef01482f117cb8d0736a6da38ed) - Signed-off-by: Zhi Yan Liu - Change-Id: I72dbead3cb2dcb87f52658ddb880e26880cc229b - ---- glance-2013.2.3/glance/api/v1/images.py.orig 2014-12-23 08:16:59.633230138 -0800 -+++ glance-2013.2.3/glance/api/v1/images.py 2014-12-23 08:19:15.059375018 -0800 -@@ -50,7 +50,8 @@ import glance.registry.client.v1.api as - from glance.store import (get_from_backend, - get_size_from_backend, - get_store_from_location, -- get_store_from_scheme) -+ get_store_from_scheme, -+ validate_external_location) - - LOG = logging.getLogger(__name__) - SUPPORTED_PARAMS = glance.api.v1.SUPPORTED_PARAMS -@@ -375,20 +376,19 @@ class Controller(controller.BaseControll - @staticmethod - def _validate_source(source, req): - """ -- External sources (as specified via the location or copy-from headers) -- are supported only over non-local store types, i.e. S3, Swift, HTTP. -- Note the absence of file:// for security reasons, see LP bug #942118. -- If the above constraint is violated, we reject with 400 "Bad Request". -+ To validate if external sources (as specified via the location -+ or copy-from headers) are supported. Otherwise we reject -+ with 400 "Bad Request". - """ - if source: -- for scheme in ['s3', 'swift', 'http', 'rbd', 'sheepdog', 'cinder']: -- if source.lower().startswith(scheme): -- return source -- msg = _("External sourcing not supported for store %s") % source -- LOG.debug(msg) -- raise HTTPBadRequest(explanation=msg, -- request=req, -- content_type="text/plain") -+ if validate_external_location(source): -+ return source -+ else: -+ msg = _("External source are not supported: '%s'") % source -+ LOG.debug(msg) -+ raise HTTPBadRequest(explanation=msg, -+ request=req, -+ content_type="text/plain") - - @staticmethod - def _copy_from(req): ---- glance-2013.2.3/glance/store/__init__.py.orig 2014-12-23 08:20:52.254600393 -0800 -+++ glance-2013.2.3/glance/store/__init__.py 2014-12-23 08:23:48.661399000 -0800 -@@ -21,6 +21,7 @@ import sys - import time - - from oslo.config import cfg -+import six.moves.urllib.parse as urlparse - - from glance.common import crypt - from glance.common import exception -@@ -369,6 +370,24 @@ def set_acls(context, location_uri, publ - LOG.debug(_("Skipping store.set_acls... not implemented.")) - - -+def validate_external_location(uri): -+ """ -+ Validate if URI of external location are supported. -+ -+ Only over non-local store types are OK, i.e. S3, Swift, -+ HTTP. Note the absence of 'file://' for security reasons, -+ see LP bug #942118, 1400966, 'swift+config://' is also -+ absent for security reasons, see LP bug #1334196. -+ -+ :param uri: The URI of external image location. -+ :return: Whether given URI of external image location are OK. -+ """ -+ pieces = urlparse.urlparse(uri) -+ valid_schemes = [scheme for scheme in location.SCHEME_TO_CLS_MAP.keys() -+ if scheme != 'file' and scheme != 'swift+config'] -+ return pieces.scheme in valid_schemes -+ -+ - class ImageRepoProxy(glance.domain.proxy.Repo): - - def __init__(self, image_repo, context, store_api): -@@ -401,22 +420,23 @@ class ImageRepoProxy(glance.domain.proxy - - - def _check_location_uri(context, store_api, uri): -- """ -- Check if an image location uri is valid. -+ """Check if an image location is valid. - - :param context: Glance request context - :param store_api: store API module - :param uri: location's uri string - """ -+ - is_ok = True - try: -- size = store_api.get_size_from_backend(context, uri) - # NOTE(zhiyan): Some stores return zero when it catch exception -- is_ok = size > 0 -+ is_ok = (store_api.validate_external_location(uri) and -+ store_api.get_size_from_backend(context, uri) > 0) - except (exception.UnknownScheme, exception.NotFound): - is_ok = False - if not is_ok: -- raise exception.BadStoreUri(_('Invalid location: %s') % uri) -+ reason = _('Invalid location') -+ raise exception.BadStoreUri(message=reason) - - - def _check_image_location(context, store_api, location): diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/patches/08-CVE-2014-9623.patch --- a/components/openstack/glance/patches/08-CVE-2014-9623.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,272 +0,0 @@ -# This patch is taken from community. Fix is present in version 2015.2.2 -# This fix could be found in following URL -# https://review.openstack.org/gitweb?p=openstack/glance.git;a=commit;h=f1260cc771ee068651aa62b972bef49d9af81eb0 - ---- glance-2013.2.3.orginal/glance/api/authorization.py 2015-02-20 03:57:20.678874000 -0600 -+++ glance-2013.2.3//glance/api/authorization.py 2015-02-20 04:07:24.881647830 -0600 -@@ -119,10 +119,10 @@ - raise exception.Forbidden(message - % self.image.image_id) - -- def save(self, image_member): -+ def save(self, image_member, from_state=None): - if (self.context.is_admin or - self.context.owner == image_member.member_id): -- updated_member = self.member_repo.save(image_member) -+ updated_member = self.member_repo.save(image_member, from_state=from_state) - return proxy_member(self.context, updated_member) - else: - message = _("You cannot update image member %s") - ---- glance-2013.2.3.orginal/glance/api/policy.py 2015-02-20 03:57:20.670610060 -0600 -+++ glance-2013.2.3//glance/api/policy.py 2015-02-20 04:33:34.232748980 -0600 -@@ -174,9 +174,9 @@ - self.policy.enforce(self.context, 'get_images', {}) - return super(ImageRepoProxy, self).list(*args, **kwargs) - -- def save(self, image): -+ def save(self, image, from_state=None): - self.policy.enforce(self.context, 'modify_image', {}) -- return super(ImageRepoProxy, self).save(image) -+ return super(ImageRepoProxy, self).save(image, from_state=from_state) - - def add(self, image): - self.policy.enforce(self.context, 'add_image', {}) -@@ -271,9 +271,9 @@ - self.policy.enforce(self.context, 'get_member', {}) - return self.member_repo.get(member_id) - -- def save(self, member): -+ def save(self, member, from_state=None): - self.policy.enforce(self.context, 'modify_member', {}) -- return self.member_repo.save(member) -+ return self.member_repo.save(member, from_state=from_state) - - def list(self, *args, **kwargs): - self.policy.enforce(self.context, 'get_members', {}) - ---- glance-2013.2.3.old/glance/api/v1/upload_utils.py 2014-04-03 11:43:55.000000000 -0700 -+++ glance-2013.2.3/glance/api/v1/upload_utils.py 2015-03-08 23:28:12.600039932 -0700 -@@ -139,13 +139,24 @@ - update_data = {'checksum': checksum, - 'size': size} - try: -- image_meta = registry.update_image_metadata(req.context, -- image_id, -- update_data) -- -- except exception.NotFound as e: -- msg = _("Image %s could not be found after upload. The image may " -- "have been deleted during the upload.") % image_id -+ try: -+ state = 'saving' -+ image_meta = registry.update_image_metadata(req.context, -+ image_id, -+ update_data, -+ from_state=state) -+ image = registry.get_image_metadata(req.context, image_id) -+ if image['status'] == 'deleted': -+ raise exception.NotFound() -+ except exception.Duplicate: -+ image = registry.get_image_metadata(req.context, image_id) -+ if image['status'] == 'deleted': -+ raise exception.NotFound() -+ else: -+ raise -+ except exception.NotFound: -+ msg = _("Image %s could not be found after upload. The image may" -+ " have been deleted during the upload.") % image_id - LOG.info(msg) - - # NOTE(jculp): we need to clean up the datastore if an image - ---- glance-2013.2.3.orginal/glance/api/v2/image_data.py 2015-02-20 03:57:20.678035080 -0600 -+++ glance-2013.2.3//glance/api/v2/image_data.py 2015-02-20 05:49:21.505608540 -0600 -@@ -24,6 +24,7 @@ - import glance.domain - import glance.gateway - import glance.notifier -+from glance.openstack.common import excutils - import glance.openstack.common.log as logging - import glance.store - -@@ -53,11 +54,12 @@ - try: - image_repo.save(image) - image.set_data(data, size) -- image_repo.save(image) -- except exception.NotFound as e: -- msg = (_("Image %s could not be found after upload." -- "The image may have been deleted during the upload: %s") -- % (image_id, e)) -+ image_repo.save(image, from_state='saving') -+ except (exception.NotFound, exception.Conflict): -+ msg = (_("Image %s could not be found after upload. " -+ "The image may have been deleted during the " -+ "upload, cleaning up the chunks uploaded.") % -+ image_id) - LOG.warn(msg) - raise webob.exc.HTTPGone(explanation=msg, - request=req, -@@ -111,6 +113,10 @@ - raise webob.exc.HTTPServiceUnavailable(explanation=msg, - request=req) - -+ except webob.exc.HTTPGone as e: -+ with excutils.save_and_reraise_exception(): -+ LOG.error(_("Failed to upload image data due to HTTP error")) -+ - except webob.exc.HTTPError as e: - LOG.error(_("Failed to upload image data due to HTTP error")) - raise - - - - -diff --git glance-2013.2.3/glance/db/__init__.py glance-2013.2.3/glance/db/__init__.py - -index a59447d..379cf6f 100644 (file) - - ---- glance-2013.2.3/glance/db/__init__.py -+++ glance-2013.2.3/glance/db/__init__.py -@@ -162,7 +162,7 @@ class ImageRepo(object): - image.created_at = new_values['created_at'] - image.updated_at = new_values['updated_at'] - -- def save(self, image): -+ def save(self, image, from_state=None): - image_values = self._format_image_to_db(image) - if image_values['size'] > CONF.image_size_cap: - raise exception.ImageSizeLimitExceeded -@@ -170,7 +170,8 @@ class ImageRepo(object): - new_values = self.db_api.image_update(self.context, - image.image_id, - image_values, -- purge_props=True) -+ purge_props=True, -+ from_state=from_state) - except (exception.NotFound, exception.Forbidden): - msg = _("No image found with ID %s") % image.image_id - raise exception.NotFound(msg) -@@ -263,7 +264,7 @@ class ImageMemberRepo(object): - msg = _("The specified member %s could not be found") - raise exception.NotFound(msg % image_member.id) - -- def save(self, image_member): -+ def save(self, image_member, from_state=None): - image_member_values = self._format_image_member_to_db(image_member) - try: - new_values = self.db_api.image_member_update(self.context, - - -diff --git glance-2013.2.3/glance/domain/proxy.py glance-2013.2.3/glance/domain/proxy.py - -index 89f138c..b27b448 100644 (file) - - ---- glance-2013.2.3/glance/domain/proxy.py -+++ glance-2013.2.3/glance/domain/proxy.py -@@ -94,9 +94,9 @@ class Repo(object): - result = self.base.add(base_item) - return self.helper.proxy(result) - -- def save(self, item): -+ def save(self, item, from_state=None): - base_item = self.helper.unproxy(item) -- result = self.base.save(base_item) -+ result = self.base.save(base_item, from_state=from_state) - return self.helper.proxy(result) - - def remove(self, item): - - - -diff --git glance-2013.2.3/glance/store/__init__.py glance-2013.2.3/glance/store/__init__.py - -index 273b7c7..ae3b4c8 100644 (file) - - ---- glance-2013.2.3/glance/store/__init__.py -+++ glance-2013.2.3/glance/store/__init__.py -@@ -446,7 +446,7 @@ class ImageRepoProxy(glance.domain.proxy.Repo): - self._set_acls(image) - return result - -- def save(self, image): -+ def save(self, image, from_state=None): - result = super(ImageRepoProxy, self).save(image) - self._set_acls(image) - return result - ---- glance-2013.2.3.orginal/glance/quota/__init__.py 2015-02-20 03:57:20.466150810 -0600 -+++ glance-2013.2.3/glance/quota/__init__.py 2015-02-25 04:44:45.714636070 -0600 -@@ -36,6 +36,28 @@ - item_proxy_class=ImageProxy, - item_proxy_kwargs=proxy_kwargs) - -+ def _enforce_image_property_quota(self, attempted): -+ if CONF.image_property_quota < 0: -+ # If value is negative, allow unlimited number of properties -+ return -+ -+ maximum = CONF.image_property_quota -+ if attempted > maximum: -+ kwargs = {'attempted': attempted, 'maximum': maximum} -+ exc = exception.ImagePropertyLimitExceeded(**kwargs) -+ LOG.debug(six.text_type(exc)) -+ raise exc -+ -+ def save(self, image, from_state=None): -+ if image.added_new_properties(): -+ self._enforce_image_property_quota(len(image.extra_properties)) -+ return super(ImageRepoProxy, self).save(image, from_state=from_state) -+ -+ def add(self, image): -+ self._enforce_image_property_quota(len(image.extra_properties)) -+ return super(ImageRepoProxy, self).add(image) -+ -+ - - class ImageFactoryProxy(glance.domain.proxy.ImageFactory): - def __init__(self, factory, context, db_api): - ---- glance-2013.2.3.orginal/glance/registry/client/v1/api.py 2015-02-20 03:57:20.477473040 -0600 -+++ glance-2013.2.3/glance/registry/client/v1/api.py 2015-02-26 02:15:02.437773030 -0600 -@@ -164,11 +164,11 @@ - - - def update_image_metadata(context, image_id, image_meta, -- purge_props=False): -+ purge_props=False, from_state=None): - LOG.debug(_("Updating image metadata for image %s..."), image_id) - c = get_registry_client(context) -- return c.update_image(image_id, image_meta, purge_props) -- -+ return c.update_image(image_id, image_meta, purge_props, -+ from_state=from_state) - - def delete_image_metadata(context, image_id): - LOG.debug(_("Deleting image metadata for image %s..."), image_id) - ---- glance-2013.2.3.orginal/glance/registry/client/v1/client.py 2015-02-20 03:57:20.477107680 -0600 -+++ glance-2013.2.3/glance/registry/client/v1/client.py 2015-02-26 02:25:21.498753360 -0600 -@@ -165,7 +165,8 @@ - image = data['image'] - return self.decrypt_metadata(image) - -- def update_image(self, image_id, image_metadata, purge_props=False): -+ def update_image(self, image_id, image_metadata, purge_props=False, -+ from_state=None): - """ - Updates Registry's information about an image - """ -@@ -174,6 +175,7 @@ - - encrypted_metadata = self.encrypt_metadata(image_metadata['image']) - image_metadata['image'] = encrypted_metadata -+ image_metadata['from_state'] = from_state - body = json.dumps(image_metadata) - - headers = { - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/glance/resolve.deps --- a/components/openstack/glance/resolve.deps Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/glance/resolve.deps Mon Apr 20 12:35:51 2015 -0700 @@ -1,10 +1,9 @@ library/python-2/eventlet-26 library/python-2/m2crypto-26 -library/python-2/oslo.config-26 +library/python-2/python-mysql-26 +library/python-2/sqlalchemy-26 library/python-2/sqlalchemy-migrate-26 -library/python/eventlet-26 -library/python/m2crypto-26 +library/python/iniparse-26 library/python/oslo.config-26 -library/python/sqlalchemy-migrate-26 runtime/python-26 system/core-os diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/Makefile --- a/components/openstack/heat/Makefile Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/heat/Makefile Mon Apr 20 12:35:51 2015 -0700 @@ -22,21 +22,23 @@ # # Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. # + include ../../../make-rules/shared-macros.mk COMPONENT_NAME= heat -COMPONENT_CODENAME= havana -COMPONENT_VERSION= 2013.2.3 +COMPONENT_CODENAME= juno +COMPONENT_VERSION= 2014.2.2 +COMPONENT_BE_VERSION= 2014.2 COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION) COMPONENT_ARCHIVE= $(COMPONENT_SRC).tar.gz COMPONENT_ARCHIVE_HASH= \ - sha256:5e1f437f75fd831bc6cbd23986d8e60a4008cf7a0a775e7a7405d56b335b1800 + sha256:ac9ad74d9571ec2441d2eec22dbe3ef9f39f7378f62238ad70911e26435d516f COMPONENT_ARCHIVE_URL= http://launchpad.net/$(COMPONENT_NAME)/$(COMPONENT_CODENAME)/$(COMPONENT_VERSION)/+download/$(COMPONENT_ARCHIVE) COMPONENT_PROJECT_URL= http://www.openstack.org/ COMPONENT_BUGDB= service/heat -IPS_COMPONENT_VERSION= 0.$(COMPONENT_VERSION) +IPS_COMPONENT_VERSION= 0.$(COMPONENT_VERSION) -TPNO= 18176 +TPNO= 21821 include $(WS_TOP)/make-rules/prep.mk include $(WS_TOP)/make-rules/setup.py.mk @@ -48,9 +50,26 @@ # only need to deliver one version. The manifest is parameterized, though. PYTHON_VERSIONS= 2.6 +PKG_MACROS += COMPONENT_BE_VERSION=$(COMPONENT_BE_VERSION) PKG_MACROS += PYVER=$(PYTHON_VERSIONS) PKG_MACROS += PYV=$(shell echo $(PYTHON_VERSIONS) | tr -d .) +# +# heat-api-cfn, heat-api-cloudwatch, heat-api, and heat-engine depend +# on heat-db and heat-upgrade so copy all of the service manifests +# into the proto directory for pkgdepend(1) to find. +# +COMPONENT_POST_INSTALL_ACTION += \ + ($(MKDIR) $(PROTO_DIR)/lib/svc/manifest/application/openstack; \ + $(CP) \ + files/heat-api-cfn.xml \ + files/heat-api-cloudwatch.xml \ + files/heat-api.xml \ + files/heat-db.xml \ + files/heat-engine.xml \ + files/heat-upgrade.xml \ + $(PROTO_DIR)/lib/svc/manifest/application/openstack) + # common targets build: $(BUILD_NO_ARCH) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/files/api-paste.ini --- a/components/openstack/heat/files/api-paste.ini Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ - -# heat-api pipeline -[pipeline:heat-api] -pipeline = faultwrap versionnegotiation authtoken context apiv1app - -# heat-api pipeline for standalone heat -# ie. uses alternative auth backend that authenticates users against keystone -# using username and password instead of validating token (which requires -# an admin/service token). -# To enable, in heat.conf: -# [paste_deploy] -# flavor = standalone -# -[pipeline:heat-api-standalone] -pipeline = faultwrap versionnegotiation authpassword context apiv1app - -# heat-api pipeline for custom cloud backends -# i.e. in heat.conf: -# [paste_deploy] -# flavor = custombackend -# -[pipeline:heat-api-custombackend] -pipeline = faultwrap versionnegotiation context custombackendauth apiv1app - -# heat-api-cfn pipeline -[pipeline:heat-api-cfn] -pipeline = cfnversionnegotiation ec2authtoken authtoken context apicfnv1app - -# heat-api-cfn pipeline for standalone heat -# relies exclusively on authenticating with ec2 signed requests -[pipeline:heat-api-cfn-standalone] -pipeline = cfnversionnegotiation ec2authtoken context apicfnv1app - -# heat-api-cloudwatch pipeline -[pipeline:heat-api-cloudwatch] -pipeline = versionnegotiation ec2authtoken authtoken context apicwapp - -# heat-api-cloudwatch pipeline for standalone heat -# relies exclusively on authenticating with ec2 signed requests -[pipeline:heat-api-cloudwatch-standalone] -pipeline = versionnegotiation ec2authtoken context apicwapp - -[app:apiv1app] -paste.app_factory = heat.common.wsgi:app_factory -heat.app_factory = heat.api.openstack.v1:API - -[app:apicfnv1app] -paste.app_factory = heat.common.wsgi:app_factory -heat.app_factory = heat.api.cfn.v1:API - -[app:apicwapp] -paste.app_factory = heat.common.wsgi:app_factory -heat.app_factory = heat.api.cloudwatch:API - -[filter:versionnegotiation] -paste.filter_factory = heat.common.wsgi:filter_factory -heat.filter_factory = heat.api.openstack:version_negotiation_filter - -[filter:faultwrap] -paste.filter_factory = heat.common.wsgi:filter_factory -heat.filter_factory = heat.api.openstack:faultwrap_filter - -[filter:cfnversionnegotiation] -paste.filter_factory = heat.common.wsgi:filter_factory -heat.filter_factory = heat.api.cfn:version_negotiation_filter - -[filter:cwversionnegotiation] -paste.filter_factory = heat.common.wsgi:filter_factory -heat.filter_factory = heat.api.cloudwatch:version_negotiation_filter - -[filter:context] -paste.filter_factory = heat.common.context:ContextMiddleware_filter_factory - -[filter:ec2authtoken] -paste.filter_factory = heat.api.aws.ec2token:EC2Token_filter_factory - -# Auth middleware that validates token against keystone -[filter:authtoken] -paste.filter_factory = heat.common.auth_token:filter_factory -auth_uri = http://127.0.0.1:5000/v2.0 -identity_uri = http://127.0.0.1:35357 -admin_tenant_name = %SERVICE_TENANT_NAME% -admin_user = %SERVICE_USER% -admin_password = %SERVICE_PASSWORD% - -# Auth middleware that validates username/password against keystone -[filter:authpassword] -paste.filter_factory = heat.common.auth_password:filter_factory - -# Auth middleware that validates against custom backend -[filter:custombackendauth] -paste.filter_factory = heat.common.custom_backend_auth:filter_factory diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/files/heat-api-cfn.xml --- a/components/openstack/heat/files/heat-api-cfn.xml Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/heat/files/heat-api-cfn.xml Mon Apr 20 12:35:51 2015 -0700 @@ -1,7 +1,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/files/heat.conf --- a/components/openstack/heat/files/heat.conf Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/heat/files/heat.conf Mon Apr 20 12:35:51 2015 -0700 @@ -4,31 +4,41 @@ # Options defined in heat.common.config # -# The SQLAlchemy connection string used to connect to the -# database (string value) -sql_connection=sqlite:////var/lib/heat/heat.sqlite +# Name of the engine node. This can be an opaque identifier. +# It is not necessarily a hostname, FQDN, or IP address. +# (string value) +#host=heat + -# timeout before idle sql connections are reaped (integer -# value) -#sql_idle_timeout=3600 +# +# Options defined in heat.common.config +# -# The default user for new instances (string value) -#instance_user=ec2-user +# The default user for new instances. This option is +# deprecated and will be removed in the Juno release. If it's +# empty, Heat will use the default user set up with your cloud +# image (for OS::Nova::Server) or 'ec2-user' (for +# AWS::EC2::Instance). (string value) +instance_user= -# Driver to use for controlling instances (string value) +# Driver to use for controlling instances. (string value) #instance_driver=heat.engine.nova -# List of directories to search for Plugins (list value) -#plugin_dirs=/usr/lib/heat +# List of directories to search for plug-ins. (list value) +plugin_dirs=/usr/lib/heat -# The directory to search for environment files (string value) +# The directory to search for environment files. (string +# value) #environment_dir=/etc/heat/environment.d -# Select deferred auth method, stored password or trusts +# Select deferred auth method, stored password or trusts. # (string value) #deferred_auth_method=password -# Subset of trustor roles to be delegated to heat (list value) +# Subset of trustor roles to be delegated to heat. If +# trusts_delegated_roles is set to [], all roles of a user +# will be delegated to heat when creating a stack. (list +# value) #trusts_delegated_roles=heat_stack_owner # Maximum resources allowed per top-level stack. (integer @@ -39,6 +49,10 @@ # one time. (integer value) #max_stacks_per_tenant=100 +# Number of times to retry to bring a resource to a non-error +# state. Set to 0 to disable retries. (integer value) +#action_retry_limit=5 + # Controls how many events will be pruned whenever a stack's # events exceed max_events_per_stack. Set this lower to keep # more events at the expense of more frequent purges. (integer @@ -50,33 +64,78 @@ # unlimited events per stack. (integer value) #max_events_per_stack=1000 -# Name of the engine node. This can be an opaque identifier.It -# is not necessarily a hostname, FQDN, or IP address. (string +# Timeout in seconds for stack action (ie. create or update). +# (integer value) +#stack_action_timeout=3600 + +# RPC timeout for the engine liveness check that is used for +# stack locking. (integer value) +#engine_life_check_timeout=2 + +# Enable the legacy OS::Heat::CWLiteAlarm resource. (boolean # value) -#host=heat +#enable_cloud_watch_lite=true + +# Enable the preview Stack Abandon feature. (boolean value) +#enable_stack_abandon=false + +# Enable the preview Stack Adopt feature. (boolean value) +#enable_stack_adopt=false -# seconds between running periodic tasks (integer value) +# Deprecated. (string value) +#onready= + + +# +# Options defined in heat.common.config +# + +# Seconds between running periodic tasks. (integer value) #periodic_interval=60 -# URL of the Heat metadata server (string value) +# URL of the Heat metadata server. (string value) #heat_metadata_server_url= -# URL of the Heat waitcondition server (string value) +# URL of the Heat waitcondition server. (string value) #heat_waitcondition_server_url= -# URL of the Heat cloudwatch server (string value) +# URL of the Heat CloudWatch server. (string value) #heat_watch_server_url= -# Instance connection to cfn/cw API via https (string value) +# Instance connection to CFN/CW API via https. (string value) #instance_connection_is_secure=0 -# Instance connection to cfn/cw API validate certs if ssl -# (string value) +# Instance connection to CFN/CW API validate certs if SSL is +# used. (string value) #instance_connection_https_validate_certificates=1 -# Keystone role for heat template-defined users (string value) +# Default region name used to get services endpoints. (string +# value) +#region_name_for_services= + +# Keystone role for heat template-defined users. (string +# value) #heat_stack_user_role=heat_stack_user +# Keystone domain ID which contains heat template-defined +# users. If this option is set, stack_user_domain_name option +# will be ignored. (string value) +# Deprecated group/name - [DEFAULT]/stack_user_domain +#stack_user_domain_id= + +# Keystone domain name which contains heat template-defined +# users. If `stack_user_domain_id` option is set, this option +# is ignored. (string value) +#stack_user_domain_name= + +# Keystone username, a user with roles sufficient to manage +# users and projects in the stack_user_domain. (string value) +#stack_domain_admin= + +# Keystone password for stack_domain_admin user. (string +# value) +#stack_domain_admin_password= + # Maximum raw byte size of any template. (integer value) #max_template_size=524288 @@ -84,14 +143,9 @@ # value) #max_nested_stack_depth=3 - -# -# Options defined in heat.common.crypt -# - -# Encryption key used for authentication info in database -# (string value) -#auth_encryption_key=notgood but just long enough i think +# Number of heat-engine processes to fork and run. (integer +# value) +#num_engine_workers=1 # @@ -104,43 +158,255 @@ # -# Options defined in heat.db.api +# Options defined in oslo.messaging # -# The backend to use for db (string value) -#db_backend=sqlalchemy +# Use durable queues in AMQP. (boolean value) +# Deprecated group/name - [DEFAULT]/rabbit_durable_queues +#amqp_durable_queues=false + +# Auto-delete queues in AMQP. (boolean value) +#amqp_auto_delete=false + +# Size of RPC connection pool. (integer value) +#rpc_conn_pool_size=30 + +# Qpid broker hostname. (string value) +#qpid_hostname=localhost + +# Qpid broker port. (integer value) +#qpid_port=5672 + +# Qpid HA cluster host:port pairs. (list value) +#qpid_hosts=$qpid_hostname:$qpid_port + +# Username for Qpid connection. (string value) +#qpid_username= + +# Password for Qpid connection. (string value) +#qpid_password= + +# Space separated list of SASL mechanisms to use for auth. +# (string value) +#qpid_sasl_mechanisms= + +# Seconds between connection keepalive heartbeats. (integer +# value) +#qpid_heartbeat=60 + +# Transport to use, either 'tcp' or 'ssl'. (string value) +#qpid_protocol=tcp + +# Whether to disable the Nagle algorithm. (boolean value) +#qpid_tcp_nodelay=true + +# The number of prefetched messages held by receiver. (integer +# value) +#qpid_receiver_capacity=1 + +# The qpid topology version to use. Version 1 is what was +# originally used by impl_qpid. Version 2 includes some +# backwards-incompatible changes that allow broker federation +# to work. Users should update to version 2 when they are +# able to take everything down, as it requires a clean break. +# (integer value) +#qpid_topology_version=1 + +# SSL version to use (valid only if SSL enabled). valid values +# are TLSv1 and SSLv23. SSLv2 and SSLv3 may be available on +# some distributions. (string value) +#kombu_ssl_version= + +# SSL key file (valid only if SSL enabled). (string value) +#kombu_ssl_keyfile= + +# SSL cert file (valid only if SSL enabled). (string value) +#kombu_ssl_certfile= + +# SSL certification authority file (valid only if SSL +# enabled). (string value) +#kombu_ssl_ca_certs= + +# How long to wait before reconnecting in response to an AMQP +# consumer cancel notification. (floating point value) +#kombu_reconnect_delay=1.0 + +# The RabbitMQ broker address where a single node is used. +# (string value) +#rabbit_host=localhost + +# The RabbitMQ broker port where a single node is used. +# (integer value) +#rabbit_port=5672 + +# RabbitMQ HA cluster host:port pairs. (list value) +#rabbit_hosts=$rabbit_host:$rabbit_port + +# Connect over SSL for RabbitMQ. (boolean value) +#rabbit_use_ssl=false + +# The RabbitMQ userid. (string value) +#rabbit_userid=guest + +# The RabbitMQ password. (string value) +#rabbit_password=guest + +# The RabbitMQ login method. (string value) +#rabbit_login_method=AMQPLAIN + +# The RabbitMQ virtual host. (string value) +#rabbit_virtual_host=/ + +# How frequently to retry connecting with RabbitMQ. (integer +# value) +#rabbit_retry_interval=1 + +# How long to backoff for between retries when connecting to +# RabbitMQ. (integer value) +#rabbit_retry_backoff=2 + +# Maximum number of RabbitMQ connection retries. Default is 0 +# (infinite retry count). (integer value) +#rabbit_max_retries=0 + +# Use HA queues in RabbitMQ (x-ha-policy: all). If you change +# this option, you must wipe the RabbitMQ database. (boolean +# value) +#rabbit_ha_queues=false + +# Deprecated, use rpc_backend=kombu+memory or rpc_backend=fake +# (boolean value) +#fake_rabbit=false + +# ZeroMQ bind address. Should be a wildcard (*), an ethernet +# interface, or IP. The "host" option should point or resolve +# to this address. (string value) +#rpc_zmq_bind_address=* + +# MatchMaker driver. (string value) +#rpc_zmq_matchmaker=oslo.messaging._drivers.matchmaker.MatchMakerLocalhost + +# ZeroMQ receiver listening port. (integer value) +#rpc_zmq_port=9501 + +# Number of ZeroMQ contexts, defaults to 1. (integer value) +#rpc_zmq_contexts=1 + +# Maximum number of ingress messages to locally buffer per +# topic. Default is unlimited. (integer value) +#rpc_zmq_topic_backlog= + +# Directory for holding IPC sockets. (string value) +#rpc_zmq_ipc_dir=/var/run/openstack + +# Name of this node. Must be a valid hostname, FQDN, or IP +# address. Must match "host" option, if running Nova. (string +# value) +#rpc_zmq_host=heat + +# Seconds to wait before a cast expires (TTL). Only supported +# by impl_zmq. (integer value) +#rpc_cast_timeout=30 + +# Heartbeat frequency. (integer value) +#matchmaker_heartbeat_freq=300 + +# Heartbeat time-to-live. (integer value) +#matchmaker_heartbeat_ttl=600 + +# Size of RPC greenthread pool. (integer value) +#rpc_thread_pool_size=64 + +# Driver or drivers to handle sending notifications. (multi +# valued) +#notification_driver= + +# AMQP topic used for OpenStack notifications. (list value) +# Deprecated group/name - [rpc_notifier2]/topics +#notification_topics=notifications + +# Seconds to wait for a response from a call. (integer value) +#rpc_response_timeout=60 + +# A URL representing the messaging driver to use and its full +# configuration. If not set, we fall back to the rpc_backend +# option and driver specific configuration. (string value) +#transport_url= + +# The messaging driver to use, defaults to rabbit. Other +# drivers include qpid and zmq. (string value) +#rpc_backend=rabbit + +# The default exchange under which topics are scoped. May be +# overridden by an exchange name specified in the +# transport_url option. (string value) +#control_exchange=openstack + + +# +# Options defined in heat.api.middleware.ssl +# + +# The HTTP Header that will be used to determine which the +# original request protocol scheme was, even if it was removed +# by an SSL terminator proxy. (string value) +#secure_proxy_ssl_header=X-Forwarded-Proto + + +# +# Options defined in heat.common.crypt +# + +# Encryption key used for authentication info in database. +# (string value) +#auth_encryption_key=notgood but just long enough i think + + +# +# Options defined in heat.common.heat_keystoneclient +# + +# Fully qualified class name to use as a keystone backend. +# (string value) +#keystone_backend=heat.common.heat_keystoneclient.KeystoneClientV3 # # Options defined in heat.engine.clients # -# Cloud module to use as a backend. Defaults to OpenStack. +# Fully qualified class name to use as a client backend. # (string value) -#cloud_backend= +#cloud_backend=heat.engine.clients.OpenStackClients + + +# +# Options defined in heat.engine.notification +# + +# Default notification level for outgoing notifications. +# (string value) +#default_notification_level=INFO + +# Default publisher_id for outgoing notifications. (string +# value) +#default_publisher_id= + +# List of drivers to send notifications (DEPRECATED). (multi +# valued) +#list_notifier_drivers= # # Options defined in heat.engine.resources.loadbalancer # -# Custom template for the built-in loadbalancer nested stack +# Custom template for the built-in loadbalancer nested stack. # (string value) #loadbalancer_template= # -# Options defined in heat.openstack.common.db.sqlalchemy.session -# - -# the filename to use with sqlite (string value) -#sqlite_db=heat.sqlite - -# If true, use synchronous mode for sqlite (boolean value) -#sqlite_synchronous=true - - -# # Options defined in heat.openstack.common.eventlet_backdoor # @@ -159,7 +425,7 @@ # Options defined in heat.openstack.common.lockutils # -# Whether to disable inter-process locks (boolean value) +# Enables or disables inter-process locks. (boolean value) #disable_process_locking=false # Directory to use for lock files. (string value) @@ -178,48 +444,50 @@ # of default WARNING level). (boolean value) #verbose=false -# Log output to standard error (boolean value) +# Log output to standard error. (boolean value) #use_stderr=true -# format string to use for log messages with context (string +# Format string to use for log messages with context. (string # value) -#logging_context_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user)s %(tenant)s] %(instance)s%(message)s +#logging_context_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s -# format string to use for log messages without context +# Format string to use for log messages without context. # (string value) #logging_default_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s -# data to append to log format when level is DEBUG (string +# Data to append to log format when level is DEBUG. (string # value) #logging_debug_format_suffix=%(funcName)s %(pathname)s:%(lineno)d -# prefix each line of exception output with this format +# Prefix each line of exception output with this format. # (string value) #logging_exception_prefix=%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s -# list of logger=LEVEL pairs (list value) -#default_log_levels=amqplib=WARN,sqlalchemy=WARN,boto=WARN,suds=INFO,keystone=INFO,eventlet.wsgi.server=WARN +# List of logger=LEVEL pairs. (list value) +#default_log_levels=amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN -# publish error events (boolean value) +# Enables or disables publication of error events. (boolean +# value) #publish_errors=false -# make deprecations fatal (boolean value) +# Enables or disables fatal status of deprecations. (boolean +# value) #fatal_deprecations=false -# If an instance is passed with the log message, format it -# like this (string value) +# The format for an instance that is passed with the log +# message. (string value) #instance_format="[instance: %(uuid)s] " -# If an instance UUID is passed with the log message, format -# it like this (string value) +# The format for an instance UUID that is passed with the log +# message. (string value) #instance_uuid_format="[instance: %(uuid)s] " -# If this option is specified, the logging configuration file -# specified is used and overrides any other logging options -# specified. Please see the Python logging module -# documentation for details on logging configuration files. -# (string value) -#log_config= +# The name of a logging configuration file. This file is +# appended to any existing logging configuration files. For +# details about logging configuration files, see the Python +# logging module documentation. (string value) +# Deprecated group/name - [DEFAULT]/log_config +#log_config_append= # DEPRECATED. A logging.Formatter log message format string # which may use any of the available logging.LogRecord @@ -229,362 +497,463 @@ #log_format= # Format string for %%(asctime)s in log records. Default: -# %(default)s (string value) +# %(default)s . (string value) #log_date_format=%Y-%m-%d %H:%M:%S # (Optional) Name of log file to output to. If no default is # set, logging will go to stdout. (string value) +# Deprecated group/name - [DEFAULT]/logfile #log_file= # (Optional) The base directory used for relative --log-file -# paths (string value) +# paths. (string value) +# Deprecated group/name - [DEFAULT]/logdir #log_dir= -# Use syslog for logging. (boolean value) +# Use syslog for logging. Existing syslog format is DEPRECATED +# during I, and will change in J to honor RFC5424. (boolean +# value) #use_syslog=false -# syslog facility to receive log lines (string value) -#syslog_log_facility=LOG_USER - - -# -# Options defined in heat.openstack.common.notifier.api -# - -# Driver or drivers to handle sending notifications (multi -# valued) -#notification_driver= - -# Default notification level for outgoing notifications -# (string value) -#default_notification_level=INFO - -# Default publisher_id for outgoing notifications (string +# (Optional) Enables or disables syslog rfc5424 format for +# logging. If enabled, prefixes the MSG part of the syslog +# message with APP-NAME (RFC5424). The format without the APP- +# NAME is deprecated in I, and will be removed in J. (boolean # value) -#default_publisher_id= - - -# -# Options defined in heat.openstack.common.notifier.list_notifier -# +#use_syslog_rfc_format=false -# List of drivers to send notifications (multi valued) -#list_notifier_drivers=heat.openstack.common.notifier.no_op_notifier - - -# -# Options defined in heat.openstack.common.notifier.rpc_notifier -# - -# AMQP topic used for openstack notifications (list value) -#notification_topics=notifications +# Syslog facility to receive log lines. (string value) +#syslog_log_facility=LOG_USER # # Options defined in heat.openstack.common.policy # -# JSON file containing policy (string value) +# The JSON file that defines policies. (string value) #policy_file=policy.json -# Rule enforced when requested rule is not found (string -# value) +# Default rule. Enforced when a requested rule is not found. +# (string value) #policy_default_rule=default +[auth_password] + # -# Options defined in heat.openstack.common.rpc +# Options defined in heat.common.config +# + +# Allow orchestration of multiple clouds. (boolean value) +#multi_cloud=false + +# Allowed keystone endpoints for auth_uri when multi_cloud is +# enabled. At least one endpoint needs to be specified. (list +# value) +#allowed_auth_uris= + + +[clients] + +# +# Options defined in heat.common.config # -# The messaging module to use, defaults to kombu. (string -# value) -#rpc_backend=heat.openstack.common.rpc.impl_kombu - -# Size of RPC thread pool (integer value) -#rpc_thread_pool_size=64 +# Type of endpoint in Identity service catalog to use for +# communication with the OpenStack service. (string value) +#endpoint_type=publicURL -# Size of RPC connection pool (integer value) -#rpc_conn_pool_size=30 - -# Seconds to wait for a response from call or multicall -# (integer value) -#rpc_response_timeout=60 +# Optional CA cert file to use in SSL connections. (string +# value) +#ca_file= -# Seconds to wait before a cast expires (TTL). Only supported -# by impl_zmq. (integer value) -#rpc_cast_timeout=30 +# Optional PEM-formatted certificate chain file. (string +# value) +#cert_file= -# Modules of exceptions that are permitted to be recreatedupon -# receiving exception data from an rpc call. (list value) -#allowed_rpc_exception_modules=heat.openstack.common.exception,heat.common.exception,nova.exception,cinder.exception,exceptions +# Optional PEM-formatted file that contains the private key. +# (string value) +#key_file= -# If passed, use a fake RabbitMQ provider (boolean value) -#fake_rabbit=false - -# AMQP exchange to connect to if using RabbitMQ or Qpid -# (string value) -#control_exchange=openstack +# If set, then the server's certificate will not be verified. +# (boolean value) +#insecure=false +[clients_ceilometer] + # -# Options defined in heat.openstack.common.rpc.amqp +# Options defined in heat.common.config # -# Use durable queues in amqp. (boolean value) -#amqp_durable_queues=false +# Type of endpoint in Identity service catalog to use for +# communication with the OpenStack service. (string value) +#endpoint_type= + +# Optional CA cert file to use in SSL connections. (string +# value) +#ca_file= + +# Optional PEM-formatted certificate chain file. (string +# value) +#cert_file= + +# Optional PEM-formatted file that contains the private key. +# (string value) +#key_file= + +# If set, then the server's certificate will not be verified. +# (boolean value) +#insecure= + + +[clients_cinder] -# Auto-delete queues in amqp. (boolean value) -#amqp_auto_delete=false +# +# Options defined in heat.common.config +# + +# Type of endpoint in Identity service catalog to use for +# communication with the OpenStack service. (string value) +#endpoint_type= + +# Optional CA cert file to use in SSL connections. (string +# value) +#ca_file= + +# Optional PEM-formatted certificate chain file. (string +# value) +#cert_file= + +# Optional PEM-formatted file that contains the private key. +# (string value) +#key_file= + +# If set, then the server's certificate will not be verified. +# (boolean value) +#insecure= # -# Options defined in heat.openstack.common.rpc.impl_kombu +# Options defined in heat.common.config +# + +# Allow client's debug log output. (boolean value) +#http_log_debug=false + + +[clients_glance] + +# +# Options defined in heat.common.config # -# SSL version to use (valid only if SSL enabled). valid values -# are TLSv1, SSLv23 and SSLv3. SSLv2 may be available on some -# distributions (string value) -#kombu_ssl_version= +# Type of endpoint in Identity service catalog to use for +# communication with the OpenStack service. (string value) +#endpoint_type= -# SSL key file (valid only if SSL enabled) (string value) -#kombu_ssl_keyfile= +# Optional CA cert file to use in SSL connections. (string +# value) +#ca_file= -# SSL cert file (valid only if SSL enabled) (string value) -#kombu_ssl_certfile= +# Optional PEM-formatted certificate chain file. (string +# value) +#cert_file= -# SSL certification authority file (valid only if SSL enabled) +# Optional PEM-formatted file that contains the private key. # (string value) -#kombu_ssl_ca_certs= - -# The RabbitMQ broker address where a single node is used -# (string value) -#rabbit_host=localhost +#key_file= -# The RabbitMQ broker port where a single node is used -# (integer value) -#rabbit_port=5672 +# If set, then the server's certificate will not be verified. +# (boolean value) +#insecure= -# RabbitMQ HA cluster host:port pairs (list value) -#rabbit_hosts=$rabbit_host:$rabbit_port + +[clients_heat] -# connect over SSL for RabbitMQ (boolean value) -#rabbit_use_ssl=false - -# the RabbitMQ userid (string value) -#rabbit_userid=guest +# +# Options defined in heat.common.config +# -# the RabbitMQ password (string value) -#rabbit_password=guest +# Type of endpoint in Identity service catalog to use for +# communication with the OpenStack service. (string value) +#endpoint_type= -# the RabbitMQ virtual host (string value) -#rabbit_virtual_host=/ - -# how frequently to retry connecting with RabbitMQ (integer +# Optional CA cert file to use in SSL connections. (string # value) -#rabbit_retry_interval=1 +#ca_file= -# how long to backoff for between retries when connecting to -# RabbitMQ (integer value) -#rabbit_retry_backoff=2 +# Optional PEM-formatted certificate chain file. (string +# value) +#cert_file= -# maximum retries with trying to connect to RabbitMQ (the -# default of 0 implies an infinite retry count) (integer -# value) -#rabbit_max_retries=0 +# Optional PEM-formatted file that contains the private key. +# (string value) +#key_file= -# use H/A queues in RabbitMQ (x-ha-policy: all).You need to -# wipe RabbitMQ database when changing this option. (boolean -# value) -#rabbit_ha_queues=false +# If set, then the server's certificate will not be verified. +# (boolean value) +#insecure= # -# Options defined in heat.openstack.common.rpc.impl_qpid +# Options defined in heat.common.config +# + +# Optional heat url in format like +# http://0.0.0.0:8004/v1/%(tenant_id)s. (string value) +#url= + + +[clients_keystone] + +# +# Options defined in heat.common.config +# + +# Type of endpoint in Identity service catalog to use for +# communication with the OpenStack service. (string value) +#endpoint_type= + +# Optional CA cert file to use in SSL connections. (string +# value) +#ca_file= + +# Optional PEM-formatted certificate chain file. (string +# value) +#cert_file= + +# Optional PEM-formatted file that contains the private key. +# (string value) +#key_file= + +# If set, then the server's certificate will not be verified. +# (boolean value) +#insecure= + + +[clients_neutron] + +# +# Options defined in heat.common.config # -# Qpid broker hostname (string value) -#qpid_hostname=localhost - -# Qpid broker port (integer value) -#qpid_port=5672 +# Type of endpoint in Identity service catalog to use for +# communication with the OpenStack service. (string value) +#endpoint_type= -# Qpid HA cluster host:port pairs (list value) -#qpid_hosts=$qpid_hostname:$qpid_port +# Optional CA cert file to use in SSL connections. (string +# value) +#ca_file= -# Username for qpid connection (string value) -#qpid_username= +# Optional PEM-formatted certificate chain file. (string +# value) +#cert_file= -# Password for qpid connection (string value) -#qpid_password= - -# Space separated list of SASL mechanisms to use for auth +# Optional PEM-formatted file that contains the private key. # (string value) -#qpid_sasl_mechanisms= +#key_file= + +# If set, then the server's certificate will not be verified. +# (boolean value) +#insecure= -# Seconds between connection keepalive heartbeats (integer -# value) -#qpid_heartbeat=60 + +[clients_nova] -# Transport to use, either 'tcp' or 'ssl' (string value) -#qpid_protocol=tcp +# +# Options defined in heat.common.config +# -# Disable Nagle algorithm (boolean value) -#qpid_tcp_nodelay=true +# Type of endpoint in Identity service catalog to use for +# communication with the OpenStack service. (string value) +#endpoint_type= + +# Optional CA cert file to use in SSL connections. (string +# value) +#ca_file= -# The qpid topology version to use. Version 1 is what was -# originally used by impl_qpid. Version 2 includes some -# backwards-incompatible changes that allow broker federation -# to work. Users should update to version 2 when they are -# able to take everything down, as it requires a clean break. -# (integer value) -#qpid_topology_version=1 +# Optional PEM-formatted certificate chain file. (string +# value) +#cert_file= + +# Optional PEM-formatted file that contains the private key. +# (string value) +#key_file= + +# If set, then the server's certificate will not be verified. +# (boolean value) +#insecure= # -# Options defined in heat.openstack.common.rpc.impl_zmq +# Options defined in heat.common.config +# + +# Allow client's debug log output. (boolean value) +#http_log_debug=false + + +[clients_swift] + +# +# Options defined in heat.common.config # -# ZeroMQ bind address. Should be a wildcard (*), an ethernet -# interface, or IP. The "host" option should point or resolve -# to this address. (string value) -#rpc_zmq_bind_address=* +# Type of endpoint in Identity service catalog to use for +# communication with the OpenStack service. (string value) +#endpoint_type= -# MatchMaker driver (string value) -#rpc_zmq_matchmaker=heat.openstack.common.rpc.matchmaker.MatchMakerLocalhost - -# ZeroMQ receiver listening port (integer value) -#rpc_zmq_port=9501 +# Optional CA cert file to use in SSL connections. (string +# value) +#ca_file= -# Number of ZeroMQ contexts, defaults to 1 (integer value) -#rpc_zmq_contexts=1 - -# Maximum number of ingress messages to locally buffer per -# topic. Default is unlimited. (integer value) -#rpc_zmq_topic_backlog= +# Optional PEM-formatted certificate chain file. (string +# value) +#cert_file= -# Directory for holding IPC sockets (string value) -#rpc_zmq_ipc_dir=/var/run/openstack +# Optional PEM-formatted file that contains the private key. +# (string value) +#key_file= -# Name of this node. Must be a valid hostname, FQDN, or IP -# address. Must match "host" option, if running Nova. (string -# value) -#rpc_zmq_host=heat +# If set, then the server's certificate will not be verified. +# (boolean value) +#insecure= +[clients_trove] + # -# Options defined in heat.openstack.common.rpc.matchmaker +# Options defined in heat.common.config # -# Heartbeat frequency (integer value) -#matchmaker_heartbeat_freq=300 - -# Heartbeat time-to-live. (integer value) -#matchmaker_heartbeat_ttl=600 - +# Type of endpoint in Identity service catalog to use for +# communication with the OpenStack service. (string value) +#endpoint_type= -[ssl] - -# -# Options defined in heat.openstack.common.sslutils -# - -# CA certificate file to use to verify connecting clients -# (string value) +# Optional CA cert file to use in SSL connections. (string +# value) #ca_file= -# Certificate file to use when starting the server securely -# (string value) +# Optional PEM-formatted certificate chain file. (string +# value) #cert_file= -# Private key file to use when starting the server securely +# Optional PEM-formatted file that contains the private key. # (string value) #key_file= +# If set, then the server's certificate will not be verified. +# (boolean value) +#insecure= + [database] # -# Options defined in heat.openstack.common.db.api -# - -# The backend to use for db (string value) -#backend=sqlalchemy - -# Enable the experimental use of thread pooling for all DB API -# calls (boolean value) -#use_tpool=false - - -# -# Options defined in heat.openstack.common.db.sqlalchemy.session +# Options defined in oslo.db # -# The SQLAlchemy connection string used to connect to the -# database (string value) -connection=sqlite:////var/lib/heat/heat.sqlite +# The file name to use with SQLite. (string value) +#sqlite_db=oslo.sqlite + +# If True, SQLite uses synchronous mode. (boolean value) +#sqlite_synchronous=true + +# The back end to use for the database. (string value) +# Deprecated group/name - [DEFAULT]/db_backend +#backend=sqlalchemy + +# The SQLAlchemy connection string to use to connect to the +# database. (string value) +# Deprecated group/name - [DEFAULT]/sql_connection +# Deprecated group/name - [DATABASE]/sql_connection +# Deprecated group/name - [sql]/connection +connection=mysql://%SERVICE_USER%:%SERVICE_PASSWORD%@localhost/heat -# The SQLAlchemy connection string used to connect to the -# slave database (string value) -#slave_connection= +# The SQLAlchemy connection string to use to connect to the +# slave database. (string value) +#slave_connection= -# timeout before idle sql connections are reaped (integer +# The SQL mode to be used for MySQL sessions. This option, +# including the default, overrides any server-set SQL mode. To +# use whatever SQL mode is set by the server configuration, +# set this to no value. Example: mysql_sql_mode= (string # value) +#mysql_sql_mode=TRADITIONAL + +# Timeout before idle SQL connections are reaped. (integer +# value) +# Deprecated group/name - [DEFAULT]/sql_idle_timeout +# Deprecated group/name - [DATABASE]/sql_idle_timeout +# Deprecated group/name - [sql]/idle_timeout #idle_timeout=3600 -# Minimum number of SQL connections to keep open in a pool +# Minimum number of SQL connections to keep open in a pool. # (integer value) +# Deprecated group/name - [DEFAULT]/sql_min_pool_size +# Deprecated group/name - [DATABASE]/sql_min_pool_size #min_pool_size=1 -# Maximum number of SQL connections to keep open in a pool +# Maximum number of SQL connections to keep open in a pool. # (integer value) +# Deprecated group/name - [DEFAULT]/sql_max_pool_size +# Deprecated group/name - [DATABASE]/sql_max_pool_size #max_pool_size= -# maximum db connection retries during startup. (setting -1 -# implies an infinite retry count) (integer value) +# Maximum number of database connection retries during +# startup. Set to -1 to specify an infinite retry count. +# (integer value) +# Deprecated group/name - [DEFAULT]/sql_max_retries +# Deprecated group/name - [DATABASE]/sql_max_retries #max_retries=10 -# interval between retries of opening a sql connection +# Interval between retries of opening a SQL connection. # (integer value) +# Deprecated group/name - [DEFAULT]/sql_retry_interval +# Deprecated group/name - [DATABASE]/reconnect_interval #retry_interval=10 -# If set, use this value for max_overflow with sqlalchemy +# If set, use this value for max_overflow with SQLAlchemy. # (integer value) +# Deprecated group/name - [DEFAULT]/sql_max_overflow +# Deprecated group/name - [DATABASE]/sqlalchemy_max_overflow #max_overflow= -# Verbosity of SQL debugging information. 0=None, -# 100=Everything (integer value) +# Verbosity of SQL debugging information: 0=None, +# 100=Everything. (integer value) +# Deprecated group/name - [DEFAULT]/sql_connection_debug #connection_debug=0 -# Add python stack traces to SQL as comment strings (boolean +# Add Python stack traces to SQL as comment strings. (boolean # value) +# Deprecated group/name - [DEFAULT]/sql_connection_trace #connection_trace=false -# If set, use this value for pool_timeout with sqlalchemy +# If set, use this value for pool_timeout with SQLAlchemy. # (integer value) +# Deprecated group/name - [DATABASE]/sqlalchemy_pool_timeout #pool_timeout= - -[paste_deploy] +# Enable the experimental use of database reconnect on +# connection lost. (boolean value) +#use_db_reconnect=false -# -# Options defined in heat.common.config -# - -# The flavor to use (string value) -#flavor= +# Seconds between database connection retries. (integer value) +#db_retry_interval=1 -# The API paste config file to use (string value) -#api_paste_config=api-paste.ini - - -[rpc_notifier2] +# If True, increases the interval between database connection +# retries up to db_max_retry_interval. (boolean value) +#db_inc_retry_interval=true -# -# Options defined in heat.openstack.common.notifier.rpc_notifier2 -# +# If db_inc_retry_interval is set, the maximum seconds between +# database connection retries. (integer value) +#db_max_retry_interval=10 -# AMQP topic(s) used for openstack notifications (list value) -#topics=notifications +# Maximum database connection retries before error is raised. +# Set to -1 to specify an infinite retry count. (integer +# value) +#db_max_retries=20 [ec2authtoken] @@ -593,10 +962,10 @@ # Options defined in heat.api.aws.ec2token # -# Authentication Endpoint URI (string value) +# Authentication Endpoint URI. (string value) #auth_uri= -# Allow orchestration of multiple clouds (boolean value) +# Allow orchestration of multiple clouds. (boolean value) #multi_cloud=false # Allowed keystone endpoints for auth_uri when multi_cloud is @@ -605,73 +974,38 @@ #allowed_auth_uris= -[heat_api_cloudwatch] - -# -# Options defined in heat.common.wsgi -# - -# Address to bind the server. Useful when selecting a -# particular network interface. (string value) -#bind_host=0.0.0.0 - -# The port on which the server will listen. (integer value) -#bind_port=8003 - -# Number of backlog requests to configure the socket with -# (integer value) -#backlog=4096 - -# Location of the SSL Certificate File to use for SSL mode -# (string value) -#cert_file= - -# Location of the SSL Key File to use for enabling SSL mode -# (string value) -#key_file= - -# Number of workers for Heat service (integer value) -#workers=0 - -# Maximum line size of message headers to be accepted. -# max_header_line may need to be increased when using large -# tokens (typically those generated by the Keystone v3 API -# with big service catalogs (integer value) -#max_header_line=16384 - - [heat_api] # # Options defined in heat.common.wsgi # -# Address to bind the server. Useful when selecting a +# Address to bind the server. Useful when selecting a # particular network interface. (string value) #bind_host=0.0.0.0 # The port on which the server will listen. (integer value) #bind_port=8004 -# Number of backlog requests to configure the socket with +# Number of backlog requests to configure the socket with. # (integer value) #backlog=4096 -# Location of the SSL Certificate File to use for SSL mode +# Location of the SSL certificate file to use for SSL mode. # (string value) #cert_file= -# Location of the SSL Key File to use for enabling SSL mode +# Location of the SSL key file to use for enabling SSL mode. # (string value) #key_file= -# Number of workers for Heat service (integer value) +# Number of workers for Heat service. (integer value) #workers=0 # Maximum line size of message headers to be accepted. # max_header_line may need to be increased when using large # tokens (typically those generated by the Keystone v3 API -# with big service catalogs (integer value) +# with big service catalogs). (integer value) #max_header_line=16384 @@ -681,73 +1015,350 @@ # Options defined in heat.common.wsgi # -# Address to bind the server. Useful when selecting a +# Address to bind the server. Useful when selecting a # particular network interface. (string value) #bind_host=0.0.0.0 # The port on which the server will listen. (integer value) #bind_port=8000 -# Number of backlog requests to configure the socket with +# Number of backlog requests to configure the socket with. # (integer value) #backlog=4096 -# Location of the SSL Certificate File to use for SSL mode +# Location of the SSL certificate file to use for SSL mode. # (string value) #cert_file= -# Location of the SSL Key File to use for enabling SSL mode +# Location of the SSL key file to use for enabling SSL mode. # (string value) #key_file= -# Number of workers for Heat service (integer value) +# Number of workers for Heat service. (integer value) +#workers=0 + +# Maximum line size of message headers to be accepted. +# max_header_line may need to be increased when using large +# tokens (typically those generated by the Keystone v3 API +# with big service catalogs). (integer value) +#max_header_line=16384 + + +[heat_api_cloudwatch] + +# +# Options defined in heat.common.wsgi +# + +# Address to bind the server. Useful when selecting a +# particular network interface. (string value) +#bind_host=0.0.0.0 + +# The port on which the server will listen. (integer value) +#bind_port=8003 + +# Number of backlog requests to configure the socket with. +# (integer value) +#backlog=4096 + +# Location of the SSL certificate file to use for SSL mode. +# (string value) +#cert_file= + +# Location of the SSL key file to use for enabling SSL mode. +# (string value) +#key_file= + +# Number of workers for Heat service. (integer value) #workers=0 # Maximum line size of message headers to be accepted. # max_header_line may need to be increased when using large # tokens (typically those generated by the Keystone v3 API -# with big service catalogs (integer value) +# with big service catalogs.) (integer value) #max_header_line=16384 -[auth_password] +[keystone_authtoken] + +# +# Options defined in keystonemiddleware.auth_token +# + +# Prefix to prepend at the beginning of the path. Deprecated, +# use identity_uri. (string value) +#auth_admin_prefix= + +# Host providing the admin Identity API endpoint. Deprecated, +# use identity_uri. (string value) +#auth_host=127.0.0.1 + +# Port of the admin Identity API endpoint. Deprecated, use +# identity_uri. (integer value) +#auth_port=35357 + +# Protocol of the admin Identity API endpoint (http or https). +# Deprecated, use identity_uri. (string value) +#auth_protocol=https + +# Complete public Identity API endpoint (string value) +auth_uri=http://127.0.0.1:5000/v2.0/ + +# Complete admin Identity API endpoint. This should specify +# the unversioned root endpoint e.g. https://localhost:35357/ +# (string value) +identity_uri=http://127.0.0.1:35357/ + +# API version of the admin Identity API endpoint (string +# value) +#auth_version= + +# Do not handle authorization requests within the middleware, +# but delegate the authorization decision to downstream WSGI +# components (boolean value) +#delay_auth_decision=false + +# Request timeout value for communicating with Identity API +# server. (boolean value) +#http_connect_timeout= + +# How many times are we trying to reconnect when communicating +# with Identity API Server. (integer value) +#http_request_max_retries=3 + +# This option is deprecated and may be removed in a future +# release. Single shared secret with the Keystone +# configuration used for bootstrapping a Keystone +# installation, or otherwise bypassing the normal +# authentication process. This option should not be used, use +# `admin_user` and `admin_password` instead. (string value) +#admin_token= + +# Keystone account username (string value) +admin_user=%SERVICE_USER% + +# Keystone account password (string value) +admin_password=%SERVICE_PASSWORD% + +# Keystone service account tenant name to validate user tokens +# (string value) +admin_tenant_name=%SERVICE_TENANT_NAME% + +# Env key for the swift cache (string value) +#cache= + +# Required if Keystone server requires client certificate +# (string value) +#certfile= + +# Required if Keystone server requires client certificate +# (string value) +#keyfile= + +# A PEM encoded Certificate Authority to use when verifying +# HTTPs connections. Defaults to system CAs. (string value) +#cafile= + +# Verify HTTPS connections. (boolean value) +#insecure=false + +# Directory used to cache files related to PKI tokens (string +# value) +signing_dir=/var/lib/heat/keystone-signing + +# Optionally specify a list of memcached server(s) to use for +# caching. If left undefined, tokens will instead be cached +# in-process. (list value) +# Deprecated group/name - [DEFAULT]/memcache_servers +#memcached_servers= + +# In order to prevent excessive effort spent validating +# tokens, the middleware caches previously-seen tokens for a +# configurable duration (in seconds). Set to -1 to disable +# caching completely. (integer value) +#token_cache_time=300 + +# Determines the frequency at which the list of revoked tokens +# is retrieved from the Identity service (in seconds). A high +# number of revocation events combined with a low cache +# duration may significantly reduce performance. (integer +# value) +#revocation_cache_time=10 + +# (optional) if defined, indicate whether token data should be +# authenticated or authenticated and encrypted. Acceptable +# values are MAC or ENCRYPT. If MAC, token data is +# authenticated (with HMAC) in the cache. If ENCRYPT, token +# data is encrypted and authenticated in the cache. If the +# value is not one of these options or empty, auth_token will +# raise an exception on initialization. (string value) +#memcache_security_strategy= + +# (optional, mandatory if memcache_security_strategy is +# defined) this string is used for key derivation. (string +# value) +#memcache_secret_key= + +# (optional) number of seconds memcached server is considered +# dead before it is tried again. (integer value) +#memcache_pool_dead_retry=300 + +# (optional) max total number of open connections to every +# memcached server. (integer value) +#memcache_pool_maxsize=10 + +# (optional) socket timeout in seconds for communicating with +# a memcache server. (integer value) +#memcache_pool_socket_timeout=3 + +# (optional) number of seconds a connection to memcached is +# held unused in the pool before it is closed. (integer value) +#memcache_pool_unused_timeout=60 + +# (optional) number of seconds that an operation will wait to +# get a memcache client connection from the pool. (integer +# value) +#memcache_pool_conn_get_timeout=10 + +# (optional) use the advanced (eventlet safe) memcache client +# pool. The advanced pool will only work under python 2.x. +# (boolean value) +#memcache_use_advanced_pool=false + +# (optional) indicate whether to set the X-Service-Catalog +# header. If False, middleware will not ask for service +# catalog on token validation and will not set the X-Service- +# Catalog header. (boolean value) +#include_service_catalog=true + +# Used to control the use and type of token binding. Can be +# set to: "disabled" to not check token binding. "permissive" +# (default) to validate binding information if the bind type +# is of a form known to the server and ignore it if not. +# "strict" like "permissive" but if the bind type is unknown +# the token will be rejected. "required" any form of token +# binding is needed to be allowed. Finally the name of a +# binding method that must be present in tokens. (string +# value) +#enforce_token_bind=permissive + +# If true, the revocation list will be checked for cached +# tokens. This requires that PKI tokens are configured on the +# Keystone server. (boolean value) +#check_revocations_for_cached=false + +# Hash algorithms to use for hashing PKI tokens. This may be a +# single algorithm or multiple. The algorithms are those +# supported by Python standard hashlib.new(). The hashes will +# be tried in the order given, so put the preferred one first +# for performance. The result of the first hash will be stored +# in the cache. This will typically be set to multiple values +# only while migrating from a less secure algorithm to a more +# secure one. Once all the old tokens are expired this option +# should be set to a single value for better performance. +# (list value) +#hash_algorithms=md5 + + +[matchmaker_redis] + +# +# Options defined in oslo.messaging +# + +# Host to locate redis. (string value) +#host=127.0.0.1 + +# Use this port to connect to redis host. (integer value) +#port=6379 + +# Password for Redis server (optional). (string value) +#password= + + +[matchmaker_ring] + +# +# Options defined in oslo.messaging +# + +# Matchmaker ring file (JSON). (string value) +# Deprecated group/name - [DEFAULT]/matchmaker_ringfile +#ringfile=/etc/oslo/matchmaker_ring.json + + +[oslo_messaging_amqp] + +# +# Options defined in oslo.messaging +# +# NOTE: Options in this group are supported when using oslo.messaging >=1.5.0. + +# address prefix used when sending to a specific server +# (string value) +#server_request_prefix=exclusive + +# address prefix used when broadcasting to all servers (string +# value) +#broadcast_prefix=broadcast + +# address prefix when sending to any server in group (string +# value) +#group_request_prefix=unicast + +# Name for the AMQP container (string value) +#container_name= + +# Timeout for inactive connections (in seconds) (integer +# value) +#idle_timeout=0 + +# Debug: dump AMQP frames to stdout (boolean value) +#trace=false + +# CA certificate PEM file for verifing server certificate +# (string value) +#ssl_ca_file= + +# Identifying certificate PEM file to present to clients +# (string value) +#ssl_cert_file= + +# Private key PEM file used to sign cert_file certificate +# (string value) +#ssl_key_file= + +# Password for decrypting ssl_key_file (if encrypted) (string +# value) +#ssl_key_password= + +# Accept clients using either SSL or plain TCP (boolean value) +#allow_insecure_clients=false + + +[paste_deploy] # # Options defined in heat.common.config # -# Allow orchestration of multiple clouds (boolean value) -#multi_cloud=false +# The flavor to use. (string value) +#flavor= -# Allowed keystone endpoints for auth_uri when multi_cloud is -# enabled. At least one endpoint needs to be specified. (list -# value) -#allowed_auth_uris= +# The API paste config file to use. (string value) +#api_paste_config=api-paste.ini -[matchmaker_ring] +[revision] # -# Options defined in heat.openstack.common.rpc.matchmaker_ring +# Options defined in heat.common.config # -# Matchmaker ring file (JSON) (string value) -#ringfile=/etc/oslo/matchmaker_ring.json +# Heat build revision. If you would prefer to manage your +# build revision separately, you can move this section to a +# different file and add it as another config option. (string +# value) +#heat_revision=unknown -[matchmaker_redis] - -# -# Options defined in heat.openstack.common.rpc.matchmaker_redis -# - -# Host to locate redis (string value) -#host=127.0.0.1 - -# Use this port to connect to redis host. (integer value) -#port=6379 - -# Password for Redis server. (optional) (string value) -#password= - - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/files/heat.exec_attr --- a/components/openstack/heat/files/heat.exec_attr Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/heat/files/heat.exec_attr Mon Apr 20 12:35:51 2015 -0700 @@ -1,1 +1,2 @@ -OpenStack Orchestration:solaris:cmd:RO::/usr/bin/heat-manage:uid=heat;gid=heat +OpenStack Orchestration Management:solaris:cmd:RO::/usr/bin/heat-manage:\ +uid=heat;gid=heat diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/files/heat.prof_attr --- a/components/openstack/heat/files/heat.prof_attr Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/heat/files/heat.prof_attr Mon Apr 20 12:35:51 2015 -0700 @@ -1,10 +1,12 @@ -OpenStack Orchestration:RO::\ +OpenStack Orchestration Management:RO::\ Manage OpenStack Heat:\ -auths=solaris.admin.edit/etc/heat/api-paste.ini,\ -solaris.admin.edit/etc/heat/heat.conf,\ -solaris.admin.edit/etc/heat/policy.json,\ +auths=solaris.admin.edit/etc/heat/*.conf,\ +solaris.admin.edit/etc/heat/*.ini,\ +solaris.admin.edit/etc/heat/*.json,\ +solaris.admin.edit/etc/heat/environment.d/*.yaml,\ +solaris.admin.edit/etc/heat/templates/*.yaml,\ solaris.smf.manage.heat,\ solaris.smf.value.heat;\ defaultpriv={file_dac_read}\:/var/svc/log/application-openstack-* -OpenStack Management:RO:::profiles=OpenStack Orchestration +OpenStack Management:RO:::profiles=OpenStack Orchestration Management diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/files/heat.user_attr --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/heat/files/heat.user_attr Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,1 @@ +heat::RO::profiles=OpenStack Orchestration Management diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/heat.p5m --- a/components/openstack/heat/heat.p5m Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/heat/heat.p5m Mon Apr 20 12:35:51 2015 -0700 @@ -20,7 +20,7 @@ # # -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. # set name=pkg.fmri \ @@ -28,7 +28,7 @@ set name=pkg.summary value="OpenStack Heat (Orchestration Service)" set name=pkg.description \ value="OpenStack Heat is a service to orchestrate multiple composite cloud applications using templates, through both an OpenStack-native ReST API and a CloudFormation-compatible Query API." -set name=pkg.human-version value="Havana $(COMPONENT_VERSION)" +set name=pkg.human-version value="Juno $(COMPONENT_VERSION)" set name=com.oracle.info.description \ value="Heat, the OpenStack orchestration service" set name=com.oracle.info.tpno value=$(TPNO) @@ -40,12 +40,14 @@ set name=info.source-url value=$(COMPONENT_ARCHIVE_URL) set name=info.upstream value="OpenStack " set name=info.upstream-url value=$(COMPONENT_PROJECT_URL) -set name=org.opensolaris.arc-caseid value=PSARC/2013/350 value=PSARC/2014/236 +set name=openstack.upgrade-id reboot-needed=true value=$(COMPONENT_BE_VERSION) +set name=org.opensolaris.arc-caseid value=PSARC/2013/350 value=PSARC/2014/236 \ + value=PSARC/2015/110 set name=org.opensolaris.consolidation value=$(CONSOLIDATION) # dir path=etc/heat owner=heat group=heat mode=0700 -file files/api-paste.ini path=etc/heat/api-paste.ini owner=heat group=heat \ - mode=0644 overlay=allow preserve=renamenew +file path=etc/heat/api-paste.ini owner=heat group=heat mode=0644 overlay=allow \ + preserve=renamenew file path=etc/heat/environment.d/default.yaml owner=heat group=heat mode=0644 \ overlay=allow preserve=renamenew file files/heat.conf path=etc/heat/heat.conf owner=heat group=heat mode=0644 \ @@ -62,15 +64,15 @@ group=sys file files/heat.prof_attr path=etc/security/prof_attr.d/cloud:openstack:heat \ group=sys -file files/heat-api-cfn.xml \ - path=lib/svc/manifest/application/openstack/heat-api-cfn.xml -file files/heat-api-cloudwatch.xml \ - path=lib/svc/manifest/application/openstack/heat-api-cloudwatch.xml -file files/heat-api.xml path=lib/svc/manifest/application/openstack/heat-api.xml -file files/heat-db.xml path=lib/svc/manifest/application/openstack/heat-db.xml -file files/heat-engine.xml \ - path=lib/svc/manifest/application/openstack/heat-engine.xml +file files/heat.user_attr path=etc/user_attr.d/cloud:openstack:heat group=sys +file path=lib/svc/manifest/application/openstack/heat-api-cfn.xml +file path=lib/svc/manifest/application/openstack/heat-api-cloudwatch.xml +file path=lib/svc/manifest/application/openstack/heat-api.xml +file path=lib/svc/manifest/application/openstack/heat-db.xml +file path=lib/svc/manifest/application/openstack/heat-engine.xml +file path=lib/svc/manifest/application/openstack/heat-upgrade.xml file files/heat-smf-method path=lib/svc/method/heat-smf-method +file files/heat-upgrade path=lib/svc/method/heat-upgrade file path=usr/bin/heat-manage file usr/bin/heat-keystone-setup \ path=usr/demo/openstack/keystone/heat-keystone-setup mode=0555 @@ -81,7 +83,9 @@ file path=usr/lib/python$(PYVER)/vendor-packages/heat-$(COMPONENT_VERSION)-py$(PYVER).egg-info/PKG-INFO file path=usr/lib/python$(PYVER)/vendor-packages/heat-$(COMPONENT_VERSION)-py$(PYVER).egg-info/SOURCES.txt file path=usr/lib/python$(PYVER)/vendor-packages/heat-$(COMPONENT_VERSION)-py$(PYVER).egg-info/dependency_links.txt +file path=usr/lib/python$(PYVER)/vendor-packages/heat-$(COMPONENT_VERSION)-py$(PYVER).egg-info/entry_points.txt file path=usr/lib/python$(PYVER)/vendor-packages/heat-$(COMPONENT_VERSION)-py$(PYVER).egg-info/not-zip-safe +file path=usr/lib/python$(PYVER)/vendor-packages/heat-$(COMPONENT_VERSION)-py$(PYVER).egg-info/pbr.json file path=usr/lib/python$(PYVER)/vendor-packages/heat-$(COMPONENT_VERSION)-py$(PYVER).egg-info/requires.txt file path=usr/lib/python$(PYVER)/vendor-packages/heat-$(COMPONENT_VERSION)-py$(PYVER).egg-info/top_level.txt file path=usr/lib/python$(PYVER)/vendor-packages/heat/__init__.py @@ -100,14 +104,21 @@ file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/cloudwatch/watch.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/middleware/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/middleware/fault.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/middleware/ssl.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/middleware/version_negotiation.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/v1/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/v1/actions.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/v1/build_info.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/v1/events.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/v1/resources.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/v1/software_configs.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/v1/software_deployments.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/v1/stacks.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/v1/util.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/v1/views/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/v1/views/stacks_view.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/v1/views/views_common.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/api/openstack/versions.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/cloudinit/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/cloudinit/boothook.sh @@ -118,7 +129,7 @@ file path=usr/lib/python$(PYVER)/vendor-packages/heat/cmd/manage.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/auth_password.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/auth_token.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/auth_url.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/config.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/context.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/crypt.py @@ -126,9 +137,14 @@ file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/environment_format.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/exception.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/heat_keystoneclient.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/i18n.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/identifier.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/lifecycle_plugin_utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/messaging.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/param_utils.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/plugin_loader.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/policy.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/serializers.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/short_id.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/template_format.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/timeutils.py @@ -136,10 +152,9 @@ file path=usr/lib/python$(PYVER)/vendor-packages/heat/common/wsgi.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/api.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/migration.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/api.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/manage.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/filters.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/README file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/manage.py @@ -158,104 +173,151 @@ file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/026_user_creds_drop_aws.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/027_user_creds_trusts.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/028_text_mysql_longtext.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/029_event_id_to_uuid.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/030_remove_uuidutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/031_stack_lock.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/032_decrypt_method.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/033_software_config.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/034_raw_template_files.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/035_event_uuid_to_id.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/036_stack_domain_project.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/037_migrate_hot_template.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/038_software_config_json_config.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/039_user_creds_nullable.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/040_software_deployment_no_signal_id.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/041_migrate_hot_template_resources.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/042_software_deployment_domain_project.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/043_migrate_template_versions.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/044_snapshots.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/045_stack_backup.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/046_properties_data.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migrate_repo/versions/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/migration.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/models.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/mutable.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/session.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sqlalchemy/types.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/sync.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/db/utils.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/doc/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/doc/resources.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/api.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/attributes.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/components.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/cfn/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/cfn/functions.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/cfn/template.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients/client_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients/os/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients/os/ceilometer.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients/os/cinder.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients/os/glance.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients/os/heat_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients/os/keystone.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients/os/neutron.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients/os/nova.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients/os/sahara.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients/os/swift.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/clients/os/trove.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/constraints.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/dependencies.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/environment.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/event.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/hot.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/function.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/hot/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/hot/functions.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/hot/parameters.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/hot/template.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/lifecycle_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/notification/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/notification/autoscaling.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/notification/stack.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/parameter_groups.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/parameters.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/parser.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/plugin_manager.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/properties.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resource.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/autoscaling.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/aws/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/aws/launch_config.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/aws/scaling_policy.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/ceilometer/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/ceilometer/alarm.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/cloud_watch.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/eip.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/glance_image.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/instance.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/internet_gateway.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/iso_8601.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/loadbalancer.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/network_interface.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/firewall.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/floatingip.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/loadbalancer.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/metering.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/net.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/network_gateway.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/neutron.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/port.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/provider_net.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/router.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/security_group.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/subnet.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/neutron/vpnservice.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/nova_floatingip.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/nova_keypair.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/nova_servergroup.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/nova_utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/openstack/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/openstack/scaling_policy.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/os_database.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/random_string.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/resource_group.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/route_table.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/s3.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/sahara_cluster.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/sahara_templates.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/security_group.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/server.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/software_config/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/software_config/cloud_config.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/software_config/multi_part.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/software_config/software_component.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/software_config/software_config.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/software_config/software_deployment.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/software_config/structured_config.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/stack.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/subnet.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/swift.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/swiftsignal.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/template_resource.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/user.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/volume.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/vpc.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/resources/wait_condition.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/rsrc_defn.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/scheduler.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/service.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/signal_responder.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/stack.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/stack_lock.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/stack_resource.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/stack_user.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/support.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/template.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/timestamp.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/update.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/engine/watchrule.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/bs/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/cs/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/da/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/de/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/en_AU/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/en_GB/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/en_US/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/es/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/fr/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/it/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/ja/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/ko/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/pt_BR/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/ru/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/tl/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/tr/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/uk/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/zh_CN/LC_MESSAGES/heat.po -file path=usr/lib/python$(PYVER)/vendor-packages/heat/locale/zh_TW/LC_MESSAGES/heat.po file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/README file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/config/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/config/generator.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/context.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/db/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/db/api.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/db/exception.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/db/sqlalchemy/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/db/sqlalchemy/migration.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/db/sqlalchemy/models.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/db/sqlalchemy/session.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/db/sqlalchemy/utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/crypto/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/crypto/utils.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/eventlet_backdoor.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/exception.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/excutils.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/fileutils.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/gettextutils.py @@ -265,42 +327,25 @@ file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/lockutils.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/log.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/loopingcall.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/network_utils.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/notifier/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/notifier/api.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/notifier/list_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/notifier/log_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/notifier/no_op_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/notifier/rabbit_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/notifier/rpc_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/notifier/rpc_notifier2.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/notifier/test_notifier.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/middleware/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/middleware/base.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/middleware/request_id.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/policy.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/processutils.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/amqp.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/common.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/dispatcher.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/impl_fake.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/impl_kombu.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/impl_qpid.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/impl_zmq.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/matchmaker.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/matchmaker_redis.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/matchmaker_ring.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/proxy.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/securemessage.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/serializer.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/service.py -file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/rpc/zmq_receiver.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/service.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/sslutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/strutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/systemd.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/threadgroup.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/timeutils.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/uuidutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/openstack/common/versionutils.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/rpc/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/rpc/api.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/rpc/client.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/scaling/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/scaling/cooldown.py +file path=usr/lib/python$(PYVER)/vendor-packages/heat/scaling/template.py file path=usr/lib/python$(PYVER)/vendor-packages/heat/version.py dir path=var/lib/heat owner=heat group=heat mode=0700 dir path=var/log/heat owner=heat group=heat mode=0700 @@ -308,47 +353,95 @@ group groupname=heat gid=87 user username=heat ftpuser=false gcos-field="OpenStack Heat" group=heat \ home-dir=/var/lib/heat uid=87 +# license heat.license license="Apache v2.0" # force a group dependency on the optional anyjson; pkgdepend work is needed to # flush this out. depend type=group fmri=library/python-2/anyjson-$(PYV) -# force a group dependency on the optional ceilometerclient; pkgdepend work is -# needed to flush this out. -depend type=group fmri=library/python/ceilometerclient-$(PYV) - -# force a group dependency on the optional cinderclient; pkgdepend work is -# needed to flush this out. -depend type=group fmri=library/python/cinderclient-$(PYV) +# force a group dependency on the optional netaddr; pkgdepend work is needed to +# flush this out. +depend type=group fmri=library/python-2/netaddr-$(PYV) -# force a group dependency on the optional neutronclient; pkgdepend work is -# needed to flush this out. -depend type=group fmri=library/python/neutronclient-$(PYV) +# force a group dependency on the optional simplejson; pkgdepend work is needed +# to flush this out. +depend type=group fmri=library/python-2/simplejson-$(PYV) -# force a group dependency on the optional swiftclient; pkgdepend work is needed -# to flush this out. -depend type=group fmri=library/python/swiftclient-$(PYV) +# force a dependency on argparse; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python-2/argparse-$(PYV) # force a dependency on babel; pkgdepend work is needed to flush this out. depend type=require fmri=library/python-2/babel-$(PYV) +# force a dependency on ceilometerclient; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/ceilometerclient-$(PYV) + +# force a dependency on cinderclient; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/cinderclient-$(PYV) + +# force a dependency on glanceclient; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/glanceclient-$(PYV) + # force a dependency on greenlet; pkgdepend work is needed to flush this out. depend type=require fmri=library/python-2/greenlet-$(PYV) -# force a dependency on kombu; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/kombu-$(PYV) +# force a dependency on heatclient; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/heatclient-$(PYV) + +# force a dependency on iso8601; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/iso8601-$(PYV) + +# force a dependency on keystoneclient; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/keystoneclient-$(PYV) + +# force a dependency on keystonemiddleware; used via a paste.deploy filter +depend type=require fmri=library/python/keystonemiddleware-$(PYV) # force a dependency on lxml; pkgdepend work is needed to flush this out. depend type=require fmri=library/python-2/lxml-$(PYV) -# force a dependency on netaddr; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/netaddr-$(PYV) +# force a dependency on m2crypto; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python-2/m2crypto-$(PYV) + +# force a dependency on neutronclient; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/neutronclient-$(PYV) + +# force a dependency on novaclient; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/novaclient-$(PYV) + +# force a dependency on oslo.db; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/oslo.db-$(PYV) + +# force a dependency on oslo.i18n; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/oslo.i18n-$(PYV) + +# force a dependency on oslo.messaging; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/oslo.messaging-$(PYV) + +# force a dependency on oslo.serialization; pkgdepend work is needed to flush +# this out. +depend type=require fmri=library/python/oslo.serialization-$(PYV) + +# force a dependency on oslo.utils; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/oslo.utils-$(PYV) # force a dependency on paste.deploy; pkgdepend work is needed to flush this # out. depend type=require fmri=library/python-2/paste.deploy-$(PYV) +# force a dependency on pbr; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/pbr-$(PYV) + +# force a dependency on posix_ipc; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/posix_ipc-$(PYV) + # force a dependency on pyyaml; pkgdepend work is needed to flush this out. depend type=require fmri=library/python-2/pyyaml-$(PYV) @@ -358,24 +451,18 @@ # force a dependency on routes; pkgdepend work is needed to flush this out. depend type=require fmri=library/python-2/routes-$(PYV) -# force a dependency on sqlalchemy; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/sqlalchemy-$(PYV) +# force a dependency on saharaclient; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/saharaclient-$(PYV) + +# force a dependency on stevedore; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python-2/stevedore-$(PYV) + +# force a dependency on swiftclient; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/swiftclient-$(PYV) + +# force a dependency on troveclient; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/troveclient-$(PYV) # force a dependency on webob; pkgdepend work is needed to flush this out. depend type=require fmri=library/python-2/webob-$(PYV) - -# force a dependency on iso8601; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/iso8601-$(PYV) - -# force a dependency on keystoneclient; pkgdepend work is needed to flush this -# out. -depend type=require fmri=library/python/keystoneclient-$(PYV) - -# force a dependency on novaclient; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/novaclient-$(PYV) - -# force a dependency on pbr; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/pbr-$(PYV) - -# force a dependency on six; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/six-$(PYV) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/patches/01-CVE-2014-3801.patch --- a/components/openstack/heat/patches/01-CVE-2014-3801.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -Patch for Upstream bug 1311223. This addresses CVE-2014-3801. It has -been fixed in Icehouse 2014.1.1 and Havana 2013.2.4. - -From 7e114a38712da8947ee7ad93eabda34f5e4aa65a Mon Sep 17 00:00:00 2001 -From: Angus Salkeld -Date: Thu, 1 May 2014 11:20:55 +1000 -Subject: Don't dynamically create provider types in the global env - -Only support this in user environments. -Note: this is only when you have the following in your template -resources: - thingy: - type: http://example.com/foo.template - -Doing this will avoid tenant-specific provider template URLs being -shown globally in the resource-type listing. - -Co-Authored-By: Angus Salkeld -Closes-Bug: #1311223 -Change-Id: Ifa18108afacbda390b19b46a8f41bc4f018e95d6 -(cherry picked from commit a02ff20509171346d2a1d2a9df7c81aada134c52) - -diff --git a/heat/engine/environment.py b/heat/engine/environment.py -index 6dd73f0..db9f2e2 100644 ---- a/heat/engine/environment.py -+++ b/heat/engine/environment.py -@@ -187,7 +187,10 @@ class ResourceRegistry(object): - registry[name] = info - - def iterable_by(self, resource_type, resource_name=None): -- if resource_type.endswith(('.yaml', '.template')): -+ is_templ_type = resource_type.endswith(('.yaml', '.template')) -+ if self.global_registry is not None and is_templ_type: -+ # we only support dynamic resource types in user environments -+ # not the global environment. - # resource with a Type == a template - # we dynamically create an entry as it has not been registered. - if resource_type not in self._registry: -diff --git a/heat/tests/test_provider_template.py b/heat/tests/test_provider_template.py -index 500cc59..e2af880 100644 ---- a/heat/tests/test_provider_template.py -+++ b/heat/tests/test_provider_template.py -@@ -398,6 +398,8 @@ class ProviderTemplateTest(HeatTestCase): - self.assertIn(attrib, templ_resource.attributes) - for k, v in json_snippet.get("Properties").items(): - self.assertEqual(v, templ_resource.properties[k]) -+ self.assertNotIn('WordPress_Single_Instance.yaml', -+ resources.global_env().registry._registry) - - def test_system_template_retrieve_by_file(self): - # make sure that a TemplateResource defined in the global environment --- -cgit v0.10.1 - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/patches/02-requirements.patch --- a/components/openstack/heat/patches/02-requirements.patch Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/heat/patches/02-requirements.patch Mon Apr 20 12:35:51 2015 -0700 @@ -1,41 +1,69 @@ In-house patch to remove unnecessary dependencies from Heat's requirements files. The specific reasons are as follows: -argparse No longer applicable +httplib2 Not applicable -httplib2 No longer applicable +kombu Not applicable pycrypto Not applicable to Solaris (M2Crypto used instead) ---- heat-2013.2.3/heat.egg-info/requires.txt.orig 2014-04-03 11:47:55.000000000 -0700 -+++ heat-2013.2.3/heat.egg-info/requires.txt 2014-07-07 03:03:36.128102921 -0700 -@@ -1,8 +1,6 @@ - pbr>=0.5.21,<1.0 --pycrypto>=2.6 - eventlet>=0.13.0 - greenlet>=0.3.2 --httplib2 - iso8601>=0.1.8 - kombu>=2.4.8 - lxml>=2.3 -@@ -22,4 +20,4 @@ - PyYAML>=3.1.0 - paramiko>=1.8.0 +qpid-python Not applicable + +--- heat-2014.2.2/heat.egg-info/requires.txt.~1~ 2015-02-05 08:30:41.000000000 -0800 ++++ heat-2014.2.2/heat.egg-info/requires.txt 2015-02-23 14:53:28.397432548 -0800 +@@ -3,10 +3,8 @@ argparse Babel>=1.3 --oslo.config>=1.2.0 -\ No newline at end of file -+oslo.config>=1.2.0 ---- heat-2013.2.3/requirements.txt.orig 2014-04-03 11:44:49.000000000 -0700 -+++ heat-2013.2.3/requirements.txt 2014-07-07 03:03:32.472531751 -0700 -@@ -1,11 +1,8 @@ - pbr>=0.5.21,<1.0 + eventlet>=0.15.1,<0.16.0 + greenlet>=0.3.2 +-httplib2>=0.7.5 + iso8601>=0.1.9 + keystonemiddleware>=1.0.0 +-kombu>=2.5.0 + lxml>=2.3 + netaddr>=0.7.12 + oslo.config>=1.4.0 # Apache-2.0 +@@ -16,7 +14,6 @@ oslo.messaging>=1.4.0,!=1.5.0,<1.6.0 + oslo.utils>=1.0.0 # Apache-2.0 + PasteDeploy>=1.5.0 + posix_ipc -pycrypto>=2.6 - eventlet>=0.13.0 + python-ceilometerclient>=1.0.6 + python-cinderclient>=1.1.0 + python-glanceclient>=0.14.0 +@@ -28,7 +25,6 @@ python-saharaclient>=0.7.3 + python-swiftclient>=2.2.0 + python-troveclient>=1.0.4 + PyYAML>=3.1.0 +-qpid-python + requests>=1.2.1,!=2.4.0 + Routes>=1.12.3,!=2.0 + six>=1.7.0 +--- heat-2014.2.2/requirements.txt.~1~ 2015-02-05 08:27:27.000000000 -0800 ++++ heat-2014.2.2/requirements.txt 2015-02-23 14:53:35.541352823 -0800 +@@ -7,10 +7,8 @@ argparse + Babel>=1.3 + eventlet>=0.15.1,<0.16.0 greenlet>=0.3.2 --httplib2 - iso8601>=0.1.8 - kombu>=2.4.8 --argparse +-httplib2>=0.7.5 + iso8601>=0.1.9 + keystonemiddleware>=1.0.0 +-kombu>=2.5.0 lxml>=2.3 - netaddr - six>=1.4.1 + netaddr>=0.7.12 + oslo.config>=1.4.0 # Apache-2.0 +@@ -20,7 +18,6 @@ oslo.messaging>=1.4.0,!=1.5.0,<1.6.0 + oslo.utils>=1.0.0 # Apache-2.0 + PasteDeploy>=1.5.0 + posix_ipc +-pycrypto>=2.6 + python-ceilometerclient>=1.0.6 + python-cinderclient>=1.1.0 + python-glanceclient>=0.14.0 +@@ -32,7 +29,6 @@ python-saharaclient>=0.7.3 + python-swiftclient>=2.2.0 + python-troveclient>=1.0.4 + PyYAML>=3.1.0 +-qpid-python + requests>=1.2.1,!=2.4.0 + Routes>=1.12.3,!=2.0 + six>=1.7.0 diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/patches/04-nopycrypto.patch --- a/components/openstack/heat/patches/04-nopycrypto.patch Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/heat/patches/04-nopycrypto.patch Mon Apr 20 12:35:51 2015 -0700 @@ -1,38 +1,18 @@ In-house removal of PyCrypto dependency in Heat. This patch is Solaris-specific and not suitable for upstream. -Convert encrypt() and decrypt() to use M2Crypto instead of PyCrypto. - ---- heat-2013.2.3/heat/common/crypt.py.~1~ 2014-04-03 11:44:49.000000000 -0700 -+++ heat-2013.2.3/heat/common/crypt.py 2014-07-07 03:26:19.115102209 -0700 -@@ -14,9 +14,9 @@ - # under the License. +--- heat-2014.2.2/heat/common/crypt.py.~1~ 2014-12-04 21:02:27.000000000 -0800 ++++ heat-2014.2.2/heat/common/crypt.py 2015-01-31 16:56:20.917251751 -0800 +@@ -13,7 +13,7 @@ import base64 + -from Crypto.Cipher import AES - from os import urandom - +from M2Crypto.EVP import Cipher from oslo.config import cfg - from heat.openstack.common import log as logging -@@ -36,9 +36,12 @@ - def encrypt(auth_info): - if auth_info is None: - return None -- iv = urandom(AES.block_size) -- cipher = AES.new(cfg.CONF.auth_encryption_key[:32], AES.MODE_CFB, iv) -- res = base64.b64encode(iv + cipher.encrypt(auth_info)) -+ iv = urandom(16) -+ cipher = Cipher(alg='aes_256_cfb', key=cfg.CONF.auth_encryption_key[:32], -+ iv=iv, op=1) -+ padded = cipher.update(auth_info) -+ padded = padded + cipher.final() -+ res = base64.b64encode(iv + padded) - return res - - -@@ -46,7 +49,9 @@ + from heat.openstack.common.crypto import utils +@@ -57,7 +57,9 @@ def heat_decrypt(auth_info): if auth_info is None: return None auth = base64.b64decode(auth_info) @@ -45,3 +25,193 @@ + padded = cipher.update(auth[16:]) + res = padded + cipher.final() return res +--- heat-2014.2.2/heat/openstack/common/crypto/utils.py.~1~ 2014-12-04 21:02:30.000000000 -0800 ++++ heat-2014.2.2/heat/openstack/common/crypto/utils.py 2015-01-31 16:56:20.917680985 -0800 +@@ -14,8 +14,8 @@ + + import base64 + +-from Crypto.Hash import HMAC +-from Crypto import Random ++from M2Crypto import EVP ++from M2Crypto import Rand + import six + + from heat.openstack.common.gettextutils import _ +@@ -23,6 +23,24 @@ from heat.openstack.common import import + + bchr = six.int2byte + ++# Provide a mapping between the names of hash types used by PyCrypto to ++# their digest sizes and the corresponding algorithm name used by ++# M2Crypto/OpenSSL. ++hashmap = { ++ 'SHA224': (28, 'sha224'), ++ 'SHA256': (32, 'sha256'), ++ 'SHA384': (48, 'sha384'), ++ 'SHA512': (64, 'sha512') ++} ++ ++# Provide a mapping between the length of a key and the algorithm name ++# used by M2Crypto/OpenSSL. ++algomap = { ++ 16: 'aes_128_cbc', ++ 24: 'aes_192_cbc', ++ 32: 'aes_256_cbc' ++} ++ + + class CryptoutilsException(Exception): + """Generic Exception for Crypto utilities.""" +@@ -39,6 +57,33 @@ class CipherBlockLengthTooBig(Cryptoutil + super(CryptoutilsException, self).__init__(message) + + ++class CipherKeyLengthInvalid(CryptoutilsException): ++ """The encryption key length is invalid for AES-CBC.""" ++ ++ def __init__(self, keylen): ++ msg = _("Encryption key length of %d is invalid for AES-CBC.") ++ message = msg % keylen ++ super(CryptoutilsException, self).__init__(message) ++ ++ ++class CipherTypeNotSupported(CryptoutilsException): ++ """The encryption cipher type is not supported.""" ++ ++ def __init__(self, enctype): ++ msg = _("Encryption cipher type %s is not supported") ++ message = msg % enctype ++ super(CryptoutilsException, self).__init__(message) ++ ++ ++class HashTypeNotSupported(CryptoutilsException): ++ """The message authentication hash function is not supported.""" ++ ++ def __init__(self, hashtype): ++ msg = _("Message authentication hash function %s is not supported") ++ message = msg % hashtype ++ super(CryptoutilsException, self).__init__(message) ++ ++ + class HKDFOutputLengthTooLong(CryptoutilsException): + """The amount of Key Material asked is too much.""" + +@@ -55,8 +100,10 @@ class HKDF(object): + """ + + def __init__(self, hashtype='SHA256'): +- self.hashfn = importutils.import_module('Crypto.Hash.' + hashtype) +- self.max_okm_length = 255 * self.hashfn.digest_size ++ if hashtype not in hashmap: ++ raise HashTypeNotSupported(hashtype) ++ (self.digest_size, self.algo) = hashmap[hashtype] ++ self.max_okm_length = 255 * self.digest_size + + def extract(self, ikm, salt=None): + """An extract function that can be used to derive a robust key given +@@ -67,9 +114,9 @@ class HKDF(object): + :param salt: optional salt value (a non-secret random value) + """ + if salt is None: +- salt = b'\x00' * self.hashfn.digest_size ++ salt = b'\x00' * self.digest_size + +- return HMAC.new(salt, ikm, self.hashfn).digest() ++ return EVP.hmac(salt, ikm, self.algo) + + def expand(self, prk, info, length): + """An expand function that will return arbitrary length output that can +@@ -83,12 +130,12 @@ class HKDF(object): + if length > self.max_okm_length: + raise HKDFOutputLengthTooLong(length, self.max_okm_length) + +- N = (length + self.hashfn.digest_size - 1) // self.hashfn.digest_size ++ N = (length + self.digest_size - 1) // self.digest_size + + okm = b"" + tmp = b"" + for block in range(1, N + 1): +- tmp = HMAC.new(prk, tmp + info + bchr(block), self.hashfn).digest() ++ tmp = EVP.hmac(prk, tmp + info + bchr(block), self.algo) + okm += tmp + + return okm[:length] +@@ -108,11 +155,15 @@ class SymmetricCrypto(object): + """ + + def __init__(self, enctype='AES', hashtype='SHA256'): +- self.cipher = importutils.import_module('Crypto.Cipher.' + enctype) +- self.hashfn = importutils.import_module('Crypto.Hash.' + hashtype) ++ if enctype != 'AES': ++ raise CipherTypeNotSupported(enctype) ++ if hashtype not in hashmap: ++ raise HashTypeNotSupported(hashtype) ++ self.algo = hashmap[hashtype][1] ++ self.block_size = 16 + + def new_key(self, size): +- return Random.new().read(size) ++ return Rand.rand_bytes(size) + + def encrypt(self, key, msg, b64encode=True): + """Encrypt the provided msg and returns the cyphertext optionally +@@ -129,19 +180,14 @@ class SymmetricCrypto(object): + + :returns enc: a block of encrypted data. + """ +- iv = Random.new().read(self.cipher.block_size) +- cipher = self.cipher.new(key, self.cipher.MODE_CBC, iv) +- +- # CBC mode requires a fixed block size. Append padding and length of +- # padding. +- if self.cipher.block_size > MAX_CB_SIZE: +- raise CipherBlockLengthTooBig(self.cipher.block_size, MAX_CB_SIZE) +- r = len(msg) % self.cipher.block_size +- padlen = self.cipher.block_size - r - 1 +- msg += b'\x00' * padlen +- msg += bchr(padlen) ++ keylen = len(key) ++ if keylen not in algomap: ++ raise CipherKeyLengthInvalid(keylen) ++ iv = Rand.rand_bytes(self.block_size) ++ cipher = EVP.Cipher(algomap[keylen], key, iv, 1) + +- enc = iv + cipher.encrypt(msg) ++ enc = iv + cipher.update(msg) ++ enc += cipher.final() + if b64encode: + enc = base64.b64encode(enc) + return enc +@@ -157,14 +203,16 @@ class SymmetricCrypto(object): + + :returns plain: the plaintext message. + """ ++ keylen = len(key) ++ if keylen not in algomap: ++ raise CipherKeyLengthInvalid(keylen) + if b64decode: + msg = base64.b64decode(msg) +- iv = msg[:self.cipher.block_size] +- cipher = self.cipher.new(key, self.cipher.MODE_CBC, iv) ++ iv = msg[:self.block_size] ++ cipher = EVP.Cipher(algomap[keylen], key, iv, 0) + +- padded = cipher.decrypt(msg[self.cipher.block_size:]) +- l = ord(padded[-1:]) + 1 +- plain = padded[:-l] ++ padded = cipher.update(msg[self.block_size:]) ++ plain = padded + cipher.final() + return plain + + def sign(self, key, msg, b64encode=True): +@@ -177,8 +225,7 @@ class SymmetricCrypto(object): + + :returns out: a base64 encoded signature. + """ +- h = HMAC.new(key, msg, self.hashfn) +- out = h.digest() ++ out = EVP.hmac(key, msg, self.algo) + if b64encode: + out = base64.b64encode(out) + return out diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/patches/05-neutron-names-required.patch --- a/components/openstack/heat/patches/05-neutron-names-required.patch Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/heat/patches/05-neutron-names-required.patch Mon Apr 20 12:35:51 2015 -0700 @@ -2,21 +2,20 @@ instead of hyphens on Solaris. This patch has not yet been submitted upstream. ---- heat-2013.2.3/heat/engine/resources/neutron/neutron.py.orig 2014-07-22 18:07:26.583195123 -0600 -+++ heat-2013.2.3/heat/engine/resources/neutron/neutron.py 2014-07-22 18:08:49.115350165 -0600 -@@ -13,6 +13,8 @@ +--- heat-2014.2.2/heat/engine/resources/neutron/neutron.py.orig 2014-07-22 18:07:26.583195123 -0600 ++++ heat-2014.2.2/heat/engine/resources/neutron/neutron.py 2014-07-22 18:08:49.115350165 -0600 +@@ -11,6 +11,7 @@ # License for the specific language governing permissions and limitations # under the License. +import platform -+ - from neutronclient.common.exceptions import NeutronClientException + import warnings from heat.common import exception -@@ -147,3 +149,10 @@ - else: - raise - return seclist +@@ -188,3 +189,10 @@ class NeutronResource(resource.Resource) + def check_delete_complete(self, delete_task): + # if the resource was already deleted, delete_task will be None + return delete_task is None or delete_task.step() + + def physical_resource_name(self): + name = super(NeutronResource, self).physical_resource_name() diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/patches/06-heat-keystone-setup.patch --- a/components/openstack/heat/patches/06-heat-keystone-setup.patch Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/heat/patches/06-heat-keystone-setup.patch Mon Apr 20 12:35:51 2015 -0700 @@ -4,8 +4,8 @@ Launchpad bug 1260556. This is a Solaris-specific patch and is not suitable for the upstream. ---- heat-2013.2.3/bin/heat-keystone-setup.~1~ 2014-04-03 11:44:49.000000000 -0700 -+++ heat-2013.2.3/bin/heat-keystone-setup 2014-07-16 20:28:16.316132723 -0700 +--- heat-2014.2.2/bin/heat-keystone-setup.orig 2014-08-07 15:08:53.000000000 -0700 ++++ heat-2014.2.2/bin/heat-keystone-setup 2014-09-20 21:44:41.866870651 -0700 @@ -2,12 +2,14 @@ set +e @@ -22,26 +22,26 @@ + CONFIG_ADMIN_PORT=$(tr -d '[\t ]' < $KEYSTONE_CONF | grep ^admin_port= | cut -d'=' -f2) fi - SERVICE_TOKEN=${SERVICE_TOKEN:-$CONFIG_SERVICE_TOKEN} -@@ -35,7 +37,7 @@ + SERVICE_TOKEN=${OS_SERVICE_TOKEN:-$CONFIG_SERVICE_TOKEN} +@@ -102,7 +104,7 @@ get_data() { shift 3 - echo $("$@" | \ + output=$("$@" | \ - awk -F'|' \ + nawk -F'|' \ "! /^\+/ && \$${match_column} ~ \"^ *${regex} *\$\" \ { print \$${output_column} }") - } -@@ -47,7 +49,7 @@ + +@@ -116,7 +118,7 @@ get_id () { get_column_num() { local name=$1 shift -- $@ | awk -F'|' "NR == 2 { for (i=2; i/dev/null | \ @@ -50,10 +50,10 @@ if [ -n "$url" ]; then local endpoints=$(get_data 3 $url 1 keystone endpoint-list) -@@ -199,7 +201,7 @@ - - ADMIN_ROLE=$(get_data 2 admin 1 keystone role-list) +@@ -280,7 +282,7 @@ keystone_setup() { + die_if_not_set $LINENO ADMIN_ROLE "Fail to get ADMIN_ROLE by 'keystone role-list' " SERVICE_TENANT=$(get_data 2 service 1 keystone tenant-list) + die_if_not_set $LINENO SERVICE_TENANT "Fail to get service tenant 'keystone tenant-list' " - SERVICE_PASSWORD=${SERVICE_PASSWORD:-$OS_PASSWORD} + SERVICE_PASSWORD=${SERVICE_PASSWORD:-heat} SERVICE_HOST=${SERVICE_HOST:-localhost} diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/patches/07-heat-plugin-defaults.patch --- a/components/openstack/heat/patches/07-heat-plugin-defaults.patch Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/heat/patches/07-heat-plugin-defaults.patch Mon Apr 20 12:35:51 2015 -0700 @@ -2,14 +2,14 @@ plugin directories searched by Heat. This patch is Solaris specific and not suitable for upstream contribution. ---- heat-2013.2.3/heat/common/config.py.orig 2014-07-17 12:48:08.249427463 -0600 -+++ heat-2013.2.3/heat/common/config.py 2014-07-17 12:48:31.499385628 -0600 -@@ -85,7 +85,7 @@ +--- heat-2014.2.2/heat/common/config.py.~1~ 2014-12-04 21:02:30.000000000 -0800 ++++ heat-2014.2.2/heat/common/config.py 2014-12-13 13:31:30.350162153 -0800 +@@ -94,7 +94,7 @@ engine_opts = [ default='heat.engine.nova', - help='Driver to use for controlling instances'), + help='Driver to use for controlling instances.'), cfg.ListOpt('plugin_dirs', - default=['/usr/lib64/heat', '/usr/lib/heat'], + default=['/usr/lib/heat'], - help='List of directories to search for Plugins'), + help='List of directories to search for plug-ins.'), cfg.StrOpt('environment_dir', default='/etc/heat/environment.d', diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/heat/resolve.deps --- a/components/openstack/heat/resolve.deps Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/heat/resolve.deps Mon Apr 20 12:35:51 2015 -0700 @@ -1,7 +1,11 @@ library/python-2/eventlet-26 +library/python-2/python-mysql-26 library/python-2/setuptools-26 +library/python-2/sqlalchemy-26 library/python-2/sqlalchemy-migrate-26 +library/python/iniparse-26 library/python/oslo.config-26 +library/python/six-26 runtime/python-26 shell/bash system/core-os diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/Makefile --- a/components/openstack/horizon/Makefile Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/horizon/Makefile Mon Apr 20 12:35:51 2015 -0700 @@ -20,25 +20,190 @@ # # -# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. # + include ../../../make-rules/shared-macros.mk +include ../../../make-rules/shared-targets.mk + +PATCH_EACH_ARCHIVE = 1 COMPONENT_NAME= horizon -COMPONENT_CODENAME= havana -COMPONENT_VERSION= 2013.2.3 +COMPONENT_CODENAME= juno +COMPONENT_VERSION= 2014.2.2 +COMPONENT_BE_VERSION= 2014.2 COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION) COMPONENT_ARCHIVE= $(COMPONENT_SRC).tar.gz COMPONENT_ARCHIVE_HASH= \ - sha256:de9b87ee62d8b28792399be0fc867ba99618eaaad289cf9842b5c7084e12620f + sha256:f639cdb8fc7fd26725d689d42c426f09bbd5a77554910800b1315f182879558e COMPONENT_ARCHIVE_URL= http://launchpad.net/$(COMPONENT_NAME)/$(COMPONENT_CODENAME)/$(COMPONENT_VERSION)/+download/$(COMPONENT_ARCHIVE) COMPONENT_PROJECT_URL= http://www.openstack.org/ -COMPONENT_BUGDB= utility/horizon -IPS_COMPONENT_VERSION= 0.$(COMPONENT_VERSION) +COMPONENT_BUGDB= service/horizon +IPS_COMPONENT_VERSION= 0.$(COMPONENT_VERSION) +COMPONENT_PATCHES= \ + 01-osprofiler.patch \ + 02-change-angular-imports.patch \ + 03-remove-qunit.patch \ + 04-remove-jasmine.patch \ + 05-disable-unsupported-bootsource.patch \ + 06-remove-security-groups.patch \ + 07-remove-image-source.patch \ + 08-_get_reachable_subnets.patch \ + 11-requirements.patch + +TPNO_HORIZON= 21822 +TPNO_ANGULAR= 21640 +TPNO_BOOTSTRAP_DP= 20670 +TPNO_BOOTSTRAP_SCSS= 20671 +TPNO_D3= 20822 +TPNO_FONT_AWESOME= 21641 +TPNO_HOGAN= 21827 +TPNO_JQUERY= 21642 +TPNO_JQUERY_MIGRATE= 13315 +TPNO_JQUERY_UI= 18416 +TPNO_JQUERY_QUICKSEARCH=20396 +TPNO_JQUERY_TABLESORTER=20824 +TPNO_JSENCRYPT= 20397 +TPNO_RICKSHAW= 20673 +TPNO_SPIN= 20674 + +NUM_EXTRA_ARCHIVES= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + +# +# Starting with Juno, Horizon depends on a number of XStatic modules +# to deliver the required JavaScript modules. This delivery method +# may be changing in future releases, so the XStatic modules for now +# are built as part of Horizon rather than being stand alone +# components/packages. The NUM_EXTRA_ARCHIVES parameter should +# enumerate the numbers of all the extra XStatic archives to be +# included in the Horizon build. +# +# XStatic itself is only used during the build process and so while it +# is downloaded and installed in the proto area, none of its +# components are delivered in the Horizon package itself. +# +COMPONENT_NAME_1 = XStatic +VERSION_XSTATIC = 1.0.1 +COMPONENT_ARCHIVE_1 = XStatic-$(VERSION_XSTATIC).tar.gz +COMPONENT_ARCHIVE_HASH_1 = \ + sha256:0ec93d7c66ebb9e0d31b664753437dc8634cb66e13310cb47c9eb1e0bc66d726 +COMPONENT_ARCHIVE_URL_1 = $(call pypi_url,1) + +COMPONENT_NAME_2 = XStatic-Angular +VERSION_ANGULAR = 1.3.7.0 +COMPONENT_ARCHIVE_2 = XStatic-Angular-$(VERSION_ANGULAR).tar.gz +COMPONENT_ARCHIVE_HASH_2 = \ + sha256:7cad216b226399cbe8d2909ed5b9f28d724907b9c9e1e078e6e25d320a3d5dd7 +COMPONENT_ARCHIVE_URL_2 = $(call pypi_url,2) +PKG_MACROS += VERSION_ANGULAR=$(VERSION_ANGULAR) + +COMPONENT_NAME_3 = XStatic-Bootstrap-Datepicker +VERSION_BOOTSTRAP_DP= 1.3.1.0 +COMPONENT_ARCHIVE_3 = XStatic-Bootstrap-Datepicker-$(VERSION_BOOTSTRAP_DP).tar.gz +COMPONENT_ARCHIVE_HASH_3 = \ + sha256:9edc9b77501001fcee9fbf4bf0a722c263efd928ef928b40081a8269fdd9a944 +COMPONENT_ARCHIVE_URL_3 = $(call pypi_url,3) +PKG_MACROS += VERSION_BOOTSTRAP_DP=$(VERSION_BOOTSTRAP_DP) + +COMPONENT_NAME_4 = XStatic-Bootstrap-SCSS +VERSION_BOOTSTRAP_SCSS= 3.2.0.0 +COMPONENT_ARCHIVE_4 = XStatic-Bootstrap-SCSS-$(VERSION_BOOTSTRAP_SCSS).tar.gz +COMPONENT_ARCHIVE_HASH_4 = \ + sha256:7e9858737e2e6aac921ec7a3fca627e522901c3061611e154ebc0b8a892c7018 +COMPONENT_ARCHIVE_URL_4 = $(call pypi_url,4) +PKG_MACROS += VERSION_BOOTSTRAP_SCSS=$(VERSION_BOOTSTRAP_SCSS) + +COMPONENT_NAME_5 = XStatic-D3 +VERSION_D3 = 3.1.6.2 +COMPONENT_ARCHIVE_5 = XStatic-D3-$(VERSION_D3).tar.gz +COMPONENT_ARCHIVE_HASH_5 = \ + sha256:46fe521f8dad99f5e20f6702180510c37b81d11f1d78119d308fcec31381f90e +COMPONENT_ARCHIVE_URL_5 = $(call pypi_url,5) +PKG_MACROS += VERSION_D3=$(VERSION_D3) -include $(WS_TOP)/make-rules/prep.mk -include $(WS_TOP)/make-rules/setup.py.mk -include $(WS_TOP)/make-rules/ips.mk +COMPONENT_NAME_6 = XStatic-Font-Awesome +VERSION_FONT_AWESOME = 4.2.0.0 +COMPONENT_ARCHIVE_6 = XStatic-Font-Awesome-$(VERSION_FONT_AWESOME).tar.gz +COMPONENT_ARCHIVE_HASH_6 = \ + sha256:b7fdbf1ed316f3a207eeb9ee1c052820e55b4e31d247d81c8ea059e21f555a73 +COMPONENT_ARCHIVE_URL_6 = $(call pypi_url,6) +PKG_MACROS += VERSION_FONT_AWESOME=$(VERSION_FONT_AWESOME) + +COMPONENT_NAME_7 = XStatic-Hogan +VERSION_HOGAN = 2.0.0.2 +COMPONENT_ARCHIVE_7 = XStatic-Hogan-$(VERSION_HOGAN).tar.gz +COMPONENT_ARCHIVE_HASH_7 = \ + sha256:5941bc7fb2a09916b8837848e6fc2a13b2dfc271811e9b522c61e1337d5fc2bd +COMPONENT_ARCHIVE_URL_7 = $(call pypi_url,7) +PKG_MACROS += VERSION_HOGAN=$(VERSION_HOGAN) + +COMPONENT_NAME_8 = XStatic-jQuery +VERSION_JQUERY = 1.10.2.1 +COMPONENT_ARCHIVE_8 = XStatic-jQuery-$(VERSION_JQUERY).tar.gz +COMPONENT_ARCHIVE_HASH_8 = \ + sha256:83416a6bb86e8534858c4d1ddca45e881c87639da6f78000c28c3a193fe91305 +COMPONENT_ARCHIVE_URL_8 = $(call pypi_url,8) +PKG_MACROS += VERSION_JQUERY=$(VERSION_JQUERY) + +COMPONENT_NAME_9 = XStatic-JQuery-Migrate +VERSION_JQUERY_MIGRATE= 1.2.1.1 +COMPONENT_ARCHIVE_9 = XStatic-JQuery-Migrate-$(VERSION_JQUERY_MIGRATE).tar.gz +COMPONENT_ARCHIVE_HASH_9 = \ + sha256:e2959b3df49afdddb00d36b74cca727a91b994b9f4edb993d7264731a750900e +COMPONENT_ARCHIVE_URL_9 = $(call pypi_url,9) +PKG_MACROS += VERSION_JQUERY_MIGRATE=$(VERSION_JQUERY_MIGRATE) + +COMPONENT_NAME_10 = XStatic-jquery-ui +VERSION_JQUERY_UI = 1.11.0.1 +COMPONENT_ARCHIVE_10 = XStatic-jquery-ui-$(VERSION_JQUERY_UI).tar.gz +COMPONENT_ARCHIVE_HASH_10 = \ + sha256:099b1836eb0d91b8dc98f5b8a6b856a2631d43af0d47f33ef90ee72ed37bda58 +COMPONENT_ARCHIVE_URL_10 = $(call pypi_url,10) +PKG_MACROS += VERSION_JQUERY_UI=$(VERSION_JQUERY_UI) + +COMPONENT_NAME_11 = XStatic-JQuery.quicksearch +VERSION_JQUERY_QS = 2.0.3.1 +COMPONENT_ARCHIVE_11 = XStatic-JQuery.quicksearch-$(VERSION_JQUERY_QS).tar.gz +COMPONENT_ARCHIVE_HASH_11 = \ + sha256:1271571b420417add56c274fd935e81bfc79e0d54a03559d6ba5ef369f358477 +COMPONENT_ARCHIVE_URL_11 = $(call pypi_url,11) +PKG_MACROS += VERSION_JQUERY_QS=$(VERSION_JQUERY_QS) + +COMPONENT_NAME_12 = XStatic-JQuery.TableSorter +VERSION_JQUERY_TS = 2.14.5.1 +COMPONENT_ARCHIVE_12 = XStatic-JQuery.TableSorter-$(VERSION_JQUERY_TS).tar.gz +COMPONENT_ARCHIVE_HASH_12 = \ + sha256:3ba24aecd9a3dc71a79dd4096fa5a8a041c3a7b892c61d05e6e46de0605070f0 +COMPONENT_ARCHIVE_URL_12 = $(call pypi_url,12) +PKG_MACROS += VERSION_JQUERY_TS=$(VERSION_JQUERY_TS) + +COMPONENT_NAME_13 = XStatic-JSEncrypt +VERSION_JSENCRYPT = 2.0.0.2 +COMPONENT_ARCHIVE_13 = XStatic-JSEncrypt-$(VERSION_JSENCRYPT).tar.gz +COMPONENT_ARCHIVE_HASH_13 = \ + sha256:5852892afc6f80c7848f4110b6dad190a54aeb908271d67aaeae9d966f4a26b5 +COMPONENT_ARCHIVE_URL_13 = $(call pypi_url,13) +PKG_MACROS += VERSION_JSENCRYPT=$(VERSION_JSENCRYPT) + +COMPONENT_NAME_14 = XStatic-Rickshaw +VERSION_RICKSHAW = 1.5.0.0 +COMPONENT_ARCHIVE_14 = XStatic-Rickshaw-$(VERSION_RICKSHAW).tar.gz +COMPONENT_ARCHIVE_HASH_14 = \ + sha256:147574228757254442700a9eea5150f14acb1224ef0612f896b663ab58406de8 +COMPONENT_ARCHIVE_URL_14 = $(call pypi_url,14) +PKG_MACROS += VERSION_RICKSHAW=$(VERSION_RICKSHAW) + +COMPONENT_NAME_15 = XStatic-Spin +VERSION_SPIN = 1.2.5.2 +COMPONENT_ARCHIVE_15 = XStatic-Spin-$(VERSION_SPIN).tar.gz +COMPONENT_ARCHIVE_HASH_15 = \ + sha256:7f46ef0e45e047019ba6eda22c432fb96f681b97bbe7f1749aa9209e07727192 +COMPONENT_ARCHIVE_URL_15 = $(call pypi_url,15) +PKG_MACROS += VERSION_SPIN=$(VERSION_SPIN) + +include $(WS_MAKE_RULES)/prep.mk +include $(WS_MAKE_RULES)/setup.py.mk +include $(WS_MAKE_RULES)/ips.mk ASLR_MODE = $(ASLR_NOT_APPLICABLE) @@ -46,25 +211,98 @@ # only need to deliver one version. The manifest is parameterized, though. PYTHON_VERSIONS= 2.6 +# Django's manage.py needs to be run with Python 2.6, since that's what this +# ecosystem runs under right now. +PYTHON_VERSION= 2.6 + +PKG_MACROS += COMPONENT_BE_VERSION=$(COMPONENT_BE_VERSION) PKG_MACROS += PYVER=$(PYTHON_VERSIONS) +PKG_MACROS += PYV=$(shell echo $(PYTHON_VERSIONS) | tr -d .) +PROTO_PYTHON_LIB = $(PROTO_DIR)$(PYTHON_LIB) + +# Copy the Oracle branding files and Django app customizations into place +COMPONENT_POST_INSTALL_ACTION += \ + ($(MKDIR) $(PROTO_PYTHON_LIB)/openstack_dashboard/templates/solaris; \ + $(CP) files/branding/css/solaris.css \ + $(PROTO_PYTHON_LIB)/openstack_dashboard/static/dashboard/css; \ + $(CP) files/branding/img/* \ + $(PROTO_PYTHON_LIB)/openstack_dashboard/static/dashboard/img; \ + $(CP) files/branding/theme/_stylesheets.html \ + $(PROTO_PYTHON_LIB)/openstack_dashboard/templates/solaris; \ + $(CP) files/overrides.py $(PROTO_PYTHON_LIB)/openstack_dashboard); + +# Generate .pyc files for the files in the proto directory +COMPONENT_POST_INSTALL_ACTION += \ + $(PYTHON) -m compileall $(PROTO_PYTHON_LIB); + +# Collect the JavaScript files and compress the static assets COMPONENT_POST_INSTALL_ACTION += \ - ($(MKDIR) $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/openstack_dashboard/static/solaris/css; \ - $(CP) files/branding/css/solaris.css $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/openstack_dashboard/static/solaris/css; \ - $(MKDIR) $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/openstack_dashboard/static/solaris/img; \ - $(CP) files/branding/img/* $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/openstack_dashboard/static/solaris/img; \ - $(MKDIR) $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/openstack_dashboard/static/solaris/theme; \ - $(CP) files/branding/theme/_stylesheets.html $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/openstack_dashboard/static/solaris/theme; \ - $(CP) files/overrides.py $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/openstack_dashboard); \ - $(PYTHON) -m compileall $(PROTO_DIR)/$(PYTHON_VENDOR_PACKAGES) - + (set -e; $(CP) $(SOURCE_DIR)/manage.py \ + $(PROTO_PYTHON_LIB)/openstack_dashboard; \ + $(TOUCH) $(PROTO_PYTHON_LIB)/xstatic/__init__.py; \ + $(TOUCH) $(PROTO_PYTHON_LIB)/xstatic/pkg/__init__.py; \ + cd $(PROTO_PYTHON_LIB)/openstack_dashboard; \ + $(ENV) PYTHONPATH=$(PROTO_PYTHON_LIB) ./manage.py \ + collectstatic --noinput; \ + $(ENV) PYTHONPATH=$(PROTO_PYTHON_LIB) ./manage.py compress --force; \ + $(CP) -R $(PROTO_PYTHON_LIB)/static \ + $(PROTO_PYTHON_LIB)/openstack_dashboard; \ + $(RM) -r \ + $(PROTO_PYTHON_LIB)/XStatic* \ + $(PROTO_PYTHON_LIB)/openstack_dashboard/local/.secret_key_store \ + $(PROTO_PYTHON_LIB)/openstack_dashboard/manage.py \ + $(PROTO_PYTHON_LIB)/static \ + $(PROTO_PYTHON_LIB)/xstatic); (( $$? )) && exit 1; + +# Patch openstack_dashboard/settings.py to remove the xstatic imports +# and use. This is done after 'gmake prep' because we need the +# xstatic imports for static asset collection. +COMPONENT_POST_INSTALL_ACTION += \ + $(GPATCH) -d $(PROTO_DIR) $(GPATCH_FLAGS) \ + < patches/99-remove.xstatic.patch + +# +# The xstatic target builds each XStatic component alongside Horizon. +# This is done because the Django script which collects +# the JavaScript libraries and compresses the static assets +# (manage.py) requires the packages be "installed". Rather than +# forcing a CBE update for any revision of any XStatic module, we use +# what's specified above. +# +# This extra work is done at package build time rather than when the +# application runs because a) compressing the assets ahead of time +# makes things faster and b) this allows the package to be entirely +# contained in /usr rather than having a separate spot in /var for the +# webservd user to write compressed assets to as they get used. +# +.PHONY: xstatic +xstatic: $(PROTO_DIR) build + for xs_archive in $$(ls -d XStatic-* | grep -v .tar.gz); do \ + cd $$xs_archive; \ + $(ENV) $(PYTHON.$(BITS)) ./setup.py build; \ + $(ENV) $(PYTHON.$(BITS)) ./setup.py install \ + --force \ + --install-data=$(PYTHON_DATA) \ + --install-lib=$(PYTHON_LIB) \ + --install-platlib=$(PYTHON_LIB) \ + --install-purelib=$(PYTHON_LIB) \ + --root $(PROTO_DIR); \ + cd ../; \ + done + # common targets build: $(BUILD_NO_ARCH) -install: $(INSTALL_NO_ARCH) +# make sure all of the xstatic modules are built +install: $(INSTALL_NO_ARCH) xstatic test: $(NO_TESTS) BUILD_PKG_DEPENDENCIES = $(BUILD_TOOLS) +clean:: + gfind $(COMPONENT_DIR) -maxdepth 1 -type d -name "XStatic*" \ + -exec rm -r {} \; + include $(WS_TOP)/make-rules/depend.mk diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/angular.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/angular.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2010-2012 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/bootstrap-datepicker.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/bootstrap-datepicker.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,218 @@ +The following applies to all products licensed under the Apache 2.0 License: + +You may not use the identified files except in compliance with the +Apache License, Version 2.0 (the "License.") + +You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0. A copy of the license is +also reproduced below. + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied. + +See the License for the specific language governing permissions and +limitations under the License. + + 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. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/bootstrap-scss.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/bootstrap-scss.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,19 @@ +Copyright (c) 2011-2014 Twitter, Inc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/d3.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/d3.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,26 @@ +Copyright (c) 2013, Michael Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +* The name Michael Bostock may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/files/branding/css/solaris.css --- a/components/openstack/horizon/files/branding/css/solaris.css Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/horizon/files/branding/css/solaris.css Mon Apr 20 12:35:51 2015 -0700 @@ -1,1712 +1,9161 @@ /* - * Bootstrap v2.0.1 + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You may + * obtain a copy of the License at * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Designed and built with all the love in the world @twitter by @mdo and @fat. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} -audio:not([controls]) { - display: none; -} + html { - font-size: 100%; - -webkit-text-size-adjust: 100%; + font-family: sans-serif; -ms-text-size-adjust: 100%; -} -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -a:hover, -a:active { - outline: 0; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - max-width: 100%; - height: auto; - border: 0; - -ms-interpolation-mode: bicubic; -} -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} -button, -input { - *overflow: visible; - line-height: normal; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} -input[type="search"] { - -webkit-appearance: textfield; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} -textarea { - overflow: auto; - vertical-align: top; -} -.clearfix { - *zoom: 1; -} -.clearfix:before, -.clearfix:after { - display: table; - content: ""; -} -.clearfix:after { - clear: both; -} -*:focus { outline: 0; } + -webkit-text-size-adjust: 100%; +} body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 18px; - color: #333333; - background-color: #ffffff; -} + margin: 0; +} + +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } + +audio, canvas, progress, video { + display: inline-block; + vertical-align: baseline; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +[hidden], template { + display: none; +} + a { - color: #005D9D; - text-decoration: none; -} -a:hover { - color: #005D9D; - text-decoration: underline; -} -.row { - margin-left: -20px; - *zoom: 1; -} -.row:before, -.row:after { - display: table; - content: ""; -} -.row:after { - clear: both; -} -[class*="span"] { - float: left; - margin-left: 20px; -} -.span1 { - width: 60px; -} -.span2 { - width: 140px; -} -.span3 { - width: 220px; -} -.span4 { - width: 300px; -} -.span5 { - width: 380px; -} -.span6 { - width: 460px; -} -.span7 { - width: 540px; -} -.span8 { - width: 620px; -} -.span9 { - width: 700px; -} -.span10 { - width: 780px; -} -.span11 { - width: 860px; -} -.span12, -.container { - width: 940px; -} -.offset1 { - margin-left: 100px; -} -.offset2 { - margin-left: 180px; -} -.offset3 { - margin-left: 260px; -} -.offset4 { - margin-left: 340px; -} -.offset5 { - margin-left: 420px; -} -.offset6 { - margin-left: 500px; -} -.offset7 { - margin-left: 580px; -} -.offset8 { - margin-left: 660px; -} -.offset9 { - margin-left: 740px; -} -.offset10 { - margin-left: 820px; -} -.offset11 { - margin-left: 900px; -} -.row-fluid { - width: 100%; - *zoom: 1; -} -.row-fluid:before, -.row-fluid:after { - display: table; - content: ""; -} -.row-fluid:after { - clear: both; -} -.row-fluid > [class*="span"] { - float: left; - margin-left: 2.127659574%; -} -.row-fluid > [class*="span"]:first-child { - margin-left: 0; -} -.row-fluid > .span1 { - width: 6.382978723%; -} -.row-fluid > .span2 { - width: 14.89361702%; -} -.row-fluid > .span3 { - width: 23.404255317%; -} -.row-fluid > .span4 { - width: 31.914893614%; -} -.row-fluid > .span5 { - width: 40.425531911%; -} -.row-fluid > .span6 { - width: 48.93617020799999%; -} -.row-fluid > .span7 { - width: 57.446808505%; -} -.row-fluid > .span8 { - width: 65.95744680199999%; -} -.row-fluid > .span9 { - width: 74.468085099%; -} -.row-fluid > .span10 { - width: 82.97872339599999%; -} -.row-fluid > .span11 { - width: 91.489361693%; -} -.row-fluid > .span12 { - width: 99.99999998999999%; -} -.container { - width: 940px; - margin-left: auto; - margin-right: auto; - *zoom: 1; -} -.container:before, -.container:after { - display: table; - content: ""; -} -.container:after { - clear: both; -} -.container-fluid { - padding-left: 20px; - padding-right: 20px; - *zoom: 1; -} -.container-fluid:before, -.container-fluid:after { - display: table; - content: ""; -} -.container-fluid:after { - clear: both; -} + background: transparent; +} + +a:active, a:hover { + outline: 0; +} + +abbr[title] { + border-bottom: 1px dotted; } + +b, strong { + font-weight: bold; } + +dfn { + font-style: italic; } + +h1 { + font-size: 2em; + margin: 0.67em 0; } + +mark { + background: #ff0; + color: #000; } + +small { +font-size: 80%; } + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sup { + top: -0.5em; } + +sub { + bottom: -0.25em; } + +img { + border: 0; } + +svg:not(:root) { + overflow: hidden; } + +figure { + margin: 1em 40px; } + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; } + +pre { + overflow: auto; } + +code, kbd, pre, samp { + font-family: monospace, monospace; + font-size: 1em; } + +button, input, optgroup, select, textarea { + color: inherit; + font: inherit; + margin: 0; } + +button { + overflow: visible; } + +button, select { + text-transform: none; } + +button, html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; } + +button[disabled], html input[disabled] { + cursor: default; } + +button::-moz-focus-inner, input::-moz-focus-inner { + border: 0; + padding: 0; } + +input { + line-height: normal; } + +input[type="checkbox"], input[type="radio"] { + box-sizing: border-box; + padding: 0; } + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; } + +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; } + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; } + +legend { + border: 0; + padding: 0; } + +textarea { + overflow: auto; } + +optgroup { + font-weight: bold; } + +table { + border-collapse: collapse; + border-spacing: 0; } + +td, th { + padding: 0; +} + +@media print { + * { + text-shadow: none !important; + color: #000 !important; + background: transparent !important; + box-shadow: none !important; + } + a, a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; } + abbr[title]:after { + content: " (" attr(title) ")"; } + a[href^="javascript:"]:after, a[href^="#"]:after { + content: ""; } + pre, blockquote { + border: 1px solid #999; + page-break-inside: avoid; } + thead { + display: table-header-group; } + tr, img { + page-break-inside: avoid; } + img { + max-width: 100% !important; } + p, h2, h3 { + orphans: 3; + widows: 3; } + h2, h3 { + page-break-after: avoid; } + select { + background: #fff !important; } + .navbar { + display: none; } + .table td, .table th { + background-color: #fff !important; + } + .btn > .caret, .dropup > .btn > .caret { + border-top-color: #000 !important; } + .label { + border: 1px solid #000; } + .table { + border-collapse: collapse !important; + } + .table-bordered th, .table-bordered td { + border: 1px solid #ddd !important; + } +} + +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot?7ad17c6085de'); + src: url('/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot?&7ad17c6085de#iefix') format('embedded-opentype'), + url('/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff?68ed1dac06bf') format('woff'), + url('/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf?e49d52e74b76') format('truetype'), + url('/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg?32941d633004#glyphicons_halflingsregular') format('svg'); } + +.glyphicon, .membership .role_dropdown li i { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +.glyphicon-asterisk:before { + content: "\2a"; } + +.glyphicon-plus:before { + content: "\2b"; } + +.glyphicon-euro:before { + content: "\20ac"; } + +.glyphicon-minus:before { + content: "\2212"; } + +.glyphicon-cloud:before { + content: "\2601"; } + +.glyphicon-envelope:before { + content: "\2709"; } + +.glyphicon-pencil:before { + content: "\270f"; } + +.glyphicon-glass:before { + content: "\e001"; } + +.glyphicon-music:before { + content: "\e002"; } + +.glyphicon-search:before { + content: "\e003"; } + +.glyphicon-heart:before { + content: "\e005"; } + +.glyphicon-star:before { + content: "\e006"; } + +.glyphicon-star-empty:before { + content: "\e007"; } + +.glyphicon-user:before { + content: "\e008"; } + +.glyphicon-film:before { + content: "\e009"; } + +.glyphicon-th-large:before { + content: "\e010"; } + +.glyphicon-th:before { + content: "\e011"; } + +.glyphicon-th-list:before { + content: "\e012"; } + +.glyphicon-ok:before { + content: "\e013"; } + +.glyphicon-remove:before { + content: "\e014"; } + +.glyphicon-zoom-in:before { + content: "\e015"; } + +.glyphicon-zoom-out:before { + content: "\e016"; } + +.glyphicon-off:before { + content: "\e017"; } + +.glyphicon-signal:before { + content: "\e018"; } + +.glyphicon-cog:before { + content: "\e019"; + margin: 0px 4px 0px 0px; +} + +.glyphicon-trash:before { + content: "\e020"; } + +.glyphicon-home:before { + content: "\e021"; } + +.glyphicon-file:before { + content: "\e022"; } + +.glyphicon-time:before { + content: "\e023"; } + +.glyphicon-road:before { + content: "\e024"; } + +.glyphicon-download-alt:before { + content: "\e025"; } + +.glyphicon-download:before { + content: "\e026"; } + +.glyphicon-upload:before { + content: "\e027"; } + +.glyphicon-inbox:before { + content: "\e028"; } + +.glyphicon-play-circle:before { + content: "\e029"; } + +.glyphicon-repeat:before { + content: "\e030"; } + +.glyphicon-refresh:before { + content: "\e031"; } + +.glyphicon-list-alt:before { + /*content: "\e032"; */ +} + +.glyphicon-lock:before { + content: "\e033"; } + +.glyphicon-flag:before { + content: "\e034"; } + +.glyphicon-headphones:before { + content: "\e035"; } + +.glyphicon-volume-off:before { + content: "\e036"; } + +.glyphicon-volume-down:before { + content: "\e037"; } + +.glyphicon-volume-up:before { + content: "\e038"; } + +.glyphicon-qrcode:before { + content: "\e039"; } + +.glyphicon-barcode:before { + content: "\e040"; } + +.glyphicon-tag:before { + content: "\e041"; } + +.glyphicon-tags:before { + content: "\e042"; } + +.glyphicon-book:before { + content: "\e043"; } + +.glyphicon-bookmark:before { + content: "\e044"; } + +.glyphicon-print:before { + content: "\e045"; } + +.glyphicon-camera:before { + content: "\e046"; } + +.glyphicon-font:before { + content: "\e047"; } + +.glyphicon-bold:before { + content: "\e048"; } + +.glyphicon-italic:before { + content: "\e049"; } + +.glyphicon-text-height:before { + content: "\e050"; } + +.glyphicon-text-width:before { + content: "\e051"; } + +.glyphicon-align-left:before { + content: "\e052"; } + +.glyphicon-align-center:before { + content: "\e053"; } + +.glyphicon-align-right:before { + content: "\e054"; } + +.glyphicon-align-justify:before { + content: "\e055"; } + +.glyphicon-list:before { + content: "\e056"; } + +.glyphicon-indent-left:before { + content: "\e057"; } + +.glyphicon-indent-right:before { + content: "\e058"; } + +.glyphicon-facetime-video:before { + content: "\e059"; } + +.glyphicon-picture:before { + content: "\e060"; } + +.glyphicon-map-marker:before { + content: "\e062"; } + +.glyphicon-adjust:before { + content: "\e063"; } + +.glyphicon-tint:before { + content: "\e064"; } + +.glyphicon-edit:before { + content: "\e065"; } + +.glyphicon-share:before { + content: "\e066"; } + +.glyphicon-check:before { + content: "\e067"; } + +.glyphicon-move:before { + content: "\e068"; } + +.glyphicon-step-backward:before { + content: "\e069"; } + +.glyphicon-fast-backward:before { + content: "\e070"; } + +.glyphicon-backward:before { + content: "\e071"; } + +.glyphicon-play:before { + content: "\e072"; } + +.glyphicon-pause:before { + content: "\e073"; } + +.glyphicon-stop:before { + content: "\e074"; } + +.glyphicon-forward:before { + content: "\e075"; } + +.glyphicon-fast-forward:before { + content: "\e076"; } + +.glyphicon-step-forward:before { + content: "\e077"; } + +.glyphicon-eject:before { + content: "\e078"; } + +.glyphicon-chevron-left:before { + content: "\e079"; } + +.glyphicon-chevron-right:before { + content: "\e080"; } + +.glyphicon-plus-sign:before { + content: "\e081"; } + +.glyphicon-minus-sign:before { + content: "\e082"; } + +.glyphicon-remove-sign:before { + content: "\e083"; } + +.glyphicon-ok-sign:before { + content: "\e084"; } + +.glyphicon-question-sign:before { + content: "\e085"; } + +.glyphicon-info-sign:before { + content: "\e086"; } + +.glyphicon-screenshot:before { + content: "\e087"; } + +.glyphicon-remove-circle:before { + content: "\e088"; } + +.glyphicon-ok-circle:before { + content: "\e089"; } + +.glyphicon-ban-circle:before { + content: "\e090"; } + +.glyphicon-arrow-left:before { + content: "\e091"; } + +.glyphicon-arrow-right:before { + content: "\e092"; } + +.glyphicon-arrow-up:before { + content: "\e093"; } + +.glyphicon-arrow-down:before { + content: "\e094"; } + +.glyphicon-share-alt:before { + content: "\e095"; } + +.glyphicon-resize-full:before { + content: "\e096"; } + +.glyphicon-resize-small:before { + content: "\e097"; } + +.glyphicon-exclamation-sign:before { + content: "\e101"; } + +.glyphicon-gift:before { + content: "\e102"; } + +.glyphicon-leaf:before { + content: "\e103"; } + +.glyphicon-fire:before { + content: "\e104"; } + +.glyphicon-eye-open:before { + content: "\e105"; } + +.glyphicon-eye-close:before { + content: "\e106"; } + +.glyphicon-warning-sign:before { + content: "\e107"; } + +.glyphicon-plane:before { + content: "\e108"; } + +.glyphicon-calendar:before { + content: "\e109"; } + +.glyphicon-random:before { + content: "\e110"; } + +.glyphicon-comment:before { + content: "\e111"; } + +.glyphicon-magnet:before { + content: "\e112"; } + +.glyphicon-chevron-up:before { + content: "\e113"; } + +.glyphicon-chevron-down:before { + content: "\e114"; } + +.glyphicon-retweet:before { + content: "\e115"; } + +.glyphicon-shopping-cart:before { + content: "\e116"; } + +.glyphicon-folder-close:before { + content: "\e117"; } + +.glyphicon-folder-open:before { + content: "\e118"; } + +.glyphicon-resize-vertical:before { + content: "\e119"; } + +.glyphicon-resize-horizontal:before { + content: "\e120"; } + +.glyphicon-hdd:before { + content: "\e121"; } + +.glyphicon-bullhorn:before { + content: "\e122"; } + +.glyphicon-bell:before { + content: "\e123"; } + +.glyphicon-certificate:before { + content: "\e124"; } + +.glyphicon-thumbs-up:before { + content: "\e125"; } + +.glyphicon-thumbs-down:before { + content: "\e126"; } + +.glyphicon-hand-right:before { + content: "\e127"; } + +.glyphicon-hand-left:before { + content: "\e128"; } + +.glyphicon-hand-up:before { + content: "\e129"; } + +.glyphicon-hand-down:before { + content: "\e130"; } + +.glyphicon-circle-arrow-right:before { + content: "\e131"; } + +.glyphicon-circle-arrow-left:before { + content: "\e132"; } + +.glyphicon-circle-arrow-up:before { + content: "\e133"; } + +.glyphicon-circle-arrow-down:before { + content: "\e134"; } + +.glyphicon-globe:before { + content: "\e135"; } + +.glyphicon-wrench:before { + content: "\e136"; } + +.glyphicon-tasks:before { + content: "\e137"; } + +.glyphicon-filter:before { + content: "\e138"; } + +.glyphicon-briefcase:before { + content: "\e139"; } + +.glyphicon-fullscreen:before { + content: "\e140"; } + +.glyphicon-dashboard:before { + content: "\e141"; } + +.glyphicon-paperclip:before { + content: "\e142"; } + +.glyphicon-heart-empty:before { + content: "\e143"; } + +.glyphicon-link:before { + content: "\e144"; } + +.glyphicon-phone:before { + content: "\e145"; } + +.glyphicon-pushpin:before { + content: "\e146"; } + +.glyphicon-usd:before { + content: "\e148"; } + +.glyphicon-gbp:before { + content: "\e149"; } + +.glyphicon-sort:before { + content: "\e150"; } + +.glyphicon-sort-by-alphabet:before { + content: "\e151"; } + +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; } + +.glyphicon-sort-by-order:before { + content: "\e153"; } + +.glyphicon-sort-by-order-alt:before { + content: "\e154"; } + +.glyphicon-sort-by-attributes:before { + content: "\e155"; } + +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; } + +.glyphicon-unchecked:before { + content: "\e157"; } + +.glyphicon-expand:before { + content: "\e158"; } + +.glyphicon-collapse-down:before { + content: "\e159"; } + +.glyphicon-collapse-up:before { + content: "\e160"; } + +.glyphicon-log-in:before { + content: "\e161"; } + +.glyphicon-flash:before { + content: "\e162"; } + +.glyphicon-log-out:before { + content: "\e163"; } + +.glyphicon-new-window:before { + content: "\e164"; } + +.glyphicon-record:before { + content: "\e165"; } + +.glyphicon-save:before { + content: "\e166"; } + +.glyphicon-open:before { + content: "\e167"; } + +.glyphicon-saved:before { + content: "\e168"; } + +.glyphicon-import:before { + content: "\e169"; } + +.glyphicon-export:before { + content: "\e170"; } + +.glyphicon-send:before { + content: "\e171"; } + +.glyphicon-floppy-disk:before { + content: "\e172"; } + +.glyphicon-floppy-saved:before { + content: "\e173"; } + +.glyphicon-floppy-remove:before { + content: "\e174"; } + +.glyphicon-floppy-save:before { + content: "\e175"; } + +.glyphicon-floppy-open:before { + content: "\e176"; } + +.glyphicon-credit-card:before { + content: "\e177"; } + +.glyphicon-transfer:before { + content: "\e178"; } + +.glyphicon-cutlery:before { + content: "\e179"; } + +.glyphicon-header:before { + content: "\e180"; } + +.glyphicon-compressed:before { + content: "\e181"; } + +.glyphicon-earphone:before { + content: "\e182"; } + +.glyphicon-phone-alt:before { + content: "\e183"; } + +.glyphicon-tower:before { + content: "\e184"; } + +.glyphicon-stats:before { + content: "\e185"; } + +.glyphicon-sd-video:before { + content: "\e186"; } + +.glyphicon-hd-video:before { + content: "\e187"; } + +.glyphicon-subtitles:before { + content: "\e188"; } + +.glyphicon-sound-stereo:before { + content: "\e189"; } + +.glyphicon-sound-dolby:before { + content: "\e190"; } + +.glyphicon-sound-5-1:before { + content: "\e191"; } + +.glyphicon-sound-6-1:before { + content: "\e192"; } + +.glyphicon-sound-7-1:before { + content: "\e193"; } + +.glyphicon-copyright-mark:before { + content: "\e194"; } + +.glyphicon-registration-mark:before { + content: "\e195"; } + +.glyphicon-cloud-download:before { + content: "\e197"; } + +.glyphicon-cloud-upload:before { + content: "\e198"; } + +.glyphicon-tree-conifer:before { + content: "\e199"; } + +.glyphicon-tree-deciduous:before { + content: "\e200"; } + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +*:before, *:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +html { + font-size: 10px; + -webkit-tap-highlight-color: transparent; } + +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 1.5; + color: #333; + background-color: #fff; } + +input, button, select, textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; } +a { + color: #005D9D; + text-decoration: none; +} +a:hover, a:focus { + color: #005D9D; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + +figure { + margin: 0; } + +img { + vertical-align: middle; } + +.img-responsive { + display: block; + width: 100% \9; + max-width: 100%; + height: auto; } + +.img-rounded { + border-radius: 6px; } + +.img-thumbnail { + padding: 4px; + line-height: 1.5; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + width: 100% \9; + max-width: 100%; + height: auto; } + +.img-circle { + border-radius: 50%; } + +hr { + margin-top: 18px; + margin-bottom: 18px; + border: 0; + border-top: 1px solid #eee; } + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; } + +h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { + font-weight: 600; + line-height: 1.2; + color: #333333; +} + h1 small, h1 .small, h2 small, h2 .small, h3 small, h3 .small, h4 small, + h4 .small, h5 small, h5 .small, h6 small, h6 .small, .h1 small, .h1 .small, + .h2 small, .h2 .small, .h3 small, .h3 .small, .h4 small, .h4 .small, .h5 small, + .h5 .small, .h6 small, .h6 .small { + font-weight: normal; + line-height: 1; + color: #333333; } + +h1, .h1, h2, .h2, h3, .h3 { + margin-top: 18px; + margin-bottom: 9px; } + h1 small, h1 .small, .h1 small, .h1 .small, h2 small, h2 .small, .h2 small, + .h2 .small, h3 small, h3 .small, .h3 small, .h3 .small { + font-size: 65%; } + +h4, .h4, h5, .h5, h6, .h6 { + margin-top: 9px; + margin-bottom: 9px; } + h4 small, h4 .small, .h4 small, .h4 .small, h5 small, h5 .small, .h5 small, + .h5 .small, h6 small, h6 .small, .h6 small, .h6 .small { + font-size: 75%; } + +h1, .h1 { + font-size: 33px; } + +h2, .h2 { + font-size: 27px; } + +h3, .h3 { + font-size: 23px; } + +h4, .h4 { + font-size: 17px; } + +h5, .h5 { + font-size: 13px; } + +h6, .h6 { + font-size: 12px; } + p { - margin: 0 0 9px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 18px; -} -p small { - font-size: 11px; - color: #999999; -} + margin: 0 0 9px; } + +#container { + width: 100%; + height: 100%; +} + .lead { - margin-bottom: 18px; - font-size: 20px; - font-weight: 200; - line-height: 27px; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - font-weight: bold; - color: #333333; - text-rendering: optimizelegibility; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - color: #999999; -} -h1 { - font-size: 30px; - line-height: 36px; -} -h1 small { - font-size: 18px; -} -h2 { - font-size: 24px; - line-height: 36px; -} -h2 small { - font-size: 18px; -} -h3 { - line-height: 27px; - font-size: 16px; -} -h3 small { - font-size: 14px; -} -h4, -h5, -h6 { - line-height: 18px; -} -h4 { - font-size: 14px; -} -h4 small { - font-size: 12px; -} -h5 { - font-size: 12px; -} -h6 { - font-size: 11px; - color: #999999; - text-transform: uppercase; -} + margin-bottom: 18px; + font-size: 14px; + font-weight: 300; + line-height: 1.4; } + +@media (min-width: 768px) { + .lead { + font-size: 19.5px; } +} + +small, .small { + font-size: 92%; } + +cite { + font-style: normal; } + +mark, .mark { + background-color: #fcf8e3; + padding: 0.2em; } + +.text-left { + text-align: left; } + +.text-right { + text-align: right; } + +.text-center { + text-align: center; } + +.text-justify { + text-align: justify; } + +.text-nowrap { + white-space: nowrap; } + +.text-lowercase { + text-transform: lowercase; } + +.text-uppercase { + text-transform: uppercase; } + +.text-capitalize { + text-transform: capitalize; } + +.text-muted { + color: #777; } + +.bg-primary { + color: #fff; } + .page-header { - padding-bottom: 17px; - margin: 18px 0; - border-bottom: 1px solid #eeeeee; -} -.page-header h1 { - line-height: 1; -} -ul, -ol { - padding: 0; - margin: 0 0 9px 25px; -} -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} -ul { - list-style: disc; -} -ol { - list-style: decimal; -} -li { - line-height: 18px; -} -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} -table ul { - margin: 0; - list-style-type: none; -} + padding-bottom: 8px; + margin: 36px 0 18px; + /*border-bottom: 1px solid #eee; */} + +ul, ol { + margin-top: 0; + margin-bottom: 9px; } +ul ul, ul ol, ol ul, ol ol { + margin-bottom: 0; } + +.list-unstyled, .list-inline { + padding-left: 0; + list-style: none; } + +.list-inline { + margin-left: -5px; } +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; } + dl { - margin-bottom: 18px; -} -dt, -dd { - line-height: 18px; -} + margin-top: 0; + margin-bottom: 18px; } + +dt, dd { + line-height: 1.5; } + dt { - font-weight: bold; -} + font-weight: bold; } + dd { - margin-left: 9px; -} -hr { - margin: 18px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} -strong { - font-weight: bold; -} -em { - font-style: italic; -} -.muted { - color: #999999; -} -abbr { - font-size: 90%; - text-transform: uppercase; - border-bottom: 1px dotted #ddd; + margin-left: 0; } + +@media (min-width: 768px) { + .dl-horizontal dt { + loat: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .dl-horizontal dd { + margin-left: 180px; } +} + +abbr[title], abbr[data-original-title] { cursor: help; -} -blockquote { - padding: 0 0 0 15px; - margin: 0 0 18px; - border-left: 5px solid #eeeeee; -} -blockquote p { - margin-bottom: 0; - font-size: 16px; - font-weight: 300; - line-height: 22.5px; -} -blockquote small { - display: block; - line-height: 18px; - color: #999999; -} -blockquote small:before { - content: '\2014 \00A0'; -} -blockquote.pull-right { - float: right; + border-bottom: 1px dotted #777; } + + .initialism { + font-size: 90%; + text-transform: uppercase; } + + blockquote { + padding: 9px 18px; + margin: 0 0 18px; + font-size: 16.25px; + border-left: 5px solid #eee; } + blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { + margin-bottom: 0; } + blockquote footer, blockquote small, blockquote .small { + display: block; + font-size: 80%; + line-height: 1.5; + color: #777; } + blockquote footer:before, blockquote small:before, blockquote .small:before { + content: '\2014 \00A0'; } + +.blockquote-reverse, blockquote.pull-right { + padding-right: 15px; padding-left: 0; - padding-right: 15px; + border-right: 5px solid #eee; border-left: 0; - border-right: 5px solid #eeeeee; -} -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} -address { - display: block; - margin-bottom: 18px; - line-height: 18px; - font-style: normal; -} -small { - font-size: 100%; -} -cite { - font-style: normal; -} -code, -pre { - padding: 0 3px 2px; - font-family: Menlo, Monaco, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; -} + text-align: right; } + .blockquote-reverse footer:before, .blockquote-reverse small:before, + .blockquote-reverse .small:before, blockquote.pull-right footer:before, + blockquote.pull-right small:before, blockquote.pull-right .small:before { + content: ''; } + .blockquote-reverse footer:after, .blockquote-reverse small:after, + .blockquote-reverse .small:after, blockquote.pull-right footer:after, + blockquote.pull-right small:after, blockquote.pull-right .small:after { + content: '\00A0 \2014'; } + +blockquote:before, blockquote:after { + content: ""; } + + address { + margin-bottom: 18px; + font-style: normal; + line-height: 1.5; } +.text-primary { + color: #428bca; } + + a.text-primary:hover { + color: #3071a9; } + + .text-success { + color: #3c763d; } + + a.text-success:hover { + color: #2b542c; } + + .text-info { + color: #31708f; } + + a.text-info:hover { + color: #245269; } + + .text-warning { + color: #8a6d3b; } + + a.text-warning:hover { + color: #66512c; } + + .text-danger { + color: #a94442; } + + a.text-danger:hover { + color: #843534; } +.bg-primary { + background-color: #428bca; } + + a.bg-primary:hover { + background-color: #3071a9; } + + .bg-success { + background-color: #dff0d8; } + + a.bg-success:hover { + background-color: #c1e2b3; } + + .bg-info { + background-color: #d9edf7; } + + a.bg-info:hover { + background-color: #afd9ee; } + + .bg-warning { + background-color: #fcf8e3; } + + a.bg-warning:hover { + background-color: #f7ecb5; } + + .bg-danger { + background-color: #f2dede; } + + a.bg-danger:hover { + background-color: #e4b9b9; } +.dl-horizontal dd:before, .dl-horizontal dd:after { + content: " "; + display: table; } + .dl-horizontal dd:after { + clear: both; } +.container:before, .container:after { + content: " "; + display: table; } + .container:after { + clear: both; } + .container-fluid:before, .container-fluid:after { + content: " "; + display: table; } + .container-fluid:after { + clear: both; } + .row:before, .row:after { + content: " "; + display: table; } + .row:after { + clear: both; } +.form-horizontal .form-group:before, .form-horizontal .form-group:after { + content: " "; + display: table; } +.form-horizontal .form-group:after { + clear: both; } +.btn-toolbar:before, .btn-toolbar:after { + content: " "; + display: table; } + .btn-toolbar:after { + clear: both; } + .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { + content: " "; + display: table; } + .btn-group-vertical > .btn-group:after { + clear: both; } +.nav:before, .nav:after { + content: " "; + display: table; } + .nav:after { + clear: both; } + .navbar:before, .navbar:after { + content: " "; + display: table; } + .navbar:after { + clear: both; } + .navbar-header:before, .navbar-header:after { + content: " "; + display: table; } + .navbar-header:after { + clear: both; } + .navbar-collapse:before, .navbar-collapse:after { + content: " "; + display: table; } + .navbar-collapse:after { + clear: both; } + .pager:before, .pager:after { + content: " "; + display: table; } + .pager:after { + clear: both; } + .panel-body:before, .panel-body:after { + content: " "; + display: table; } + .panel-body:after { + clear: both; } + .modal-footer:before, .modal-footer:after { + content: " "; + display: table; } + .modal-footer:after { + clear: both; } + .clearfix:before, .clearfix:after { + content: " "; + display: table; } + .clearfix:after { + clear: both; } +code, kbd, pre, samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } + code { - padding: 3px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; } + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } + +kbd kbd { + padding: 0; + font-size: 100%; + box-shadow: none; } + pre { display: block; padding: 8.5px; margin: 0 0 9px; font-size: 12px; - line-height: 18px; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; - white-space: pre; - white-space: pre-wrap; + line-height: 1.5; word-break: break-all; word-wrap: break-word; -} -pre.prettyprint { - margin-bottom: 18px; -} + color: #333; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; } + pre code { - padding: 0; - color: inherit; - background-color: transparent; - border: 0; -} + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; } + .pre-scrollable { max-height: 340px; - overflow-y: scroll; -} -form { - margin: 0 0 18px; -} + overflow-y: scroll; } +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; } + @media (min-width: 768px) { + .container { + width: 750px; } +} + @media (min-width: 992px) { + .container { + width: 970px; } +} + @media (min-width: 1200px) { + .container { + width: 1170px; } +} + +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; } + +.row { + margin-left: -15px; + margin-right: -15px; } + +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, +.col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, +.col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, +.col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, +.col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, +.col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, +.col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, +.col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; } + + .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, + .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; } + + .col-xs-1 { + width: 8.33333%; } + + .col-xs-2 { + width: 16.66667%; } + + .col-xs-3 { + width: 25%; } + + .col-xs-4 { + width: 33.33333%; } + + .col-xs-5 { + width: 41.66667%; } + + .col-xs-6 { + width: 50%; } + + .col-xs-7 { + width: 58.33333%; } + + .col-xs-8 { + width: 66.66667%; } + + .col-xs-9 { + width: 75%; } + + .col-xs-10 { + width: 83.33333%; } + + .col-xs-11 { + width: 91.66667%; } + + .col-xs-12 { + width: 100%; } + + .col-xs-pull-0 { + right: auto; } + + .col-xs-pull-1 { + right: 8.33333%; } + + .col-xs-pull-2 { + right: 16.66667%; } + + .col-xs-pull-3 { + right: 25%; } + + .col-xs-pull-4 { + right: 33.33333%; } + + .col-xs-pull-5 { + right: 41.66667%; } + + .col-xs-pull-6 { + right: 50%; } + + .col-xs-pull-7 { + right: 58.33333%; } + + .col-xs-pull-8 { + right: 66.66667%; } + + .col-xs-pull-9 { + right: 75%; } + + .col-xs-pull-10 { + right: 83.33333%; } + + .col-xs-pull-11 { + right: 91.66667%; } + + .col-xs-pull-12 { + right: 100%; } + + .col-xs-push-0 { + left: auto; } + + .col-xs-push-1 { + left: 8.33333%; } + + .col-xs-push-2 { + left: 16.66667%; } + + .col-xs-push-3 { + left: 25%; } + + .col-xs-push-4 { + left: 33.33333%; } + + .col-xs-push-5 { + left: 41.66667%; } + + .col-xs-push-6 { + left: 50%; } + + .col-xs-push-7 { + left: 58.33333%; } + + .col-xs-push-8 { + left: 66.66667%; } + + .col-xs-push-9 { + left: 75%; } + + .col-xs-push-10 { + left: 83.33333%; } + + .col-xs-push-11 { + left: 91.66667%; } + + .col-xs-push-12 { + left: 100%; } + + .col-xs-offset-0 { + margin-left: 0%; } + + .col-xs-offset-1 { + margin-left: 8.33333%; } + + .col-xs-offset-2 { + margin-left: 16.66667%; } + + .col-xs-offset-3 { + margin-left: 25%; } + + .col-xs-offset-4 { + margin-left: 33.33333%; } + + .col-xs-offset-5 { + margin-left: 41.66667%; } + + .col-xs-offset-6 { + margin-left: 50%; } + + .col-xs-offset-7 { + margin-left: 58.33333%; } + + .col-xs-offset-8 { + margin-left: 66.66667%; } + + .col-xs-offset-9 { + margin-left: 75%; } + + .col-xs-offset-10 { + margin-left: 83.33333%; } + + .col-xs-offset-11 { + margin-left: 91.66667%; } + + .col-xs-offset-12 { + margin-left: 100%; } + @media (min-width: 768px) { + .col-xs-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, + .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; } + .col-sm-1 { + width: 8.33333%; } + .col-sm-2 { + width: 16.66667%; } + .col-sm-3 { + width: 25%; } + .col-sm-4 { + width: 33.33333%; } + .col-sm-5 { + width: 41.66667%; } + .col-sm-6 { + width: 50%; } + .col-sm-7 { + width: 58.33333%; } + .col-sm-8 { + width: 66.66667%; } + .col-sm-9 { + width: 75%; } + .col-sm-10 { + width: 83.33333%; } + .col-sm-11 { + width: 91.66667%; } + .col-sm-12 { + width: 100%; } + .col-sm-pull-0 { + right: auto; } + .col-sm-pull-1 { + right: 8.33333%; } + .col-sm-pull-2 { + right: 16.66667%; } + .col-sm-pull-3 { + right: 25%; } + .col-sm-pull-4 { + right: 33.33333%; } + .col-sm-pull-5 { + right: 41.66667%; } + .col-sm-pull-6 { + right: 50%; } + .col-sm-pull-7 { + right: 58.33333%; } + .col-sm-pull-8 { + right: 66.66667%; } + .col-sm-pull-9 { + right: 75%; } + .col-sm-pull-10 { + right: 83.33333%; } + .col-sm-pull-11 { + right: 91.66667%; } + .col-sm-pull-12 { + right: 100%; } + .col-sm-push-0 { + left: auto; } + .col-sm-push-1 { + left: 8.33333%; } + .col-sm-push-2 { + left: 16.66667%; } + .col-sm-push-3 { + left: 25%; } + .col-sm-push-4 { + left: 33.33333%; } + .col-sm-push-5 { + left: 41.66667%; } + .col-sm-push-6 { + left: 50%; } + .col-sm-push-7 { + left: 58.33333%; } + .col-sm-push-8 { + left: 66.66667%; } + .col-sm-push-9 { + left: 75%; } + .col-sm-push-10 { + left: 83.33333%; } + .col-sm-push-11 { + left: 91.66667%; } + .col-sm-push-12 { + left: 100%; } + .col-sm-offset-0 { + margin-left: 0%; } + .col-sm-offset-1 { + margin-left: 8.33333%; } + .col-sm-offset-2 { + margin-left: 16.66667%; } + .col-sm-offset-3 { + margin-left: 25%; } + .col-sm-offset-4 { + margin-left: 33.33333%; } + .col-sm-offset-5 { + margin-left: 41.66667%; } + .col-sm-offset-6 { + margin-left: 50%; } + .col-sm-offset-7 { + margin-left: 58.33333%; } + .col-sm-offset-8 { + margin-left: 66.66667%; } + .col-sm-offset-9 { + margin-left: 75%; } + .col-sm-offset-10 { + margin-left: 83.33333%; } + .col-sm-offset-11 { + margin-left: 91.66667%; } + .col-sm-offset-12 { + margin-left: 100%; } +} + @media (min-width: 992px) { + .col-xs-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, + .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; } + .col-md-1 { + width: 8.33333%; } + .col-md-2 { + width: 16.66667%; } + .col-md-3 { + width: 25%; } + .col-md-4 { + width: 33.33333%; } + .col-md-5 { + width: 41.66667%; } + .col-md-6 { + width: 50%; } + .col-md-7 { + width: 58.33333%; } + .col-md-8 { + width: 66.66667%; } + .col-md-9 { + width: 75%; } + .col-md-10 { + width: 83.33333%; } + .col-md-11 { + width: 91.66667%; } + .col-md-12 { + width: 100%; } + .col-md-pull-0 { + right: auto; } + .col-md-pull-1 { + right: 8.33333%; } + .col-md-pull-2 { + right: 16.66667%; } + .col-md-pull-3 { + right: 25%; } + .col-md-pull-4 { + right: 33.33333%; } + .col-md-pull-5 { + right: 41.66667%; } + .col-md-pull-6 { + right: 50%; } + .col-md-pull-7 { + right: 58.33333%; } + .col-md-pull-8 { + right: 66.66667%; } + .col-md-pull-9 { + right: 75%; } + .col-md-pull-10 { + right: 83.33333%; } + .col-md-pull-11 { + right: 91.66667%; } + .col-md-pull-12 { + right: 100%; } + .col-md-push-0 { + left: auto; } + .col-md-push-1 { + left: 8.33333%; } + .col-md-push-2 { + left: 16.66667%; } + .col-md-push-3 { + left: 25%; } + .col-md-push-4 { + left: 33.33333%; } + .col-md-push-5 { + left: 41.66667%; } + .col-md-push-6 { + left: 50%; } + .col-md-push-7 { + left: 58.33333%; } + .col-md-push-8 { + left: 66.66667%; } + .col-md-push-9 { + left: 75%; } + .col-md-push-10 { + left: 83.33333%; } + .col-md-push-11 { + left: 91.66667%; } + .col-md-push-12 { + left: 100%; } + .col-md-offset-0 { + margin-left: 0%; } + .col-md-offset-1 { + margin-left: 8.33333%; } + .col-md-offset-2 { + margin-left: 16.66667%; } + .col-md-offset-3 { + margin-left: 25%; } + .col-md-offset-4 { + margin-left: 33.33333%; } + .col-md-offset-5 { + margin-left: 41.66667%; } + .col-md-offset-6 { + margin-left: 50%; } + .col-md-offset-7 { + margin-left: 58.33333%; } + .col-md-offset-8 { + margin-left: 66.66667%; } + .col-md-offset-9 { + margin-left: 75%; } + .col-md-offset-10 { + margin-left: 83.33333%; } + .col-md-offset-11 { + margin-left: 91.66667%; } + .col-md-offset-12 { + margin-left: 100%; } +} + @media (min-width: 1200px) { + .col-xs-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, + .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; } + .col-lg-1 { + width: 8.33333%; } + .col-lg-2 { + width: 16.66667%; } + .col-lg-3 { + width: 25%; } + .col-lg-4 { + width: 33.33333%; } + .col-lg-5 { + width: 41.66667%; } + .col-lg-6 { + width: 50%; } + .col-lg-7 { + width: 58.33333%; } + .col-lg-8 { + width: 66.66667%; } + .col-lg-9 { + width: 75%; } + .col-lg-10 { + width: 83.33333%; } + .col-lg-11 { + width: 91.66667%; } + .col-lg-12 { + width: 100%; } + .col-lg-pull-0 { + right: auto; } + .col-lg-pull-1 { + right: 8.33333%; } + .col-lg-pull-2 { + right: 16.66667%; } + .col-lg-pull-3 { + right: 25%; } + .col-lg-pull-4 { + right: 33.33333%; } + .col-lg-pull-5 { + right: 41.66667%; } + .col-lg-pull-6 { + right: 50%; } + .col-lg-pull-7 { + right: 58.33333%; } + .col-lg-pull-8 { + right: 66.66667%; } + .col-lg-pull-9 { + right: 75%; } + .col-lg-pull-10 { + right: 83.33333%; } + .col-lg-pull-11 { + right: 91.66667%; } + .col-lg-pull-12 { + right: 100%; } + .col-lg-push-0 { + left: auto; } + .col-lg-push-1 { + left: 8.33333%; } + .col-lg-push-2 { + left: 16.66667%; } + .col-lg-push-3 { + left: 25%; } + .col-lg-push-4 { + left: 33.33333%; } + .col-lg-push-5 { + left: 41.66667%; } + .col-lg-push-6 { + left: 50%; } + .col-lg-push-7 { + left: 58.33333%; } + .col-lg-push-8 { + left: 66.66667%; } + .col-lg-push-9 { + left: 75%; } + .col-lg-push-10 { + left: 83.33333%; } + .col-lg-push-11 { + left: 91.66667%; } + .col-lg-push-12 { + left: 100%; } + .col-lg-offset-0 { + margin-left: 0%; } + .col-lg-offset-1 { + margin-left: 8.33333%; } + .col-lg-offset-2 { + margin-left: 16.66667%; } + .col-lg-offset-3 { + margin-left: 25%; } + .col-lg-offset-4 { + margin-left: 33.33333%; } + .col-lg-offset-5 { + margin-left: 41.66667%; } + .col-lg-offset-6 { + margin-left: 50%; } + .col-lg-offset-7 { + margin-left: 58.33333%; } + .col-lg-offset-8 { + margin-left: 66.66667%; } + .col-lg-offset-9 { + margin-left: 75%; } + .col-lg-offset-10 { + margin-left: 83.33333%; } + .col-lg-offset-11 { + margin-left: 91.66667%; } + .col-lg-offset-12 { + margin-left: 100%; } +} + +table { + background-color: transparent; } + +th { + text-align: left; } + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 18px; + border: 1px solid #ffffff; } + +.table > thead > tr > th, .table > thead > tr > td, .table > tbody > tr > th, +.table > tbody > tr > td, .table > tfoot > tr > th, .table > tfoot > tr > td { + padding: 8px 0px; + line-height: 1.5; + vertical-align: top; + border-top: 1px solid #d5dfe6; } + +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 1px solid #d5dfe6; } +.table > caption + thead > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > th, +.table > thead:first-child > tr:first-child > td { + border-top: 0; } +.table > tbody + tbody { + border-top: 1px solid #d5dfe6; } +.table .table { + background-color: #fff; } + +.table-condensed > thead > tr > th, .table-condensed > thead > tr > td, +.table-condensed > tbody > tr > th, .table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > th, .table-condensed > tfoot > tr > td { + padding: 5px; } + +.table-bordered { + border: 1px solid #ddd; } +.table-bordered > thead > tr > th, .table-bordered > thead > tr > td, +.table-bordered > tbody > tr > th, .table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > th, .table-bordered > tfoot > tr > td { + border: 1px solid #eeeeee; + padding: 8px 12px; } +.table-bordered > thead > tr > th, .table-bordered > thead > tr > td { + border-bottom-width: 2px; } + +.table-striped > tbody > tr:nth-child(odd) > td, +.table-striped > tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; } + +.table-hover > tbody > tr:hover > td, .table-hover > tbody > tr:hover > th { + background-color: #f5f5f5; } + +table col[class*="col-"] { + position: static; + float: none; + display: table-column; } + + table td[class*="col-"], table th[class*="col-"] { + position: static; + float: none; + display: table-cell; } + +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 13.5px; + overflow-y: hidden; + overflow-x: auto; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + -webkit-overflow-scrolling: touch; } + .table-responsive > .table { + margin-bottom: 0; } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; } + .table-responsive > .table-bordered { + border: 0; } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; } +} +.table > thead > tr > td.active, .table > thead > tr > th.active, +.table > thead > tr.active > td, .table > thead > tr.active > th, +.table > tbody > tr > td.active, .table > tbody > tr > th.active, +.table > tbody > tr.active > td, .table > tbody > tr.active > th, +.table > tfoot > tr > td.active, .table > tfoot > tr > th.active, +.table > tfoot > tr.active > td, .table > tfoot > tr.active > th { + background-color: #f5f5f5; } + +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; } + +.table > thead > tr > td.success, .table > thead > tr > th.success, +.table > thead > tr.success > td, .table > thead > tr.success > th, +.table > tbody > tr > td.success, .table > tbody > tr > th.success, +.table > tbody > tr.success > td, .table > tbody > tr.success > th, +.table > tfoot > tr > td.success, .table > tfoot > tr > th.success, +.table > tfoot > tr.success > td, .table > tfoot > tr.success > th { + background-color: #dff0d8; } + +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; } + +.table > thead > tr > td.info, .table > thead > tr > th.info, +.table > thead > tr.info > td, .table > thead > tr.info > th, +.table > tbody > tr > td.info, .table > tbody > tr > th.info, +.table > tbody > tr.info > td, .table > tbody > tr.info > th, +.table > tfoot > tr > td.info, .table > tfoot > tr > th.info, +.table > tfoot > tr.info > td, .table > tfoot > tr.info > th { + background-color: #d9edf7; } + +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; } + +.table > thead > tr > td.warning, .table > thead > tr > th.warning, +.table > thead > tr.warning > td, .table > thead > tr.warning > th, +.table > tbody > tr > td.warning, .table > tbody > tr > th.warning, +.table > tbody > tr.warning > td, .table > tbody > tr.warning > th, +.table > tfoot > tr > td.warning, .table > tfoot > tr > th.warning, +.table > tfoot > tr.warning > td, .table > tfoot > tr.warning > th { + background-color: #fcf8e3; } + +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; } + +.table > thead > tr > td.danger, .table > thead > tr > th.danger, +.table > thead > tr.danger > td, .table > thead > tr.danger > th, +.table > tbody > tr > td.danger, .table > tbody > tr > th.danger, +.table > tbody > tr.danger > td, .table > tbody > tr.danger > th, +.table > tfoot > tr > td.danger, .table > tfoot > tr > th.danger, +.table > tfoot > tr.danger > td, .table > tfoot > tr.danger > th { + background-color: #f2dede; } + +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; } fieldset { padding: 0; margin: 0; border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 27px; - font-size: 19.5px; - line-height: 36px; - color: #333333; - border: 0; - border-bottom: 1px solid #eee; -} -legend small { - font-size: 13.5px; - color: #999999; -} -label, -input, -button, -select, -textarea { - font-size: 13px; - font-weight: normal; - line-height: 18px; -} -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} -label { - display: block; - margin-bottom: 5px; - color: #333333; -} -input, -textarea, -select, -.uneditable-input { - display: inline-block; - width: 210px; - height: 18px; - padding: 4px; - margin-bottom: 9px; - font-size: 13px; - line-height: 18px; - color: #555555; - border: 1px solid #ccc; - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; -} -.uneditable-textarea { - width: auto; - height: auto; -} -label input, -label textarea, -label select { + min-width: 0; } + + legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 18px; + font-size: 19.5px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; } + + label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; } + + input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + + input[type="radio"], input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; } + + input[type="file"] { + display: block; } + + input[type="range"] { + display: block; + width: 100%; } + + select[multiple], select[size] { + height: auto; } + + input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + + output { + display: block; + padding-top: 7px; + font-size: 13px; + line-height: 1.5; + color: #555; } + + .form-control, .datepicker input { + display: block; + width: 100%; + height: 32px; + padding: 6px 12px; + font-size: 13px; + line-height: 1.5; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } + .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control, + .datepicker input[disabled], .datepicker input[readonly], + fieldset[disabled] .datepicker input, .datepicker fieldset[disabled] input { + cursor: not-allowed; + background-color: #eee; + opacity: 1; } + +textarea.form-control, .datepicker textareainput { + height: auto; } + + input[type="search"] { + -webkit-appearance: none; } + + input[type="date"], input[type="time"], input[type="datetime-local"], + input[type="month"] { + line-height: 32px; + line-height: 1.5 \0; } + input[type="date"].input-sm, input[type="time"].input-sm, + input[type="datetime-local"].input-sm, input[type="month"].input-sm, + .form-horizontal .form-group-sm input[type="datetime-local"].form-control, + .form-horizontal .form-group-sm input[type="time"].form-control, + .form-horizontal .form-group-sm input[type="month"].form-control, + .form-horizontal .form-group-sm input[type="date"].form-control, + .input-group-sm input[type="datetime-local"].form-control, + .input-group-sm input[type="datetime-local"].input-group-addon, + .input-group-sm > .input-group-btn input[type="datetime-local"].btn, + .input-group-sm input[type="time"].form-control, + .input-group-sm input[type="time"].input-group-addon, + .input-group-sm > .input-group-btn input[type="time"].btn, + .input-group-sm input[type="month"].form-control, + .input-group-sm input[type="month"].input-group-addon, + .input-group-sm > .input-group-btn input[type="month"].btn, + .input-group-sm input[type="date"].form-control, + .input-group-sm input[type="date"].input-group-addon, + .input-group-sm > .input-group-btn input[type="date"].btn, + .input-group-sm .datepicker input[type="month"], + .datepicker .input-group-sm input[type="month"], + .input-group-sm .datepicker input[type="time"], + .datepicker .input-group-sm input[type="time"], + .form-horizontal .form-group-sm .datepicker input[type="datetime-local"], + .datepicker .form-horizontal .form-group-sm input[type="datetime-local"], + .input-group-sm .datepicker input[type="date"], + .datepicker .input-group-sm input[type="date"], + .form-horizontal .form-group-sm .datepicker input[type="month"], + .datepicker .form-horizontal .form-group-sm input[type="month"], + .form-horizontal .form-group-sm .datepicker input[type="date"], + .datepicker .form-horizontal .form-group-sm input[type="date"], + .form-horizontal .form-group-sm .datepicker input[type="time"], + .datepicker .form-horizontal .form-group-sm input[type="time"], + .input-group-sm .datepicker input[type="datetime-local"], + .datepicker .input-group-sm input[type="datetime-local"] { + line-height: 30px; } + input[type="date"].input-lg, input[type="time"].input-lg, + input[type="datetime-local"].input-lg, input[type="month"].input-lg, + .form-horizontal .form-group-lg input[type="date"].form-control, + .form-horizontal .form-group-lg input[type="month"].form-control, + .form-horizontal .form-group-lg input[type="datetime-local"].form-control, + .form-horizontal .form-group-lg input[type="time"].form-control, + .input-group-lg input[type="date"].form-control, + .input-group-lg input[type="date"].input-group-addon, + .input-group-lg > .input-group-btn input[type="date"].btn, + .input-group-lg input[type="month"].form-control, + .input-group-lg input[type="month"].input-group-addon, + .input-group-lg > .input-group-btn input[type="month"].btn, + .input-group-lg input[type="datetime-local"].form-control, + .input-group-lg input[type="datetime-local"].input-group-addon, + .input-group-lg > .input-group-btn input[type="datetime-local"].btn, + .input-group-lg input[type="time"].form-control, + .input-group-lg input[type="time"].input-group-addon, + .input-group-lg > .input-group-btn input[type="time"].btn, + .form-horizontal .form-group-lg .datepicker input[type="time"], + .datepicker .form-horizontal .form-group-lg input[type="time"], + .input-group-lg .datepicker input[type="datetime-local"], + .datepicker .input-group-lg input[type="datetime-local"], + .form-horizontal .form-group-lg .datepicker input[type="date"], + .datepicker .form-horizontal .form-group-lg input[type="date"], + .input-group-lg .datepicker input[type="month"], + .datepicker .input-group-lg input[type="month"], + .form-horizontal .form-group-lg .datepicker input[type="month"], + .datepicker .form-horizontal .form-group-lg input[type="month"], + .form-horizontal .form-group-lg .datepicker input[type="datetime-local"], + .datepicker .form-horizontal .form-group-lg input[type="datetime-local"], + .input-group-lg .datepicker input[type="time"], + .datepicker .input-group-lg input[type="time"], + .input-group-lg .datepicker input[type="date"], + .datepicker .input-group-lg input[type="date"] { + line-height: 45px; } + +.form-group { + margin-bottom: 15px; } + +.radio, .checkbox { + position: relative; + display: block; + min-height: 18px; + margin-top: 10px; + margin-bottom: 10px; } +.radio label, .checkbox label { + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; } + +.radio input[type="radio"], .radio-inline input[type="radio"], +.checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; } + + .radio + .radio, .checkbox + .checkbox { + margin-top: -5px; } + + .radio-inline, .checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; } + + .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; } + + input[type="radio"][disabled], input[type="radio"].disabled, + fieldset[disabled] input[type="radio"], input[type="checkbox"][disabled], + input[type="checkbox"].disabled, fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; } + +.radio-inline.disabled, fieldset[disabled] .radio-inline, +.checkbox-inline.disabled, fieldset[disabled] .checkbox-inline { + cursor: not-allowed; } + +.radio.disabled label, fieldset[disabled] .radio label, .checkbox.disabled label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; } + +.form-control-static { + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; } + .form-control-static.input-lg, .form-control-static.input-sm, + .form-horizontal .form-group-lg .form-control-static.form-control, + .form-horizontal .form-group-sm .form-control-static.form-control, + .input-group-lg .form-control-static.form-control, + .input-group-lg .form-control-static.input-group-addon, + .input-group-lg > .input-group-btn .form-control-static.btn, + .input-group-sm .form-control-static.form-control, + .input-group-sm .form-control-static.input-group-addon, + .input-group-sm > .input-group-btn .form-control-static.btn, + .input-group-lg .datepicker input.form-control-static, + .datepicker .input-group-lg input.form-control-static, + .form-horizontal .form-group-lg .datepicker input.form-control-static, + .datepicker .form-horizontal .form-group-lg input.form-control-static, + .form-horizontal .form-group-sm .datepicker input.form-control-static, + .datepicker .form-horizontal .form-group-sm input.form-control-static, + .input-group-sm .datepicker input.form-control-static, + .datepicker .input-group-sm input.form-control-static { + padding-left: 0; + padding-right: 0; } + +.has-feedback { + position: relative; } + .has-feedback .form-control, .has-feedback .datepicker input, + .datepicker .has-feedback input { + padding-right: 40px; } + +.form-control-feedback { + position: absolute; + top: 23px; + right: 0; + z-index: 2; display: block; -} -input[type="image"], -input[type="checkbox"], -input[type="radio"] { - width: auto; - height: auto; - padding: 0; - margin: 3px 0; - *margin-top: 0; - /* IE7 */ - - line-height: normal; - cursor: pointer; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - border: 0 \9; - /* IE9 and down */ - -} -input[type="image"] { - border: 0; -} -input[type="file"] { - width: auto; - padding: initial; - line-height: initial; - border: initial; - background-color: #ffffff; - background-color: initial; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -input[type="button"], -input[type="reset"], -input[type="submit"] { - width: auto; - height: auto; -} -select, -input[type="file"] { - height: 28px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 28px; -} -input[type="file"] { - line-height: 18px \9; -} -select { - width: 220px; - background-color: #ffffff; -} -select[multiple], -select[size] { - height: auto; -} -input[type="image"] { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -textarea { - height: auto; -} -input[type="hidden"] { - display: none; -} -.radio, -.checkbox { - padding-left: 18px; -} -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -18px; -} -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} -input, -textarea { - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -ms-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} -input:focus, -textarea:focus { - border-color: rgba(82, 168, 236, 0.8); - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus, -select:focus { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.input-mini { - width: 60px; -} -.input-small { - width: 90px; -} -.input-medium { - width: 150px; -} -.input-large { - width: 210px; -} -.input-xlarge { - width: 270px; -} -.input-xxlarge { - width: 530px; -} -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input { - float: none; - margin-left: 0; -} -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 50px; -} -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 130px; -} -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 210px; -} -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 290px; -} -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 370px; -} -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 450px; -} -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 530px; -} -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 610px; -} -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 690px; -} -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 770px; -} -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 850px; -} -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 930px; -} -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - background-color: #f5f5f5; - border-color: #ddd; - cursor: not-allowed; -} -.control-group.warning > label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; - border-color: #c09853; -} -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: 0 0 6px #dbc59e; - -moz-box-shadow: 0 0 6px #dbc59e; - box-shadow: 0 0 6px #dbc59e; -} -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} -.control-group.error > label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; - border-color: #b94a48; -} -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: 0 0 6px #d59392; - -moz-box-shadow: 0 0 6px #d59392; - box-shadow: 0 0 6px #d59392; -} -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} -.control-group.success > label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; - border-color: #468847; -} -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: 0 0 6px #7aba7b; - -moz-box-shadow: 0 0 6px #7aba7b; - box-shadow: 0 0 6px #7aba7b; -} -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} -input:focus:required:invalid, -textarea:focus:required:invalid, -select:focus:required:invalid { - color: #b94a48; - border-color: #ee5f5b; -} -input:focus:required:invalid:focus, -textarea:focus:required:invalid:focus, -select:focus:required:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} -.form-actions { - padding: 17px 20px 18px; - margin-top: 18px; - margin-bottom: 18px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; -} -.uneditable-input { - display: block; - background-color: #ffffff; - border-color: #eee; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - cursor: not-allowed; -} -:-moz-placeholder { - color: #999999; -} -::-webkit-input-placeholder { - color: #999999; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 0; - color: #999999; -} -.help-inline { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - margin-bottom: 9px; - vertical-align: middle; - padding-left: 5px; -} -.input-prepend, -.input-append { - margin-bottom: 5px; - *zoom: 1; -} -.input-prepend:before, -.input-append:before, -.input-prepend:after, -.input-append:after { - display: table; - content: ""; -} -.input-prepend:after, -.input-append:after { - clear: both; -} -.input-prepend input, -.input-append input, -.input-prepend .uneditable-input, -.input-append .uneditable-input { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend input:focus, -.input-append input:focus, -.input-prepend .uneditable-input:focus, -.input-append .uneditable-input:focus { - position: relative; - z-index: 2; -} -.input-prepend .uneditable-input, -.input-append .uneditable-input { - border-left-color: #ccc; -} -.input-prepend .add-on, -.input-append .add-on { - float: left; - display: block; - width: auto; - min-width: 16px; - height: 18px; - margin-right: -1px; - padding: 4px 5px; - font-weight: normal; - line-height: 18px; - color: #999999; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - background-color: #f5f5f5; - border: 1px solid #ccc; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-prepend .active, -.input-append .active { - background-color: #a9dba9; - border-color: #46a546; -} -.input-prepend .add-on { - *margin-top: 1px; - /* IE6-7 */ - -} -.input-append input, -.input-append .uneditable-input { - float: left; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append .uneditable-input { - border-left-color: #eee; - border-right-color: #ccc; -} -.input-append .add-on { - margin-right: 0; - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-append input:first-child { - *margin-left: -160px; -} -.input-append input:first-child + .add-on { - *margin-left: -21px; -} -.search-query { - padding-left: 14px; - padding-right: 14px; - margin-bottom: 0; - -webkit-border-radius: 14px; - -moz-border-radius: 14px; - border-radius: 14px; -} -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input { - display: inline-block; - margin-bottom: 0; -} -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} -.form-search label, -.form-inline label, -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - display: inline-block; -} -.form-search .input-append .add-on, -.form-inline .input-prepend .add-on, -.form-search .input-append .add-on, -.form-inline .input-prepend .add-on { - vertical-align: middle; -} -.form-search .radio, -.form-inline .radio, -.form-search .checkbox, -.form-inline .checkbox { + width: 32px; + height: 32px; + line-height: 32px; + text-align: center; } + + .input-lg + .form-control-feedback, + .form-horizontal .form-group-lg .form-control + .form-control-feedback, + .input-group-lg .form-control + .form-control-feedback, + .input-group-lg .input-group-addon + .form-control-feedback, + .input-group-lg > .input-group-btn .btn + .form-control-feedback, + .input-group-lg .datepicker input + .form-control-feedback, + .datepicker .input-group-lg input + .form-control-feedback, + .form-horizontal .form-group-lg .datepicker input + .form-control-feedback, + .datepicker .form-horizontal .form-group-lg input + .form-control-feedback { + width: 45px; + height: 45px; + line-height: 45px; } + + .input-sm + .form-control-feedback, + .form-horizontal .form-group-sm .form-control + .form-control-feedback, + .input-group-sm .form-control + .form-control-feedback, + .input-group-sm .input-group-addon + .form-control-feedback, + .input-group-sm > .input-group-btn .btn + .form-control-feedback, + .input-group-sm .datepicker input + .form-control-feedback, + .datepicker .input-group-sm input + .form-control-feedback, + .form-horizontal .form-group-sm .datepicker input + .form-control-feedback, + .datepicker .form-horizontal .form-group-sm input + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; } + + .has-feedback label.sr-only ~ .form-control-feedback { + top: 0; } + + .help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; } + +@media (min-width: 768px) { +.form-inline .form-group, .navbar-form .form-group, .table_actions .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; } +.form-inline .form-control, .navbar-form .form-control, +.table_actions .form-control, .form-inline .datepicker input, +.datepicker .form-inline input, .table_actions .datepicker input, +.datepicker .table_actions input, .navbar-form .datepicker input, +.datepicker .navbar-form input { + background: #ffffff; + display: inline-block; + width: auto; + vertical-align: middle; } +.form-inline .input-group, .navbar-form .input-group, .table_actions .input-group { + display: inline-table; + vertical-align: middle; } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control, + .navbar-form .input-group .input-group-addon, + .table_actions .input-group .input-group-btn, + .table_actions .input-group .form-control, + .table_actions .input-group .input-group-addon, + .navbar-form .input-group .datepicker input, + .datepicker .navbar-form .input-group input, + .form-inline .input-group .datepicker input, + .datepicker .form-inline .input-group input, + .table_actions .input-group .datepicker input, + .datepicker .table_actions .input-group input { + width: auto; } + .form-inline .input-group > .form-control, + .navbar-form .input-group > .form-control, + .table_actions .input-group > .form-control, + .table_actions .input-group .datepicker > input, + .datepicker .table_actions .input-group > input, + .form-inline .input-group .datepicker > input, + .datepicker .form-inline .input-group > input, + .navbar-form .input-group .datepicker > input, + .datepicker .navbar-form .input-group > input { + width: 100%; } + .form-inline .control-label, .navbar-form .control-label, + .table_actions .control-label { + margin-bottom: 0; + vertical-align: middle; } + .form-inline .radio, .form-inline .checkbox, .navbar-form .radio, + .navbar-form .checkbox, .table_actions .radio, .table_actions .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; } + .form-inline .radio label, .form-inline .checkbox label, .navbar-form .radio label, + .navbar-form .checkbox label, .table_actions .radio label, + .table_actions .checkbox label { + padding-left: 0; } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"], + .navbar-form .checkbox input[type="checkbox"], + .navbar-form .radio input[type="radio"], + .table_actions .checkbox input[type="checkbox"], + .table_actions .radio input[type="radio"] { + position: relative; + margin-left: 0; } + .form-inline .has-feedback .form-control-feedback, + .navbar-form .has-feedback .form-control-feedback, + .table_actions .has-feedback .form-control-feedback { + top: 0; } +} + +.form-horizontal .radio, .form-horizontal .checkbox, +.form-horizontal .radio-inline, .form-horizontal .checkbox-inline { + margin-top: 0; margin-bottom: 0; - vertical-align: middle; -} -.control-group { - margin-bottom: 9px; -} -legend + .control-group { - margin-top: 18px; - -webkit-margin-top-collapse: separate; -} -.form-horizontal .control-group { - margin-bottom: 18px; - *zoom: 1; -} -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { + padding-top: 7px; } + .form-horizontal .radio, .form-horizontal .checkbox { + min-height: 25px; } + .form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; } + @media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 7px; } +} +.form-horizontal .has-feedback .form-control-feedback { + top: 0; + right: 15px; } + @media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.3px; } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; } +} +.form-control:focus, .datepicker input:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } + +.input-sm, .form-horizontal .form-group-sm .form-control, +.input-group-sm .form-control, .input-group-sm .input-group-addon, +.input-group-sm > .input-group-btn .btn, +.form-horizontal .form-group-sm .datepicker input, +.datepicker .form-horizontal .form-group-sm input, +.input-group-sm .datepicker input, .datepicker .input-group-sm input { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + + select.input-sm, .form-horizontal .form-group-sm select.form-control, + .input-group-sm select.form-control, .input-group-sm select.input-group-addon, + .input-group-sm > .input-group-btn select.btn, + .input-group-sm .datepicker selectinput, .datepicker .input-group-sm selectinput, + .form-horizontal .form-group-sm .datepicker selectinput, + .datepicker .form-horizontal .form-group-sm selectinput { + height: 30px; + line-height: 30px; } + + textarea.input-sm, select[multiple].input-sm, + .form-horizontal .form-group-sm textarea.form-control, + .form-horizontal .form-group-sm select[multiple].form-control, + .input-group-sm textarea.form-control, .input-group-sm textarea.input-group-addon, + .input-group-sm > .input-group-btn textarea.btn, + .input-group-sm select[multiple].form-control, + .input-group-sm select[multiple].input-group-addon, + .input-group-sm > .input-group-btn select[multiple].btn, + .form-horizontal .form-group-sm .datepicker selectinput[multiple], + .datepicker .form-horizontal .form-group-sm selectinput[multiple], + .form-horizontal .form-group-sm .datepicker textareainput, + .datepicker .form-horizontal .form-group-sm textareainput, + .input-group-sm .datepicker selectinput[multiple], + .datepicker .input-group-sm selectinput[multiple], + .input-group-sm .datepicker textareainput, + .datepicker .input-group-sm textareainput { + height: auto; } + + .input-lg, .form-horizontal .form-group-lg .form-control, + .input-group-lg .form-control, .input-group-lg .input-group-addon, + .input-group-lg > .input-group-btn .btn, .input-group-lg .datepicker input, + .datepicker .input-group-lg input, + .form-horizontal .form-group-lg .datepicker input, + .datepicker .form-horizontal .form-group-lg input { + height: 45px; + padding: 10px 16px; + font-size: 17px; + line-height: 1.33; + border-radius: 6px; } + + select.input-lg, .form-horizontal .form-group-lg select.form-control, + .input-group-lg select.form-control, .input-group-lg select.input-group-addon, + .input-group-lg > .input-group-btn select.btn, + .input-group-lg .datepicker selectinput, .datepicker .input-group-lg selectinput, + .form-horizontal .form-group-lg .datepicker selectinput, + .datepicker .form-horizontal .form-group-lg selectinput { + height: 45px; + line-height: 45px; } + + textarea.input-lg, select[multiple].input-lg, + .form-horizontal .form-group-lg select[multiple].form-control, + .form-horizontal .form-group-lg textarea.form-control, + .input-group-lg select[multiple].form-control, + .input-group-lg select[multiple].input-group-addon, + .input-group-lg > .input-group-btn select[multiple].btn, + .input-group-lg textarea.form-control, .input-group-lg textarea.input-group-addon, + .input-group-lg > .input-group-btn textarea.btn, + .input-group-lg .datepicker selectinput[multiple], + .datepicker .input-group-lg selectinput[multiple], + .form-horizontal .form-group-lg .datepicker textareainput, + .datepicker .form-horizontal .form-group-lg textareainput, + .form-horizontal .form-group-lg .datepicker selectinput[multiple], + .datepicker .form-horizontal .form-group-lg selectinput[multiple], + .input-group-lg .datepicker textareainput, + .datepicker .input-group-lg textareainput { + height: auto; } + .has-success .help-block, .has-success .control-label, .has-success .radio, + .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline { + color: #3c763d; } + .has-success .form-control, .has-success .datepicker input, + .datepicker .has-success input { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + .has-success .form-control:focus, .has-success .datepicker input:focus, + .datepicker .has-success input:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; } + .has-success .input-group-addon { + color: #3c763d; + border-color: #3c763d; + background-color: #dff0d8; } + .has-success .form-control-feedback { + color: #3c763d; } + .has-warning .help-block, .has-warning .control-label, .has-warning .radio, + .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline { + color: #8a6d3b; } + .has-warning .form-control, .has-warning .datepicker input, + .datepicker .has-warning input { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + .has-warning .form-control:focus, .has-warning .datepicker input:focus, + .datepicker .has-warning input:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; } + .has-warning .input-group-addon { + color: #8a6d3b; + border-color: #8a6d3b; + background-color: #fcf8e3; } + .has-warning .form-control-feedback { + color: #8a6d3b; } + .has-error .help-block, .has-error .control-label, .has-error .radio, + .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline { + color: #a94442; } + .has-error .form-control, .has-error .datepicker input, + .datepicker .has-error input { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + .has-error .form-control:focus, .has-error .datepicker input:focus, + .datepicker .has-error input:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; } + .has-error .input-group-addon { + color: #a94442; + border-color: #a94442; + background-color: #f2dede; } + .has-error .form-control-feedback { + color: #a94442; } +.form-control::-moz-placeholder, .datepicker input::-moz-placeholder { + color: #777; + opacity: 1; } + .form-control:-ms-input-placeholder, .datepicker input:-ms-input-placeholder { + color: #777; } + .form-control::-webkit-input-placeholder, + .datepicker input::-webkit-input-placeholder { + color: #777; } +.input-group-addon.input-lg, +.form-horizontal .form-group-lg .input-group-addon.form-control, +.input-group-lg .input-group-addon.form-control, +.input-group-lg .input-group-addon, +.input-group-lg > .input-group-btn .input-group-addon.btn, +.form-horizontal .form-group-lg .datepicker input.input-group-addon, +.datepicker .form-horizontal .form-group-lg input.input-group-addon, +.input-group-lg .datepicker input.input-group-addon, +.datepicker .input-group-lg input.input-group-addon { + padding: 10px 16px; + font-size: 17px; + border-radius: 6px; } + .input-group-addon.input-sm, + .form-horizontal .form-group-sm .input-group-addon.form-control, + .input-group-sm .input-group-addon.form-control, + .input-group-sm .input-group-addon, + .input-group-sm > .input-group-btn .input-group-addon.btn, + .input-group-sm .datepicker input.input-group-addon, + .datepicker .input-group-sm input.input-group-addon, + .form-horizontal .form-group-sm .datepicker input.input-group-addon, + .datepicker .form-horizontal .form-group-sm input.input-group-addon { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; } + +.input-group { + position: relative; display: table; - content: ""; -} -.form-horizontal .control-group:after { - clear: both; -} -.form-horizontal .control-label { - float: left; - width: 140px; - padding-top: 5px; - text-align: right; -} -.form-horizontal .controls { - margin-left: 160px; -} -.form-horizontal .form-actions { - padding-left: 160px; -} -table { - max-width: 100%; - border-collapse: collapse; - border-spacing: 0; -} -.table { - width: 100%; - margin-bottom: 18px; -} -.table th, -.table td { - padding: 8px; - line-height: 18px; - text-align: left; - vertical-align: top; - border-bottom: 1px solid #EEEEEE; -} -.table th { - font-weight: bold; -} -.table thead th { - vertical-align: bottom; -} -.table thead:first-child tr th, -.table thead:first-child tr td { - border-top: 0; -} -.table tbody + tbody { - border-top: 2px solid #C4CED8; -} -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} -.table-bordered { - border: 1px solid #ddd; - border-collapse: separate; - *border-collapse: collapsed; - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; -} -.table-bordered th + th, -.table-bordered td + td, -.table-bordered th + td, -.table-bordered td + th { - /*border-left: 1px solid #D5DFE6;*/ -} -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} -.table-bordered thead:first-child tr:first-child th:first-child, -.table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.table-bordered thead:first-child tr:first-child th:last-child, -.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.table-bordered thead:last-child tr:last-child th:first-child, -.table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.table-bordered thead:last-child tr:last-child th:last-child, -.table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: #f9f9f9; -} -.table tbody tr:hover td, -.table tbody tr:hover th { - background-color: #EBECED; -} -table .span1 { - float: none; - width: 44px; - margin-left: 0; -} -table .span2 { - float: none; - width: 124px; - margin-left: 0; -} -table .span3 { - float: none; - width: 204px; - margin-left: 0; -} -table .span4 { - float: none; - width: 284px; - margin-left: 0; -} -table .span5 { - float: none; - width: 364px; - margin-left: 0; -} -table .span6 { - float: none; - width: 444px; - margin-left: 0; -} -table .span7 { - float: none; - width: 524px; - margin-left: 0; -} -table .span8 { - float: none; - width: 604px; - margin-left: 0; -} -table .span9 { - float: none; - width: 684px; - margin-left: 0; -} -table .span10 { - float: none; - width: 764px; - margin-left: 0; -} -table .span11 { - float: none; - width: 844px; - margin-left: 0; -} -table .span12 { - float: none; - width: 924px; - margin-left: 0; -} -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 0px; - height: 0px; - line-height: 14px; - vertical-align: text-top; - /*xbackground-image: url('/static/bootstrap/img/glyphicons-halflings.png?531d4b607365');*/ - background-position: 14px 14px; - background-repeat: no-repeat; - *margin-right: .3em; -} -[class^="icon-"]:last-child, -[class*=" icon-"]:last-child { - *margin-left: 0; -} -.icon-white { - /*xbackground-image: url('/static/bootstrap/img/glyphicons-halflings-white.png?11118ae8db79');*/ -} -.icon-glass { - background-position: 0 0; -} -.icon-music { - background-position: -24px 0; -} -.icon-search { - background-position: -48px 0; -} -.icon-envelope { - background-position: -72px 0; -} -.icon-heart { - background-position: -96px 0; -} -.icon-star { - background-position: -120px 0; -} -.icon-star-empty { - background-position: -144px 0; -} -.icon-user { - background-position: -168px 0; -} -.icon-film { - background-position: -192px 0; -} -.icon-th-large { - background-position: -216px 0; -} -.icon-th { - background-position: -240px 0; -} -.icon-th-list { - background-position: -264px 0; -} -.icon-ok { - background-position: -288px 0; -} -.icon-remove { - background-position: -312px 0; -} -.icon-zoom-in { - background-position: -336px 0; -} -.icon-zoom-out { - background-position: -360px 0; -} -.icon-off { - background-position: -384px 0; -} -.icon-signal { - background-position: -408px 0; -} -.icon-cog { - background-position: -432px 0; -} -.icon-trash { - background-position: -456px 0; -} -.icon-home { - background-position: 0 -24px; -} -.icon-file { - background-position: -24px -24px; -} -.icon-time { - background-position: -48px -24px; -} -.icon-road { - background-position: -72px -24px; -} -.icon-download-alt { - background-position: -96px -24px; -} -.icon-download { - background-position: -120px -24px; -} -.icon-upload { - background-position: -144px -24px; -} -.icon-inbox { - background-position: -168px -24px; -} -.icon-play-circle { - background-position: -192px -24px; -} -.icon-repeat { - background-position: -216px -24px; -} -.icon-refresh { - background-position: -240px -24px; -} -.icon-list-alt { - background-position: -264px -24px; -} -.icon-lock { - background-position: -287px -24px; -} -.icon-flag { - background-position: -312px -24px; -} -.icon-headphones { - background-position: -336px -24px; -} -.icon-volume-off { - background-position: -360px -24px; -} -.icon-volume-down { - background-position: -384px -24px; -} -.icon-volume-up { - background-position: -408px -24px; -} -.icon-qrcode { - background-position: -432px -24px; -} -.icon-barcode { - background-position: -456px -24px; -} -.icon-tag { - background-position: 0 -48px; -} -.icon-tags { - background-position: -25px -48px; -} -.icon-book { - background-position: -48px -48px; -} -.icon-bookmark { - background-position: -72px -48px; -} -.icon-print { - background-position: -96px -48px; -} -.icon-camera { - background-position: -120px -48px; -} -.icon-font { - background-position: -144px -48px; -} -.icon-bold { - background-position: -167px -48px; -} -.icon-italic { - background-position: -192px -48px; -} -.icon-text-height { - background-position: -216px -48px; -} -.icon-text-width { - background-position: -240px -48px; -} -.icon-align-left { - background-position: -264px -48px; -} -.icon-align-center { - background-position: -288px -48px; -} -.icon-align-right { - background-position: -312px -48px; -} -.icon-align-justify { - background-position: -336px -48px; -} -.icon-list { - background-position: -360px -48px; -} -.icon-indent-left { - background-position: -384px -48px; -} -.icon-indent-right { - background-position: -408px -48px; -} -.icon-facetime-video { - background-position: -432px -48px; -} -.icon-picture { - background-position: -456px -48px; -} -.icon-pencil { - background-position: 0 -72px; -} -.icon-map-marker { - background-position: -24px -72px; -} -.icon-adjust { - background-position: -48px -72px; -} -.icon-tint { - background-position: -72px -72px; -} -.icon-edit { - background-position: -96px -72px; -} -.icon-share { - background-position: -120px -72px; -} -.icon-check { - background-position: -144px -72px; -} -.icon-move { - background-position: -168px -72px; -} -.icon-step-backward { - background-position: -192px -72px; -} -.icon-fast-backward { - background-position: -216px -72px; -} -.icon-backward { - background-position: -240px -72px; -} -.icon-play { - background-position: -264px -72px; -} -.icon-pause { - background-position: -288px -72px; -} -.icon-stop { - background-position: -312px -72px; -} -.icon-forward { - background-position: -336px -72px; -} -.icon-fast-forward { - background-position: -360px -72px; -} -.icon-step-forward { - background-position: -384px -72px; -} -.icon-eject { - background-position: -408px -72px; -} -.icon-chevron-left { - background-position: -432px -72px; -} -.icon-chevron-right { - background-position: -456px -72px; -} -.icon-plus-sign { - background-position: 0 -96px; -} -.icon-minus-sign { - background-position: -24px -96px; -} -.icon-remove-sign { - background-position: -48px -96px; -} -.icon-ok-sign { - background-position: -72px -96px; -} -.icon-question-sign { - background-position: -96px -96px; -} -.icon-info-sign { - background-position: -120px -96px; -} -.icon-screenshot { - background-position: -144px -96px; -} -.icon-remove-circle { - background-position: -168px -96px; -} -.icon-ok-circle { - background-position: -192px -96px; -} -.icon-ban-circle { - background-position: -216px -96px; -} -.icon-arrow-left { - background-position: -240px -96px; -} -.icon-arrow-right { - background-position: -264px -96px; -} -.icon-arrow-up { - background-position: -289px -96px; -} -.icon-arrow-down { - background-position: -312px -96px; -} -.icon-share-alt { - background-position: -336px -96px; -} -.icon-resize-full { - background-position: -360px -96px; -} -.icon-resize-small { - background-position: -384px -96px; -} -.icon-plus { - background-position: -408px -96px; -} -.icon-minus { - background-position: -433px -96px; -} -.icon-asterisk { - background-position: -456px -96px; -} -.icon-exclamation-sign { - background-position: 0 -120px; -} -.icon-gift { - background-position: -24px -120px; -} -.icon-leaf { - background-position: -48px -120px; -} -.icon-fire { - background-position: -72px -120px; -} -.icon-eye-open { - background-position: -96px -120px; -} -.icon-eye-close { - background-position: -120px -120px; -} -.icon-warning-sign { - background-position: -144px -120px; -} -.icon-plane { - background-position: -168px -120px; -} -.icon-calendar { - background-position: -192px -120px; -} -.icon-random { - background-position: -216px -120px; -} -.icon-comment { - background-position: -240px -120px; -} -.icon-magnet { - background-position: -264px -120px; -} -.icon-chevron-up { - background-position: -288px -120px; -} -.icon-chevron-down { - background-position: -313px -119px; -} -.icon-retweet { - background-position: -336px -120px; -} -.icon-shopping-cart { - background-position: -360px -120px; -} -.icon-folder-close { - background-position: -384px -120px; -} -.icon-folder-open { - background-position: -408px -120px; -} -.icon-resize-vertical { - background-position: -432px -119px; -} -.icon-resize-horizontal { - background-position: -456px -118px; -} -.dropdown { - position: relative; -} -.dropdown-toggle { - border: 1px solid #eeeeee; -} -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} + border-collapse: separate; } + .input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; } + .input-group .form-control, .input-group .datepicker input, + .datepicker .input-group input { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; } + +.input-group-addon, .input-group-btn, .input-group .form-control, +.input-group .datepicker input, .datepicker .input-group input { + display: table-cell; } + .input-group-addon:not(:first-child):not(:last-child), + .input-group-btn:not(:first-child):not(:last-child), + .input-group .form-control:not(:first-child):not(:last-child), + .input-group .datepicker input:not(:first-child):not(:last-child), + .datepicker .input-group input:not(:first-child):not(:last-child) { + border-radius: 0; } + +.input-group-addon, .input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; } + + .input-group-addon { + padding: 6px 12px; + font-size: 13px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; } + .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { + margin-top: 0; } + +.input-group .form-control:first-child, .input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn, +.input-group .datepicker input:first-child, +.datepicker .input-group input:first-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + + .input-group-addon:first-child { + border-right: 0; } + + .input-group .form-control:last-child, .input-group-addon:last-child, + .input-group-btn:last-child > .btn, + .input-group-btn:last-child > .btn-group > .btn, + .input-group-btn:last-child > .dropdown-toggle, + .input-group-btn:first-child > .btn:not(:first-child), + .input-group-btn:first-child > .btn-group:not(:first-child) > .btn, + .input-group .datepicker input:last-child, + .datepicker .input-group input:last-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + + .input-group-addon:last-child { + border-left: 0; } + + .input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; } + .input-group-btn > .btn { + position: relative; } + .input-group-btn > .btn + .btn { + margin-left: -1px; } + .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, + .input-group-btn > .btn:active { + z-index: 2; } + .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { + margin-right: -1px; } + .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { + margin-left: -1px; } +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 6px 12px; + font-size: 13px; + line-height: 1.5; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } +.btn:focus, .btn:active:focus, .btn.active:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } +.btn:hover, .btn:focus { + color: #333; + text-decoration: none; } +.btn:active, .btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.12); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.12); } +.btn.disabled, .btn[disabled], fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; } + +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; } + +.btn-primary { + font-weight: 700; + color: #ffffff !important; + background: #0572ce !important; + border-color: #0572ce !important; + } + +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; } + +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; } + +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; } + +.table_actions .btn-danger { + color: #ffffff !important; + background: #0572ce !important; + border: 1px solid #0572ce !important; } + +.actions_column .btn-danger:hover, .actions_column .btn-danger:focus, .actions_column .btn-danger:active { + background: #eeeeee !important; + border-color: #cccccc !important; + color: #000000; +} + +.btn-link { + color: #428bca; + font-weight: normal; + cursor: pointer; + border-radius: 0; } +.btn-link, .btn-link:active, .btn-link[disabled], fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; } +.btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { + border-color: transparent; } +.btn-link:hover, .btn-link:focus { + color: #005D9D; + text-decoration: underline; + background-color: transparent; } +.btn-link[disabled]:hover, .btn-link[disabled]:focus, +fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; } + +.btn-lg, .btn-group-lg .btn { + padding: 10px 16px; + font-size: 17px; + line-height: 1.33; + border-radius: 6px; } + +.btn-sm, .btn-group-sm .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +.btn-xs, .btn-group-xs .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; + background: #0572ce; + border: 1px solid #0572ce; + color: #ffffff; + font-weight: 400; + } + +.btn-xs:hover, .btn-group-xs .btn:hover, +.btn-sm:hover, .btn-group-sm .btn:hover { + background: #0572ce; + border: 1px solid 0572ce; +} + +.actions_column .btn-sm:hover { + background: #ffffff; +} + +.btn-block { + display: block; + width: 100%; } + +.btn-block + .btn-block { + margin-top: 5px; } + +input[type="submit"].btn-block, input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; } +.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, +.open > .btn-default.dropdown-toggle { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; } +.btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { + background-image: none; } +.btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focus, +.btn-default.disabled:active, .btn-default.disabled.active, .btn-default[disabled], +.btn-default[disabled]:hover, .btn-default[disabled]:focus, +.btn-default[disabled]:active, .btn-default[disabled].active, +fieldset[disabled] .btn-default, fieldset[disabled] .btn-default:hover, +fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default:active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; } +.btn-default .badge { + color: #fff; + background-color: #333; } +.btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, +.open > .btn-primary.dropdown-toggle, .btn-danger:hover { + color: #fff; + background-color: 0572ce !important; + border-color: 0572ce !important; +} +.btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { + background-image: none; } +.btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, +.btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], +.btn-primary[disabled]:hover, .btn-primary[disabled]:focus, +.btn-primary[disabled]:active, .btn-primary[disabled].active, +fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, +fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary:active, +fieldset[disabled] .btn-primary.active { + background-color: #428bca; + border-color: #357ebd; } +.btn-primary .badge { + color: #428bca; + background-color: #fff; } +.btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, +.open > .btn-success.dropdown-toggle { + color: #fff; + background-color: #449d44; + border-color: #398439; } +.btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { + background-image: none; } +.btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, +.btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], +.btn-success[disabled]:hover, .btn-success[disabled]:focus, +.btn-success[disabled]:active, .btn-success[disabled].active, + fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, + fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success:active, + fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; } +.btn-success .badge { + color: #5cb85c; + background-color: #fff; } +.btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, +.open > .btn-info.dropdown-toggle { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; } +.btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { + background-image: none; } +.btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, +.btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], +.btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled]:active, +.btn-info[disabled].active, fieldset[disabled] .btn-info, + fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, + fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; } +.btn-info .badge { + color: #5bc0de; + background-color: #fff; } +.btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, +.open > .btn-warning.dropdown-toggle { + color: #fff; + background-color: #ec971f; + border-color: #d58512; } +.btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { + background-image: none; } +.btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, +.btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], +.btn-warning[disabled]:hover, .btn-warning[disabled]:focus, +.btn-warning[disabled]:active, .btn-warning[disabled].active, +fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, +fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning:active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; } +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; } +.btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, +.open > .btn-danger.dropdown-toggle { + color: #ffffff; + background: 0572ce; + border-color: 0572ce; + } +.btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { + background-image: none; } +.btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, +.btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], +.btn-danger[disabled]:hover, .btn-danger[disabled]:focus, +.btn-danger[disabled]:active, .btn-danger[disabled].active, +fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, +fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger:active, +fieldset[disabled] .btn-danger.active { + background-color: #dde7ee; + border-color: #cedae2; } +.btn-danger .badge { + color: #d9534f; + background-color: #fff; } +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; } + .fade.in { + opacity: 1; } + +.collapse { + display: none; } + .collapse.in { + display: block; } + +tr.collapse.in { + display: table-row; } + + tbody.collapse.in { + display: table-row-group; } + + .collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; } .caret { display: inline-block; width: 0; height: 0; - text-indent: -99999px; - *text-indent: 0; - vertical-align: top; - border-left: 4px solid transparent; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; border-right: 4px solid transparent; - border-top: 4px solid #000000; - opacity: 0.3; - filter: alpha(opacity=30); - content: "\2193"; -} -.dropdown .caret { + border-left: 4px solid transparent; } + + .dropdown { + position: relative; } + + .dropdown-toggle:focus { + outline: 0; } + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 13px; + text-align: left; + background-color: #fff; + border: 1px solid #c4ced7; + border-radius: 2px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.17); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.17); + background-clip: padding-box; } +.dropdown-menu.pull-right { + right: 0; + left: auto; } +.dropdown-menu .divider { + height: 1px; + margin: 8px 0; + overflow: hidden; + background-color: #e5e5e5; } +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.5; + color: #333; + white-space: nowrap; } + +.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #f5f5f5; } + +.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + outline: 0; + background-color: #428bca; } + +.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; } + +.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; } + +.open > .dropdown-menu { + display: block; } + .open > a { + outline: 0; } + +#editor_list li a { + border: 1px solid #ffffff; + background: #ffffff; + color: #000000; + height: 30px; + width: 100%; + line-height: 30px; + padding-left: 12px; + vertical-align: middle; +} + +#editor_list li a:hover { + border: 1px solid #ebeced; + background: #ebeced; +} + +.dropdown-menu-right { + left: auto; + right: 0; } + + .dropdown-menu-left { + left: 0; + right: auto; } + + .dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.5; + color: #777; + white-space: nowrap; } + + .dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; } + + .pull-right > .dropdown-menu { + right: 0; + left: auto; } + + .dropup .caret, .navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; } + .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; } + +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; } +} +.btn-group, .btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; } + .btn-group > .btn, .btn-group-vertical > .btn { + position: relative; + float: left; } + .btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, + .btn-group > .btn.active, .btn-group-vertical > .btn:hover, + .btn-group-vertical > .btn:focus, .btn-group-vertical > .btn:active, + .btn-group-vertical > .btn.active { + z-index: 2; } + .btn-group > .btn:focus, .btn-group-vertical > .btn:focus { + outline: 0; } + +.btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; } + +.btn-toolbar { + margin-left: -5px; } +.btn-toolbar .btn-group, .btn-toolbar .input-group { + float: left; } +.btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { + margin-left: 5px; } + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; } + +.btn-group > .btn:first-child { + margin-left: 0; } +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + +.btn-group > .btn-group { + float: left; } + +.btn-group a:hover { + background: #ffffff; + border: 1px solid #cccccc; +} + +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; } + +.btn-group > .btn-group:first-child > .btn:last-child, +.btn-group > .btn-group:first-child > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + +.btn-group > .btn-group:last-child > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + + .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { + outline: 0; } + + .btn-group > .btn-lg + .dropdown-toggle, + .btn-group .btn-group-lg > .btn + .dropdown-toggle, + .btn-group-lg .btn-group > .btn + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; } + + .btn-lg .caret, .btn-group-lg .btn .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; } + + .dropup .btn-lg .caret, .dropup .btn-group-lg .btn .caret, + .btn-group-lg .dropup .btn .caret { + border-width: 0 5px 5px; } + + .btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; } + + .btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.12); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.12); } + .btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; } + +.btn .caret { + margin-left: 0; } + + .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, + .btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; } + .btn-group-vertical > .btn-group > .btn { + float: none; } + .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, + .btn-group-vertical > .btn-group + .btn, + .btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; } + +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; } + .btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + .btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-top-left-radius: 0; } + +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; } + + .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, + .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; } + + .btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; } + .btn-group-justified > .btn, .btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; } + .btn-group-justified > .btn-group .btn { + width: 100%; } + .btn-group-justified > .btn-group .dropdown-menu { + left: auto; } + +[data-toggle="buttons"] > .btn > input[type="radio"], +[data-toggle="buttons"] > .btn > input[type="checkbox"] { + position: absolute; + z-index: -1; + opacity: 0; + filter: alpha(opacity=0); } +.navbar-btn.btn-xs, .btn-group-xs .navbar-btn.btn { + margin-top: 14px; + margin-bottom: 14px; } +.navbar-btn.btn-sm, .btn-group-sm .navbar-btn.btn { + margin-top: 10px; + margin-bottom: 10px; } + +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 18px; + border: 1px solid transparent; } +@media (min-width: 768px) { + .navbar { + border-radius: 4px; } +} + +@media (min-width: 768px) { + .navbar-header { + float: left; } +} + +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; } + .navbar-collapse.in { + overflow-y: auto; } + @media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; } + .navbar-collapse.in { + overflow-y: visible; } + .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; } +} + +.navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { + max-height: 340px; } + @media (max-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; } +} + +.container > .navbar-header, .container > .navbar-collapse, +.container-fluid > .navbar-header, .container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; } + @media (min-width: 768px) { + .container > .navbar-header, .container > .navbar-collapse, + .container-fluid > .navbar-header, .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; } +} + +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; } + @media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; } +} + +.navbar-fixed-top, .navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + @media (min-width: 768px) { + .navbar-fixed-top, .navbar-fixed-bottom { + border-radius: 0; } +} + +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; } + + .navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; } + + .navbar-brand { + float: left; + padding: 16px 15px; + font-size: 17px; + line-height: 18px; + height: 50px; } + .navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; } + @media (min-width: 768px) { + .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { + margin-left: -15px; } +} + +.navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; margin-top: 8px; - margin-left: 2px; -} -.dropdown:hover .caret, -.open.dropdown .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.dropdown-menu { + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; } + .navbar-toggle:focus { + outline: 0; } + .navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; } + .navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; } + @media (min-width: 768px) { + .navbar-toggle { + display: none; } +} + +.navbar-nav { + margin: 8px -15px; } + .navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 18px; } + @media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 18px; } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; } +} + @media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; } + .navbar-nav > li { + float: left; } + .navbar-nav > li > a { + padding-top: 16px; + padding-bottom: 16px; } + .navbar-nav.navbar-right:last-child { + margin-right: -15px; } +} + +@media (min-width: 768px) { + .navbar-left { + float: left !important; } + .navbar-right { + float: right !important; } +} + +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 9px; + margin-bottom: 9px; } + @media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; } +} + @media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; } + .navbar-form.navbar-right:last-child { + margin-right: -15px; } +} + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; } + + .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + + .navbar-btn { + margin-top: 9px; + margin-bottom: 9px; } + + .navbar-text { + margin-top: 16px; + margin-bottom: 16px; } + @media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 15px; } + .navbar-text.navbar-right:last-child { + margin-right: 0; } +} + +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; } + .navbar-default .navbar-brand { + color: #777; } + .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; } + .navbar-default .navbar-text { + color: #777; } + .navbar-default .navbar-nav > li > a { + color: #777; } + .navbar-default .navbar-nav > li > a:hover, + .navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; } + .navbar-default .navbar-nav > .active > a, + .navbar-default .navbar-nav > .active > a:hover, + .navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; } + .navbar-default .navbar-nav > .disabled > a, + .navbar-default .navbar-nav > .disabled > a:hover, + .navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; } + .navbar-default .navbar-toggle { + border-color: #ddd; } + .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { + background-color: #ddd; } + .navbar-default .navbar-toggle .icon-bar { + background-color: #888; } + .navbar-default .navbar-collapse, .navbar-default .navbar-form { + border-color: #e7e7e7; } + .navbar-default .navbar-nav > .open > a, + .navbar-default .navbar-nav > .open > a:hover, + .navbar-default .navbar-nav > .open > a:focus { + background-color: #e7e7e7; + color: #555; } + @media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; } +} + .navbar-default .navbar-link { + color: #777; } + .navbar-default .navbar-link:hover { + color: #333; } + .navbar-default .btn-link { + color: #777; } + .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { + color: #333; } + .navbar-default .btn-link[disabled]:hover, + .navbar-default .btn-link[disabled]:focus, + fieldset[disabled] .navbar-default .btn-link:hover, + fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; } + +.navbar-inverse { + background-color: #222; + border-color: #080808; } + .navbar-inverse .navbar-brand { + color: #777; } + .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; } + .navbar-inverse .navbar-text { + color: #777; } + .navbar-inverse .navbar-nav > li > a { + color: #777; } + .navbar-inverse .navbar-nav > li > a:hover, + .navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; } + .navbar-inverse .navbar-nav > .active > a, + .navbar-inverse .navbar-nav > .active > a:hover, + .navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; } + .navbar-inverse .navbar-nav > .disabled > a, + .navbar-inverse .navbar-nav > .disabled > a:hover, + .navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; } + .navbar-inverse .navbar-toggle { + border-color: #333; } + .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { + background-color: #333; } + .navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; } + .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #101010; } + .navbar-inverse .navbar-nav > .open > a, + .navbar-inverse .navbar-nav > .open > a:hover, + .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #080808; + color: #fff; } + @media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #777; } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; } +} + .navbar-inverse .navbar-link { + color: #777; } + .navbar-inverse .navbar-link:hover { + color: #fff; } + .navbar-inverse .btn-link { + color: #777; } + .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { + color: #fff; } + .navbar-inverse .btn-link[disabled]:hover, + .navbar-inverse .btn-link[disabled]:focus, + fieldset[disabled] .navbar-inverse .btn-link:hover, + fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; } +.btn-xs .badge, .btn-group-xs .btn .badge { + top: 0; + padding: 1px 5px; } + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #fff; + line-height: 1; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: #777; + border-radius: 10px; } + .badge:empty { + display: none; } + .btn .badge { + position: relative; + top: -1px; } +a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { + color: #428bca; + background-color: #fff; } +.nav-pills > li > a > .badge { + margin-left: 3px; } + +a.badge:hover, a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; } +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; } + .nav > li { + position: relative; + display: block; } + .nav > li > a { + position: relative; + display: block; + padding: 10px 15px; } + .nav > li > a:hover, .nav > li > a:focus { + text-decoration: none; + background-color: #eee; } + .nav > li.disabled > a { + color: #777; } + .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; } +.nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + background-color: #eee; + border-color: #428bca; } +.nav .nav-divider { + height: 1px; + margin: 8px 0; + overflow: hidden; + background-color: #e5e5e5; } + .nav > li > a > img { + max-width: none; } + +.nav-tabs { + border-bottom: 1px solid #dddddd; } +.nav-tabs > li { + float: left; + margin-bottom: -1px; } +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.5; + border: 1px solid transparent; +} + +.nav-tabs > li > a:hover { + border: 1px solid transparent; + border-bottom: 1px solid #dddddd; + /*border-color: #eee #eee #ddd;*/ + text-decoration: underline; + background: #ffffff; +} +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + /*color: #555;*/ + font-weight: 600; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: #fff; + text-decoration: none; + background: url(../img/content_tab_bkgd_selected.png) repeat-x; + cursor: default; } + +.nav-justified, .nav-tabs.nav-justified { + width: 100%; } + .nav-justified > li, .nav-tabs.nav-justified > li { + float: none; } + .nav-justified > li > a, .nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; } + .nav-justified > .dropdown .dropdown-menu, + .nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; } + @media (min-width: 768px) { + .nav-justified > li, .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; } + .nav-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-bottom: 0; } +} + +.nav-tabs-justified, .nav-tabs.nav-justified { + border-bottom: 0; } + .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; } + .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; } + @media (min-width: 768px) { + .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; } + .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; } +} + +.nav-pills > li { + float: left; } +.nav-pills > li > a { + border-radius: 4px; } +.nav-pills > li + li { + margin-left: 2px; } +.nav-pills > li.active > a, .nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #428bca; } + +.nav-stacked > li { + float: none; } + .nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; } + +.tab-content > .tab-pane { + display: none; } + .tab-content > .active { + display: block; } + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; } +.form-inline, .navbar-form, .table_actions { + display: inline; } +.form-inline input, .form-inline button, .form-inline a.btn, .navbar-form input, +.navbar-form button, .navbar-form a.btn, .table_actions input, +.table_actions button, .table_actions a.btn { + margin-left: 5px; + background: -moz-linear-gradient(top, #f1f3f4, #e3e8ea); + background: -ms-linear-gradient(top, #f1f3f4, #e3e8ea); + background: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f3f4), to(#e3e8ea)); + background: -webkit-linear-gradient(top, #f1f3f4, #e3e8ea); + background: -o-linear-gradient(top, #f1f3f4, #e3e8ea); + background: linear-gradient(top, #f1f3f4, #e3e8ea); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + border: 1px solid #C3CED7; + font-weight: 700; +} + +.form-inline input:hover, .form-inline button:hover, .form-inline a.btn:hover, .navbar-form input:hover, +.navbar-form button:hover, .navbar-form a.btn:hover, .table_actions input:hover, +.table_actions button:hover, .table_actions a.btn:hover { + background: -moz-linear-gradient(top, #F8F9FA, #F1F4F5); + background: -ms-linear-gradient(top, #F8F9FA, #F1F4F5); + background: -webkit-gradient(linear, 0 0, 0 100%, from(#F8F9FA), to(#F1F4F5)); + background: -webkit-linear-gradient(top, #F8F9FA, #F1F4F5); + background: -o-linear-gradient(top, #F8F9FA, #F1F4F5); + background: linear-gradient(top, #F8F9FA, #F1F4F5); + text-decoration: none; +} + +.table_count { + font-weight: 700; +} + +.clearfix:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; } + +* html .clearfix { + zoom: 1; } + +*:first-child + html .clearfix { + zoom: 1; } + +@font-face { + font-family: 'anivers'; + src: url('/static/dashboard/fonts/Anivers_Regular-webfont.eot?5f61443eb372'); + src: url('/static/dashboard/fonts/Anivers_Regular-webfont.eot?iefix&5f61443eb372') format('eot'), + url('/static/dashboard/fonts/Anivers_Regular-webfont.woff?2c3db88030ec') format('woff'), + url('/static/dashboard/fonts/Anivers_Regular-webfont.ttf?6a7822aa21cf') format('truetype'), + url('/static/dashboard/fonts/Anivers_Regular-webfont.svg?1dbc53d268e6#webfont3JLVF59W') format('svg'); + font-weight: normal; + font-style: normal; } + +body { + background-color: #ffffff; + color: #333333; + min-width: 900px; } + +small { + font-size: 11px; } + +a { + color: #145c9e; + text-decoration: none; } + +a:hover, a:focus { + color: #145c9e; + text-decoration: underline; } + +ul { + list-style: none; + margin: 0; } + +.list-bullet { + list-style: disc; } + +.small-padding { + padding-left: 0; + padding-right: 5px; + padding-bottom: 5px; } + +dt { + font-weight: bold; } + +.topbar { + background: url('../img/OpenStack_banner.png') repeat-x; + height: 79px; + padding: 17px 0px 0px 20px; +} + +.topbar .switcher_bar { + display: inline-block; + height: auto; + width: 160px; + max-width: 160px; + /*margin-bottom: 0; + margin-right: 10px;*/ + padding: 0; + background: url('/static/dashboard/img/dropdown_ena.png') no-repeat; + background-position: 140px center; +} + + +.topbar .switcher_bar ul#tenant_list a { + max-width: 160px; + overflow: hidden; + text-overflow: ellipsis; } + +.topbar .switcher_bar a { + margin-left: 0; + display: block; + border: 1px solid #f5f5f5; + border-radius: 2px; + padding: 0px 0px 0px 6px; + color: #000000; +} + +.topbar .switcher_bar a:hover, .topbar .switcher_bar a:active { + text-decoration: none; + border: 1px solid #0572ce; + background: url('/static/dashboard/img/dropdown_dwn.png') no-repeat right 6px center #0572ce; + color: #ffffff; +} + +.topbar .open a { + border: 1px solid #0572ce; + background: url('/static/dashboard/img/dropdown_dwn.png') no-repeat right 6px center #0572ce; + color: #ffffff; +} + + +.topbar .switcher_bar ul { + width: 130px; } + +.topbar .switcher_bar div { + padding: 0px 20px 0px 8px; + line-height: 28px; + text-decoration: none; + overflow: hidden; + text-overflow: ellipsis; } + +.topbar .switcher_bar div:first-letter { + text-transform: capitalize; +} + +.topbar .context-box { + display: inline; + float: right; + position: relative; + right: 165px; +} + +.hide_image { + background-image: none !important; } + +#profile_editor_switcher { + width: auto; + height: 28px; + vertical-align: top; + white-space: nowrap; + /*background-image: url('/static/dashboard/img/profile_drop.png?94c62ed0a520');*/ + background-repeat: no-repeat; + background-position: right 6px center; + line-height: 28px; + position: relative; + top: 4px; +} + +#profile_editor_switcher a, #profile_editor_switcher a:hover { + text-decoration: none; +} + +#user_info { + margin: 0px; + margin-right: -57px; +} + +#user_info > a { + color: #145c9e; + margin-left: 14px; + line-height: 38px; + font-size: 13px !important; +} + +#user_info > a:hover { + color: #145c9e; +} + +.page-header { + margin: 0px; + padding: 19px 0px; + font-family: Arial, Helvetica, sans-serif; + height: auto; + width: 100%; } +.page-header h2 { + margin: 0; } + +h2 { + color: #333333; + font-size: 30px; + font-weight: normal; } + +#splash .login { + background: url('/static/dashboard/img/OracleSolaris_login_banner.png') no-repeat; + position: absolute; + top: 80px; + left: 50%; + margin: 0 0 0 -195px; + padding-top: 79px; + width: 390px; + border: 1px solid #dddddd; + max-height: none; + border-radius: 6px; + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + background-clip: padding-box; } +#splash .login form .error { + width: 100%; } +#splash .login form input { + width: 100%; } +#splash .login form select { + width: 360px; } + +#splash p.help-block { + display: none; } + +#create_container_form .modal-footer { + margin-top: 190px; } + +.container-fluid { + padding-left: 0; } + +.sidebar { + border: none; + border-right: 1px solid #c4ced8; + border-bottom: 1px solid #c4ced8; + float: left; + width: 235px; + height: 800px; + background: #ebeced; +} + +.sidebar h4 { + margin-left: 14px; + color: #333333; } + +.sidebar .nav-tabs { + margin-top: -34px; } + +.sidebar .nav-tabs li.active a { + background-color: #ffffff; } + +h1.brand { + width: 100%; + margin: 0; } + +h1.brand a { + background: url('/static/dashboard/img/OracleSolaris_Logo.png') top left no-repeat; + display: block; + float: left; + padding-left: 115px; + color: #000000; + font-weight: 400; + width: 310px; + font-family: Arial, Helvetica, sans-serif; + font-size: 19px; + line-height: 35px; + } + +h1.brand a:hover { + color: #000000; + text-decoration: none; +} + + a.current_item { + width: 163px; + float: left; } + + a.current_item:hover { + text-decoration: none; } + + a.current_item:hover h3, a.current_item:hover h4 { + color: #005D9D; + border-radius: 4px; } + + .sidebar .switcher_bar { + width: 190px; + height: 38px; + padding: 5px 0; + margin-left: 14px; + margin-bottom: 15px; } + + .sidebar .switcher_bar a.dropdown-toggle { + display: block; + padding: 5px 0; + background-image: url('/static/dashboard/img/drop_arrow.png?2ec1100baed3'); + border: 1px solid #c0d9e4; + background-color: #e9f5fa; + background-repeat: no-repeat; + background-position: 167px 23px; } + + .sidebar .switcher_bar a.dropdown-toggle:hover { + text-decoration: none; + background-color: #cde8f4; } + + .sidebar .switcher_bar:focus { + outline: none; } + + .sidebar .switcher_bar h3 { + color: #4790ae; + font-size: 16px; + margin: -6px 0 0 14px; + padding: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .sidebar .switcher_bar h3:hover { + white-space: normal; + overflow: visible; + text-overflow: none; + padding-right: 1em; + word-wrap: break-word; } + +.sidebar .switcher_bar h4 { + color: #6fabc4; + font-size: 10px; + text-transform: uppercase; + font-weight: normal; + padding: 0; } + + .sidebar .switcher_bar ul { + border: 1px solid #c0d9e4; + margin-left: -1px; + width: 190px; } + + .sidebar .switcher_bar li a:hover { + background: #92d6f1; } + + #usage { + margin-bottom: 25px; + height: 125px; } + + .usage_block { + background: #e8f8ff; + color: #84b6c5; + border: 1px solid #afe3fb; + border-radius: 5px; + float: left; + width: 29%; + margin-right: 5%; + min-height: 125px; } + + .usage_block.last { + margin-right: 0; } + + .usage_block h3 { + background: #cef0ff; + color: #4fa5bf; + font-weight: normal; + padding: 0 0 0 10px; + border-bottom: 1px solid #c6e7f5; + border-top-left-radius: 5px; + border-top-right-radius: 5px; } + +.usage_block ul { + margin: 10px; } + +.usage_block .quantity { + font-size: 25px; } + +.usage_block li { + font-size: 11px; + margin: 0 0 15px 0; } + +.usage_block .unit { + font-size: 11px; + text-transform: uppercase; + padding: 0 0 0 1px; } + +.table-bordered { + border: none; } + +.table_header { + min-height: 35px; + padding: 5px 0; } + +.table_caption th { + background-color: transparent; + border: none; } + +.table-bordered th.table_header { + border: none; + padding: 12px 0px;} + +#containers tr.table_caption { + height: 56px;} + +#containers th.table_header, +#objects th.table_header { + padding: 12px;} + +.table-bordered tr.table_caption + tr th { + border: 1px solid #d5dfe6; + padding: 12px; + background-color: #ebeced; +} + +.table-bordered tr.table_caption + tr th:first-child, +.table-bordered tr.table_caption + tr th.hide + th { + border-top-left-radius: 4px; + border-left: 1px solid #d5dfe6; } + +.table-bordered tr.table_caption + tr th:last-child { + border-top-right-radius: 4px; + border-right: 1px solid #d5dfe6; } + +.table-bordered tbody tr td:first-child, .table-bordered tfoot tr td:first-child { + border-left: 1px solid #d5dfe6; } + +.table-bordered tbody tr td:last-child, .table-bordered tfoot tr td:last-child { + border-right: 1px solid #d5dfe6; } + +.table-bordered tfoot tr td:first-child { + border-bottom: 1px solid #d5dfe6; +} + +.table-bordered tfoot tr td:last-child { + background-color: #f9f9f9; + padding: 8px 12px; + border-bottom: 1px solid #d5dfe6; +} + +.table_title h3, .table_header h3 { + font-family: Arial, Helvetica, sans-serif; + font-weight: 600; + font-size: 16px; + line-height: 30px; + vertical-align: middle; + margin: 0px; + float: left; } + + .table th.header { + cursor: pointer; } + + .table th.header:hover { + background-color: #e8e8e8; + text-decoration: underline; } + + .table tbody td.anchor a { + display: block; } + + .table tr.table_caption th.header:hover { + background-color: transparent; + cursor: default; } + + .table th.headerSortUp:hover, .table th.headerSortDown:hover { + background-color: #dfdfdf; } + + .table th.headerSortUp, .table th.headerSortDown { + background-color: #dfdfdf; + background-repeat: no-repeat; + background-position: 98% center; } + + .table th.headerSortDown { + background-image: url('/static/dashboard/img/drop_arrow.png?2ec1100baed3'); } + + .table th.headerSortUp { + background-image: url('/static/dashboard/img/up_arrow.png?4293b62aa222'); } + + .table tr.summation td:first-child, .table tr.summation td:last-child { + border-radius: 0; + border-bottom: 0 none; } + + .table li { + list-style-position: inside; } + + th { + background: #f1f1f1; } + + td.anchor { + padding: 0; } + + .main_nav { + list-style: none; + width: 222px; + margin: 10px 0 20px 0; } + + .main_nav a { + color: #999; + width: 185px; + padding: 10px; + display: block; + margin-left: 20px; } + + .main_nav a.active { + background: #fff; + border: 2px solid #d8d8d8; + border-right: 0; + border-bottom-color: #ccc; } + + table form { + margin-bottom: 0; + width: 1px; } + + .messages { + position: fixed; + z-index: 9999; + top: 20px; + right: 20px; + width: 300px; } + .messages .alert { + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); } + .messages .alert.alert-danger { + border-width: 1px; + border-style: solid; + border-color: #d43f3a; } + .messages .alert.alert-success { + border-width: 1px; + border-style: solid; + border-color: #4cae4c; } + +.alert .alert-actions { + margin-top: -23px; + margin-right: -23px; } + + .modal > form, .login > form, .alert-actions > form { + margin-bottom: 0; } + + .alert p { + overflow: hidden; + word-wrap: break-word; } + + .alert p:last-child { + margin-bottom: 0; } + + #actions.single { + width: 90px; } + + .table-striped tr td { + transition: background 0.2s; + -webkit-transition: background 0.2s; + -moz-transition: background 0.2s; + -o-transition: background 0.2s; } + + .inspect { + float: left; + display: block; + margin-top: 5px; + margin-right: 25px; } + + .table { + margin-bottom: 25px; } + .table > thead > tr > th, .table > thead > tr > td, .table > tbody > tr > th, + .table > tbody > tr > td, .table > tfoot > tr > th, .table > tfoot > tr > td { + vertical-align: middle; } + +.table tr td { + vertical-align: middle; } + + .table tr.empty td { + text-align: center; } + + .table tfoot tr td { + border-top: 1px solid #dddddd; + background-color: #f1f1f1; + font-size: 11px; + line-height: 14px; } + + .table_actions { + float: right; + min-width: 400px; } + + .table_actions .table_search, .table_actions .table_filter { + display: inline-block; } + + .table_search input[type="text"] { + padding-right: 26px; } + .table_search select { + width: auto; } + +.table_actions .table_actions_menu { + display: inline-block; + position: relative; + margin-left: 5px; } + .table_actions .table_actions_menu .dropdown-menu { + left: auto; + right: 0; } + .table_actions .table_actions_menu .dropdown-menu a, + .table_actions .table_actions_menu .dropdown-menu button { + margin-left: 0px; + padding-left: 22px; } + .table_actions .table_actions_menu .dropdown-menu a .glyphicon, + .table_actions .table_actions_menu .dropdown-menu button .glyphicon, + .table_actions .table_actions_menu .dropdown-menu button .membership .role_dropdown li i, + .membership .role_dropdown li .table_actions .table_actions_menu .dropdown-menu button i, + .table_actions .table_actions_menu .dropdown-menu a .membership .role_dropdown li i, + .membership .role_dropdown li .table_actions .table_actions_menu .dropdown-menu a i { + margin-left: -14px; } + +td.no-transition { + -webkit-transition: none !important; + -moz-transition: none !important; + -o-transition: none !important; + -ms-transition: none !important; + transition: none !important; } + + td.success { + background-color: #dff0d8 !important; } + + td.loading { + background-color: #e6e6e6 !important; } + + td.inline_edit_available div.table_cell_wrapper .table_cell_action button.ajax-inline-edit { + padding: 9px 12px 9px 12px; + position: relative; + border-radius: 0px; + position: relative; + display: block; + background: none; + border: 0 none; } + td.inline_edit_available div.table_cell_wrapper .table_cell_action button.ajax-inline-edit:before { + display: inline-block; + content: ""; + width: 18px; + height: 20px; + margin-top: 0px; + *margin-right: 0.3em; + line-height: 14px; + background-image: url('/static/bootstrap/img/glyphicons-halflings.png'); + background-position: 0 -72px; + background-repeat: no-repeat; + position: absolute; + top: 2px; + left: 4px; } + +div.table_cell_wrapper { + min-height: 18px; + position: relative; } + div.table_cell_wrapper .inline-edit-label { + display: inline; } + div.table_cell_wrapper .inline-edit-form { + float: left; } + div.table_cell_wrapper .inline-edit-actions, + div.table_cell_wrapper .table_cell_action { + float: right; + width: 20px; + margin: 0; } + div.table_cell_wrapper .inline-edit-actions button.ajax-inline-edit, + div.table_cell_wrapper .table_cell_action button.ajax-inline-edit { + padding: 10px; + position: relative; + display: none; + background: none; + border: 0 none; } + div.table_cell_wrapper .table_cell_action { + width: auto; + margin: auto 0px 0px 0px; + display: none; + position: absolute; + top: -10px; + right: 0px; + z-index: 99; } + div.table_cell_wrapper .inline-edit-error .error { + padding: 9px 12px 9px 12px; + position: relative; + border-radius: 0px; + position: absolute; + width: 18px; + height: 20px; + top: 20px; + left: 2px; + padding: 0; } + div.table_cell_wrapper .inline-edit-error .error:before { + display: inline-block; + content: ""; + width: 20px; + height: 20px; + margin-top: 0px; + *margin-right: 0.3em; + line-height: 14px; + background-image: url('/static/bootstrap/img/glyphicons-halflings.png'); + background-position: -144px -120px; + background-repeat: no-repeat; + position: absolute; + top: 0px; + left: 0px; } + div.table_cell_wrapper .inline-edit-status .success { + padding: 9px 12px 9px 12px; + position: relative; + border-radius: 0px; + padding: 0; + position: absolute; + top: 2px; + right: 18px; + width: 18px; + height: 20px; + z-index: 100; } + div.table_cell_wrapper .inline-edit-status .success:before { + display: inline-block; + content: ""; + width: 20px; + height: 20px; + margin-top: 0px; + *margin-right: 0.3em; + line-height: 14px; + background-image: url('/static/bootstrap/img/glyphicons-halflings.png'); + background-position: -288px 0px; + background-repeat: no-repeat; + position: absolute; + top: 0px; + left: 0px; } + div.table_cell_wrapper .inline-edit-status .loading { + padding: 9px 12px 9px 12px; + position: relative; + border-radius: 0px; + padding: 0; + position: absolute; + top: 0px; + right: 24px; + width: 18px; + height: 20px; + z-index: 100; } + div.table_cell_wrapper .inline-edit-status .loading:before { + display: inline-block; + content: ""; + width: 20px; + height: 20px; + margin-top: 0px; + *margin-right: 0.3em; + line-height: 14px; + background-image: url('/static/dashboard/img/spinner.gif?a9f731a1424b'); + background-position: 0px 0px; + background-repeat: no-repeat; + position: absolute; + top: 0px; + left: 0px; } + div.table_cell_wrapper .inline-edit-status.inline-edit-mod .loading { + top: 15px; + right: 34px; } + +.table_header .table_actions { + min-width: 0; } + +.table_header .table_actions a, .table_header .table_actions > button, +.table_header .table_actions .table_search button { + display: inline-block; + float: none; } + +.table_header .table_actions .table_search select { + margin-bottom: 0; + line-height: 22px; } + +.table_header .table_filter { + vertical-align: bottom; + margin-right: 20px; } + +.table_header .table_filter i { + vertical-align: middle; } + +.table_actions form { + float: right; + margin-left: 10px; } + +.hidden { + display: none; } + +.table-striped.datatable tbody td { + background-clip: padding-box; } +.table-striped.datatable tbody tr.odd td { + background-color: #f9f9f9; + padding: 8px 12px; +} +.table-striped.datatable tbody tr.even td { + background-color: inherit; + padding: 8px 12px; +} +.table-striped.datatable tbody tr.odd:hover td, +.table-striped.datatable tbody tr.even:hover td, +.table-striped.datatable tbody tr:hover th { + background-color: #e3e9f2; } + +.table-striped tbody tr.status_unknown:nth-child(odd) td { + background-color: #ffffb5; } + +.table-striped tbody tr.status_unknown:nth-child(even) td { + background-color: #ffffc6; } + +.nowrap-col { + white-space: nowrap; } + +.overview { + font-size: 24px; } + +#monitoring { + background: #ffffff; + font-size: 14px; + height: 20px; + margin: -18px 0 25px; + padding: 10px; + border: 1px solid #dddddd; + font-family: "anivers"; } + + #monitoring h3 { + font-size: 14px; + font-weight: normal; + float: left; + line-height: 18px; } + + #external_links, #external_links li { + float: left; } + + #external_links li { + margin: 0 0 0 15px; } + + .datatable th.narrow { + width: 1em; } + .datatable input { + padding: 2px 5px; + margin: 0; } + .datatable th span.required:after { + content: "*"; + font-weight: bold; + line-height: 0; + padding-left: 4px; + color: #428bca; } + .datatable .normal_column ul { + padding-left: 0; } +.capabilities .panel-heading .form-control, +.capabilities .panel-heading .datepicker input, +.datepicker .capabilities .panel-heading input { + width: 150px; + margin-left: 20px; } + +form label { + text-align: left; + color: #555555; + font-weight: bold; + display: inline-block; } + + form .form-group > div.dynamic-select { + display: table; + border-collapse: separate; } + form .form-group > div.dynamic-select > * { + display: table-cell; } + form .form-group > div.dynamic-select > a { + width: 1%; } + +.modal.fullscreen .modal-dialog { + width: 90%; + margin: auto; + left: 5%; } + + .modal.loading .modal-dialog { + width: 170px; } + .modal.loading .modal-dialog .modal-body { + height: 170px; } + +.modal.loading p { + text-align: center; + position: absolute; + bottom: 0; + width: 150px; } + + .modal-body { + overflow-y: visible; + max-height: none; } + + .modal-body table { + margin-bottom: 30px; } + + .modal-body ~ hr { + margin-bottom: 0; } + + .static_page { + float: left; + background-color: #ffffff; + border: 1px solid #dddddd; } + + .static_page > form { + margin-bottom: 0; } + + .left { + float: left; + width: 342px; + margin-right: 15px; } + + .left form { + margin: 0; } + + .right { + float: left; + width: 342px; } + + .clear { + clear: both; + width: 0; + height: 0; + padding: 0; + margin: 0; } + + .modal { + top: 0 !important; } + + .modal-footer input { + width: auto; } + + .modal-body .modal-footer { + width: 670px; + margin-left: -25px; + margin-right: -15px; } + +.modal-footer a.close { + background: -moz-linear-gradient(top, #f1f3f4, #e3e8ea); + background: -ms-linear-gradient(top, #f1f3f4, #e3e8ea); + background: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f3f4), to(#e3e8ea)); + background: -webkit-linear-gradient(top, #f1f3f4, #e3e8ea); + background: -o-linear-gradient(top, #f1f3f4, #e3e8ea); + background: linear-gradient(top, #f1f3f4, #e3e8ea); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + border: 1px solid #C3CED7; + font-weight: 700; + margin-top: 0; + margin-right: 5px; + font-size: 13px; + line-height: 1.5; + color: #000000; + /*font-weight: normal;*/ + filter: alpha(opacity=100); + -khtml-opacity: 1; + -moz-opacity: 1; + opacity: 1; } + +.modal-footer a.close:hover { + color: #000000; + background: -moz-linear-gradient(top, #F8F9FA, #F1F4F5); + background: -ms-linear-gradient(top, #F8F9FA, #F1F4F5); + background: -webkit-gradient(linear, 0 0, 0 100%, from(#F8F9FA), to(#F1F4F5)); + background: -webkit-linear-gradient(top, #F8F9FA, #F1F4F5); + background: -o-linear-gradient(top, #F8F9FA, #F1F4F5); + background: linear-gradient(top, #F8F9FA, #F1F4F5); + text-decoration: none; +} + + .modal-body .help-block { + text-align: left; + float: left; + width: 100%; + margin-bottom: 10px; } + + #create_keypair_modal .clearfix { + margin-bottom: 115px; } + + #actions { + width: 90px; } + + #actions .btn { + margin-bottom: 5px; } + + #actions a.btn { + width: 70px; } + + #actions input.btn { + text-align: left; } + + #images #actions { + width: 100px; } + + .details-modal .modal-body { + padding-bottom: 20px; } + + td.select { + width: 10px; } + + td.actions_column { + white-space: nowrap; + padding: 10px; + position: relative; + width: 200px; + background-clip: padding-box; } + + td.actions_column .btn-group { + display: inline-block; } + + td.actions_column .row_actions a, td.actions_column .row_actions input, + td.actions_column .row_actions button, div.table_actions_menu .dropdown-menu a, + div.table_actions_menu .dropdown-menu input, + div.table_actions_menu .dropdown-menu button { + background: none; + float: none; + display: block; + padding: 5px 10px; + color: #333333; + text-align: left; + border-radius: 0; + border: 0 none; + -webkit-box-shadow: none; + box-shadow: none; } + + td.actions_column .row_actions .hide { + display: none; } + + td.actions_column .btn-action-required { + font-weight: bold; } + + .tab-content { + overflow: visible; } + + .btn.hide, .btn-group .hide { + display: none; } + + .btn-group .dropdown-toggle:focus { + outline: none; } + + .dropdown-menu button { + line-height: 18px; + width: 100%; } + + .btn-group .dropdown-menu .btn { + border-radius: 0; } + +.dropdown-menu .btn.btn-danger, .dropdown-menu .btn.btn-danger:hover, +.dropdown-menu .btn.btn-success, .dropdown-menu .btn.btn-success:hover, +.dropdown-menu .btn.btn-info, .dropdown-menu .btn.btn-info:hover { + text-shadow: none; } +.dropdown-menu li:hover { + background: none; } +td.actions_column .dropdown-menu a:hover, +td.actions_column .dropdown-menu button:hover, +div.table_actions_menu .dropdown-menu a:hover, +div.table_actions_menu .dropdown-menu button:hover { + background-color: #eeeeee; } +.dropdown-menu .btn.btn-danger { + color: #333333; } +.dropdown-menu .btn.btn-danger:hover { + background-color: #eeeeee !important; } + +tr td.actions_column ul.row_actions.single, +tr:hover td.actions_column ul.row_actions.single, +td.actions_column ul.row_actions.single, +td.actions_column ul.row_actions.single:hover { + border: none; } + + td.actions_column ul.row_actions.single li.action { + display: block; } + + td.actions_column ul.row_actions.single li.action:hover { + background-color: transparent; } + + td.actions_column ul.row_actions.single a, + td.actions_column ul.row_actions.single input, + td.actions_column ul.row_actions.single button { + color: #5bc0de; } + + td.actions_column ul.row_actions.single a:hover, + td.actions_column ul.row_actions.single input:hover, + td.actions_column ul.row_actions.single button:hover { + color: #333333; } + + th.multi_select_column, td.multi_select_column { + width: 41px; } + + th.multi_select_column, td.multi_select_column { + text-align: center; } + + .table-fixed { + table-layout: fixed; } + + .table input[type="checkbox"] { + display: inline; } + + div.input input[type="checkbox"] { + float: left; + width: 25px; } + + .table_title a { + font-size: 11px; + float: right; + margin-left: 10px; + margin-top: 10px; } + + tr.terminated { + color: #999999; } + + #instance_tabs { + float: left; + width: 100%; + border-bottom: 1px solid #e1e1e1; } + + #instance_tabs li a { + background: #f2f2f2; + display: block; + font-size: 14px; + float: left; + padding: 5px 10px; + margin-right: 10px; + border: 1px solid #e1e1e1; + border-bottom: none; } + + #instance_tabs li.active a { + background: #fff; + padding-bottom: 8px; + margin-bottom: -5px; } + +#main_content { + position: relative; + top: -5px; +} + + #main_content .nav-tabs { + margin-bottom: 0; } + + #main_content .tab-content { + border: 1px solid #ddd; + border-top: 0 none; + padding: 10px; } + + #main_content .workflow .modal-body { + padding-left: 0; + padding-right: 0; } + + #main_content .workflow .modal-body .tab-content { + border-left: 0 none; + border-right: 0 none; + border-bottom: 0 none; } + + #content_body { + padding-left: 255px; + padding-right: 25px; } + + .tab_wrapper { + padding-top: 50px; } + + .tooltip { + z-index: 12000; } + + .volume_boot_disclosure { + font-weight: bold; + color: #555; + cursor: pointer; + background-image: url('/static/dashboard/img/right_droparrow.png?b14134630332'); + background-repeat: no-repeat; + background-position: 130px center; } + + .volume_boot_disclosure.on { + width: 334px; + margin-bottom: 10px; + border-bottom: solid 1px #dddddd; + background-image: url('/static/dashboard/img/drop_arrow.png?2ec1100baed3'); } + + .nav-tabs a { + cursor: pointer; } + + .nav-tabs li.error a { + color: #d9534f; } + + .nav-tabs li.error a:after { + content: "*"; } + + .nav-tabs li.required a:after, form .form-group.required > label:after, + form .form-field.required > label:after { + content: "*"; + font-weight: bold; + line-height: 0; + padding-left: 4px; + color: #428bca; } + + #region_selector { + position: absolute; + z-index: 9999; + right: 0; + top: 24px; } + + #region_selector a { + margin-left: 0; } + + #region_selector ul { + float: left; + margin-left: 5px; + padding-right: 21px; + width: 125px; } + + #region_selector ul:hover a { + display: block; } + + #region_selector li a { + padding: 3px 3px 3px 5px; + display: none; + background: #e1e1e1; + margin-top: -10px; } + + #region_selector li:first-child p { + background: #ededed url('/static/dashboard/img/drop_arrow.png?2ec1100baed3') no-repeat 106px 9px !important; + display: block; + border: 1px solid #e1e1e1; + padding: 5px; } + + iframe { + border: none; } + + .item_detail ul li label { + color: #333333; + font-weight: bold; + display: block; + margin-top: 5px; } + + .progress_bar { + height: 100%; + width: 100%; + border: 1px solid #cccccc; + background-color: #cccccc; } + + .progress_bar_fill, .progress_bar_selected { + height: 100%; + float: left; } + + .progress_bar_fill { + background-color: #555555; } + + .progress_bar_selected { + background-color: #428bca; + width: 0; } + + .progress_bar_over { + background-color: #d9534f; } + + .d3_quota_bar { + width: 20%; + margin-bottom: 8px; + margin-top: 10px; + float: left; + text-align: center; } + + .quota-dynamic { + overflow: hidden; + margin-bottom: 8px; } + + .quota_title { + color: #cccccc; + padding-bottom: 0; + margin-bottom: 8px; } + + .quota_title strong { + color: #333333; } + + .quota_title strong span { + font-weight: normal; } + + .quota_title p { + float: right; + margin-bottom: 0; } + + .quota_bar { + margin: -8px 0 8px; } + + div .flavor_table { + border: 1px solid #dddddd; + width: 100%; + margin-bottom: 14px; } + + .flavor_table .flavor_name { + white-space: nowrap; + font-weight: bold; + text-align: left; + padding: 7px 12px 7px 7px; + width: 160px; } + + #main_content .row { + margin: 10px 0 20px; } + + #main_content .row:last-child { + margin-bottom: 0; } + + .version_label { + position: relative; + text-align: right; } + + .header_rule { + margin: 0 0 10px; } + + .item_detail .detail_section { + margin-bottom: 25px; + float: left; + margin-right: 50px; } + + .has-error .help-block, .dynamic-error { + padding: 10px; } + + .dynamic-error { + background: #ffffff; + border: 1px solid #dddddd; + color: #d9534f; + margin-bottom: 0.5em; } + + label.log-length { + line-height: 28px; + margin-right: 10px; } + + .progress-success.bar { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -ms-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(top, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', + endColorstr='#57a957', GradientType=0); } + + .progress_bar_fill.progress-warning.bar { + background-color: #898989; + background-image: -moz-linear-gradient(top, #999999, #333333); + background-image: -ms-linear-gradient(top, #999999, #333333); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#999999), to(#333333)); + background-image: -webkit-linear-gradient(top, #999999, #333333); + background-image: -o-linear-gradient(top, #999999, #333333); + background-image: linear-gradient(top, #999999, #333333); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#999999', + endColorstr='#333333', GradientType=0); } + + .progress_bar_over.bar { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(top, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', + endColorstr='#c43c35', GradientType=0); } + + .split_five div.form-group input[type="text"], .split_five div.form-group select { + width: 120px; } + + .warning { + background-color: #ffffff; + border-bottom: 1px solid #d9534f; + padding: 5px 10px; } + .warning .warning-text { + text-align: center; } + .warning .warning-text h3, .warning .warning-text a { + display: inline-block; } + .warning .warning-text h3 { + vertical-align: bottom; } + +#admin_warning_detail ul { + list-style: circle; + padding-left: 20px; + margin-bottom: 10px; } + +.no_split { + margin-top: -60px; } + + .capabilities { + min-height: 200px; } + .capabilities .panel .list-group { + height: 400px; + overflow: auto; } + .capabilities .dark-stripe { + background-color: #f9f9f9; } + .capabilities .light-stripe { + background-color: white; } + .capabilities .list-group-item.level-0 > * { + padding-left: 0px; } + .capabilities .list-group-item.level-1 > * { + padding-left: 15px; } + .capabilities .list-group-item.level-2 > * { + padding-left: 30px; } + .capabilities .list-group-item .leaf { + padding-left: 10px; } + .capabilities .list-group-item span.input-group-addon { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 50%; + max-width: 140px; + text-align: right; } + .capabilities .list-group-item .label-info { + display: inline-block; + position: absolute; + z-index: 10; + top: 1px; + left: 25px; + max-width: 80%; + overflow: hidden; + text-overflow: ellipsis; } + .capabilities .list-group-item .label-danger { + display: inline-block; + position: absolute; + z-index: 10; + bottom: 1px; + left: 25px; } + +.membership { + min-height: 200px; } +.membership .btn-group { + margin-left: 0px; + padding: 3px 10px; + margin-bottom: 0px; + border: 1px solid #cccccc; + border-bottom: none; } +.membership .btn-group .active { + float: right; } +.membership a.btn-primary:hover { + background-color: #005d9d; +} +.membership .help_text { + margin-left: 5px; + margin-bottom: 15px; + width: 650px; } +.membership .members_title { + color: #555555; + font-weight: bold; + float: left; + line-height: 30px; + width: 160px; } +.membership input[type="text"]:disabled + span.glyphicon-search { + color: #cccccc; } +.membership .fake_table_header { + background-color: #ffffff; + padding: 10px; + border: 1px solid #dddddd; + border-bottom: none; + overflow: hidden; } +.membership .fake_table > ul { + padding: 0; } + .membership .fake_table > ul.no_results { + border: 1px solid #dddddd; + padding: 10px; } +.membership .fake_table ul.btn-group:hover { + background-color: #dddddd; +} + .membership .member { + text-align: left; + line-height: 32px; } + .membership .members ul.btn-group, .membership .available_members ul.btn-group { + display: block; } + .membership .members ul.btn-group.nav-pills > li > a, + .membership .available_members ul.btn-group.nav-pills > li > a { + padding: 6px 11px; } + .membership .dark_stripe { + background-color: #f9f9f9; } + .membership .light_stripe { + background-color: white; } + .membership .last_stripe { + border-bottom: 1px solid #dddddd; } + .membership .has-feedback { + display: inline-block; + float: right; + margin-bottom: 0; } + .membership .filter { + width: 130px; } + .membership .form-control-feedback { + top: 0; } + .membership .role_dropdown li { + cursor: pointer; + background: none; + float: none; + display: block; + padding: 5px 10px; + color: #000; + text-align: left; + border-radius: 0; + border: 0 none; + -webkit-box-shadow: none; + box-shadow: none; + z-index: 99999; } + .membership .role_dropdown li i { + opacity: 0; + display: inline-block; + width: 14px; + font-size: 12px; + line-height: 14px; + vertical-align: text-top; } + .membership .role_dropdown li i:before { + content: "\e013"; } + .membership .role_dropdown li:hover { + background-color: #cdcdcd; } + .membership .role_dropdown li.selected i { + opacity: 1; } + .membership .dropdown-menu.role_dropdown { + right: 0; + left: auto; } + .membership .nav .role_options { + float: right; + padding-right: 5px; } + +.add_member_btn { + display: inline; } + + #add_member { + clear: both; } + + .add_member { + float: right; + margin-top: 10px; + margin-right: 15px; } + + .dropdown_fix { + overflow: visible; } + + .loading_gif { + margin-right: 0.5em; + float: left; } + + .btn-inline { + margin-bottom: 9px; } + + .modal-body fieldset .form-field select[data-add-item-url] { + width: 275px; + margin-right: 2px; } + + #networkListSortContainer { + display: none; } + + .networklist { + padding: 6px; + background: #eee; + border: 1px solid #dddddd; + min-height: 2em; + width: auto !important; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + .networklist li { + width: 226px; + list-style-type: none; + margin: 6px auto; + padding: 3px; + background: #ffffff; + border: 1px solid #aaa; + line-height: 18px; + border-radius: 3px; + cursor: move; + padding-left: 23px; + background: #ffffff url('/static/dashboard/img/drag.png?93ec7e23f795') no-repeat 11px 50%; } + .networklist li em { + font-size: 0.5em; + line-height: 1em; + color: #999; + font-style: normal; + margin-left: 0.8em; } + .networklist li i { + margin-right: 5px; + vertical-align: middle; } + .networklist li a.btn { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + font-size: 11px; + line-height: 12px; + padding: 2px 5px 3px; + margin-right: 1px; + width: 18px; + text-align: center; + right: 5px; + vertical-align: middle; + float: right; } + .networklist li a.btn:before { + content: "+"; } + .networklist li.ui-sortable-helper { + background-color: #def; } + .networklist li.ui-state-highlight { + border: 1px dotted #cccccc; + background: #efefef; + height: 0.5em; } + .networklist li:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; } + +#selected_network { + margin-bottom: 1.5em; + counter-reset: v1 0; + background: #edf9ff; + border: 1px solid #c0d9e4; } + #selected_network li { + position: relative; } + #selected_network li a.btn:before { + content: "-"; } +#selected_network li:before { + content: "NIC:" counter(v1); + counter-increment: v1; + display: inline-block; + margin-right: 5px; + background: #555555; + color: #ffffff; + font-size: 90%; + padding: 0px 4px; + vertical-align: middle; + border-radius: 2px; + position: absolute; + left: -2em; } +#selected_network.dragging li:before { + content: "NIC:"; + background-color: rgba(102, 102, 102, 0.5); + padding-right: 10px; } +#selected_network.dragging li.ui-state-highlight:before { + content: ""; + background: transparent; } + +#topologyCanvasContainer { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: auto; + padding: 25px; + padding-left: 50px; + background: #efefef; + min-height: 400px; } +#topologyCanvasContainer div.nodata { + font-size: 150%; + text-align: center; + padding-top: 150px; + display: none; } +#topologyCanvasContainer.noinfo div.nodata { + display: block; } +#topologyCanvasContainer.noinfo #topology_canvas { + display: none; } + +.topologyNavi { + overflow: hidden; + margin: 10px 0 20px; } +.topologyNavi i { + margin-right: 3px; } +.topologyNavi .toggleView { + float: left; } +.topologyNavi .launchButtons { + float: right; + text-align: right; } + +.toggleView .btn, +.topologyNavi .launchButtons a.btn { + margin-left: 10px; + background: -moz-linear-gradient(top, #f1f3f4, #e3e8ea); + background: -ms-linear-gradient(top, #f1f3f4, #e3e8ea); + background: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f3f4), to(#e3e8ea)); + background: -webkit-linear-gradient(top, #f1f3f4, #e3e8ea); + background: -o-linear-gradient(top, #f1f3f4, #e3e8ea); + background: linear-gradient(top, #f1f3f4, #e3e8ea); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + border: 1px solid #C3CED7; + font-weight: 700; +} + +.toggleView .btn:hover, +.topologyNavi .launchButtons a.btn:hover { + background: -moz-linear-gradient(top, #F8F9FA, #F1F4F5); + background: -ms-linear-gradient(top, #F8F9FA, #F1F4F5); + background: -webkit-gradient(linear, 0 0, 0 100%, from(#F8F9FA), to(#F1F4F5)); + background: -webkit-linear-gradient(top, #F8F9FA, #F1F4F5); + background: -o-linear-gradient(top, #F8F9FA, #F1F4F5); + background: linear-gradient(top, #F8F9FA, #F1F4F5); + text-decoration: none; +} + +.topologyBalloon { + display: none; + background: #ffffff; + position: absolute; + left: 100px; + top: 20px; + z-index: 600; + border-radius: 5px; + color: #333; + min-width: 200px; + line-height: 1.2; + font-size: 11px; + -webkit-box-shadow: 0px 1px 6px #777; + box-shadow: 0px 1px 6px #777; } +.topologyBalloon.on { + display: block; } +.topologyBalloon .vnc_window { + margin-left: 10px; } +.topologyBalloon .closeTopologyBalloon { + font-size: 16px; + line-height: 1; + display: block; + position: absolute; + font-weight: bold; + right: 6px; + top: 0px; + cursor: pointer; + padding: 3px; + color: #aaa; } +.topologyBalloon .closeTopologyBalloon:hover { + color: #777; + text-decoration: none; } +.topologyBalloon .contentBody { + padding: 8px 8px 0; } +.topologyBalloon span.active:before, .topologyBalloon span.down:before { + content: ""; + width: 9px; + height: 9px; + display: inline-block; + background: #5cb85c; + margin-right: 3px; + border-radius: 10px; + vertical-align: middle; } +.topologyBalloon span.down:before { + background: #d9534f; } +.topologyBalloon .footer { + background: #efefef; + border-top: 1px solid #dddddd; + padding: 8px; + border-radius: 0px 0px 7px 7px; } + .topologyBalloon .footer .footerInner { + display: table; + width: 100%; } +.topologyBalloon .footer .cell { + display: table-cell; + padding-right: 5px; } +.topologyBalloon .footer .link { + font-size: 12px; } +.topologyBalloon .footer .delete { + padding-right: 0; + text-align: right; } +.topologyBalloon table.detailInfoTable { + margin-bottom: 5px; } +.topologyBalloon table.detailInfoTable caption { + text-align: left; + font-size: 12px; + color: #000000; + font-weight: bold; + margin-bottom: 5px; } +.topologyBalloon table.detailInfoTable th, +.topologyBalloon table.detailInfoTable td { + text-align: left; + vertical-align: middle; + padding-bottom: 3px; + background: transparent; } +.topologyBalloon table.detailInfoTable th { + color: #cccccc; + padding-right: 8px; + width: 80px; } +.topologyBalloon table.detailInfoTable th span { + vertical-align: middle; + width: 80px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: inline-block; } +.topologyBalloon table.detailInfoTable th.device { + color: #333333; + text-align: right; } +.topologyBalloon table.detailInfoTable td { + padding-right: 5px; + white-space: nowrap; } +.topologyBalloon table.detailInfoTable td.delete { + padding-right: 0; + text-align: right; } +.topologyBalloon table.detailInfoTable .btn { + line-height: 1.4; } +.topologyBalloon:before { + border-top: 7px solid transparent; + border-bottom: 7px solid transparent; + border-right: 9px solid #dddddd; + display: block; + position: absolute; + top: 30px; + left: -9px; + width: 0; + height: 0; + content: ""; } +.topologyBalloon:after { + border-top: 6px solid transparent; + border-bottom: 6px solid transparent; + border-right: 8px solid #ffffff; + display: block; + position: absolute; + top: 31px; + left: -8px; + width: 0; + height: 0; + content: ""; } +.topologyBalloon.leftPosition:before { + border-right: none; + border-left: 9px solid #dddddd; + right: -9px; + top: 30px; + left: auto; } +.topologyBalloon.leftPosition:after { + border-right: none; + border-left: 8px solid #ffffff; + right: -8px; + top: 31px; + left: auto; } + +#topologyMessages { + width: 1px; + height: 1px; + visibility: hidden; + position: absolute; + top: -100px; } + +.quota-heading { + /*font-family: anivers;*/ + font-weight: normal; + font-size: 24px; + margin-bottom: 10px; } + +.link { + width: 200px; + stroke: #999; + stroke-width: 1.5px; } + +.node { + cursor: pointer; } + +.node text { + font: 12px sans-serif; } + +#resource_container { + position: relative; } + +#stack_box { + position: absolute; + width: 300px; + top: 10px; + left: 10px; } + +#stack_box h3 { + font-size: 11pt; + line-height: 20px; } + +#stack_box p { + margin: 0; + font-size: 9pt; + line-height: 14px; } + +#stack_box a { + margin: 0; + font-size: 9pt; + line-height: 14px; } + +#stack_box img { + float: left; } + +#stack_box #stack_info { + float: left; + white-space: normal; + width: 200px; } + +#info_box { + position: absolute; + width: 300px; + top: 100px; + left: 10px; } + + #info_box h3 { + font-size: 9pt; + line-height: 20px; } + + #info_box p { + margin: 0; + font-size: 9pt; + line-height: 14px; } + + #info_box a { + margin: 0; + font-size: 9pt; + line-height: 14px; } + + #info_box .error { + color: #a02622; } + + #ruleListSortContainer { + display: none; } + + .rulelist { + padding: 6px; + background: #eee; + border: 1px solid #dddddd; + min-height: 2em; + width: auto !important; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + .rulelist li { + width: 226px; + list-style-type: none; + margin: 6px auto; + padding: 3px; + background: #ffffff; + border: 1px solid #dddddd; + line-height: 18px; + border-radius: 3px; + cursor: move; + padding-left: 23px; + background: #ffffff url('/static/dashboard/img/drag.png?93ec7e23f795') no-repeat 11px 50%; } + .rulelist li em { + font-size: 0.5em; + line-height: 1em; + color: #999; + font-style: normal; + margin-left: 0.8em; } + .rulelist li i { + margin-right: 5px; + vertical-align: middle; } + .rulelist li a.btn { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + font-size: 11px; + line-height: 12px; + padding: 2px 5px 3px; + margin-right: 1px; + width: 18px; + text-align: center; + right: 5px; + vertical-align: middle; + float: right; } + .rulelist li a.btn:before { + content: "+"; } + .rulelist li.ui-sortable-helper { + background-color: #def; } + .rulelist li.ui-state-highlight { + border: 1px dotted #dddddd; + background: #efefef; + height: 0.5em; } + .rulelist li:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; } + +#selected_rule { + margin-bottom: 1.5em; + counter-reset: v1 0; + background: #edf9ff; + border: 1px solid #dddddd; } + #selected_rule li { + position: relative; } + #selected_rule li a.btn:before { + content: "-"; } + #selected_rule li:before { + content: "rule:" counter(v1); + counter-increment: v1; + display: inline-block; + margin-right: 5px; + background: #555555; + color: #ffffff; + font-size: 90%; + padding: 0px 4px; + vertical-align: middle; + border-radius: 2px; + position: absolute; + left: -2em; } + #selected_rule.dragging li:before { + content: "rule:"; + background-color: rgba(102, 102, 102, 0.5); + padding-right: 10px; } + #selected_rule.dragging li.ui-state-highlight:before { + content: ""; + background: transparent; } + +.tablesorter thead tr th.tablesorter-header { + cursor: pointer; + background-repeat: no-repeat; + background-position: 99% center; + background-position: right 5px center; } + .tablesorter thead tr th.tablesorter-headerAsc { + background-image: url('/static/dashboard/img/up_arrow.png?4293b62aa222'); } + .tablesorter thead tr th.tablesorter-headerDesc { + background-image: url('/static/dashboard/img/drop_arrow.png?2ec1100baed3'); } + +a.link-popover { + cursor: default; } + + a:hover.link-popover { + text-decoration: none; } +.breadcrumb { + padding: 8px 15px; + margin-bottom: 18px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; } + .breadcrumb > li { + display: inline-block; } + .breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #ccc; } + .breadcrumb > .active { + color: #777; } +.pagination { + display: inline-block; + padding-left: 0; + margin: 18px 0; + border-radius: 4px; } + .pagination > li { + display: inline; } + .pagination > li > a, .pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + line-height: 1.5; + text-decoration: none; + color: #428bca; + background-color: #fff; + border: 1px solid #ddd; + margin-left: -1px; } + .pagination > li:first-child > a, .pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; } + .pagination > li:last-child > a, .pagination > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; } + .pagination > li > a:hover, .pagination > li > a:focus, + .pagination > li > span:hover, .pagination > li > span:focus { + color: #005D9D; + background-color: #eee; + border-color: #ddd; } + .pagination > .active > a, .pagination > .active > a:hover, + .pagination > .active > a:focus, .pagination > .active > span, + .pagination > .active > span:hover, .pagination > .active > span:focus { + z-index: 2; + color: #fff; + background-color: #428bca; + border-color: #428bca; + cursor: default; } + .pagination > .disabled > span, .pagination > .disabled > span:hover, + .pagination > .disabled > span:focus, .pagination > .disabled > a, + .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { + color: #777; + background-color: #fff; + border-color: #ddd; + cursor: not-allowed; } +.pagination-lg > li > a, .pagination-lg > li > span { + padding: 10px 16px; + font-size: 17px; } + .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; } +.pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { + border-bottom-right-radius: 6px; + border-top-right-radius: 6px; } +.pagination-sm > li > a, .pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; } + .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; } +.pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; } +.pager { + padding-left: 0; + margin: 18px 0; + list-style: none; + text-align: center; } + .pager li { + display: inline; } + .pager li > a, .pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; } + .pager li > a:hover, .pager li > a:focus { + text-decoration: none; + background-color: #eee; } + .pager .next > a, .pager .next > span { + float: right; } + .pager .previous > a, .pager .previous > span { + float: left; } + .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, + .pager .disabled > span { + color: #777; + background-color: #fff; + cursor: not-allowed; } +.label { + display: inline; + padding: 0.2em 0.6em 0.3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25em; } + .label:empty { + display: none; } + .btn .label { + position: relative; + top: -1px; } + +a.label:hover, a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; } + +.label-default { + background-color: #777; } + + .label-primary { + background-color: #428bca; } + + .label-success { + background-color: #5cb85c; } + + .label-info { + background-color: #5bc0de; } + + .label-warning { + background-color: #f0ad4e; } + + .label-danger { + background-color: #d9534f; } +.label-default[href]:hover, .label-default[href]:focus { + background-color: #5e5e5e; } +.label-primary[href]:hover, .label-primary[href]:focus { + background-color: #3071a9; } +.label-success[href]:hover, .label-success[href]:focus { + background-color: #449d44; } +.label-info[href]:hover, .label-info[href]:focus { + background-color: #31b0d5; } +.label-warning[href]:hover, .label-warning[href]:focus { + background-color: #ec971f; } +.label-danger[href]:hover, .label-danger[href]:focus { + background-color: #c9302c; } +.jumbotron { + padding: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; } + .jumbotron h1, .jumbotron .h1 { + color: inherit; } + .jumbotron p { + margin-bottom: 15px; + font-size: 20px; + font-weight: 200; } + .jumbotron > hr { + border-top-color: #d5d5d5; } + .container .jumbotron { + border-radius: 6px; } + .jumbotron .container { + max-width: 100%; } + @media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; } + .container .jumbotron { + padding-left: 60px; + padding-right: 60px; } + .jumbotron h1, .jumbotron .h1 { + font-size: 58.5px; } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 18px; + line-height: 1.5; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; } + .thumbnail > img, .thumbnail a > img { + display: block; + width: 100% \9; + max-width: 100%; + height: auto; + margin-left: auto; + margin-right: auto; } + .thumbnail .caption { + padding: 9px; + color: #333; } + +a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { + border-color: #428bca; } +.alert { + padding: 15px; + margin-bottom: 18px; + border: 1px solid transparent; + border-radius: 4px; } + .alert h4 { + margin-top: 0; + color: inherit; } + .alert .alert-link { + font-weight: bold; } + .alert > p, .alert > ul { + margin-bottom: 0; } + .alert > p + p { + margin-top: 5px; } + +.alert-dismissable, .alert-dismissible { + padding-right: 35px; } + .alert-dismissable .close, .alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; } + +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #3c763d; } + + .alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #31708f; } + + .alert-warning { + background-color: #fcf8e3; + border-color: #faebcc; + color: #8a6d3b; } + + .alert-danger { + background-color: #f2dede; + border-color: #ebccd1; + color: #a94442; } +.alert-success hr { + border-top-color: #c9e2b3; } + .alert-success .alert-link { + color: #2b542c; } + .alert-info hr { + border-top-color: #a6e1ec; } + .alert-info .alert-link { + color: #245269; } + .alert-warning hr { + border-top-color: #f7e1b5; } + .alert-warning .alert-link { + color: #66512c; } + .alert-danger hr { + border-top-color: #e4b9c0; } + .alert-danger .alert-link { + color: #843534; } +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; } + to { + background-position: 0 0; } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; } + to { + background-position: 0 0; } +} + +.progress { + overflow: hidden; + height: 18px; + margin-bottom: 18px; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } + + .progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 18px; + color: #fff; + text-align: center; + background-color: #428bca; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; } + + .progress-striped .progress-bar, .progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); + background-size: 40px 40px; } + + .progress.active .progress-bar, .progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; } + + .progress-bar[aria-valuenow="1"], .progress-bar[aria-valuenow="2"] { + min-width: 30px; } + .progress-bar[aria-valuenow="0"] { + color: #777; + min-width: 30px; + background-color: transparent; + background-image: none; + box-shadow: none; } + +.progress-bar-success { + background-color: #5cb85c; } + + .progress-bar-info { + background-color: #5bc0de; } + + .progress-bar-warning { + background-color: #f0ad4e; } + + .progress-bar-danger { + background-color: #d9534f; } +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); } + .progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); } + .progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); } + .progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, + transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, + transparent 75%, transparent); } +.media, .media-body { + overflow: hidden; + zoom: 1; } + + .media, .media .media { + margin-top: 15px; } + + .media:first-child { + margin-top: 0; } + + .media-object { + display: block; } + + .media-heading { + margin: 0 0 5px; } + + .media > .pull-left { + margin-right: 10px; } + .media > .pull-right { + margin-left: 10px; } + +.media-list { + padding-left: 0; + list-style: none; } +.list-group { + margin-bottom: 20px; + padding-left: 0; } + + .list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; } + .list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; } + .list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; } + .list-group-item > .badge { + float: right; } + .list-group-item > .badge + .badge { + margin-right: 5px; } + +a.list-group-item { + color: #555; } + a.list-group-item .list-group-item-heading { + color: #333; } + a.list-group-item:hover, a.list-group-item:focus { + text-decoration: none; + color: #555; + background-color: #f5f5f5; } + +.list-group-item.disabled, .list-group-item.disabled:hover, +.list-group-item.disabled:focus { + background-color: #eee; + color: #777; } + .list-group-item.disabled .list-group-item-heading, + .list-group-item.disabled:hover .list-group-item-heading, + .list-group-item.disabled:focus .list-group-item-heading { + color: inherit; } + .list-group-item.disabled .list-group-item-text, + .list-group-item.disabled:hover .list-group-item-text, + .list-group-item.disabled:focus .list-group-item-text { + color: #777; } +.list-group-item.active, .list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #428bca; + border-color: #428bca; } + .list-group-item.active .list-group-item-heading, + .list-group-item.active .list-group-item-heading > small, + .list-group-item.active .list-group-item-heading > .small, + .list-group-item.active:hover .list-group-item-heading, + .list-group-item.active:hover .list-group-item-heading > small, + .list-group-item.active:hover .list-group-item-heading > .small, + .list-group-item.active:focus .list-group-item-heading, + .list-group-item.active:focus .list-group-item-heading > small, + .list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; } + .list-group-item.active .list-group-item-text, + .list-group-item.active:hover .list-group-item-text, + .list-group-item.active:focus .list-group-item-text { + color: #e1edf7; } + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; } + + .list-group-item-text { + margin-bottom: 0; + line-height: 1.3; } +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; } + + a.list-group-item-success { + color: #3c763d; } + a.list-group-item-success .list-group-item-heading { + color: inherit; } + a.list-group-item-success:hover, a.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; } + a.list-group-item-success.active, a.list-group-item-success.active:hover, + a.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; } + +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; } + + a.list-group-item-info { + color: #31708f; } + a.list-group-item-info .list-group-item-heading { + color: inherit; } + a.list-group-item-info:hover, a.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; } + a.list-group-item-info.active, a.list-group-item-info.active:hover, + a.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; } + +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; } + + a.list-group-item-warning { + color: #8a6d3b; } + a.list-group-item-warning .list-group-item-heading { + color: inherit; } + a.list-group-item-warning:hover, a.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; } + a.list-group-item-warning.active, a.list-group-item-warning.active:hover, + a.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; } + +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; } + + a.list-group-item-danger { + color: #a94442; } + a.list-group-item-danger .list-group-item-heading { + color: inherit; } + a.list-group-item-danger:hover, a.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; } + a.list-group-item-danger.active, a.list-group-item-danger.active:hover, + a.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; } +.panel { + margin-bottom: 18px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } + + .panel-body { + padding: 15px; } + + .panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; } + .panel-heading > .dropdown .dropdown-toggle { + color: inherit; } + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 15px; + color: inherit; } + .panel-title > a { + color: inherit; } + +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + + .panel > .list-group { + margin-bottom: 0; } + .panel > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; } + .panel > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: 3px; + border-top-left-radius: 3px; } + .panel > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; } + +.list-group + .panel-footer { + border-top-width: 0; } + + .panel > .table, .panel > .table-responsive > .table, + .panel > .panel-collapse > .table { + margin-bottom: 0; } + .panel > .table:first-child, + .panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 3px; } + .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, + .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, + .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, + .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; } + .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, + .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, + .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, + .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; } + .panel > .table:last-child, + .panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, + .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; } + .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, + .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; } + .panel > .panel-body + .table, .panel > .panel-body + .table-responsive { + border-top: 1px solid #ddd; } + .panel > .table > tbody:first-child > tr:first-child th, + .panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; } + .panel > .table-bordered, .panel > .table-responsive > .table-bordered { + border: 0; } + .panel > .table-bordered > thead > tr > th:first-child, + .panel > .table-bordered > thead > tr > td:first-child, + .panel > .table-bordered > tbody > tr > th:first-child, + .panel > .table-bordered > tbody > tr > td:first-child, + .panel > .table-bordered > tfoot > tr > th:first-child, + .panel > .table-bordered > tfoot > tr > td:first-child, + .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, + .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, + .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, + .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; } + .panel > .table-bordered > thead > tr > th:last-child, + .panel > .table-bordered > thead > tr > td:last-child, + .panel > .table-bordered > tbody > tr > th:last-child, + .panel > .table-bordered > tbody > tr > td:last-child, + .panel > .table-bordered > tfoot > tr > th:last-child, + .panel > .table-bordered > tfoot > tr > td:last-child, + .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, + .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, + .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, + .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; } + .panel > .table-bordered > thead > tr:first-child > td, + .panel > .table-bordered > thead > tr:first-child > th, + .panel > .table-bordered > tbody > tr:first-child > td, + .panel > .table-bordered > tbody > tr:first-child > th, + .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, + .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, + .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, + .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; } + .panel > .table-bordered > tbody > tr:last-child > td, + .panel > .table-bordered > tbody > tr:last-child > th, + .panel > .table-bordered > tfoot > tr:last-child > td, + .panel > .table-bordered > tfoot > tr:last-child > th, + .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, + .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, + .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, + .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; } + .panel > .table-responsive { + border: 0; + margin-bottom: 0; } + +.panel-group { + margin-bottom: 18px; } + .panel-group .panel { + margin-bottom: 0; + border-radius: 4px; } + .panel-group .panel + .panel { + margin-top: 5px; } + .panel-group .panel-heading { + border-bottom: 0; } + .panel-group .panel-heading + .panel-collapse > .panel-body { + border-top: 1px solid #ddd; } + .panel-group .panel-footer { + border-top: 0; } + .panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; } + +.panel-default { + border-color: #ddd; } + + .panel-primary { + border-color: #428bca; } + + .panel-success { + border-color: #d6e9c6; } + + .panel-info { + border-color: #bce8f1; } + + .panel-warning { + border-color: #faebcc; } + + .panel-danger { + border-color: #ebccd1; } +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; } + .panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; } + .panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; } +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; } +.panel-primary > .panel-heading { + color: #fff; + background-color: #428bca; + border-color: #428bca; } + .panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #428bca; } + .panel-primary > .panel-heading .badge { + color: #428bca; + background-color: #fff; } +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #428bca; } +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; } + .panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; } + .panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; } +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; } +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; } + .panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; } + .panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; } +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; } +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; } + .panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; } + .panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; } +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; } +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; } + .panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; } + .panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; } +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; } +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; } + .embed-responsive .embed-responsive-item, .embed-responsive iframe, + .embed-responsive embed, .embed-responsive object { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; } + .embed-responsive.embed-responsive-16by9 { + padding-bottom: 56.25%; } + .embed-responsive.embed-responsive-4by3 { + padding-bottom: 75%; } +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } + .well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); } + +.well-lg { + padding: 24px; + border-radius: 6px; } + + .well-sm { + padding: 9px; + border-radius: 3px; } +.close { + float: right; + font-size: 19.5px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: 0.2; + filter: alpha(opacity=20); } + .close:hover, .close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); } + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; } +.modal-open { + overflow: hidden; } + + .modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; } + .modal.fade .modal-dialog { + -webkit-transform: translate3d(0, -25%, 0); + transform: translate3d(0, -25%, 0); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; } + .modal.in .modal-dialog { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; } + + .modal-dialog { + position: relative; + width: auto; + margin: 10px; } + + .modal-content { + position: relative; + background-color: #fff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: 0; } + + .modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; } + .modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); } + .modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); } + +.modal-header { + /*padding: 15px; + min-height: 16.42857px; */ + height: 39px; + padding-top: 0px; + padding: 0px 0px 15px 15px;; +} +.modal-header .close { + margin-top: -2px; + margin-right: 15px; +} +.modal-title { + margin: 0; + line-height: 1.5; } +.modal-body { + position: relative; + padding: 15px; } +.modal-footer { + padding: 15px; + text-align: right; + background: #f5f5f5; + border-top: 1px solid #e5e5e5; } +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; } +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; } +.modal-footer .btn-block + .btn-block { + margin-left: 0; } +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; } + + @media (min-width: 768px) { + .modal-dialog { + width: 732px; + margin: 30px auto; } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } + .modal-sm { + width: 300px; } +} + +@media (min-width: 992px) { + .modal-lg { + width: 900px; } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + visibility: visible; + font-size: 12px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); } + .tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); } + .tooltip.top { + margin-top: -3px; + padding: 5px 0; } + .tooltip.right { + margin-left: 3px; + padding: 0 5px; } + .tooltip.bottom { + margin-top: 3px; + padding: 5px 0; } + .tooltip.left { + margin-left: -3px; + padding: 0 5px; } + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #000; + border-radius: 4px; } + + .tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } + + .tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } + .tooltip.top-left .tooltip-arrow { + bottom: 0; + left: 5px; + border-width: 5px 5px 0; + border-top-color: #000; } + .tooltip.top-right .tooltip-arrow { + bottom: 0; + right: 5px; + border-width: 5px 5px 0; + border-top-color: #000; } + .tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; } + .tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; } + .tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + .tooltip.bottom-left .tooltip-arrow { + top: 0; + left: 5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + .tooltip.bottom-right .tooltip-arrow { + top: 0; + right: 5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; } + .popover.top { + margin-top: -10px; } + .popover.right { + margin-left: 10px; } + .popover.bottom { + margin-top: 10px; } + .popover.left { + margin-left: -10px; } + +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 13px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; } + + .popover-content { + padding: 9px 14px; } + + .popover > .arrow, .popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } + +.popover > .arrow { + border-width: 11px; } + + .popover > .arrow:after { + border-width: 10px; + content: ""; } + + .popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; } + .popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #fff; } + .popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); } + .popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #fff; } + .popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; } + .popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #fff; } + .popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); } + .popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #fff; + bottom: -10px; } +.carousel { + position: relative; } + + .carousel-inner { + position: relative; + overflow: hidden; + width: 100%; } + .carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; } + .carousel-inner > .item > img, .carousel-inner > .item > a > img { + display: block; + width: 100% \9; + max-width: 100%; + height: auto; + line-height: 1; } + .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { + display: block; } + .carousel-inner > .active { + left: 0; } + .carousel-inner > .next, .carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; } + .carousel-inner > .next { + left: 100%; } + .carousel-inner > .prev { + left: -100%; } + .carousel-inner > .next.left, .carousel-inner > .prev.right { + left: 0; } + .carousel-inner > .active.left { + left: -100%; } + .carousel-inner > .active.right { + left: 100%; } + +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } + .carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.0001)); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', + endColorstr='#00000000', GradientType=1); } + .carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001), rgba(0, 0, 0, 0.5)); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', + endColorstr='#80000000', GradientType=1); } + .carousel-control:hover, .carousel-control:focus { + outline: 0; + color: #fff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); } + .carousel-control .icon-prev, .carousel-control .icon-next, + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; } + .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; } + .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; } + .carousel-control .icon-prev, .carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + font-family: serif; } + .carousel-control .icon-prev:before { + content: '\2039'; } + .carousel-control .icon-next:before { + content: '\203a'; } + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; } + .carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #fff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: transparent; } + .carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #fff; } + +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } + .carousel-caption .btn { + text-shadow: none; } + +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; } + .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { + margin-left: -15px; } + .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { + margin-right: -15px; } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; } + .carousel-indicators { + bottom: 20px; } +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; } + + .pull-right { + float: right !important; } + + .pull-left { + float: left !important; } + + .hide { + display: none !important; } + + .show { + display: block !important; } + + .invisible { + visibility: hidden; } + + .text-hide { + font: 0 / 0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; } + + .hidden { + display: none !important; + visibility: hidden !important; } + + .affix { + position: fixed; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } +@-ms-viewport { + width: device-width; } + + .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, + .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, + .visible-md-inline, .visible-md-inline-block, .visible-lg-block, + .visible-lg-inline, .visible-lg-inline-block { + display: none !important; } + + @media (max-width: 767px) { + .visible-xs-block { + display: block !important; } +} + +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; } +} + +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; } +} + +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; } +} + +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; } +} + +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; } +} + +.visible-print-block { + display: none !important; } + @media print { + .visible-print-block { + display: block !important; } +} + +.visible-print-inline { + display: none !important; } + @media print { + .visible-print-inline { + display: inline !important; } +} + +.visible-print-inline-block { + display: none !important; } + @media print { + .visible-print-inline-block { + display: inline-block !important; } +} +.visible-xs, .visible-sm, .visible-md, .visible-lg { + display: none !important; } + @media (max-width: 767px) { + .visible-xs { + display: block !important; } + table.visible-xs { + display: table; } + tr.visible-xs { + display: table-row !important; } + th.visible-xs, td.visible-xs { + display: table-cell !important; } +} + @media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; } + table.visible-sm { + display: table; } + tr.visible-sm { + display: table-row !important; } + th.visible-sm, td.visible-sm { + display: table-cell !important; } +} + @media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; } + table.visible-md { + display: table; } + tr.visible-md { + display: table-row !important; } + th.visible-md, td.visible-md { + display: table-cell !important; } +} + @media (min-width: 1200px) { + .visible-lg { + display: block !important; } + table.visible-lg { + display: table; } + tr.visible-lg { + display: table-row !important; } + th.visible-lg, td.visible-lg { + display: table-cell !important; } +} + @media (max-width: 767px) { + .hidden-xs { + display: none !important; } +} + @media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; } +} + @media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; } +} + @media (min-width: 1200px) { + .hidden-lg { + display: none !important; } +} + +.visible-print { + display: none !important; } + @media print { + .visible-print { + display: block !important; } + table.visible-print { + display: table; } + tr.visible-print { + display: table-row !important; } + th.visible-print, td.visible-print { + display: table-cell !important; } +} +@media print { + .hidden-print { + display: none !important; } +} +.datepicker { + padding: 4px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + direction: ltr; } + +.datepicker-inline { + width: 220px; } + +.datepicker.datepicker-rtl { + direction: rtl; } + +.datepicker.datepicker-rtl table tr td span { + float: right; } + +.datepicker-dropdown { + top: 0; + left: 0; } + +.datepicker-dropdown:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-top: 0; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; } + + .datepicker-dropdown:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-top: 0; + position: absolute; } + + .datepicker-dropdown.datepicker-orient-left:before { + left: 6px; } + + .datepicker-dropdown.datepicker-orient-left:after { + left: 7px; } + + .datepicker-dropdown.datepicker-orient-right:before { + right: 6px; } + + .datepicker-dropdown.datepicker-orient-right:after { + right: 7px; } + + .datepicker-dropdown.datepicker-orient-top:before { + top: -7px; } + + .datepicker-dropdown.datepicker-orient-top:after { + top: -6px; } + + .datepicker-dropdown.datepicker-orient-bottom:before { + bottom: -7px; + border-bottom: 0; + border-top: 7px solid #999; } + + .datepicker-dropdown.datepicker-orient-bottom:after { + bottom: -6px; + border-bottom: 0; + border-top: 6px solid #ffffff; } + + .datepicker > div { + display: none; } + + .datepicker.days div.datepicker-days { + display: block; } + + .datepicker.months div.datepicker-months { + display: block; } + + .datepicker.years div.datepicker-years { + display: block; } + + .datepicker table { + margin: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + + .datepicker td, .datepicker th { + text-align: center; + width: 20px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + border: none; } + + .table-striped .datepicker table tr td, .table-striped .datepicker table tr th { + background-color: transparent; } + + .datepicker table tr td.day:hover, .datepicker table tr td.day.focused { + background: #eeeeee; + cursor: pointer; } + + .datepicker table tr td.old, .datepicker table tr td.new { + color: #999999; } + + .datepicker table tr td.disabled, .datepicker table tr td.disabled:hover { + background: none; + color: #999999; + cursor: default; } + + .datepicker table tr td.today, .datepicker table tr td.today:hover, + .datepicker table tr td.today.disabled, + .datepicker table tr td.today.disabled:hover { + background-color: #fde19a; + background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a)); + background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -o-linear-gradient(top, #fdd49a, #fdf59a); + background-image: linear-gradient(top, #fdd49a, #fdf59a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', + endColorstr='#fdf59a', GradientType=0); + border-color: #fdf59a #fdf59a #fbed50; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #000; } + + .datepicker table tr td.today:hover, .datepicker table tr td.today:hover:hover, + .datepicker table tr td.today.disabled:hover, + .datepicker table tr td.today.disabled:hover:hover, + .datepicker table tr td.today:active, .datepicker table tr td.today:hover:active, + .datepicker table tr td.today.disabled:active, + .datepicker table tr td.today.disabled:hover:active, + .datepicker table tr td.today.active, .datepicker table tr td.today:hover.active, + .datepicker table tr td.today.disabled.active, + .datepicker table tr td.today.disabled:hover.active, + .datepicker table tr td.today.disabled, + .datepicker table tr td.today:hover.disabled, + .datepicker table tr td.today.disabled.disabled, + .datepicker table tr td.today.disabled:hover.disabled, + .datepicker table tr td.today[disabled], + .datepicker table tr td.today:hover[disabled], + .datepicker table tr td.today.disabled[disabled], + .datepicker table tr td.today.disabled:hover[disabled] { + background-color: #fdf59a; } + + .datepicker table tr td.today:active, .datepicker table tr td.today:hover:active, + .datepicker table tr td.today.disabled:active, + .datepicker table tr td.today.disabled:hover:active, + .datepicker table tr td.today.active, .datepicker table tr td.today:hover.active, + .datepicker table tr td.today.disabled.active, + .datepicker table tr td.today.disabled:hover.active { + background-color: #fbf069 \9; } + + .datepicker table tr td.today:hover:hover { + color: #000; } + + .datepicker table tr td.today.active:hover { + color: #fff; } + + .datepicker table tr td.range, .datepicker table tr td.range:hover, + .datepicker table tr td.range.disabled, + .datepicker table tr td.range.disabled:hover { + background: #eeeeee; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; } + + .datepicker table tr td.range.today, .datepicker table tr td.range.today:hover, + .datepicker table tr td.range.today.disabled, + .datepicker table tr td.range.today.disabled:hover { + background-color: #f3d17a; + background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a)); + background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -o-linear-gradient(top, #f3c17a, #f3e97a); + background-image: linear-gradient(top, #f3c17a, #f3e97a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', + endColorstr='#f3e97a', GradientType=0); + border-color: #f3e97a #f3e97a #edde34; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; } + + .datepicker table tr td.range.today:hover, + .datepicker table tr td.range.today:hover:hover, + .datepicker table tr td.range.today.disabled:hover, + .datepicker table tr td.range.today.disabled:hover:hover, + .datepicker table tr td.range.today:active, + .datepicker table tr td.range.today:hover:active, + .datepicker table tr td.range.today.disabled:active, + .datepicker table tr td.range.today.disabled:hover:active, + .datepicker table tr td.range.today.active, + .datepicker table tr td.range.today:hover.active, + .datepicker table tr td.range.today.disabled.active, + .datepicker table tr td.range.today.disabled:hover.active, + .datepicker table tr td.range.today.disabled, + .datepicker table tr td.range.today:hover.disabled, + .datepicker table tr td.range.today.disabled.disabled, + .datepicker table tr td.range.today.disabled:hover.disabled, + .datepicker table tr td.range.today[disabled], + .datepicker table tr td.range.today:hover[disabled], + .datepicker table tr td.range.today.disabled[disabled], + .datepicker table tr td.range.today.disabled:hover[disabled] { + background-color: #f3e97a; } + + .datepicker table tr td.range.today:active, + .datepicker table tr td.range.today:hover:active, + .datepicker table tr td.range.today.disabled:active, + .datepicker table tr td.range.today.disabled:hover:active, + .datepicker table tr td.range.today.active, + .datepicker table tr td.range.today:hover.active, + .datepicker table tr td.range.today.disabled.active, + .datepicker table tr td.range.today.disabled:hover.active { + background-color: #efe24b \9; } + + .datepicker table tr td.selected, .datepicker table tr td.selected:hover, + .datepicker table tr td.selected.disabled, + .datepicker table tr td.selected.disabled:hover { + background-color: #9e9e9e; + background-image: -moz-linear-gradient(top, #b3b3b3, #808080); + background-image: -ms-linear-gradient(top, #b3b3b3, #808080); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080)); + background-image: -webkit-linear-gradient(top, #b3b3b3, #808080); + background-image: -o-linear-gradient(top, #b3b3b3, #808080); + background-image: linear-gradient(top, #b3b3b3, #808080); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', + endColorstr='#808080', GradientType=0); + border-color: #808080 #808080 #595959; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } + + .datepicker table tr td.selected:hover, + .datepicker table tr td.selected:hover:hover, + .datepicker table tr td.selected.disabled:hover, + .datepicker table tr td.selected.disabled:hover:hover, + .datepicker table tr td.selected:active, + .datepicker table tr td.selected:hover:active, + .datepicker table tr td.selected.disabled:active, + .datepicker table tr td.selected.disabled:hover:active, + .datepicker table tr td.selected.active, + .datepicker table tr td.selected:hover.active, + .datepicker table tr td.selected.disabled.active, + .datepicker table tr td.selected.disabled:hover.active, + .datepicker table tr td.selected.disabled, + .datepicker table tr td.selected:hover.disabled, + .datepicker table tr td.selected.disabled.disabled, + .datepicker table tr td.selected.disabled:hover.disabled, + .datepicker table tr td.selected[disabled], + .datepicker table tr td.selected:hover[disabled], + .datepicker table tr td.selected.disabled[disabled], + .datepicker table tr td.selected.disabled:hover[disabled] { + background-color: #808080; } + + .datepicker table tr td.selected:active, + .datepicker table tr td.selected:hover:active, + .datepicker table tr td.selected.disabled:active, + .datepicker table tr td.selected.disabled:hover:active, + .datepicker table tr td.selected.active, + .datepicker table tr td.selected:hover.active, + .datepicker table tr td.selected.disabled.active, + .datepicker table tr td.selected.disabled:hover.active { + background-color: #666666 \9; } + + .datepicker table tr td.active, .datepicker table tr td.active:hover, + .datepicker table tr td.active.disabled, + .datepicker table tr td.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', + endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } + + .datepicker table tr td.active:hover, .datepicker table tr td.active:hover:hover, + .datepicker table tr td.active.disabled:hover, + .datepicker table tr td.active.disabled:hover:hover, + .datepicker table tr td.active:active, .datepicker table tr td.active:hover:active, + .datepicker table tr td.active.disabled:active, + .datepicker table tr td.active.disabled:hover:active, + .datepicker table tr td.active.active, .datepicker table tr td.active:hover.active, + .datepicker table tr td.active.disabled.active, + .datepicker table tr td.active.disabled:hover.active, + .datepicker table tr td.active.disabled, + .datepicker table tr td.active:hover.disabled, + .datepicker table tr td.active.disabled.disabled, + .datepicker table tr td.active.disabled:hover.disabled, + .datepicker table tr td.active[disabled], + .datepicker table tr td.active:hover[disabled], + .datepicker table tr td.active.disabled[disabled], + .datepicker table tr td.active.disabled:hover[disabled] { + background-color: #0044cc; } + + .datepicker table tr td.active:active, .datepicker table tr td.active:hover:active, + .datepicker table tr td.active.disabled:active, + .datepicker table tr td.active.disabled:hover:active, + .datepicker table tr td.active.active, .datepicker table tr td.active:hover.active, + .datepicker table tr td.active.disabled.active, + .datepicker table tr td.active.disabled:hover.active { + background-color: #003399 \9; } + + .datepicker table tr td span { + display: block; + width: 23%; + height: 54px; + line-height: 54px; + float: left; + margin: 1%; + cursor: pointer; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; } + + .datepicker table tr td span:hover { + background: #eeeeee; } + + .datepicker table tr td span.disabled, .datepicker table tr td span.disabled:hover { + background: none; + color: #999999; + cursor: default; } + + .datepicker table tr td span.active, .datepicker table tr td span.active:hover, + .datepicker table tr td span.active.disabled, + .datepicker table tr td span.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', + endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } + + .datepicker table tr td span.active:hover, + .datepicker table tr td span.active:hover:hover, + .datepicker table tr td span.active.disabled:hover, + .datepicker table tr td span.active.disabled:hover:hover, + .datepicker table tr td span.active:active, + .datepicker table tr td span.active:hover:active, + .datepicker table tr td span.active.disabled:active, + .datepicker table tr td span.active.disabled:hover:active, + .datepicker table tr td span.active.active, + .datepicker table tr td span.active:hover.active, + .datepicker table tr td span.active.disabled.active, + .datepicker table tr td span.active.disabled:hover.active, + .datepicker table tr td span.active.disabled, + .datepicker table tr td span.active:hover.disabled, + .datepicker table tr td span.active.disabled.disabled, + .datepicker table tr td span.active.disabled:hover.disabled, + .datepicker table tr td span.active[disabled], + .datepicker table tr td span.active:hover[disabled], + .datepicker table tr td span.active.disabled[disabled], + .datepicker table tr td span.active.disabled:hover[disabled] { + background-color: #0044cc; } + + .datepicker table tr td span.active:active, + .datepicker table tr td span.active:hover:active, + .datepicker table tr td span.active.disabled:active, + .datepicker table tr td span.active.disabled:hover:active, + .datepicker table tr td span.active.active, + .datepicker table tr td span.active:hover.active, + .datepicker table tr td span.active.disabled.active, + .datepicker table tr td span.active.disabled:hover.active { + background-color: #003399 \9; } + + .datepicker table tr td span.old, .datepicker table tr td span.new { + color: #999999; } + + .datepicker th.datepicker-switch { + width: 145px; } + + .datepicker thead tr:first-child th, .datepicker tfoot tr th { + cursor: pointer; } + + .datepicker thead tr:first-child th:hover, .datepicker tfoot tr th:hover { + background: #eeeeee; } + + .datepicker .cw { + font-size: 10px; + width: 12px; + padding: 0 2px 0 5px; + vertical-align: middle; } + + .datepicker thead tr:first-child th.cw { + cursor: default; + background-color: transparent; } + + .input-append.date .add-on i, .input-prepend.date .add-on i { + cursor: pointer; + width: 16px; + height: 16px; } + + .input-daterange input { + text-align: center; } + + .input-daterange input:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; } + + .input-daterange input:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; } + + .input-daterange .add-on { + display: inline-block; + width: auto; + min-width: 16px; + height: 20px; + padding: 4px 5px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + vertical-align: middle; + background-color: #eeeeee; + border: 1px solid #ccc; + margin-left: -5px; + margin-right: -5px; } + + .datepicker.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + float: left; + display: none; + min-width: 160px; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + *border-right-width: 2px; + *border-bottom-width: 2px; + color: #333333; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 20px; } + + .datepicker.dropdown-menu th, .datepicker.datepicker-inline th, + .datepicker.dropdown-menu td, .datepicker.datepicker-inline td { + padding: 4px 5px; } +.nav_accordion { + background-color: #ebeced; + color: #252525; + margin: 0px; +} +.nav_accordion dt, .nav_accordion dd { + padding-left: 13px; + margin: 0px; + line-height: 39px; + width: 235px; +} +.nav_accordion dt h4, .nav_accordion dd h4 { + border: 1px solid #c4ced8; + border-bottom: 0; + background-color: #ebeced; + background-repeat: no-repeat; + background-position: 96% center; + background-image: url('/static/dashboard/img/right_droparrow.png'); + padding-left: 28px; + line-height: 39px; + width: 235px; + margin: 0px; + color: #252525; + text-rendering: optimizelegibility; + cursor: pointer; } +.nav_accordion dt h4 div, .nav_accordion dd h4 div { + color: #6e6e6e; + font-size: 13px; + display: block; + outline: none; + overflow: hidden; + text-overflow: ellipsis; + max-width: 177px; } +.nav_accordion dt h4.active, .nav_accordion dd h4.active { + border-bottom: 1px solid #c4ced8; + background: url('/static/dashboard/img/drop_arrow.png') no-repeat #ebeced; + background-position: 96% center; +} +.nav_accordion dt a, .nav_accordion dd a { + color: #6e6e6e; + font-size: 16px; + margin: 0px; + padding: 0; + display: block; + font-weight: bold; + outline: none; + text-decoration: none; } +.nav_accordion dt ul, .nav_accordion dd ul { + list-style: none outside none; + margin: 0px; + padding: 0px; + width: 235px; +} +.nav_accordion dt ul li, .nav_accordion dd ul li { + vertical-align: middle; +} +nav_accordion dt:last-of-type ul li:last-of-type, +.nav_accordion dd:last-of-type ul li:last-of-type { + border-bottom: 1px solid #c4ced8; + border-top: 1px solid #c4ced8; +} + +nav_accordion dt:last-of-type ul li:last-of-type a.active, +.nav_accordion dd:last-of-type ul li:last-of-type a.active { + border-top: none; +} +nav_accordion dt:last-of-type ul li:first-of-type a.active, +.nav_accordion dd:last-of-type ul li:first-of-type a.active { + border-bottom: none; +} +.nav_accordion dt li a, .nav_accordion dd li a { + height: 39px; + line-height: 39px; + vertical-align: middle; + padding-left: 44px; + display: block; + line-height: 18px; + font-weight: normal; + font-size: 13px; + padding-top: 10px; + color: #145c9e; +} +.nav_accordion dt li a.active, .nav_accordion dd li a.active { + background: white; + border-top: 1px solid #c4ced8; + border-bottom: 1px solid #c4ced8; + padding-left: 44px; + width: 235px; + font-weight: 600; +} +.nav_accordion dt li:first-child a.active, .nav_accordion dd li:first-child a.active { + border-top: none; +} +.nav_accordion dt li:last-child a.active, .nav_accordion dd li:last-child a.active { + border-bottom: none; +} + +.nav_accordion dt li a:last-child, .nav_accordion dd li a:last-child { + /*margin-bottom: 8px; */ +} +.nav_accordion dd { + padding: 0px; + font-size: 13px; +} +.nav_accordion dt { + border-top: 1px solid #c4ced8; + border-right: 1px solid #c4ced8; + background: url('/static/dashboard/img/right_droparrow.png') no-repeat #ebeced; + background-position: 96% center; + padding-left: 13px; + width: 235px; + cursor: pointer; +} + +.nav_accordion dt:last-of-type { + border-bottom: 1px solid #c4ced8; +} +.nav_accordion dt div { + color: #6e6e6e; + font-size: 13px; + padding: 0; + outline: none; + overflow: hidden; + text-overflow: ellipsis; + max-width: 201px; } +.nav_accordion dt.active { + background-image: url('/static/dashboard/img/drop_arrow.png'); } +.nav_accordion dt:first-child { + border-top: 0; } +.nav_accordion dt a { + text-decoration: none; } +#browser_wrapper { + width: 100%; + min-width: 1360px; + background-color: #ffffff; + border: none; + border-radius: 4px; } +#browser_wrapper .tfoot { + clear: both; + padding: 8px; + border-bottom: 1px solid #d5dfe6; + border-top: 1px solid #eeeeee; + background-color: #f9f9f9; + font-size: 11px; + line-height: 14px; } +#browser_wrapper .tfoot span { + display: inline-block; } +#browser_wrapper .tfoot span.navigation_table_count { + width: 40%; } +#browser_wrapper form, #browser_wrapper table { + margin-bottom: 0; } +#browser_wrapper .navigation_wrapper, #browser_wrapper .content_wrapper { + position: relative; + float: left; } +#browser_wrapper div.navigation_wrapper { + z-index: 10; + width: 40%; } +#browser_wrapper div.navigation_wrapper div.table_wrapper, +#browser_wrapper div.navigation_wrapper thead th.table_header { + border-right: 0 none; + border-top-right-radius: 0; } +#browser_wrapper div.navigation_wrapper td:first-child { + border-left: 0 none; } +#browser_wrapper div.navigation_wrapper td.breadcrumb_td { + padding-right: 0; + max-width: 200px; } +#browser_wrapper div.navigation_wrapper tr.current_selected td { + background-color: #bfd4e5; } +#browser_wrapper div.navigation_wrapper tfoot td { + border-right: 0 none; + border-bottom-right-radius: 0; } +#browser_wrapper div.navigation_wrapper ul.breadcrumb { + padding-right: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + white-space: nowrap; } +#browser_wrapper div.navigation_wrapper tbody td { + border: 1px solid #eeeeee; + background-color: #ffffff; } +#browser_wrapper div.navigation_wrapper tbody td.anchor { + /*border-left: 1px solid #d5dfe6;*/ + word-wrap: break-word; + white-space: normal; + max-width: 145px; } +#browser_wrapper div.content_wrapper { + width: 60%; } +#browser_wrapper div.content_wrapper div.table_wrapper, +#browser_wrapper div.content_wrapper thead th.table_header { + border-left: 0 none; + border-top-left-radius: 0; } +#browser_wrapper div.content_wrapper td { + border: 1px solid #eeeeee; + border-left: none; } +#browser_wrapper div.content_wrapper td:last-child { + border-right: 0 none; } +#browser_wrapper div.content_wrapper td.breadcrumb_td { + padding-left: 0; } +#browser_wrapper div.content_wrapper tfoot td { + border-left: 0 none; + border-bottom-left-radius: 0; } +#browser_wrapper div.content_wrapper ul.breadcrumb { + padding-left: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left: 0; } +#browser_wrapper div.content_wrapper ul.breadcrumb li { + visibility: hidden; } +#browser_wrapper table { + border-collapse: collapse; } +#browser_wrapper table thead tr th { + border-bottom: 0; + background-color: #ffffff; } +#browser_wrapper table tbody tr:last-child td { + border-bottom: 1px solid #dddddd; + border-radius: 0; } +#browser_wrapper table tbody tr.empty td { + height: 28px; + padding: 10px; } +#browser_wrapper table tbody td.actions_column { + position: static; } +#browser_wrapper .breadcrumb { + padding: 6px; + margin: 0 0 1px; } +.topbar .context-box .context-selection { + display: inline-block; + position: relative; + top: 3px; +} + +.topbar .context-box .context-selection .dropdown-toggle { + background: url('/static/dashboard/img/dropdown_ena.png') transparent no-repeat; + background-repeat: no-repeat; + background-position: right 6px top 7px; + font-size: 13px; + color: transparent; + border: 1px solid #f5f5f5; + border-radius: 2px; +} +.topbar .context-box .context-selection .dropdown-toggle:hover, +.topbar .context-box .open .dropdown-toggle { + background: url('/static/dashboard/img/dropdown_dwn.png') #0572ce no-repeat; + background-position: right 6px center; + border: 1px solid #0572ce; + border-radius: 2px; + color: #ffffff; +} + +.topbar .context-box .context-selection .dropdown-toggle .context-overview { + padding: 0px 1px 0px 0px; + text-transform: capitalize; + color: #000000; +} + +.topbar .context-box .open .dropdown-toggle .context-overview { + color: #ffffff; +} + +.topbar .context-box .context-selection .dropdown-toggle:hover .context-overview { + color: #ffffff; +} + +.topbar .context-box .context-selection .dropdown-menu { + padding: 0; + border: 1px solid #c4ced7; +} +.topbar .context-box .context-selection .dropdown-header { + font-size: 13px; + color: #000000; + font-weight: 600; +} + +.topbar .context-box .context-selection .dropdown-header:hover { + background: #ffffff; +} + +.topbar .context-box .context-selection .context-lists { + display: table; + padding: 0px; + width: 100%; +} +.topbar .context-box .context-selection .footer { + width: 100%; + height: 30px; + line-height: 30px; + padding-left: 12px; + /*margin-top: 1em; + padding: 0.4em 1em;*/ + background: #f9f9f9; + border-top: 1px solid #c4ced7; + /*text-align: right; */ +} +.topbar .context-box .context-selection .disabled { + cursor: not-allowed; + color: #cccccc; } +.topbar .context-box .context-selection a { + cursor: pointer; + text-decoration: none; + white-space: nowrap; } +.topbar .context-box .context-selection em { + font-size: 17px; + font-weight: bold; + vertical-align: middle; } +.topbar .context-box .context-selection ul { + display: table-cell; + padding-left: 0px; +} +.topbar .context-box .context-selection ul li { + padding-left: 0; + font-size: 13px; + text-overflow: ellipsis; + overflow: hidden; + max-width: 160px; + height: 30px; + line-height: 30px; + padding-left: 12px; +} + +.topbar .context-box .context-selection ul li:hover { + background: #ebeced; +} + +.topbar .context-box .context-selection ul li a { + background: transparent; + color: #333333; + border: none; + text-transform: capitalize; +} + +.topbar .context-box .context-selection ul li .glyphicon-ok { + margin: 0px 8px 0px 0px; + line-height: 30px; + float: left; + color: #333333; +} +.topbar .context-box .context-selection ul:not(:last-child) { + border-right: 1px solid #cccccc; } + +.rickshaw_graph .detail { + pointer-events: none; + position: absolute; + top: 0; + z-index: 2; + background: rgba(0, 0, 0, 0.1); + bottom: 0; + width: 1px; + transition: opacity 0.25s linear; + -moz-transition: opacity 0.25s linear; + -o-transition: opacity 0.25s linear; + -webkit-transition: opacity 0.25s linear; +} +.rickshaw_graph .detail.inactive { + opacity: 0; +} +.rickshaw_graph .detail .item.active { + opacity: 1; +} +.rickshaw_graph .detail .x_label { + font-family: Arial, sans-serif; + border-radius: 3px; + padding: 6px; + opacity: 0.5; + border: 1px solid #e0e0e0; + font-size: 12px; + position: absolute; + background: white; + white-space: nowrap; +} +.rickshaw_graph .detail .item { + position: absolute; + z-index: 2; + border-radius: 3px; + padding: 0.25em; + font-size: 12px; + font-family: Arial, sans-serif; + opacity: 0; + background: rgba(0, 0, 0, 0.4); + color: white; + border: 1px solid rgba(0, 0, 0, 0.4); + margin-left: 1em; + margin-top: -1em; + white-space: nowrap; +} +.rickshaw_graph .detail .item.active { + opacity: 1; + background: rgba(0, 0, 0, 0.8); +} +.rickshaw_graph .detail .item:before { + content: "\25c2"; + position: absolute; + left: -0.5em; + color: rgba(0, 0, 0, 0.7); + width: 0; +} +.rickshaw_graph .detail .dot { + width: 4px; + height: 4px; + margin-left: -4px; + margin-top: -3px; + border-radius: 5px; + position: absolute; + box-shadow: 0 0 2px rgba(0, 0, 0, 0.6); + background: white; + border-width: 2px; + border-style: solid; + display: none; + background-clip: padding-box; +} +.rickshaw_graph .detail .dot.active { + display: block; +} +/* graph */ + +.rickshaw_graph { + position: relative; +} +.rickshaw_graph svg { + display: block; + overflow: hidden; +} + +/* ticks */ + +.rickshaw_graph .x_tick { + position: absolute; + top: 0; + bottom: 0; + width: 0px; + border-left: 1px dotted rgba(0, 0, 0, 0.2); + pointer-events: none; +} +.rickshaw_graph .x_tick .title { + position: absolute; + font-size: 12px; + font-family: Arial, sans-serif; + opacity: 0.5; + white-space: nowrap; + margin-left: 3px; + bottom: 1px; +} + +/* annotations */ + +.rickshaw_annotation_timeline { + height: 1px; + border-top: 1px solid #e0e0e0; + margin-top: 10px; + position: relative; +} +.rickshaw_annotation_timeline .annotation { + position: absolute; + height: 6px; + width: 6px; + margin-left: -2px; + top: -3px; + border-radius: 5px; + background-color: rgba(0, 0, 0, 0.25); +} +.rickshaw_graph .annotation_line { + position: absolute; + top: 0; + bottom: -6px; + width: 0px; + border-left: 2px solid rgba(0, 0, 0, 0.3); + display: none; +} +.rickshaw_graph .annotation_line.active { + display: block; +} + +.rickshaw_graph .annotation_range { + background: rgba(0, 0, 0, 0.1); + display: none; + position: absolute; + top: 0; + bottom: -6px; +} +.rickshaw_graph .annotation_range.active { + display: block; +} +.rickshaw_graph .annotation_range.active.offscreen { + display: none; +} + +.rickshaw_annotation_timeline .annotation .content { + background: white; + color: black; + opacity: 0.9; + padding: 5px 5px; + box-shadow: 0 0 2px rgba(0, 0, 0, 0.8); + border-radius: 3px; + position: relative; + z-index: 20; + font-size: 12px; + padding: 6px 8px 8px; + top: 18px; + left: -11px; + width: 160px; + display: none; + cursor: pointer; +} +.rickshaw_annotation_timeline .annotation .content:before { + content: "\25b2"; + position: absolute; + top: -11px; + color: white; + text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.8); +} +.rickshaw_annotation_timeline .annotation.active, +.rickshaw_annotation_timeline .annotation:hover { + background-color: rgba(0, 0, 0, 0.8); + cursor: none; +} +.rickshaw_annotation_timeline .annotation .content:hover { + z-index: 50; +} +.rickshaw_annotation_timeline .annotation.active .content { + display: block; +} +.rickshaw_annotation_timeline .annotation:hover .content { + display: block; + z-index: 50; +} +.rickshaw_graph .y_axis, +.rickshaw_graph .x_axis_d3 { + fill: none; +} +.rickshaw_graph .y_ticks .tick, +.rickshaw_graph .x_ticks_d3 .tick { + stroke: rgba(0, 0, 0, 0.16); + stroke-width: 2px; + shape-rendering: crisp-edges; + pointer-events: none; +} +.rickshaw_graph .y_grid .tick, +.rickshaw_graph .x_grid_d3 .tick { + z-index: -1; + stroke: rgba(0, 0, 0, 0.20); + stroke-width: 1px; + stroke-dasharray: 1 1; +} +.rickshaw_graph .y_grid path, +.rickshaw_graph .x_grid_d3 path { + fill: none; + stroke: none; +} +.rickshaw_graph .y_ticks path, +.rickshaw_graph .x_ticks_d3 path { + fill: none; + stroke: #808080; +} +.rickshaw_graph .y_ticks text, +.rickshaw_graph .x_ticks_d3 text { + opacity: 0.5; + font-size: 12px; + pointer-events: none; +} +.rickshaw_graph .x_tick.glow .title, +.rickshaw_graph .y_ticks.glow text { + fill: black; + color: black; + text-shadow: + -1px 1px 0 rgba(255, 255, 255, 0.1), + 1px -1px 0 rgba(255, 255, 255, 0.1), + 1px 1px 0 rgba(255, 255, 255, 0.1), + 0px 1px 0 rgba(255, 255, 255, 0.1), + 0px -1px 0 rgba(255, 255, 255, 0.1), + 1px 0px 0 rgba(255, 255, 255, 0.1), + -1px 0px 0 rgba(255, 255, 255, 0.1), + -1px -1px 0 rgba(255, 255, 255, 0.1); +} +.rickshaw_graph .x_tick.inverse .title, +.rickshaw_graph .y_ticks.inverse text { + fill: white; + color: white; + text-shadow: + -1px 1px 0 rgba(0, 0, 0, 0.8), + 1px -1px 0 rgba(0, 0, 0, 0.8), + 1px 1px 0 rgba(0, 0, 0, 0.8), + 0px 1px 0 rgba(0, 0, 0, 0.8), + 0px -1px 0 rgba(0, 0, 0, 0.8), + 1px 0px 0 rgba(0, 0, 0, 0.8), + -1px 0px 0 rgba(0, 0, 0, 0.8), + -1px -1px 0 rgba(0, 0, 0, 0.8); +} +.rickshaw_legend { + font-family: Arial; + font-size: 12px; + color: white; + background: #404040; + display: inline-block; + padding: 12px 5px; + border-radius: 2px; + position: relative; +} +.rickshaw_legend:hover { + z-index: 10; +} +.rickshaw_legend .swatch { + width: 10px; + height: 10px; + border: 1px solid rgba(0, 0, 0, 0.2); +} +.rickshaw_legend .line { + clear: both; + line-height: 140%; + padding-right: 15px; +} +.rickshaw_legend .line .swatch { + display: inline-block; + margin-right: 3px; + border-radius: 2px; +} +.rickshaw_legend .label { + margin: 0; + white-space: nowrap; + display: inline; + font-size: inherit; + background-color: transparent; + color: inherit; + font-weight: normal; + line-height: normal; + padding: 0px; + text-shadow: none; +} +.rickshaw_legend .action:hover { + opacity: 0.6; +} +.rickshaw_legend .action { + margin-right: 0.2em; + font-size: 10px; + opacity: 0.2; + cursor: pointer; + font-size: 14px; +} +.rickshaw_legend .line.disabled { + opacity: 0.4; +} +.rickshaw_legend ul { + list-style-type: none; + margin: 0; + padding: 0; + margin: 2px; + cursor: pointer; +} +.rickshaw_legend li { + padding: 0 0 0 2px; + min-width: 80px; + white-space: nowrap; +} +.rickshaw_legend li:hover { + background: rgba(255, 255, 255, 0.08); + border-radius: 3px; +} +.rickshaw_legend li:active { + background: rgba(255, 255, 255, 0.2); + border-radius: 3px; +} + +.datepicker { + padding: 4px; + border-radius: 4px; + direction: ltr; +} + +.datepicker input { + background: #ffffff !important; +} + +.datepicker-inline { + width: 220px; +} +.datepicker.datepicker-rtl { + direction: rtl; +} +.datepicker.datepicker-rtl table tr td span { + float: right; +} +.datepicker-dropdown { + top: 0; + left: 0; +} +.datepicker-dropdown:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-top: 0; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; +} +.datepicker-dropdown:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-top: 0; + position: absolute; +} +.datepicker-dropdown.datepicker-orient-left:before { + left: 6px; +} +.datepicker-dropdown.datepicker-orient-left:after { + left: 7px; +} +.datepicker-dropdown.datepicker-orient-right:before { + right: 6px; +} +.datepicker-dropdown.datepicker-orient-right:after { + right: 7px; +} +.datepicker-dropdown.datepicker-orient-top:before { + top: -7px; +} +.datepicker-dropdown.datepicker-orient-top:after { + top: -6px; +} +.datepicker-dropdown.datepicker-orient-bottom:before { + bottom: -7px; + border-bottom: 0; + border-top: 7px solid #999; +} +.datepicker-dropdown.datepicker-orient-bottom:after { + bottom: -6px; + border-bottom: 0; + border-top: 6px solid #fff; +} +.datepicker > div { + display: none; +} +.datepicker.days div.datepicker-days { + display: block; +} +.datepicker.months div.datepicker-months { + display: block; +} +.datepicker.years div.datepicker-years { + display: block; +} +.datepicker table { + margin: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.datepicker table tr td, +.datepicker table tr th { + text-align: center; + width: 30px; + height: 30px; + border-radius: 4px; + border: none; +} +.table-striped .datepicker table tr td, +.table-striped .datepicker table tr th { + background-color: transparent; +} +.datepicker table tr td.day:hover, +.datepicker table tr td.day.focused { + background: #eeeeee; + cursor: pointer; +} +.datepicker table tr td.old, +.datepicker table tr td.new { + color: #999999; +} +.datepicker table tr td.disabled, +.datepicker table tr td.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td.today, +.datepicker table tr td.today:hover, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today.disabled:hover { + color: #000000; + background-color: #ffdb99; + border-color: #ffb733; +} +.datepicker table tr td.today:hover, +.datepicker table tr td.today:hover:hover, +.datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today.disabled:hover:hover, +.datepicker table tr td.today:focus, +.datepicker table tr td.today:hover:focus, +.datepicker table tr td.today.disabled:focus, +.datepicker table tr td.today.disabled:hover:focus, +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.today, +.open .dropdown-toggle.datepicker table tr td.today:hover, +.open .dropdown-toggle.datepicker table tr td.today.disabled, +.open .dropdown-toggle.datepicker table tr td.today.disabled:hover { + color: #000000; + background-color: #ffcd70; + border-color: #f59e00; +} +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.today, +.open .dropdown-toggle.datepicker table tr td.today:hover, +.open .dropdown-toggle.datepicker table tr td.today.disabled, +.open .dropdown-toggle.datepicker table tr td.today.disabled:hover { + background-image: none; +} +.datepicker table tr td.today.disabled, +.datepicker table tr td.today:hover.disabled, +.datepicker table tr td.today.disabled.disabled, +.datepicker table tr td.today.disabled:hover.disabled, +.datepicker table tr td.today[disabled], +.datepicker table tr td.today:hover[disabled], +.datepicker table tr td.today.disabled[disabled], +.datepicker table tr td.today.disabled:hover[disabled], +fieldset[disabled] .datepicker table tr td.today, +fieldset[disabled] .datepicker table tr td.today:hover, +fieldset[disabled] .datepicker table tr td.today.disabled, +fieldset[disabled] .datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today:hover.disabled:hover, +.datepicker table tr td.today.disabled.disabled:hover, +.datepicker table tr td.today.disabled:hover.disabled:hover, +.datepicker table tr td.today[disabled]:hover, +.datepicker table tr td.today:hover[disabled]:hover, +.datepicker table tr td.today.disabled[disabled]:hover, +.datepicker table tr td.today.disabled:hover[disabled]:hover, +fieldset[disabled] .datepicker table tr td.today:hover, +fieldset[disabled] .datepicker table tr td.today:hover:hover, +fieldset[disabled] .datepicker table tr td.today.disabled:hover, +fieldset[disabled] .datepicker table tr td.today.disabled:hover:hover, +.datepicker table tr td.today.disabled:focus, +.datepicker table tr td.today:hover.disabled:focus, +.datepicker table tr td.today.disabled.disabled:focus, +.datepicker table tr td.today.disabled:hover.disabled:focus, +.datepicker table tr td.today[disabled]:focus, +.datepicker table tr td.today:hover[disabled]:focus, +.datepicker table tr td.today.disabled[disabled]:focus, +.datepicker table tr td.today.disabled:hover[disabled]:focus, +fieldset[disabled] .datepicker table tr td.today:focus, +fieldset[disabled] .datepicker table tr td.today:hover:focus, +fieldset[disabled] .datepicker table tr td.today.disabled:focus, +fieldset[disabled] .datepicker table tr td.today.disabled:hover:focus, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today:hover.disabled:active, +.datepicker table tr td.today.disabled.disabled:active, +.datepicker table tr td.today.disabled:hover.disabled:active, +.datepicker table tr td.today[disabled]:active, +.datepicker table tr td.today:hover[disabled]:active, +.datepicker table tr td.today.disabled[disabled]:active, +.datepicker table tr td.today.disabled:hover[disabled]:active, +fieldset[disabled] .datepicker table tr td.today:active, +fieldset[disabled] .datepicker table tr td.today:hover:active, +fieldset[disabled] .datepicker table tr td.today.disabled:active, +fieldset[disabled] .datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today:hover.disabled.active, +.datepicker table tr td.today.disabled.disabled.active, +.datepicker table tr td.today.disabled:hover.disabled.active, +.datepicker table tr td.today[disabled].active, +.datepicker table tr td.today:hover[disabled].active, +.datepicker table tr td.today.disabled[disabled].active, +.datepicker table tr td.today.disabled:hover[disabled].active, +fieldset[disabled] .datepicker table tr td.today.active, +fieldset[disabled] .datepicker table tr td.today:hover.active, +fieldset[disabled] .datepicker table tr td.today.disabled.active, +fieldset[disabled] .datepicker table tr td.today.disabled:hover.active { + background-color: #ffffff; + border-color: #ffb733; +} +.datepicker table tr td.today:hover:hover { + color: #000; +} +.datepicker table tr td.today.active:hover { + color: #fff; +} +.datepicker table tr td.range, +.datepicker table tr td.range:hover, +.datepicker table tr td.range.disabled, +.datepicker table tr td.range.disabled:hover { + background: #eeeeee; + border-radius: 0; +} +.datepicker table tr td.range.today, +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today.disabled:hover { + color: #000000; + background-color: #f7ca77; + border-color: #f1a417; + border-radius: 0; +} +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today:hover:hover, +.datepicker table tr td.range.today.disabled:hover, +.datepicker table tr td.range.today.disabled:hover:hover, +.datepicker table tr td.range.today:focus, +.datepicker table tr td.range.today:hover:focus, +.datepicker table tr td.range.today.disabled:focus, +.datepicker table tr td.range.today.disabled:hover:focus, +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.range.today, +.open .dropdown-toggle.datepicker table tr td.range.today:hover, +.open .dropdown-toggle.datepicker table tr td.range.today.disabled, +.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover { + color: #000000; + background-color: #f4bb51; + border-color: #bf800c; +} +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.range.today, +.open .dropdown-toggle.datepicker table tr td.range.today:hover, +.open .dropdown-toggle.datepicker table tr td.range.today.disabled, +.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover { + background-image: none; +} +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today:hover.disabled, +.datepicker table tr td.range.today.disabled.disabled, +.datepicker table tr td.range.today.disabled:hover.disabled, +.datepicker table tr td.range.today[disabled], +.datepicker table tr td.range.today:hover[disabled], +.datepicker table tr td.range.today.disabled[disabled], +.datepicker table tr td.range.today.disabled:hover[disabled], +fieldset[disabled] .datepicker table tr td.range.today, +fieldset[disabled] .datepicker table tr td.range.today:hover, +fieldset[disabled] .datepicker table tr td.range.today.disabled, +fieldset[disabled] .datepicker table tr td.range.today.disabled:hover, +.datepicker table tr td.range.today.disabled:hover, +.datepicker table tr td.range.today:hover.disabled:hover, +.datepicker table tr td.range.today.disabled.disabled:hover, +.datepicker table tr td.range.today.disabled:hover.disabled:hover, +.datepicker table tr td.range.today[disabled]:hover, +.datepicker table tr td.range.today:hover[disabled]:hover, +.datepicker table tr td.range.today.disabled[disabled]:hover, +.datepicker table tr td.range.today.disabled:hover[disabled]:hover, +fieldset[disabled] .datepicker table tr td.range.today:hover, +fieldset[disabled] .datepicker table tr td.range.today:hover:hover, +fieldset[disabled] .datepicker table tr td.range.today.disabled:hover, +fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:hover, +.datepicker table tr td.range.today.disabled:focus, +.datepicker table tr td.range.today:hover.disabled:focus, +.datepicker table tr td.range.today.disabled.disabled:focus, +.datepicker table tr td.range.today.disabled:hover.disabled:focus, +.datepicker table tr td.range.today[disabled]:focus, +.datepicker table tr td.range.today:hover[disabled]:focus, +.datepicker table tr td.range.today.disabled[disabled]:focus, +.datepicker table tr td.range.today.disabled:hover[disabled]:focus, +fieldset[disabled] .datepicker table tr td.range.today:focus, +fieldset[disabled] .datepicker table tr td.range.today:hover:focus, +fieldset[disabled] .datepicker table tr td.range.today.disabled:focus, +fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:focus, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today:hover.disabled:active, +.datepicker table tr td.range.today.disabled.disabled:active, +.datepicker table tr td.range.today.disabled:hover.disabled:active, +.datepicker table tr td.range.today[disabled]:active, +.datepicker table tr td.range.today:hover[disabled]:active, +.datepicker table tr td.range.today.disabled[disabled]:active, +.datepicker table tr td.range.today.disabled:hover[disabled]:active, +fieldset[disabled] .datepicker table tr td.range.today:active, +fieldset[disabled] .datepicker table tr td.range.today:hover:active, +fieldset[disabled] .datepicker table tr td.range.today.disabled:active, +fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today:hover.disabled.active, +.datepicker table tr td.range.today.disabled.disabled.active, +.datepicker table tr td.range.today.disabled:hover.disabled.active, +.datepicker table tr td.range.today[disabled].active, +.datepicker table tr td.range.today:hover[disabled].active, +.datepicker table tr td.range.today.disabled[disabled].active, +.datepicker table tr td.range.today.disabled:hover[disabled].active, +fieldset[disabled] .datepicker table tr td.range.today.active, +fieldset[disabled] .datepicker table tr td.range.today:hover.active, +fieldset[disabled] .datepicker table tr td.range.today.disabled.active, +fieldset[disabled] .datepicker table tr td.range.today.disabled:hover.active { + background-color: #f7ca77; + border-color: #f1a417; +} +.datepicker table tr td.selected, +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected.disabled:hover { + color: #ffffff; + background-color: #999999; + border-color: #555555; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected:hover:hover, +.datepicker table tr td.selected.disabled:hover, +.datepicker table tr td.selected.disabled:hover:hover, +.datepicker table tr td.selected:focus, +.datepicker table tr td.selected:hover:focus, +.datepicker table tr td.selected.disabled:focus, +.datepicker table tr td.selected.disabled:hover:focus, +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.selected, +.open .dropdown-toggle.datepicker table tr td.selected:hover, +.open .dropdown-toggle.datepicker table tr td.selected.disabled, +.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover { + color: #ffffff; + background-color: #858585; + border-color: #373737; +} +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.selected, +.open .dropdown-toggle.datepicker table tr td.selected:hover, +.open .dropdown-toggle.datepicker table tr td.selected.disabled, +.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover { + background-image: none; +} +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected:hover.disabled, +.datepicker table tr td.selected.disabled.disabled, +.datepicker table tr td.selected.disabled:hover.disabled, +.datepicker table tr td.selected[disabled], +.datepicker table tr td.selected:hover[disabled], +.datepicker table tr td.selected.disabled[disabled], +.datepicker table tr td.selected.disabled:hover[disabled], +fieldset[disabled] .datepicker table tr td.selected, +fieldset[disabled] .datepicker table tr td.selected:hover, +fieldset[disabled] .datepicker table tr td.selected.disabled, +fieldset[disabled] .datepicker table tr td.selected.disabled:hover, +.datepicker table tr td.selected.disabled:hover, +.datepicker table tr td.selected:hover.disabled:hover, +.datepicker table tr td.selected.disabled.disabled:hover, +.datepicker table tr td.selected.disabled:hover.disabled:hover, +.datepicker table tr td.selected[disabled]:hover, +.datepicker table tr td.selected:hover[disabled]:hover, +.datepicker table tr td.selected.disabled[disabled]:hover, +.datepicker table tr td.selected.disabled:hover[disabled]:hover, +fieldset[disabled] .datepicker table tr td.selected:hover, +fieldset[disabled] .datepicker table tr td.selected:hover:hover, +fieldset[disabled] .datepicker table tr td.selected.disabled:hover, +fieldset[disabled] .datepicker table tr td.selected.disabled:hover:hover, +.datepicker table tr td.selected.disabled:focus, +.datepicker table tr td.selected:hover.disabled:focus, +.datepicker table tr td.selected.disabled.disabled:focus, +.datepicker table tr td.selected.disabled:hover.disabled:focus, +.datepicker table tr td.selected[disabled]:focus, +.datepicker table tr td.selected:hover[disabled]:focus, +.datepicker table tr td.selected.disabled[disabled]:focus, +.datepicker table tr td.selected.disabled:hover[disabled]:focus, +fieldset[disabled] .datepicker table tr td.selected:focus, +fieldset[disabled] .datepicker table tr td.selected:hover:focus, +fieldset[disabled] .datepicker table tr td.selected.disabled:focus, +fieldset[disabled] .datepicker table tr td.selected.disabled:hover:focus, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected:hover.disabled:active, +.datepicker table tr td.selected.disabled.disabled:active, +.datepicker table tr td.selected.disabled:hover.disabled:active, +.datepicker table tr td.selected[disabled]:active, +.datepicker table tr td.selected:hover[disabled]:active, +.datepicker table tr td.selected.disabled[disabled]:active, +.datepicker table tr td.selected.disabled:hover[disabled]:active, +fieldset[disabled] .datepicker table tr td.selected:active, +fieldset[disabled] .datepicker table tr td.selected:hover:active, +fieldset[disabled] .datepicker table tr td.selected.disabled:active, +fieldset[disabled] .datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected:hover.disabled.active, +.datepicker table tr td.selected.disabled.disabled.active, +.datepicker table tr td.selected.disabled:hover.disabled.active, +.datepicker table tr td.selected[disabled].active, +.datepicker table tr td.selected:hover[disabled].active, +.datepicker table tr td.selected.disabled[disabled].active, +.datepicker table tr td.selected.disabled:hover[disabled].active, +fieldset[disabled] .datepicker table tr td.selected.active, +fieldset[disabled] .datepicker table tr td.selected:hover.active, +fieldset[disabled] .datepicker table tr td.selected.disabled.active, +fieldset[disabled] .datepicker table tr td.selected.disabled:hover.active { + background-color: #999999; + border-color: #555555; +} +.datepicker table tr td.active, +.datepicker table tr td.active:hover, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active.disabled:hover { + color: #ffffff; + background-color: #428bca; + border-color: #357ebd; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.active:hover, +.datepicker table tr td.active:hover:hover, +.datepicker table tr td.active.disabled:hover, +.datepicker table tr td.active.disabled:hover:hover, +.datepicker table tr td.active:focus, +.datepicker table tr td.active:hover:focus, +.datepicker table tr td.active.disabled:focus, +.datepicker table tr td.active.disabled:hover:focus, +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.active, +.open .dropdown-toggle.datepicker table tr td.active:hover, +.open .dropdown-toggle.datepicker table tr td.active.disabled, +.open .dropdown-toggle.datepicker table tr td.active.disabled:hover { + color: #ffffff; + background-color: #3276b1; + border-color: #285e8e; +} +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.active, +.open .dropdown-toggle.datepicker table tr td.active:hover, +.open .dropdown-toggle.datepicker table tr td.active.disabled, +.open .dropdown-toggle.datepicker table tr td.active.disabled:hover { + background-image: none; +} +.datepicker table tr td.active.disabled, +.datepicker table tr td.active:hover.disabled, +.datepicker table tr td.active.disabled.disabled, +.datepicker table tr td.active.disabled:hover.disabled, +.datepicker table tr td.active[disabled], +.datepicker table tr td.active:hover[disabled], +.datepicker table tr td.active.disabled[disabled], +.datepicker table tr td.active.disabled:hover[disabled], +fieldset[disabled] .datepicker table tr td.active, +fieldset[disabled] .datepicker table tr td.active:hover, +fieldset[disabled] .datepicker table tr td.active.disabled, +fieldset[disabled] .datepicker table tr td.active.disabled:hover, +.datepicker table tr td.active.disabled:hover, +.datepicker table tr td.active:hover.disabled:hover, +.datepicker table tr td.active.disabled.disabled:hover, +.datepicker table tr td.active.disabled:hover.disabled:hover, +.datepicker table tr td.active[disabled]:hover, +.datepicker table tr td.active:hover[disabled]:hover, +.datepicker table tr td.active.disabled[disabled]:hover, +.datepicker table tr td.active.disabled:hover[disabled]:hover, +fieldset[disabled] .datepicker table tr td.active:hover, +fieldset[disabled] .datepicker table tr td.active:hover:hover, +fieldset[disabled] .datepicker table tr td.active.disabled:hover, +fieldset[disabled] .datepicker table tr td.active.disabled:hover:hover, +.datepicker table tr td.active.disabled:focus, +.datepicker table tr td.active:hover.disabled:focus, +.datepicker table tr td.active.disabled.disabled:focus, +.datepicker table tr td.active.disabled:hover.disabled:focus, +.datepicker table tr td.active[disabled]:focus, +.datepicker table tr td.active:hover[disabled]:focus, +.datepicker table tr td.active.disabled[disabled]:focus, +.datepicker table tr td.active.disabled:hover[disabled]:focus, +fieldset[disabled] .datepicker table tr td.active:focus, +fieldset[disabled] .datepicker table tr td.active:hover:focus, +fieldset[disabled] .datepicker table tr td.active.disabled:focus, +fieldset[disabled] .datepicker table tr td.active.disabled:hover:focus, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active:hover.disabled:active, +.datepicker table tr td.active.disabled.disabled:active, +.datepicker table tr td.active.disabled:hover.disabled:active, +.datepicker table tr td.active[disabled]:active, +.datepicker table tr td.active:hover[disabled]:active, +.datepicker table tr td.active.disabled[disabled]:active, +.datepicker table tr td.active.disabled:hover[disabled]:active, +fieldset[disabled] .datepicker table tr td.active:active, +fieldset[disabled] .datepicker table tr td.active:hover:active, +fieldset[disabled] .datepicker table tr td.active.disabled:active, +fieldset[disabled] .datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active:hover.disabled.active, +.datepicker table tr td.active.disabled.disabled.active, +.datepicker table tr td.active.disabled:hover.disabled.active, +.datepicker table tr td.active[disabled].active, +.datepicker table tr td.active:hover[disabled].active, +.datepicker table tr td.active.disabled[disabled].active, +.datepicker table tr td.active.disabled:hover[disabled].active, +fieldset[disabled] .datepicker table tr td.active.active, +fieldset[disabled] .datepicker table tr td.active:hover.active, +fieldset[disabled] .datepicker table tr td.active.disabled.active, +fieldset[disabled] .datepicker table tr td.active.disabled:hover.active { + background-color: #428bca; + border-color: #357ebd; +} +.datepicker table tr td span { + display: block; + width: 23%; + height: 54px; + line-height: 54px; + float: left; + margin: 1%; + cursor: pointer; + border-radius: 4px; +} +.datepicker table tr td span:hover { + background: #eeeeee; +} +.datepicker table tr td span.disabled, +.datepicker table tr td span.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td span.active, +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active.disabled:hover { + color: #ffffff; + background-color: #428bca; + border-color: #357ebd; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active:hover:hover, +.datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active:focus, +.datepicker table tr td span.active:hover:focus, +.datepicker table tr td span.active.disabled:focus, +.datepicker table tr td span.active.disabled:hover:focus, +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td span.active, +.open .dropdown-toggle.datepicker table tr td span.active:hover, +.open .dropdown-toggle.datepicker table tr td span.active.disabled, +.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover { + color: #ffffff; + background-color: #3276b1; + border-color: #285e8e; +} +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td span.active, +.open .dropdown-toggle.datepicker table tr td span.active:hover, +.open .dropdown-toggle.datepicker table tr td span.active.disabled, +.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover { + background-image: none; +} +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active:hover.disabled, +.datepicker table tr td span.active.disabled.disabled, +.datepicker table tr td span.active.disabled:hover.disabled, +.datepicker table tr td span.active[disabled], +.datepicker table tr td span.active:hover[disabled], +.datepicker table tr td span.active.disabled[disabled], +.datepicker table tr td span.active.disabled:hover[disabled], +fieldset[disabled] .datepicker table tr td span.active, +fieldset[disabled] .datepicker table tr td span.active:hover, +fieldset[disabled] .datepicker table tr td span.active.disabled, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active:hover.disabled:hover, +.datepicker table tr td span.active.disabled.disabled:hover, +.datepicker table tr td span.active.disabled:hover.disabled:hover, +.datepicker table tr td span.active[disabled]:hover, +.datepicker table tr td span.active:hover[disabled]:hover, +.datepicker table tr td span.active.disabled[disabled]:hover, +.datepicker table tr td span.active.disabled:hover[disabled]:hover, +fieldset[disabled] .datepicker table tr td span.active:hover, +fieldset[disabled] .datepicker table tr td span.active:hover:hover, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active.disabled:focus, +.datepicker table tr td span.active:hover.disabled:focus, +.datepicker table tr td span.active.disabled.disabled:focus, +.datepicker table tr td span.active.disabled:hover.disabled:focus, +.datepicker table tr td span.active[disabled]:focus, +.datepicker table tr td span.active:hover[disabled]:focus, +.datepicker table tr td span.active.disabled[disabled]:focus, +.datepicker table tr td span.active.disabled:hover[disabled]:focus, +fieldset[disabled] .datepicker table tr td span.active:focus, +fieldset[disabled] .datepicker table tr td span.active:hover:focus, +fieldset[disabled] .datepicker table tr td span.active.disabled:focus, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active:hover.disabled:active, +.datepicker table tr td span.active.disabled.disabled:active, +.datepicker table tr td span.active.disabled:hover.disabled:active, +.datepicker table tr td span.active[disabled]:active, +.datepicker table tr td span.active:hover[disabled]:active, +.datepicker table tr td span.active.disabled[disabled]:active, +.datepicker table tr td span.active.disabled:hover[disabled]:active, +fieldset[disabled] .datepicker table tr td span.active:active, +fieldset[disabled] .datepicker table tr td span.active:hover:active, +fieldset[disabled] .datepicker table tr td span.active.disabled:active, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active:hover.disabled.active, +.datepicker table tr td span.active.disabled.disabled.active, +.datepicker table tr td span.active.disabled:hover.disabled.active, +.datepicker table tr td span.active[disabled].active, +.datepicker table tr td span.active:hover[disabled].active, +.datepicker table tr td span.active.disabled[disabled].active, +.datepicker table tr td span.active.disabled:hover[disabled].active, +fieldset[disabled] .datepicker table tr td span.active.active, +fieldset[disabled] .datepicker table tr td span.active:hover.active, +fieldset[disabled] .datepicker table tr td span.active.disabled.active, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover.active { + background-color: #428bca; + border-color: #357ebd; +} +.datepicker table tr td span.old, +.datepicker table tr td span.new { + color: #999999; +} +.datepicker th.datepicker-switch { + width: 145px; +} +.datepicker thead tr:first-child th, +.datepicker tfoot tr th { + cursor: pointer; +} +.datepicker thead tr:first-child th:hover, +.datepicker tfoot tr th:hover { + background: #eeeeee; +} +.datepicker .cw { + font-size: 10px; + width: 12px; + padding: 0 2px 0 5px; + vertical-align: middle; +} +.datepicker thead tr:first-child th.cw { + cursor: default; + background-color: transparent; +} +.input-group.date .input-group-addon i { + cursor: pointer; + width: 16px; + height: 16px; +} +.input-daterange input { + text-align: center; +} +.input-daterange input:first-child { + border-radius: 3px 0 0 3px; +} +.input-daterange input:last-child { + border-radius: 0 3px 3px 0; +} +.input-daterange .input-group-addon { + width: auto; + min-width: 16px; + padding: 4px 5px; + font-weight: normal; + line-height: 1.51429; + text-align: center; + text-shadow: 0 1px 0 #fff; + vertical-align: middle; + background-color: #eeeeee; + border: solid #cccccc; + border-width: 1px 0; + margin-left: -5px; + margin-right: -5px; +} +.datepicker.dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; float: left; display: none; - min-width: 145px; - _width: 145px; - padding: 4px 0; - margin: 0; + min-width: 160px; list-style: none; background-color: #ffffff; - border-color: #C3CED7; - /*border-color: rgba(0, 0, 0, 0.2);*/ - border-style: solid; - border-width: 1px; - /*-webkit-border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px;*/ + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 5px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); @@ -1715,4529 +9164,1701 @@ background-clip: padding-box; *border-right-width: 2px; *border-bottom-width: 2px; -} -.dropdown-menu.bottom-up { - top: auto; - bottom: 100%; - margin-bottom: 2px; -} -.dropdown-menu .divider { - height: 1px; - margin: 5px 1px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; - *width: 100%; - *margin: -5px 0 5px; -} -.dropdown-menu a { - display: block; - padding: 3px 15px; - clear: both; - font-weight: normal; - line-height: 18px; - color: #555555; - white-space: nowrap; -} -.dropdown-menu li > a:hover, -.dropdown-menu .active > a, -.dropdown-menu .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #0088cc; -} -.dropdown.open { - *z-index: 1000; -} -.dropdown.open .dropdown-toggle, -.dropdown.open .dropdown-toggle:hover { - color: #ffffff; - background: #ccc; - background: rgba(0, 0, 0, 0.3); -} -.dropdown.open .dropdown-menu { - display: block; -} -.typeahead { - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #eee; - border: 1px solid rgba(0, 0, 0, 0.05); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} -.fade { - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -ms-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; - opacity: 0; -} -.fade.in { - opacity: 1; -} -.collapse { - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -ms-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; - position: relative; - overflow: hidden; - height: 0; -} -.collapse.in { - height: auto; -} -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 18px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover { - color: #000000; - text-decoration: none; - opacity: 0.4; - filter: alpha(opacity=40); - cursor: pointer; -} -.btn { - display: inline-block; - padding: 7px 10px 5px 10px; - margin-bottom: 0; - font-size: 12px !important; - line-height: 18px; - color: #000000; - /*text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - background-color: #f5f5f5;*/ - background: -moz-linear-gradient(top, #f1f3f4, #e3e8ea); - background: -ms-linear-gradient(top, #f1f3f4, #e3e8ea); - background: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f3f4), to(#e3e8ea)); - background: -webkit-linear-gradient(top, #f1f3f4, #e3e8ea); - background: -o-linear-gradient(top, #f1f3f4, #e3e8ea); - background: linear-gradient(top, #f1f3f4, #e3e8ea); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - /*border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);*/ - border: 1px solid #C3CED7; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - /*-webkit-box-shadow: inset 0 1px 1px rgba(251, 252, 252, 1), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(251, 252, 252, 1), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(251, 252, 252, 1), 0 1px 2px rgba(0, 0, 0, 0.05);*/ - cursor: pointer; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - /**margin-left: .3em;*/ -} -.btn:hover, -.btn:active, -.btn.active { - background: -moz-linear-gradient(top, #F8F9FA, #F1F4F5); - background: -ms-linear-gradient(top, #F8F9FA, #F1F4F5); - background: -webkit-gradient(linear, 0 0, 0 100%, from(#F8F9FA), to(#F1F4F5)); - background: -webkit-linear-gradient(top, #F8F9FA, #F1F4F5); - background: -o-linear-gradient(top, #F8F9FA, #F1F4F5); - background: linear-gradient(top, #F8F9FA, #F1F4F5); - text-decoration: none; -} - -.btn.disabled, -.btn[disabled] { - background: #F4F6F7; - color: #999999; - border: 1px solid #DFE6EB; -} - -.btn:active, -.btn.active { - background-color: #cccccc \9; -} -.btn:first-child { - *margin-left: 0; -} -.btn:hover { - color: #000000; - text-decoration: none; - background: -moz-linear-gradient(top, #f8f9fa, #f1f4f5); - background: -ms-linear-gradient(top, #f8f9fa, #f1f4f5); - background: -webkit-gradient(linear, 0 0, 0 100%, from(#f8f9fa), to(#f1f4f5)); - background: -webkit-linear-gradient(top, #f8f9fa, #f1f4f5); - background: -o-linear-gradient(top, #f8f9fa, #f1f4f5); - background: linear-gradient(top, #f8f9fa, #f1f4f5); - /*background-color: #e6e6e6; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -ms-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear;*/ -} -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn.active, -.btn:active { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - background-color: #e6e6e6; - background-color: #d9d9d9 \9; - outline: 0; -} -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - background-color: #e6e6e6; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-large { - padding: 9px 14px; - font-size: 15px; - line-height: normal; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.btn-large [class^="icon-"] { - margin-top: 1px; -} -.btn-small { - padding: 5px 9px; - font-size: 11px; - line-height: 16px; -} -.btn-small [class^="icon-"] { - margin-top: -1px; -} -.btn-mini { - padding: 2px 6px; - font-size: 11px; - line-height: 14px; -} -.btn-primary, -.btn-primary:hover, -.btn-warning, -.btn-warning:hover, -.btn-danger, -.btn-danger:hover, -.btn-success, -.btn-success:hover, -.btn-info, -.btn-info:hover, -.btn-inverse, -.btn-inverse:hover { - /*text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);*/ - color: #fff; -} -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-dark.active { - color: #fff; - background-color: #c44012; - -} -li.active .btn-primary, -.btn-primary { - color: #ffffff; - border: 1px solid #0074CD; - background: #0074CD; - font-weight: bold; - /*background-image: linear-gradient(bottom, rgb(199,66,18) 0%, rgb(221,74,20) 100%); - background-image: -o-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(221,74,20) 100%); - background-image: -moz-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(221,74,20) 100%); - background-image: -webkit-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(221,74,20) 100%); - background-image: -ms-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(221,74,20) 100%); - -webkit-box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.2); - box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.2);*/ -} -.btn-primary:hover, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - border: 1px solid #0160C1; - background: #0160C1; -} -/*.btn-primary.active { - background-color: #c44012 \9; -}*/ -$.btn-primary:active, -.btn-primary:active { - background-color: #DD4814; - background-image: linear-gradient(bottom, rgb(199,66,18) 0%, rgb(236,94,43) 100%); - background-image: -o-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(236,94,43) 100%); - background-image: -moz-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(236,94,43) 100%); - background-image: -webkit-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(236,94,43) 100%); - background-image: -ms-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(236,94,43) 100%); - text-decoration: none; -} - -.btn-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -ms-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-warning:hover, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - background-color: #f89406; -} -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} -.btn-danger { - background: #0074CD; - /*font-weight: bold;*/ - border: 1px solid #0074CD; - color: #FFFFFF -} - -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled], -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover { - background-color: #dde7ee; - color: #8193a1; - font-weight: bold; - font-size: 12px !important; - border: 1px solid #cedae2; -} - -.btn-danger:hover, -.btn-danger:active { - background: #0160c1; - border: 1px solid #0160c1; - color: #FFFFFF; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} -.btn-success { - background-color: #5bb75b; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -ms-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(top, #62c462, #51a351); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-success:hover, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - background-color: #51a351; -} -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} -.btn-info { - background-color: #49afcd; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(top, #5bc0de, #2f96b4); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-info:hover, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - background-color: #2f96b4; -} -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} -.btn-inverse { - background-color: #393939; - background-image: -moz-linear-gradient(top, #454545, #262626); - background-image: -ms-linear-gradient(top, #454545, #262626); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#454545), to(#262626)); - background-image: -webkit-linear-gradient(top, #454545, #262626); - background-image: -o-linear-gradient(top, #454545, #262626); - background-image: linear-gradient(top, #454545, #262626); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#454545', endColorstr='#262626', GradientType=0); - border-color: #262626 #262626 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.btn-inverse:hover, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - background-color: #262626; -} -.btn-inverse:active, -.btn-inverse.active { - background-color: #0c0c0c \9; -} - -.btn-search { - margin-left: 0px !important; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 2px; - *padding-bottom: 2px; -} -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} -button.btn.large, -input[type="submit"].btn.large { - *padding-top: 7px; - *padding-bottom: 7px; -} -button.btn.small, -input[type="submit"].btn.small { - *padding-top: 3px; - *padding-bottom: 3px; -} -.btn-group { - position: relative; - *zoom: 1; - margin: 0px; -} -.topologyNavi .btn-group { - margin-left: 5px; - margin-top: 5px; - float: left; -} -.btn-group:before, -.btn-group:after { - display: table; - content: ""; -} -.btn-group:after { - clear: both; -} -.btn-group:first-child { - *margin-left: 0; -} -.btn-group + .btn-group { - /*margin-left: 5px;*/ -} -.btn-toolbar { - margin-top: 9px; - margin-bottom: 9px; -} -.btn-toolbar .btn-group { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} -.btn-group .btn { - position: relative; - float: left; - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group .btn:first-child { - margin-left: 0; - -webkit-border-top-left-radius: 3px; - -moz-border-radius-topleft: 3px; - border-top-left-radius: 3px; - -webkit-border-bottom-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - border-bottom-left-radius: 3px; -} -.btn-group .btn:last-child, -.btn-group .dropdown-toggle { - -webkit-border-top-right-radius: 3px; - -moz-border-radius-topright: 3px; - border-top-right-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - -moz-border-radius-bottomright: 3px; - border-bottom-right-radius: 3px; -} -.btn-group .btn.large:first-child { - margin-left: 0; - /*-webkit-border-top-left-radius: 6px; - -moz-border-radius-topleft: 6px; - border-top-left-radius: 6px; - -webkit-border-bottom-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - border-bottom-left-radius: 6px;*/ -} -.btn-group .btn.large:last-child, -.btn-group .large.dropdown-toggle { - /*-webkit-border-top-right-radius: 6px; - -moz-border-radius-topright: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - -moz-border-radius-bottomright: 6px; - border-bottom-right-radius: 6px;*/ -} -.btn-group .btn:hover, -.btn-group .btn:focus, -.btn-group .btn:active, -.btn-group .btn.active { - z-index: 2; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - *padding-top: 5px; - *padding-bottom: 5px; -} -.btn-group.open { - *z-index: 1000; -} -.btn-group.open .dropdown-menu { - display: block; - margin-top: 1px; - /*-webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px;*/ -} -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} -.btn .caret { - margin-top: 7px; - margin-left: 0; -} -.btn:hover .caret, -.open.btn-group .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.btn-primary .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - opacity: 0.75; - filter: alpha(opacity=75); -} -.btn-small .caret { - margin-top: 4px; -} -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 18px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.alert, -.alert-heading { - color: #c09853; -} -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 18px; -} -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success, -.alert-success .alert-heading { - color: #468847; -} -.alert-danger, -.alert-error { - background-color: #f2dede; - border-color: #eed3d7; -} -.alert-danger, -.alert-error, -.alert-danger .alert-heading, -.alert-error .alert-heading { - color: #b94a48; -} -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info, -.alert-info .alert-heading { - color: #3a87ad; -} -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} -.alert-block p + p { - margin-top: 5px; -} -.nav { - margin-left: 0; - margin-bottom: 18px; - list-style: none; -} -.nav > li > a { - display: block; -} -.nav > li > a:hover { - text-decoration: none; - background-color: #ebeced; -} -.nav .nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 18px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} -.nav li + .nav-header { - margin-top: 9px; -} -.nav-list { - padding-left: 14px; - padding-right: 14px; - margin-bottom: 0; -} -.nav-list > li > a, -.nav-list .nav-header { - margin-left: -15px; - margin-right: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} -.nav-list > li > a { - padding: 3px 15px; -} -.nav-list .active > a, -.nav-list .active > a:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} -.nav-list [class^="icon-"] { - margin-right: 2px; -} -.nav-tabs, -.nav-pills { - *zoom: 1; -} -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; -} -.nav-tabs:after, -.nav-pills:after { - clear: both; -} -.nav-pills { - margin: 0px; - padding: 5px 12px; - width: 289px !important; - border: 1px solid #d5dfe6; - border-top: 1px solid #eeeeee; - border-bottom: none; -} -.right .fake_table .members .nav-pills { - width: 304px !important; -} -.nav-pills:first-of-type { - border-top: 1px solid #d5dfe6; -} -.nav-tabs > li, -.nav-pills > li { - float: left; -} -.nav-tabs > li > a { - line-height: 33px; - text-align: center; -} -.nav-pills > li > a { - line-height: 14px; - text-align: center; -} -.nav-tabs > li { - margin-bottom: -1px; - margin-left: -1px; - -} -.nav-tabs > li > a { - border: 1px solid #c4ced8; - border-top: none; - border-right: none; - width: 113px; -} -.nav-tabs > li > a:hover { -} -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover { - border: 1px solid #ddd; - border-top: none; - cursor: default; -} -ul.nav-pills li.active { - float: right; -} -.nav-pills > li > a { - padding-top: 6px; - padding-bottom: 10px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-pills .active > a { - color: #ffffff; - background-color: #0074CD; - height: 14px; - width: 8px; -} -.nav-pills .active > a:hover { - background-color: #0160C1; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li > a { - margin-right: 0; -} -.nav-tabs.nav-stacked { - border-bottom: 0; -} -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.nav-tabs.nav-stacked > li > a:hover { - border-color: #ddd; - z-index: 2; -} -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} -.nav-tabs .dropdown-menu, -.nav-pills .dropdown-menu { - margin-top: 1px; - border-width: 1px; -} -.nav-pills .dropdown-menu { - -webkit-border-radius: 0px; - -moz-border-radius: 0px; - border-radius: 0px; -} -.nav-tabs .dropdown-toggle .caret, -.nav-pills .dropdown-toggle .caret { - /*border-top-color: #000000;*/ - border-top: 4px solid #005580; - oppacity: 0.3; - margin-top: 6px; -} -.nav-tabs .dropdown-toggle:hover .caret, -.nav-pills .dropdown-toggle:hover .caret { - border-top-color: #005580; -} -.nav-tabs .active .dropdown-toggle .caret, -.nav-pills .active .dropdown-toggle .caret { - border-top: 4px solid #005580; -} -.nav > .dropdown.active > a:hover { - color: #005580; - cursor: pointer; -} -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > .open.active > a:hover { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} -.nav .open .caret, -.nav .open.active .caret, -.nav .open a:hover .caret { - border-top-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} -.tabs-stacked .open > a:hover { - border-color: #999999; -} -.tabbable { - *zoom: 1; -} -.tabbable:before, -.tabbable:after { - display: table; - content: ""; -} -.tabbable:after { - clear: both; -} -.tab-content { - overflow: hidden; -} -.tabs-below .nav-tabs, -.tabs-right .nav-tabs, -.tabs-left .nav-tabs { - border-bottom: 0; -} -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} -.tab-content > .active, -.pill-content > .active { - display: block; -} -.tabs-below .nav-tabs { - border-top: 1px solid #ddd; -} -.tabs-below .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} -.tabs-below .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-below .nav-tabs > li > a:hover { - border-bottom-color: transparent; - border-top-color: #ddd; -} -.tabs-below .nav-tabs .active > a, -.tabs-below .nav-tabs .active > a:hover { - border-color: transparent #ddd #ddd #ddd; -} -.tabs-left .nav-tabs > li, -.tabs-right .nav-tabs > li { - float: none; -} -.tabs-left .nav-tabs > li > a, -.tabs-right .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} -.tabs-left .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} -.tabs-left .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-left .nav-tabs > li > a:hover { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} -.tabs-left .nav-tabs .active > a, -.tabs-left .nav-tabs .active > a:hover { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} -.tabs-right .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} -.tabs-right .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-right .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} -.tabs-right .nav-tabs .active > a, -.tabs-right .nav-tabs .active > a:hover { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} -.navbar { - overflow: visible; - margin-bottom: 18px; -} -.navbar-inner { - padding-left: 20px; - padding-right: 20px; - background-color: #2c2c2c; - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); -} -.btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-left: 5px; - margin-right: 5px; - background-color: #2c2c2c; - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} -.btn-navbar:hover, -.btn-navbar:active, -.btn-navbar.active, -.btn-navbar.disabled, -.btn-navbar[disabled] { - background-color: #222222; -} -.btn-navbar:active, -.btn-navbar.active { - background-color: #080808 \9; -} -.btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} -.nav-collapse.collapse { - height: auto; -} -.navbar .brand:hover { - text-decoration: none; -} -.navbar .brand { - float: left; - display: block; - padding: 8px 20px 12px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - line-height: 1; - color: #ffffff; -} -.navbar .navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #999999; -} -.navbar .navbar-text a:hover { - color: #ffffff; - background-color: transparent; -} -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} -.navbar .btn-group .btn { - margin-top: 0; -} -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} -.navbar-form:before, -.navbar-form:after { - display: table; - content: ""; -} -.navbar-form:after { - clear: both; -} -.navbar-form input, -.navbar-form select { - display: inline-block; - margin-top: 5px; - margin-bottom: 0; -} -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 6px; - white-space: nowrap; -} -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} -.navbar-search { - position: relative; - float: left; - margin-top: 6px; - margin-bottom: 0; -} -.navbar-search .search-query { - padding: 4px 9px; + color: #333333; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; - font-weight: normal; - line-height: 1; - color: #ffffff; - color: rgba(255, 255, 255, 0.75); - background: #666; - background: rgba(255, 255, 255, 0.3); - border: 1px solid #111; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -ms-transition: none; - -o-transition: none; - transition: none; -} -.navbar-search .search-query :-moz-placeholder { - color: #eeeeee; -} -.navbar-search .search-query ::-webkit-input-placeholder { - color: #eeeeee; -} -.navbar-search .search-query:hover { - color: #ffffff; - background-color: #999999; - background-color: rgba(255, 255, 255, 0.5); -} -.navbar-search .search-query:focus, -.navbar-search .search-query.focused { - padding: 5px 10px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - outline: 0; -} -.navbar-fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} -.navbar-fixed-top .navbar-inner { - padding-left: 0; - padding-right: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar .nav { + line-height: 1.5; +} +.datepicker.dropdown-menu th, +.datepicker.datepicker-inline th, +.datepicker.dropdown-menu td, +.datepicker.datepicker-inline td { + padding: 0px 5px; +} + +.chart { + height: inherit; + width: inherit; + min-height: inherit; + min-width: inherit; } + .chart .tooltip_detail { + position: absolute; + z-index: 2; + border-radius: 3px; + padding: 0.25em; + font-size: 12px; + font-family: Arial, sans-serif; + color: white; + border: 1px solid rgba(0, 0, 0, 0.4); + margin-left: 1em; + margin-top: -1em; + white-space: nowrap; + background: rgba(0, 0, 0, 0.8); } + .chart .tooltip_detail:before { + content: "\25c2"; + position: absolute; + left: -0.5em; + color: rgba(0, 0, 0, 0.7); + width: 0; + top: 12px; } + +.overview_chart { + width: 214px; + height: 81px; } + .overview_chart .chart_container { + width: 140px; + min-width: 140px; } + .overview_chart .chart_container .chart svg { + padding-right: 4px !important; } + .overview_chart .chart_container .chart .detail .dot.active { + box-sizing: content-box; } + .overview_chart .bar_chart_container { + position: relative; + width: 74px; + min-width: 74px; } + .overview_chart .bar_chart_container, .overview_chart .chart_container { + float: left; + min-height: 81px; + height: 81px; } + .overview_chart .bar_chart_container .chart, + .overview_chart .chart_container .chart { + height: inherit; + width: inherit; + min-height: inherit; + min-width: inherit; } + .overview_chart .bar_chart_container .chart .modal-backdrop, + .overview_chart .chart_container .chart .modal-backdrop { + min-height: inherit; + min-width: inherit; } + .overview_chart .tooltip_detail { + position: absolute; + z-index: 2; + border-radius: 3px; + padding: 0.25em; + font-size: 12px; + font-family: Arial, sans-serif; + color: white; + border: 1px solid rgba(0, 0, 0, 0.4); + margin-left: 1em; + margin-top: -1em; + white-space: nowrap; + background: rgba(0, 0, 0, 0.8); } + .overview_chart .tooltip_detail:before { + content: "\25c2"; + position: absolute; + left: -0.5em; + color: rgba(0, 0, 0, 0.7); + width: 0; + top: 12px; } + +.chart_container { position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} -.navbar .nav.pull-right { - float: right; -} -.navbar .nav > li { - display: block; - float: left; -} -.navbar .nav > li > a { - float: none; - padding: 10px 10px 11px; - line-height: 19px; - color: #999999; - text-decoration: none; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.navbar .nav > li > a:hover { - background-color: transparent; - color: #ffffff; - text-decoration: none; -} -.navbar .nav .active > a, -.navbar .nav .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #222222; -} -.navbar .divider-vertical { - height: 40px; - width: 1px; - margin: 0 9px; - overflow: hidden; - background-color: #222222; - border-right: 1px solid #333333; -} -.navbar .nav.pull-right { - margin-left: 10px; - margin-right: 0; -} -.navbar .dropdown-menu { - margin-top: 1px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.navbar .dropdown-menu:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; - top: -7px; - left: 9px; -} -.navbar .dropdown-menu:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - position: absolute; - top: -6px; - left: 10px; -} -.navbar .nav .dropdown-toggle .caret, -.navbar .nav .open.dropdown .caret { - border-top-color: #ffffff; -} -.navbar .nav .active .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.navbar .nav .open > .dropdown-toggle, -.navbar .nav .active > .dropdown-toggle, -.navbar .nav .open.active > .dropdown-toggle { - background-color: transparent; -} -.navbar .nav .active > .dropdown-toggle:hover { - color: #ffffff; -} -.navbar .nav.pull-right .dropdown-menu { - left: auto; - right: 0; -} -.navbar .nav.pull-right .dropdown-menu:before { - left: auto; - right: 12px; -} -.navbar .nav.pull-right .dropdown-menu:after { - left: auto; - right: 13px; -} -.breadcrumb { - padding: 7px 14px; - margin: 0 0 18px; - background-color: #fbfbfb; - background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); - background-image: linear-gradient(top, #ffffff, #f5f5f5); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); - border: 1px solid #ddd; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} -.breadcrumb li { - display: inline-block; - text-shadow: 0 1px 0 #ffffff; -} -.breadcrumb .divider { - padding: 0 5px; - color: #999999; -} -.breadcrumb .active a { - color: #333333; -} -.pagination { - height: 36px; - margin: 18px 0; -} -.pagination ul { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - margin-left: 0; - margin-bottom: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} -.pagination li { - display: inline; -} -.pagination a { - float: left; - padding: 0 14px; - line-height: 34px; - text-decoration: none; - border: 1px solid #ddd; - border-left-width: 0; -} -.pagination a:hover, -.pagination .active a { - background-color: #f5f5f5; -} -.pagination .active a { - color: #999999; - cursor: default; -} -.pagination .disabled a, -.pagination .disabled a:hover { - color: #999999; - background-color: transparent; - cursor: default; -} -.pagination li:first-child a { - border-left-width: 1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.pagination li:last-child a { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.pagination-centered { - text-align: center; -} -.pagination-right { - text-align: right; -} -.pager { - margin-left: 0; - margin-bottom: 18px; - list-style: none; - text-align: center; - *zoom: 1; -} -.pager:before, -.pager:after { - display: table; - content: ""; -} -.pager:after { - clear: both; -} -.pager li { - display: inline; -} -.pager a { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.pager a:hover { - text-decoration: none; - background-color: #f5f5f5; -} -.pager .next a { - float: right; -} -.pager .previous a { - float: left; -} -.modal-open .dropdown-menu { - z-index: 2050; -} -.modal-open .dropdown.open { - *z-index: 2050; -} -.modal-open .popover { - z-index: 2060; -} -.modal-open .tooltip { - z-index: 2070; -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.modal { - position: fixed; - top: 50%; - left: 50%; - z-index: 1050; - max-height: 500px; - overflow: auto; - width: 560px; - margin: -250px 0 0 -280px; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - /* IE6-7 */ - - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} -.modal.fade { - -webkit-transition: opacity .3s linear, top .3s ease-out; - -moz-transition: opacity .3s linear, top .3s ease-out; - -ms-transition: opacity .3s linear, top .3s ease-out; - -o-transition: opacity .3s linear, top .3s ease-out; - transition: opacity .3s linear, top .3s ease-out; - top: -25%; -} -.modal.fade.in { - top: 50%; -} -.modal-header { - padding: 9px 15px 9px 15px; -} -.modal-header .close { - margin-top: 2px; -} - -.modal-body { - padding: 15px 20px 30px 20px; -} -.modal-body .modal-form { - margin-bottom: 0; -} -.modal-footer { - padding: 14px 20px 15px; - margin-bottom: 0; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; - *zoom: 1; -} -.modal-footer:before, -.modal-footer:after { - display: table; - content: ""; -} -.modal-footer:after { - clear: both; -} -.modal-footer .btn { - float: right; - margin-left: 5px; - margin-bottom: 0; -} -.tooltip { - position: absolute; - z-index: 1020; - display: block; - visibility: visible; - padding: 5px; - font-size: 11px; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.tooltip.top { - margin-top: -2px; -} -.tooltip.right { - margin-left: 2px; -} -.tooltip.bottom { - margin-top: 2px; -} -.tooltip.left { - margin-left: -2px; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #000000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: 5px solid #000000; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - padding: 5px; -} -.popover.top { - margin-top: -5px; -} -.popover.right { - margin-left: 5px; -} -.popover.bottom { - margin-top: 5px; -} -.popover.left { - margin-left: -5px; -} -.popover.top .arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #000000; -} -.popover.right .arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: 5px solid #000000; -} -.popover.bottom .arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; -} -.popover.left .arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} -.popover .arrow { - position: absolute; - width: 0; - height: 0; -} -.popover-inner { - padding: 3px; - width: 280px; - overflow: hidden; - background: #000000; - background: rgba(0, 0, 0, 0.8); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -} -.popover-title { - padding: 9px 15px; - line-height: 1; - background-color: #f5f5f5; - border-bottom: 1px solid #eee; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.popover-content { - padding: 14px; - background-color: #ffffff; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} -.popover-content p, -.popover-content ul, -.popover-content ol { - margin-bottom: 0; -} -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} -.thumbnails:before, -.thumbnails:after { - display: table; - content: ""; -} -.thumbnails:after { - clear: both; -} -.thumbnails > li { - float: left; - margin: 0 0 18px 20px; -} -.thumbnail { - display: block; - padding: 4px; - line-height: 1; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); -} -a.thumbnail:hover { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} -.thumbnail > img { - display: block; - max-width: 100%; - margin-left: auto; - margin-right: auto; -} -.thumbnail .caption { - padding: 9px; -} -.label { - padding: 2px 4px 3px; - font-size: 11.049999999999999px; - font-weight: bold; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #999999; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.label:hover { - color: #ffffff; - text-decoration: none; -} -.label-important { - background-color: #b94a48; -} -.label-important:hover { - background-color: #953b39; -} -.label-warning { - background-color: #f89406; -} -.label-warning:hover { - background-color: #c67605; -} -.label-success { - background-color: #468847; -} -.label-success:hover { - background-color: #356635; -} -.label-info { - background-color: #3a87ad; -} -.label-info:hover { - background-color: #2d6987; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@-moz-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -.progress { - overflow: hidden; - height: 18px; - margin-bottom: 18px; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(top, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.progress .bar { - width: 0%; - height: 18px; - color: #ffffff; - font-size: 12px; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -ms-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(top, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -ms-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} -.progress-striped .bar { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-danger .bar { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); -} -.progress-danger.progress-striped .bar { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-success .bar { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -ms-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(top, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); -} -.progress-success.progress-striped .bar { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-info .bar { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(top, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); -} -.progress-info.progress-striped .bar { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.accordion { - margin-bottom: 18px; -} -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.accordion-heading { - border-bottom: 0; -} -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} -.carousel { - position: relative; - margin-bottom: 18px; - line-height: 1; -} -.carousel-inner { - overflow: hidden; - width: 100%; - position: relative; -} -.carousel .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -ms-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} -.carousel .item > img { - display: block; - line-height: 1; -} -.carousel .active, -.carousel .next, -.carousel .prev { - display: block; -} -.carousel .active { - left: 0; -} -.carousel .next, -.carousel .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel .next { - left: 100%; -} -.carousel .prev { - left: -100%; -} -.carousel .next.left, -.carousel .prev.right { - left: 0; -} -.carousel .active.left { - left: -100%; -} -.carousel .active.right { - left: 100%; -} -.carousel-control { + min-height: 300px; + min-width: 400px; } + .chart_container .chart { + position: relative; + min-height: 300px; + min-width: 400px; } + .chart_container .chart .detail .x_label { + display: none; } + .chart_container .chart .detail .item { + line-height: 1.4; + padding: 0.5em; } + .chart_container .chart .detail .date { + color: #a0a0a0; } + .chart_container .chart .modal-backdrop { + position: absolute; + opacity: 0.5; + top: 0; + left: 0; + min-height: 300px; + min-width: 400px; } + .chart_container .chart svg { + padding: 0 0 5px 0; } + .chart_container .detail_swatch { + float: right; + display: inline-block; + width: 10px; + height: 10px; + margin: 0 4px 0 0; } + +.legend_container { + min-width: 90px; + margin-left: 20px; } + .legend_container .swatch { + float: right; + display: inline-block; + width: 10px; + height: 10px; + margin: 0 4px 0 0; } + .legend_container .modal-backdrop { + position: absolute; + opacity: 0.5; + top: 0; + left: 0; + min-width: 90px; } + .legend_container .rickshaw_legend.disabled { + padding: 0; } + +.spinner_wrapper { position: absolute; top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} -.carousel-control.right { - left: auto; - right: 15px; -} -.carousel-control:hover { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} -.carousel-caption { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 10px 15px 5px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} -.carousel-caption h4, -.carousel-caption p { - color: #ffffff; -} -.hero-unit { - padding: 60px; - margin-bottom: 30px; - background-color: #f5f5f5; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; -} -.hero-unit p { - font-size: 18px; - font-weight: 200; - line-height: 27px; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.hide { - display: none; -} -.show { - display: block; -} -.invisible { - visibility: hidden; -} -/* new clearfix */ -.clearfix:after { - visibility: hidden; - display: block; - font-size: 0; - content: " "; - clear: both; - height: 0; -} -* html .clearfix { - zoom: 1; -} -/* IE6 */ -*:first-child + html .clearfix { - zoom: 1; -} -/* IE7 */ -@font-face { - font-family: 'anivers'; - src: url('/static/dashboard/fonts/Anivers_Regular-webfont.eot?5f61443eb372'); - src: url('/static/dashboard/fonts/Anivers_Regular-webfont.eot?iefix') format('eot'), url('/static/dashboard/fonts/Anivers_Regular-webfont.woff?2c3db88030ec') format('woff'), url('/static/dashboard/fonts/Anivers_Regular-webfont.ttf?6a7822aa21cf') format('truetype'), url('/static/dashboard/fonts/Anivers_Regular-webfont.svg#webfont3JLVF59W') format('svg'); - font-weight: normal; - font-style: normal; -} -a { - color: #005D9D; -} -ul { - list-style: none; - margin: 0; -} -dt { - font-weight: bold; -} -#main_content { - padding-left: 247px; - padding-right: 20px; - min-width: 840px; -} -.topbar { - background: #f2f2f2; - border-bottom: 1px solid #e5e5e5; - padding: 10px 25px; - margin-top: 0; - margin-left: -25px; - margin-bottom: 66px; - margin-right: -25px; - min-width: 700px; -} - -.topbar .switcher_bar { - display: inline-block; - height: auto; - width: 160px; - background-position: 140px center; - margin-bottom: 0; - font-size: 11px; - margin-left: 20px; - padding: 0; - background-image: url('../../dashboard/img/drop_arrow.png?2ec1100baed3'); - border: 1px solid #c0d9e4; - background-color: #e9f5fa; - background-repeat: no-repeat; -} -.topbar .switcher_bar a { - padding: 2px 10px 1px; - margin-left: 0; - display: block; -} -.topbar .switcher_bar ul { - width: 130px; -} - -#user_info > span { - margin-right: 12px; -} -#user_info > a { - border: 1px solid #d9dfe3; - background: #fafafa; - padding: 12px 12px 8px 12px; - margin-left: -6px; -} - -#user_info > a:hover { - border: 1px solid #c3ced7; - background: #f7f8f9; - color: #0074cd; -} - -.page-header { - margin: 0; - padding: 0; - border: 0; - font-family: anivers; -} -h2 { - color: #6a6a6a; - font-size: 30px; - font-weight: normal; -} -body { - background-color: #fff; - min-width: 890px; -} - - -/* Login Splash Page */ -#splash .login { - background: url(../img/OracleSolaris_login_banner.png) no-repeat; - position: absolute; - top: 80px; - left: 50%; - margin: 0 0 0 -195px; - padding-top: 79px; - width: 390px; - border: 1px solid #e1e1e1; - max-height: none; - /*-webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px;*/ - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} -/* -#splash .login:before { - content: url(../img/OpenStack_Dashboard_txt.png); - position: relative; - top: -28px; - left: 148px; - font-size: 15px; - color: #454545; - background: #F5F5F5; -}*/ - -#splash .login .modal-header { - height: 10px; - padding-top: 0px; - padding-bottom: 15px; -} - -/*#splash .login .modal-header:before { - content: "Sign In"; - position: relative; - top: 24px; - width: 150px; - background: #FFFFFF; - font-size: 18px; - color: #FFFFFF; - font-weight: bold; -}*/ - -#splash .login .modal-header h3 { - color: #FFFFFF; -} - -#splash .login form, -#splash .login .modal-header { - background-color: #fff; -} - -#splash .login input { - width: 340px; -} -#splash .login select { - width: 360px; -} -#splash .help-block { - display: none; -} -#create_container_form .modal-footer { - margin-top: 190px; -} -.nav li a { - color: #8EACB7; - text-shadow: none; -} -.nav li a.dropdown-toggle { - color: #8EACB7; -} -.nav li a.dropdown-toggle:hover { - color: #005580; -} -.container-fluid { - padding-left: 0; -} -.sidebar { - float: left; -} -.sidebar h4 { - margin-left: 14px; - color: #999; -} -.sidebar .nav-tabs { - margin-top: -34px; -} -.sidebar .nav-tabs li.active a { - background-color: #edf9ff; -} -h1.brand { - width: 100%; - margin: 0; - background-color: #f5f5f5; - padding-bottom: 40px; -} -h1.brand a { - display: block; - float: left; -} -/* Tenant Dropdown */ -a.current_item { - width: 163px; - float: left; -} -a.current_item:hover { - text-decoration: none; -} -a.current_item:hover h3, -a.current_item:hover h4 { - color: #39738c; -} -.sidebar .switcher_bar { - margin-left: 36px; - margin-bottom: 24px; -} -.sidebar .switcher_bar a.dropdown-toggle { - display: block; - padding: 5px 0; - background-image: url('../../dashboard/img/drop_arrow.png'); - border: 1px solid #c0d9e4; - background-color: #e9f5fa; - background-repeat: no-repeat; - background-position: 167px 23px; -} -.sidebar .switcher_bar a.dropdown-toggle:hover { - text-decoration: none; - background-color: #cde8f4; -} -.sidebar .switcher_bar:focus { - outline: none; -} -.sidebar .switcher_bar h3 { - color: #454545; - line-height: 16px; - font-size: 16px; - margin: 0; - padding: 0; -} -.sidebar .switcher_bar h4 { - color: #454545; - font-size: 9px; - text-transform: uppercase; - font-weight: normal; - padding: 0; -} -.sidebar .switcher_bar ul { - border: 1px solid #c0d9e4; - margin-left: -1px; - width: 190px; -} -.sidebar .switcher_bar li a:hover { - background: #92d6f1; -} -#usage { - margin-bottom: 25px; - height: 125px; -} -.usage_block { - background: #e8f8ff; - color: #84b6c5; - border: 1px solid #afe3fb; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - float: left; - width: 29%; - margin-right: 5%; - min-height: 125px; -} -.usage_block.last { - margin-right: 0; -} -.usage_block h3 { - background: #cef0ff; - color: #4fa5bf; - font-weight: normal; - padding: 0 0 0 10px; - border-bottom: 1px solid #c6e7f5; - -webkit-border-top-left-radius: 5px; - -webkit-border-top-right-radius: 5px; - -moz-border-radius-topleft: 5px; - -moz-border-radius-topright: 5px; - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} -.usage_block ul { - margin: 10px; -} -.usage_block .quantity { - font-size: 25px; -} -.usage_block li { - font-size: 11px; - margin: 0 0 15px 0; -} -.usage_block .unit { - font-size: 11px; - text-transform: uppercase; - padding: 0 0 0 1px; -} -.table-bordered { - border: none; -} -.table_header { - min-height: 35px; - padding: 5px 0; -} -.table_caption th { - background-color: transparent; - border: none; -} -.table-bordered tr.table_caption + tr th { - /*border-top: 1px solid #D5DFE6; - border-bottom: 1px solid #D5DFE6;*/ - border: 1px solid #D5DFE6; - border-right: 1px solid transparent; -} -.table-bordered tr.table_caption + tr th:first-child, -.table-bordered tr.table_caption + tr th.hide + th { - /*-moz-border-radius-topleft: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px;*/ - border-left: 1px solid #D5DFE6; -} -.table-bordered tr.table_caption + tr th:last-child { - /*-moz-border-radius-topright: 4px; - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px;*/ - border-right: 1px solid #D5DFE6; -} -.table-bordered tbody tr td:first-child, -.table-bordered tfoot tr td:first-child { - border-left: 1px solid #D5DFE6; -} -.table-bordered tbody tr td:last-child, -.table-bordered tfoot tr td:last-child { - border-right: 1px solid #D5DFE6; -} -.table-bordered tfoot tr td:first-child { - border-bottom: 1px solid #D5DFE6; - /*-moz-border-radius-bottomleft: 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px;*/ -} -.table-bordered tfoot tr td:last-child { - border-bottom: 1px solid #D5DFE6; - /*-moz-border-radius-bottomright: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px;*/ -} -.table_title h3, -.table_header h3 { - font-family: anivers; - font-weight: normal; - font-size: 24px; - margin-bottom: 5px; - float: left; -} -.table th.header { - cursor: pointer; -} -.table th.header:hover { - background-color: #e8e8e8; -} -.table tbody td.anchor a { - display: block; - padding: 8px; -} -.table tr.table_caption th.header:hover { - background-color: transparent; - cursor: default; -} -.table th.headerSortUp:hover, -.table th.headerSortDown:hover { - background-color: #DAE9F5; -} -.table th.headerSortUp, -.table th.headerSortDown { - background-color: #DAE9F5; - background-repeat: no-repeat; - background-position: 98% center; -} -.table th.headerSortDown { - background-image: url('../../dashboard/img/drop_arrow.png?2ec1100baed3'); -} -.table th.headerSortUp { - background-image: url('../../dashboard/img/up_arrow.png?4293b62aa222'); -} -.table tr.summation td:first-child, -.table tr.summation td:last-child { - border-radius: 0; - border-bottom: 0 none; -} -th { - background: #F1F3F4; -} -td.anchor { - padding: 0; -} -small { - font-size: 11px; -} -.main_nav { - list-style: none; - width: 227px; - float: left; - margin: 10px 0 20px 0; -} -.main_nav a { - color: #999; - width: 185px; - padding: 10px; - display: block; - margin-left: 20px; -} -.main_nav a.active { - background: #fff; - border: 2px solid #d8d8d8; - border-right: 0; - border-bottom-color: #ccc; -} -table form { - margin-bottom: 0; - width: 1px; -} -.messages { - position: fixed; - z-index: 9999; - top: 20px; - right: 20px; - width: 300px; -} -.messages .alert-block { - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -} -.messages .alert-block.alert-error { - border: 1px solid #9d261d; -} -.messages .alert-block.alert-success { - border: 1px solid #46a546; -} -.alert-block .alert-actions { - margin-top: -23px; - margin-right: -23px; -} -.modal > form, -.login > form, -.alert-actions > form { - margin-bottom: 0; -} -.alert-block p { - overflow: hidden; - word-wrap: break-word; -} -.alert-block p:last-child { - margin-bottom: 0; -} -#actions.single { - width: 90px; -} -.table-striped tr td { - transition: background 0.2s; - -webkit-transition: background 0.2s; - -moz-transition: background 0.2s; - -o-transition: background 0.2s; -} -.inspect { - float: left; - display: block; - margin-top: 5px; - margin-right: 25px; -} -.table { - margin-bottom: 25px; -} -.table tr td { - vertical-align: middle; -} -.table tr.empty td { - text-align: center; - font-size: 12px; -} -.table tfoot tr td { - border-top: 1px solid transparent; - background-color: #F1F1F1; - font-size: 11px; - color: #000000; - line-height: 14px; - font-weight: bold; -} -.table_actions { - float: right; - min-width: 400px; -} -.table_actions .table_search { - /*display: inline-block;*/ - padding-bottom: 8px; - margin-left: 142px; - width: 267px; -} - -.table_actions .btn-group { - padding-bottom: 8px; -} - -.table_search input { - background: url('../../dashboard/img/search.png?781fb162b111') no-repeat 195px 5px; - display: inline-block; - margin-bottom: 0; -} -.table_actions a, -.table_actions button { - float: right; - margin-left: 5px; -} -.table_actions button.filter { - margin-left: 0; -} -.table_header .table_actions { - min-width: 0px; -} -.table_header .table_actions a, -.table_header .table_actions button { - display: inline-block; - /*float: right;*/ -} -.table_actions form { - float: right; - margin-left: 10px; -} -.hidden { - display: none; -} -.table-striped tbody tr.status_unknown:nth-child(odd) td { - background-color: #ffffb5; -} -.table-striped tbody tr.status_unknown:nth-child(even) td { - background-color: #ffffc6; -} -.nowrap-col { - white-space: nowrap; -} -.overview { - font-size: 24px; -} -#monitoring { - background: #f8f8f8; - font-size: 14px; - height: 20px; - margin: -18px 0 25px; - padding: 10px; - border: 1px solid #e1e1e1; - font-family: "anivers"; -} -#monitoring h3 { - font-size: 14px; - font-weight: normal; - float: left; - line-height: 18px; -} -#external_links, -#external_links li { - float: left; -} -#external_links li { - margin: 0 0 0 15px; -} -/* Forms */ -form label { - text-align: left; - color: #555; - font-weight: bold; -} -.modal { - width: 700px; - max-height: none; - /* Prevents large modals from scrolling unnecessarily */ - - top: 80px; - margin-top: 0; - position: absolute; -} -.modal.loading { - width: 150px; - height: 150px; - margin: 0 auto; - overflow: hidden; -} -.modal.loading p { - text-align: center; - position: absolute; - bottom: 0; - width: 150px; -} -form.horizontal .form-field { - float: left; -} -form.horizontal.split_half .form-field { - width: 334px; - /* Fits 2 fields to a row */ - -} -form.horizontal.split_quarter .form-field { - width: 167px; - /* Fits 4 fields to a row */ - -} -form.horizontal.split_five .form-field { - width: 133px; - /* Fits 5 fields to a row */ - -} -form.horizontal fieldset { - width: 100%; -} -.modal-body { - overflow-y: visible; - max-height: none; -} -.modal-body table { - margin-bottom: 30px; -} -.modal-body ~ hr { - margin-bottom: 0; -} - -.modal-body .nav-tabs > li > a { - font-size: 14px; - width: auto; - padding-left: 12px; - padding-right: 12px; -} - -.static_page { - float: left; - width: 700px; - background-color: #FFF; - border: 1px solid #DDD; -} -.static_page > form { - margin-bottom: 0; -} -.left { - float: left; - width: 315px; - margin-right: 15px; -} -.left form { - margin: 0; -} -.right { - float: left; - width: 330px; -} + left: 40%; } + + .rickshaw_legend { + background: white; + color: #404040; } + .rickshaw_legend .action { + text-decoration: none; + color: black; } .workflow ul.nav-tabs { - padding: 0 1px; - border-bottom: 1px solid #C4CED8; -} - -.workflow ul.nav-tabs > li > a { - color: #005D9D; - border: 1px solid transparent; - margin-right: 1px; -} - -.workflow ul.nav-tabs > li > a:hover { - background: #FFFFFF; - border-bottom: 1px solid #C4CED8; - -} - -.workflow ul.nav-tabs > li.active > a, -.workflow ul.nav-tabs > li.active > a:hover -{ - background: url(../img/content_tab_bkgd_selected.png) repeat-x; - font-weight: bold; - border: 1px solid #C4CED8; - border-top: 1px solid #1274D1; - border-bottom: 1px solid #FFFFFF; -} - -.workflow td.actions { - vertical-align: top; - width: 308px; - padding-right: 10px; -} -.workflow td.help_text { - vertical-align: top; - width: 340px; - padding-left: 10px; - border-left: 1px solid #DDD; -} + padding: 0 13px; } + .workflow td.actions { + vertical-align: top; + width: 308px; + padding-right: 10px; } + .workflow td.help_text { + vertical-align: top; + width: 340px; + padding-left: 10px; + border-left: 1px solid #dddddd; } .workflow fieldset > table { - margin-bottom: 0; -} -.clear { - clear: both; - width: 0; - height: 0; - padding: 0; - margin: 0; -} -.modal-body fieldset { - margin: 0; - padding: 0; -} -.modal-body fieldset ul { - width: 90%; -} -.modal-body fieldset .form-field input, -.modal-body fieldset .form-field textarea { - width: 298px; -} -.modal-body fieldset .form-field select { - width: 308px; -} -.modal-body fieldset .form-field textarea { - height: 36px; -} -.modal-footer input { - width: auto; -} -.modal-body .modal-footer { - width: 670px; - margin-left: -25px; - margin-right: -15px; -} -.modal-footer a.close { - margin-top: 0; - margin-right: 5px; - font-size: 12px; - color: #000000; - font-weight: bold; - filter: alpha(opacity=100); - -khtml-opacity: 1; - -moz-opacity: 1; - opacity: 1; - background: -moz-linear-gradient(top, #f1f3f4, #e3e8ea); - background: -ms-linear-gradient(top, #f1f3f4, #e3e8ea); - background: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f3f4), to(#e3e8ea)); - background: -webkit-linear-gradient(top, #f1f3f4, #e3e8ea); - background: -o-linear-gradient(top, #f1f3f4, #e3e8ea); - background: linear-gradient(top, #f1f3f4, #e3e8ea); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - /*border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);*/ - border: 1px solid #C3CED7; -} -.modal-footer a.close:hover { - text-decoration: none; - background: -moz-linear-gradient(top, #f8f9fa, #f1f4f5); - background: -ms-linear-gradient(top, #f8f9fa, #f1f4f5); - background: -webkit-gradient(linear, 0 0, 0 100%, from(#f8f9fa), to(#f1f4f5)); - background: -webkit-linear-gradient(top, #f8f9fa, #f1f4f5); - background: -o-linear-gradient(top, #f8f9fa, #f1f4f5); - background: linear-gradient(top, #f8f9fa, #f1f4f5); -} -.modal-body .help-block { - text-align: left; - float: left; - width: 100%; - margin-bottom: 10px; -} -#create_keypair_modal .clearfix { - margin-bottom: 115px; -} -#actions { - width: 90px; -} -#actions .btn { - margin-bottom: 5px; -} -#actions a.btn { - width: 70px; -} -#actions input.btn { - text-align: left; -} -#images #actions { - width: 100px; -} -/*New List Patches*/ -.details-modal .modal-body { - padding-bottom: 20px; -} -.form-inline { - display: inline; -} -.form-inline input, -.form-inline button, -.form-inline a.btn { - margin-left: 5px; -} -td.select { - width: 10px; -} -/* Actions dropdown */ -th.actions_column { - width: 150px; -} -td.actions_column { - width: 150px; - padding: 10px; - position: relative; - min-width: 140px; - min-height: 20px; -} -td.actions_column .row_actions a, -td.actions_column .row_actions input, -td.actions_column .row_actions button { - background: none; - float: none; - display: block; - padding: 5px 10px; - color: black; - text-align: left; - border-radius: 0; - border: 0 none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -td.actions_column .row_actions .hide { - display: none; -} -/* Makes size consistent across browsers when mixing "btn-group" and "small" */ -.btn.hide, -.btn-group .hide { - display: none; -} -.btn-group .dropdown-toggle:focus { - outline: none; -} -.dropdown-menu button { - line-height: 18px; - /* Matches rule for ".dropdown-menu a" in bootstrap */ - - width: 100%; -} -.btn-group .dropdown-menu .btn { - border-radius: 0; -} -.dropdown-menu .btn.btn-danger, -.dropdown-menu .btn.btn-danger:hover, -.dropdown-menu .btn.btn-success, -.dropdown-menu .btn.btn-success:hover, -.dropdown-menu .btn.btn-info, -.dropdown-menu .btn.btn-info:hover { - text-shadow: none; - /* remove default bootstrap shadowing from button text. */ - -} -.dropdown-menu li:hover { - background: none; -} -.dropdown-menu li.divider:hover { - background-color: #E5E5E5; -} -td.actions_column .dropdown-menu a:hover, -td.actions_column .dropdown-menu button:hover { - background-color: #EBECED; -} -.dropdown-menu .btn.btn-danger { - /*color: #C43C35;*/ - font-weight: 400; -} -.dropdown-menu .btn.btn-danger:hover { - /*background-color: #f6e0df;*/ - background-color: #EBECED; -} -/* Overrides for single-action rows (no dropdown) */ -tr td.actions_column ul.row_actions.single, -tr:hover td.actions_column ul.row_actions.single, -td.actions_column ul.row_actions.single, -td.actions_column ul.row_actions.single:hover { - border: none; -} -td.actions_column ul.row_actions.single li.action { - display: block; -} -td.actions_column ul.row_actions.single li.action:hover { - background-color: transparent; -} -td.actions_column ul.row_actions.single a, -td.actions_column ul.row_actions.single input, -td.actions_column ul.row_actions.single button { - color: #43a1d6; -} -td.actions_column ul.row_actions.single a:hover, -td.actions_column ul.row_actions.single input:hover, -td.actions_column ul.row_actions.single button:hover { - color: black; -} -th.multi_select_column, -td.multi_select_column { - width: 25px; -} -th.multi_select_column, -td.multi_select_column { - text-align: center; -} -.table-fixed { - table-layout: fixed; -} -.table input[type="checkbox"] { - display: inline; -} -div.input input[type="checkbox"] { - float: left; - width: 25px; -} -.table_title a { - font-size: 11px; - float: right; - margin-left: 10px; - margin-top: 10px; -} -tr.terminated { - color: #999999; -} -#instance_tabs { - float: left; - width: 100%; - border-bottom: 1px solid #e1e1e1; -} -#instance_tabs li a { - background: #f2f2f2; - display: block; - font-size: 14px; - float: left; - padding: 5px 10px; - margin-right: 10px; - border: 1px solid #e1e1e1; - border-bottom: none; -} -#instance_tabs li.active a { - background: #fff; - padding-bottom: 8px; - margin-bottom: -5px; -} - -#main_content .nav-tabs { - margin: 0px 0px 0px 1px; - padding: 0px; - -} - -#main_content .nav-tabs li a { - width: 130px; - font-size: 13px; - color: #005D9D; - border: 1px solid transparent; - margin-right: 1px; -} - -#main_content .nav-tabs li.active a { - width: 130px; - font-size: 13px; - color: #005D9D; - border: 1px solid #C4CED8; - border-bottom: 1px solid #FFFFFF; - border-top: 1px solid #FFFFFF; - font-weight: bold; - background: url(../img/content_tab_bkgd_selected.png) repeat-x; -} - -#main_content .tab-content { - border: 1px solid #D5DFE6; - padding: 0px 10px 10px 10px; - margin: 0px; -} - -#main_content .workflow .modal-body { - padding-left: 0; - padding-right: 0; -} -#main_content .workflow .modal-body .tab-content { - border-left: 0 none; - border-right: 0 none; - border-bottom: 0 none; -} -.tab_wrapper { - padding-top: 50px; -} -/* Fix tooltip z-index to show above modals. Bootstrap bug 582*/ -.tooltip { - z-index: 12000; -} -.volume_boot_disclosure { - font-weight: bold; - color: #555; - cursor: pointer; - background-image: url('../../dashboard/img/right_droparrow.png?b14134630332'); - background-repeat: no-repeat; - background-position: 130px center; -} -.volume_boot_disclosure.on { - width: 334px; - margin-bottom: 10px; - border-bottom: solid 1px #E1E1E1; - background-image: url('../../dashboard/img/drop_arrow.png?2ec1100baed3'); -} -form div.clearfix.error { - width: 308px; -} -.nav-tabs a { - cursor: pointer; -} -.nav-tabs li.error a { - color: #B94A48; -} -.nav-tabs li.error a:after { - content: "*"; -} -/* Region selector in header */ -#region_selector { - position: absolute; - z-index: 9999; - right: 0; - top: 24px; -} -#region_selector a { - margin-left: 0; -} -#region_selector ul { - float: left; - margin-left: 5px; - padding-right: 21px; - width: 125px; -} -#region_selector ul:hover a { - display: block; -} -#region_selector li a { - padding: 3px 3px 3px 5px; - display: none; - background: #E1E1E1; - margin-top: -10px; -} -#region_selector li:first-child p { - background: #ededed url('../../dashboard/img/drop_arrow.png?2ec1100baed3') no-repeat 106px 9px !important; - display: block; - border: 1px solid #e1e1e1; - padding: 5px; -} -iframe { - border: none; -} -.item_detail ul li label { - color: #000; - font-weight: bold; - display: block; - margin-top: 5px; -} -.progress_bar { - height: 100%; - width: 100%; - border: 1px solid #CCC; - background-color: #CCC; -} -.progress_bar_fill, -.progress_bar_selected { - height: 100%; - float: left; -} -.progress_bar_fill { - background-color: #666; -} -.progress_bar_selected { - background-color: #4790AE; - width: 0; -} -.progress_bar_over { - background-color: red; -} -.quota_title { - color: #999; - padding-bottom: 0; - margin-bottom: 8px; -} -.quota_title strong { - color: #000; -} -.quota_title strong span { + margin-bottom: 0; } + .workflow.wizard .row .btn { + float: none; + margin: 0; } + .workflow.wizard .row .next { + text-align: right; } + .workflow.wizard .nav-tabs.wizard-tabs { + border-bottom: 0; + background: #efefef; + padding: 0; } + .workflow.wizard .nav-tabs.wizard-tabs li { + margin-bottom: 0; + position: relative; } + .workflow.wizard .nav-tabs.wizard-tabs li:before { + position: absolute; + top: 0; + right: -20px; + z-index: 2; + display: block; + border: 20px solid transparent; + border-right: 0; + border-left: 20px solid #dddddd; + content: ''; } + .workflow.wizard .nav-tabs.wizard-tabs li:after { + position: absolute; + top: -2px; + right: -22px; + z-index: 1; + display: block; + border: 22px solid transparent; + border-right: 0; + border-left: 22px solid #ffffff; + content: ''; } + .workflow.wizard .nav-tabs.wizard-tabs li.active:before, + .workflow.wizard .nav-tabs.wizard-tabs li.done:before { + border-left: 20px solid #007acc; } + .workflow.wizard .nav-tabs.wizard-tabs li a { + border: 0; + border-radius: 0; + background: #dddddd; + color: #43a4d7; + padding: 0 15px; + padding-left: 35px; + line-height: 40px; + position: relative; + margin: 0; } + .workflow.wizard .nav-tabs.wizard-tabs li:first-child a { + padding-left: 15px; } + .workflow.wizard .nav-tabs.wizard-tabs li.active a { + background: #007acc; + color: #ffffff; } + .workflow.wizard .nav-tabs.wizard-tabs li.done a { + background: #007acc; } + .workflow.wizard label.error { + color: #d9534f; } + +@font-face { + font-family: 'FontAwesome'; + src: url('/static/horizon/lib/font-awesome/fonts/fontawesome-webfont.eot?v=4.1.0&90186830c9c5'); + src: url('/static/horizon/lib/font-awesome/fonts/fontawesome-webfont.eot?&90186830c9c5#iefix&v=4.1.0') format('embedded-opentype'), + url('/static/horizon/lib/font-awesome/fonts/fontawesome-webfont.woff?v=4.1.0&fdf491ce5ff5') format('woff'), + url('/static/horizon/lib/font-awesome/fonts/fontawesome-webfont.ttf?v=4.1.0&4f0022f25672') format('truetype'), + url('/static/horizon/lib/font-awesome/fonts/fontawesome-webfont.svg?v=4.1.0&776d58f453c8#fontawesomeregular') format('svg'); font-weight: normal; -} -.quota_title p { - float: right; - margin-bottom: 0; -} -.quota_bar { - height: 15px; - margin: -8px 0 8px; -} -div .flavor_table { - border: 1px solid #AAA; - width: 100%; - margin-bottom: 14px; -} -.flavor_table .flavor_name { - white-space: nowrap; - font-weight: bold; - text-align: left; - padding: 7px 12px 7px 7px; - width: 160px; -} -#main_content .row-fluid { - margin: 10px 0 20px; -} -#main_content .row-fluid:last-child { - margin-bottom: 0; -} -.header_rule { - margin: 0 0 10px; -} -.item_detail .detail_section { - margin-bottom: 25px; - float: left; - margin-right: 50px; -} -.error .help-inline { - background: #efdfdf; - border: 1px solid #ead5d8; - padding: 10px; - display: block; -} -label.log-length { - line-height: 28px; - margin-right: 10px; -} -.progress-success.bar { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -ms-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(top, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); -} -.progress_bar_fill.progress-warning.bar { - background-color: #898989; - background-image: -moz-linear-gradient(top, #999999, #333333); - background-image: -ms-linear-gradient(top, #999999, #333333); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#999999), to(#333333)); - background-image: -webkit-linear-gradient(top, #999999, #333333); - background-image: -o-linear-gradient(top, #999999, #333333); - background-image: linear-gradient(top, #999999, #333333); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#999999', endColorstr='#333333', GradientType=0); -} -.progress_bar_over.bar { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); -} -.split_five div.control-group input[type="text"], -.split_five div.control-group select { - width: 120px; -} -.warning { - background-color: #f2dede; - border-bottom: 1px solid #9d261d; - padding: 5px 10px; -} -.warning .warning-text { - text-align: center; -} -.warning .warning-text h3, -.warning .warning-text a { + font-style: normal; +} + +.fa { display: inline-block; -} -.warning .warning-text h3 { - vertical-align: bottom; -} -#admin_warning_detail ul { - list-style: circle; - padding-left: 20px; - margin-bottom: 10px; -} -.no_split { - margin-top: -60px; -} -/* Project Membership UI */ -.project_membership { - min-height: 200px; - /* Buttons */ - - /* Header */ - - /* 'Fake table' body */ - - /* User lists */ - - /* List filtering */ - - /* Role dropdown menus */ - -} -.project_membership .btn-group { - margin-left: 0px; - padding: 2px 10px 0 0; - margin-bottom: 0px; - border: 1px solid #DDD; - border-bottom: none; -} -.project_membership .btn-group .active { - float: right; -} -.project_membership a.btn-primary:hover { - background-color: #04C; -} -.project_membership .help_text { - margin-left: 15px; - margin-bottom: 15px; -} -.project_membership .users_title { - color: #555; - font-weight: bold; - padding-left: 10px; - float: left; -} -.project_membership input { - background: url('../../dashboard/img/search.png?781fb162b111') no-repeat 105px 5px whiteSmoke; -} -.membership .fake_table_header, -.project_membership .fake_table_header { - background-color: #F2F4F7; - width: 306px; - height: 38px; - padding-top: 10px; - border: 1px solid #D5DFE6; - border-bottom: none; -} -.membership .fake_table, -.project_membership .fake_table { - width: 315px; -} -.membership .fake_table ul.no_results, -.project_membership .left .fake_table ul.no_results { - width: 313px; - line-height: 36px; - border: 1px solid #d5dfe6; - -} -.membership .fake_table ul.btn-group:hover, -.project_membership .fake_table ul.btn-group:hover { - background-color: #DDD; -} -.membership .left .fake_table_header, -.project_membership .left .fake_table_header { - width: 313px; -} -.membership .right .fake_table_header, -.project_membership .right .fake_table_header { - width: 328px; -} -.membership .right .fake_table ul.no_results, -.project_membership .right .fake_table ul.no_results { - /*margin-left: -20px;*/ - line-height: 36px; - width: 328px; - border: 1px solid #d5dfe6; -} -ul.no_results li { - padding: 5px 12px; - height: 36px; - line-height: 36px; -} -.project_membership .member { - padding: 10px; - text-align: left; -} -.project_membership .project_members { - margin-left: -20px; -} -.membership .project_members ul.btn-group, -.project_membership .available_users ul.btn-group { - width: 308px; -} -.membership .dark_stripe, -.project_membership .dark_stripe { - background-color: #F9F9F9; -} -.membership .light_stripe, -.project_membership .light_stripe { - background-color: white; -} -.membership .last_stripe, -.project_membership .last_stripe { - border-bottom: 1px solid #d5dfe6; -} -.project_membership .filter { - width: 120px; - margin: -5px 13px 15px 0px; - float: right; -} -.project_membership .no_results { - border: 1px solid #DDD; - padding: 10px; - color: #08C; -} -.membership .role_dropdown li, -.project_membership .role_dropdown li { - cursor: pointer; - background: none; - float: none; - display: block; - padding: 5px 10px; - color: black; - text-align: left; - border-radius: 0; - border: 0 none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - z-index: 99999; -} -.membership .role_dropdown li:hover, -.project_membership .role_dropdown li:hover { - background-color: #EBECED; -} -.membership .nav .role_options, -.project_membership .nav .role_options { - float: right; - padding-right: 5px; -} -.membership input[type="text"] { - width: 180px; - float: right; - margin-right: 12px; -} -.members_title { - margin-left: 12px; - position: relative; - top: 6px; - -} - -/* Inline user creation */ -.add_user_btn { - display: inline; -} -#add_user { - clear: both; -} -.add_user { - float: right; - margin-top: 10px; - margin-right: 15px; -} -/* Fixes overflow on dropdowns in modal */ -.dropdown_fix { - overflow: visible; -} -/* Replaces CPU hungry spin.js with animated gif */ -.loading_gif { - width: 35px; - height: 13px; - padding-top: 2px; - padding-right: 5px; - float: left; -} -/* ResourceBrowser style */ -#browser_wrapper { - width: 100%; - min-width: 1000px; - background-color: #eeeeee; - border: 1px solid #dddddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -#browser_wrapper .tfoot { - clear: both; - padding: 8px; - border-top: 1px solid #dddddd; - background-color: #F1F1F1; - font-size: 11px; - line-height: 14px; -} -#browser_wrapper .tfoot span { - display: inline-block; -} -#browser_wrapper .tfoot span.navigation_table_count { - width: 30%; -} -#browser_wrapper form, -#browser_wrapper table { - margin-bottom: 0; -} -#browser_wrapper .navigation_wrapper, -#browser_wrapper .content_wrapper { - position: relative; - float: left; -} -#browser_wrapper div.navigation_wrapper { - z-index: 10; - width: 30%; -} -#browser_wrapper div.navigation_wrapper div.table_wrapper, -#browser_wrapper div.navigation_wrapper thead th.table_header { - border-right: 0 none; - border-top-right-radius: 0; -} -#browser_wrapper div.navigation_wrapper td:first-child { - border-left: 0 none; -} -#browser_wrapper div.navigation_wrapper td.breadcrumb_td { - padding-right: 0px; - max-width: 200px; -} -#browser_wrapper div.navigation_wrapper tr.current_selected td { - background-color: #E9F5FA; -} -#browser_wrapper div.navigation_wrapper tfoot td { - border-right: 0 none; - border-bottom-right-radius: 0; -} -#browser_wrapper div.navigation_wrapper ul.breadcrumb { - padding-right: 0px; - border-top-right-radius: 0px; - border-bottom-right-radius: 0px; - border-right: none; - white-space: nowrap; -} -#browser_wrapper div.navigation_wrapper tbody td { - border-right: 1px solid #dddddd; - background-color: #ffffff; -} -#browser_wrapper div.content_wrapper { - width: 70%; - /* FIXME(Ke Wu): for now there are two breadcrumb tr in both table - * and this one in the content table is hidden. This hack is made to - * fix the alignment of two table, needs a better solution in the - * future. - */ - -} -#browser_wrapper div.content_wrapper div.table_wrapper, -#browser_wrapper div.content_wrapper thead th.table_header { - border-left: 0 none; - border-top-left-radius: 0; -} -#browser_wrapper div.content_wrapper td { - border-bottom: 1px solid #dddddd; -} -#browser_wrapper div.content_wrapper td:last-child { - border-right: 0 none; -} -#browser_wrapper div.content_wrapper td.breadcrumb_td { - padding-left: 0px; -} -#browser_wrapper div.content_wrapper tfoot td { - border-left: 0 none; - border-bottom-left-radius: 0; -} -#browser_wrapper div.content_wrapper ul.breadcrumb { - padding-left: 0px; - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - border-left: none; -} -#browser_wrapper div.content_wrapper ul.breadcrumb li { - visibility: hidden; -} -#browser_wrapper table { - border-collapse: collapse; -} -#browser_wrapper table thead tr th { - border-bottom: none; - background-color: #eeeeee; -} -#browser_wrapper table tbody tr:last-child td { - border-bottom: 1px solid #ddd; - border-radius: 0; -} -#browser_wrapper table tbody tr.empty td { - height: 28px; - padding: 10px; -} -#browser_wrapper table tbody td.actions_column { - position: static; -} -#browser_wrapper .breadcrumb { - padding: 6px; - margin: 0 0 1px 0; -} -/* Styling for inline object creation buttons */ -.btn-inline { - margin-bottom: 9px; -} -.modal-body fieldset .form-field select[data-add-item-url] { - width: 275px; - margin-right: 2px; -} - -/* Styling for draged network object */ -#networkListSortContainer { - display: none; -} -.networklist { - padding: 6px; - background: #eee; - border: 1px solid #ccc; - min-height: 2em; - width: auto !important; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.networklist li { - width: 226px; - list-style-type: none; - margin: 6px auto; - padding: 3px; - background: #fff; - border: 1px solid #aaa; - line-height: 18px; - border-radius: 3px; - cursor: move; - padding-left: 23px; - background: #ffffff url(/static/dashboard/img/drag.png) no-repeat 11px 50%; -} -.networklist li em { - font-size: 0.5em; - line-height: 1em; - color: #999; + font-family: FontAwesome; font-style: normal; - margin-left: 0.8em; -} -.networklist li i { - margin-right: 5px; - vertical-align: middle; -} -.networklist li a.btn { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - font-size: 11px; - line-height: 12px; - padding: 2px 5px 3px; - margin-right: 1px; - width: 18px; - text-align: center; - right: 5px; - vertical-align: middle; - float: right; -} -.networklist li a.btn:before { - content: "+"; -} -.networklist li.ui-sortable-helper { - background-color: #def; -} -.networklist li.ui-state-highlight { - border: 1px dotted #ccc; - background: #efefef; - height: 0.5em; -} -.networklist li:after { - visibility: hidden; - display: block; - font-size: 0; - content: " "; - clear: both; - height: 0; -} -#selected_network { - margin-bottom: 1.5em; - counter-reset: v1 0; - background: #edf9ff; - border: 1px solid #c0d9e4; -} -#selected_network li { - position: relative; -} -#selected_network li a.btn:before { - content: "-"; -} -#selected_network li:before { - content: "nic:" counter(v1); - counter-increment: v1; - display: inline-block; - margin-right: 5px; - background: #666; - color: #fff; - font-size: 90%; - padding: 0px 4px; - vertical-align: middle; - border-radius: 2px; - position: absolute; - left: -2em; -} -#selected_network.dragging li:before { - content: "nic:"; - background-color: rgba(102, 102, 102, 0.5); - padding-right: 10px; -} -#selected_network.dragging li.ui-state-highlight:before { - content: ""; - background: transparent; -} -/* Styling for network topology */ -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 20px 0; - } - to { - background-position: 0 0; - } -} -@-moz-keyframes progress-bar-stripes { - from { - background-position: 20px 0; - } - to { - background-position: 0 0; - } -} -@-ms-keyframes progress-bar-stripes { - from { - background-position: 20px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 20px 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 20px 0; - } - to { - background-position: 0 0; - } -} -#topologyCanvas { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - -o-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - height: 500px; - padding: 25px; - padding-left: 50px; - background: #efefef; -} -#topologyCanvas div.nodata { - font-size: 150%; - font-weight: bold; - text-align: center; - padding-top: 200px; - display: none; -} -div.networks { - height: 100%; -} -div.network { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - -o-box-sizing: border-box; - box-sizing: border-box; - float: left; - width: 270px; - height: 100%; - position: relative; -} -div.network .nicname { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - -o-box-sizing: border-box; - box-sizing: border-box; - height: 100%; - width: 17px; - border-radius: 17px; - z-index: 200; - color: #fff; - position: absolute; - left: -8px; - top: 0px; - cursor: pointer; -} -div.network .nicname:hover { - background-image: -webkit-linear-gradient(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.15)); - background-image: -moz-linear-gradient(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.15)); - background-image: -ms-linear-gradient(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.15)); - background-image: -o-linear-gradient(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.15)); - background-image: linear-gradient(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.15)); - background-size: 10px 10px; -} -div.network .nicname.nourl { - cursor: auto; -} -div.network .nicname.nourl:hover { - background-image: none; -} -div.network .nicname h3 { - font-size: 12px; + font-weight: normal; line-height: 1; - position: relative; - font-weight: normal; - top: 55%; - color: #fff; - left: -1px; - letter-spacing: 0.2em; - -webkit-transform: rotate(-90deg); - -moz-transform: rotate(-90deg); - -ms-transform: rotate(-90deg); - -o-transform: rotate(-90deg); - transform: rotate(-90deg); - white-space: nowrap; - text-shadow: 0px 0px 5px #000; -} -div.network .nicname span.ip { - position: absolute; - bottom: -10px; - left: 20px; - color: #000; - display: block; - font-weight: normal; - font-size: 90%; - letter-spacing: 0.2em; - -webkit-transform: rotate(-90deg); - -moz-transform: rotate(-90deg); - -ms-transform: rotate(-90deg); - -o-transform: rotate(-90deg); - transform: rotate(-90deg); - -webkit-transform-origin: 0% 0%; - -moz-transform-origin: 0% 0%; - -ms-transform-origin: 0% 0%; - -o-transform-origin: 0% 0%; - transform-origin: 0% 0%; - white-space: nowrap; - text-shadow: 0px 0px 2px #fff,0px 0px 2px #fff; -} -div.network .router, -div.network .server, -div.network .device { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - -o-box-sizing: border-box; - box-sizing: border-box; - cursor: pointer; - width: 90px; - border: 3px solid #444; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } +.fa-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -15%; } + + .fa-2x { + font-size: 2em; } + + .fa-3x { + font-size: 3em; } + + .fa-4x { + font-size: 4em; } + + .fa-5x { + font-size: 5em; } +.fa-fw { + width: 1.28571em; + text-align: center; } +.fa-ul { + padding-left: 0; + margin-left: 2.14286em; + list-style-type: none; } + .fa-ul > li { + position: relative; } + +.fa-li { position: absolute; - top: 30px; - left: 90px; - color: #fff; - padding: 0 3px; - background: #666; - margin-bottom: 20px; - border-radius: 8px; -} -div.network .router:before, -div.network .server:before, -div.network .device:before { - content: ""; - width: 20px; - height: 20px; - border: 2px solid #444; - line-height: 1.2; - position: absolute; - border-radius: 20px; - top: -10px; - left: -10px; - background: #ffffff url(/static/dashboard/img/router.png) no-repeat center center; - background-size: 16px 16px; -} -div.network .router:after, -div.network .server:after, -div.network .device:after { - content: ""; - width: 100%; - line-height: 1.2; - position: absolute; - text-align: center; - border-radius: 0; - background: #444; - color: #fff; - font-size: 11px; - height: 1.5em; - bottom: 0px; - left: 0px; -} -div.network .router span.devicename, -div.network .server span.devicename, -div.network .device span.devicename { - position: absolute; - color: #fff; - bottom: 0px; - font-size: 12px; - line-height: 14px; - width: 100%; - text-align: center; - z-index: 300; - left: -2px; -} -div.network .router span.name, -div.network .server span.name, -div.network .device span.name { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - display: block; - font-size: 12px; - position: relative; - z-index: 10; - text-align: center; - top: 4px; - padding: 0 3px; -} -div.network .router div.port, -div.network .server div.port, -div.network .device div.port { - text-align: right; - min-width: 90px; - height: 10px; - font: 0px/0px sans-serif; - position: absolute; - left: -91px; - top: 8px; - background-color: #37a9e3; - background-image: none; - -webkit-background-size: 20px 20px; - -moz-background-size: 20px 20px; - -o-background-size: 20px 20px; - background-size: 20px 20px; - z-index: 100; -} -div.network .router div.port span.ip, -div.network .server div.port span.ip, -div.network .device div.port span.ip { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - -o-box-sizing: border-box; - box-sizing: border-box; - color: #333; - font-size: 9px; - line-height: 1; - text-shadow: 0px -1px #ffffff; - position: relative; - top: -1em; - width: 90px; - display: inline-block; - padding-right: 8px; - padding-left: 8px; - word-wrap: break-word; - word-break: break-all; -} -div.network .router div.port.right, -div.network .server div.port.right, -div.network .device div.port.right { - left: auto; - right: -92px; - width: 92px; - text-align: left; -} -div.network .router:hover, -div.network .server:hover, -div.network .device:hover { - border-color: #222; -} -div.network .router:hover div.port, -div.network .server:hover div.port, -div.network .device:hover div.port { - cursor: pointer; - background-color: #2688c0; - -webkit-animation: progress-bar-stripes 1s linear infinite; - -moz-animation: progress-bar-stripes 1s linear infinite; - -ms-animation: progress-bar-stripes 1s linear infinite; - -o-animation: progress-bar-stripes 1s linear infinite; - animation: progress-bar-stripes 1s linear infinite; -} -div.network .router:hover div.port:hover, -div.network .server:hover div.port:hover, -div.network .device:hover div.port:hover { - -webkit-animation: progress-bar-stripes 0.3s linear infinite; - -moz-animation: progress-bar-stripes 0.3s linear infinite; - -ms-animation: progress-bar-stripes 0.3s linear infinite; - -o-animation: progress-bar-stripes 0.3s linear infinite; - animation: progress-bar-stripes 0.3s linear infinite; -} -div.network .router:hover div.port.nourl, -div.network .server:hover div.port.nourl, -div.network .device:hover div.port.nourl { - cursor: auto; - background-image: none; -} -div.network .router:hover div.port.nourl:hover, -div.network .server:hover div.port.nourl:hover, -div.network .device:hover div.port.nourl:hover { - background-image: none; -} -div.network .router:hover:after, -div.network .server:hover:after, -div.network .device:hover:after { - background-color: #222; - border-color: #222; -} -div.network .device { - border: none; - background: transparent; -} -div.network .server { - background: #fff; - color: #333; -} -div.network .server:before { - background: #ffffff url(/static/dashboard/img/server.png) no-repeat center center; - background-size: 14px 14px; -} -.launchButtons { - float: right; - text-align: right; - margin: 10px 0px 15px 10px; - clear: right; -} -.launchButtons a.btn { - margin-left: 10px; -} - -html { height: 100%; } - -body { - background: #fff; - color: #333; - font-family: Arial, Helvetica, sans-serif - font-size: 16px; - height: 100%; -} - -.warning { - background-color: #eca918; - border-bottom: 1px solid #8d6817; - -moz-box-shadow: 0 5px 10px 1px #000; - -webkit-box-shadow: 0 5px 10px 1px #000; - box-shadow: 0 5px 10px 1px #d12a03; - display: block; - z-index: 999; - position: relative; -} - -.warning h3 { - background-color: #eca918; - color: #624a16; -} - -#container { - height: 100%; - overflow-x: hidden; -} - -/* topbar */ -.topbar { - background: url('../img/Openstack_banner.png') repeat-x; - background-position: bottom; - border-bottom: 0; - color: #fff; - padding: 0 20px 0 245px; - position: relative; - left: -221px; - width: 100%; - height: 79px; -} - -.page-header { - font-family: Arial, Helvetica, sans-serif; } - -.page-header h2 { - color: #333; - font-size: 18px; - line-height: 14px; - font-weight: bold; - margin-left: 0px; - margin-right: -30px; - margin: 0px -30px 0px 0px; - padding: 0px; + left: -2.14286em; + width: 2.14286em; + top: 0.14286em; + text-align: center; } + .fa-li.fa-lg { + left: -1.85714em; } +.fa-border { + padding: 0.2em 0.25em 0.15em; + border: solid 0.08em #eee; + border-radius: 0.1em; } + + .pull-right { + float: right; } + + .pull-left { + float: left; } + + .fa.pull-left { + margin-right: 0.3em; } + .fa.pull-right { + margin-left: 0.3em; } +.fa-spin { + -webkit-animation: spin 2s infinite linear; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; } + + @-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); } + 100% { + -moz-transform: rotate(359deg); } +} + +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(359deg); } +} + +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); } + 100% { + -o-transform: rotate(359deg); } +} + +@keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); } + + .fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); } + + .fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); } + + .fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0); + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); } + + .fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); } +.fa-stack { position: relative; - top: 100px; -} - -#user_info, #user_info a { - color: #000000; -} - -/* logo */ -h1.brand { - background: none; - color: #fff; - position: absolute; - z-index: 999; - padding: 0; -} - -h1.brand a { - background: url('../img/OracleSolaris_Logo.png') top left no-repeat; - color: #F5F5F5; - margin-bottom: 0; - margin-left: 20px; - margin-top: 18px; - padding-left: 115px; - width: 480px; - font-family: Arial, Helvetica, sans-serif; - font-size: 19px; - line-height: 35px; - font-weight: 400; -} - -h1.brand a:before { - content: url('../img/OpenStack_Dashboard_txt.png'); - position: relative; - top: 3px; -} - -/* -h1.brand a:before { - content: "OpenStack"; - font-weight: bold; - font-size: 19px; - color: #454545; - position: relative; - left: 0px; - top: 0px; - background: #F5F5F5; -} - -h1.brand a:after { - content: "Dashboard"; - font-weight: regular; - font-size: 19px; - color: #454545; - position: relative; - left: -190px; - top: 0px; - background: #F5F5F5; -}*/ - -h1.brand a:hover, #user_info a:hover { - text-decoration: none; -} - -/* user info */ -#user_info { - padding: 0px; - margin-top: 18px; - margin-right: 0px; - padding: 9px 0px; -} - -#user_info, #user_info a { - font-size: 12px; - font-weight: bold; - font-family: Arial, Helvetica, sans-serif; -} - - -/* main nav (in sidebar) */ -.main_nav li { - position: relative; -} - -.main_nav a { - border-left: 0; - border-right: 0; - color: #005D9D; - margin-left: 0; - padding: 0 0 0 37px; - width: 189px; - float: left; - position: relative; - line-height: 36px; - border: 1px solid #EBECED; - border-width: 1px 0; -} - -.main_nav a:hover { - background: #fbfbfb; - color: #005D9D; - border: 1px solid #fbfbfb; - border-width: 1px 0; - text-decoration: none; -} - -.main_nav li a.active { - border-color: #C4CED8; - font-weight: bold; - border-width: 1px 0 1px 0; - color: #005D9D; - width: 190px; - z-index: 3; -} - -.main_nav a.active:hover { - background: #FFFFFF; - color: #005D9D; - text-decoration: none; -} - -#main_content .nav-tabs li a:hover { - background: #FFFFFF; - border-bottom: 1px solid #D5DFE6; - border-top: 1px solid #FFFFFF; -} - -#main_content .nav-tabs li.active a:hover { - background: #FFFFFF; - border: 1px solid #C4CED8; - border-bottom: 1px solid #FFFFFF; - border-top: 1px solid #FFFFFF; - background: url(../img/content_tab_bkgd_selected.png) repeat-x; -} - -/* sidebar */ -.sidebar { - background: #ebeced; - border: 1px solid #C4CED8; - border-width: 0 1px 0 0; - min-height: 100%; - width: 226px; - position: relative; -} - -.sidebar h4 { - margin-left: 23px; - color: #000000; - vertical-align: top; - font-weight: 500; -} - -.sidebar a { font-size: 14px; } - -.sidebar .nav-tabs { - background: #f7f7f7; - padding-top: 70px; - margin-top: 0; - margin-bottom: 27px; -} - -.sidebar .nav-tabs li a { - color: #005d9d; - border-bottom-color: #c4ced8; - background: url(../img/tab_bkgd_deselected.png) repeat-x; - font-size: 13px; - font-family: Arial, Helvetica, sans-serif; -} - -.sidebar .nav-tabs li a:hover { - background: url(../img/tab_bkgd_deselected.png) repeat-x; - border-bottom-color: #c4ced8; - color: #333; -} - -.sidebar .nav-tabs li.active a { - background: #ebeced url(../img/tab_bkgd_selected.png) repeat-x; - border: 1px solid #C4CED8; - border-color: #c4ced8; - border-bottom: 1px solid #ebeced; - border-top: 0px solid #ebeced; - border-right: 0px solid #ebeced; - color: #555555; - font-size: 13px; - font-family: Arial, Helvetica, sans-serif; - font-weight: bold; - width: 113px; -} - -.sidebar .nav-tabs li.active a:hover { - border-color: #c4ced8; - border-bottom-color: #ebeced; -} - -.sidebar .switcher_bar h4 { - margin: 0px; -} - -/* main content */ - -/* tables */ -.table tbody tr td, -.table tbody tr th { - -moz-transition-duration: .5s; - -webkit-transition-duration: .5s; - transition-duration: .5s; -} - -.table_header h3 { - font-family: Arial, Helvetica, sans-serif; - margin-left: -10px; -} - -h3.table_title { - position: absolute; - left: -999em; -} - -table th { - font-size: 14px; - font-weight: 500; - color: #444; -} - -.table_actions { margin-right: -7px; } - -.table tfoot tr td { - background-color: #F9F9F9; -} - -/* static pages */ -.static_page, .quota-dynamic { margin-top: 80px; } - -.static_page, .quota-dynamic h3 { - margin-bottom: 20px; -} - -.static_page, .quota-dynamic .progress_bar { - max-width: 50%; - margin-top: 10px; -} - -.static_page, .quota-dynamic, .table_wrapper, .usage_info_wrapper, .tab-content { - background: #fff; - background: rgba(255, 255, 255, 0.70); - margin: 30px 0px 0px 0px -} - -#volumes, #volume-types { - position: relative; - top: -8px; -} - -td.normal_column, td.actions_column { - font-size: 12px; - color:#000000; - border-left: 1px solid #EEEEEE; -} -.topologyNavi { - height: 80px; -} - -.topologyBalloon { - display: none; - background: #ffffff; - position: absolute; - left: 100px; - top: 20px; - z-index: 600; - border-radius: 5px; - color: #333333; - min-width: 200px; - line-height: 1.2; - font-size: 11px; - -webkit-box-shadow: 0px 1px 6px #777777; - -moz-box-shadow: 0px 1px 6px #777777; - box-shadow: 0px 1px 6px #777777; -} -.topologyBalloon.on { - display: block; -} -.topologyBalloon .vnc_window { - margin-left: 10px; -} -.topologyBalloon .closeTopologyBalloon { - font-size: 16px; - line-height: 1; - display: block; - position: absolute; - font-weight: bold; - right: 6px; - top: 0px; - cursor: pointer; - padding: 3px; - color: #aaaaaa; -} -.topologyBalloon .closeTopologyBalloon:hover { - color: #777777; - text-decoration: none; -} -.topologyBalloon .contentBody { - padding: 8px 8px 0; -} -.topologyBalloon span.active:before, .topologyBalloon span.down:before { - content: ""; - width: 9px; - height: 9px; display: inline-block; - background: #0d925b; - margin-right: 3px; - border-radius: 10px; - vertical-align: middle; -} -.topologyBalloon span.down:before { - background: #e64b41; -} -.topologyBalloon .footer { - background: #efefef; - border-top: 1px solid #d9d9d9; - padding: 8px; - border-radius: 0px 0px 7px 7px; -} -.topologyBalloon .footer .footerInner { - display: table; - width: 100%; -} -.topologyBalloon .footer .cell { - display: table-cell; - padding-right: 10px; -} -.topologyBalloon .footer .link { - font-size: 12px; -} -.topologyBalloon .footer .delete { - padding-right: 0; - text-align: right; -} -.topologyBalloon .footer .delete .btn:before { - content: "Delete "; -} -.topologyBalloon .footer .delete .btn.deleting:before { - content: "Deleting "; -} -.topologyBalloon .footer .delete .btn.instance:before { - content: "Terminate "; -} -.topologyBalloon .footer .delete .btn.instance.deleting:before { - content: "Terminating "; -} -.topologyBalloon table.detaiInfoTable { - margin: 0px 0px 8px 0px; - -} -.topologyBalloon table.detaiInfoTable caption { - text-align: left; - font-size: 16px; - font-weight: bold; - margin-bottom: 3px; -} -.topologyBalloon table.detaiInfoTable th, .topologyBalloon table.detaiInfoTable td { - text-align: left; - vertical-align: middle; - padding-bottom: 3px; - background: transparent; -} -.topologyBalloon table.detaiInfoTable th { - color: #999999; - padding-right: 8px; - width: 80px; -} -.topologyBalloon table.detaiInfoTable th span { - vertical-align: middle; - width: 80px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - display: inline-block; -} -.topologyBalloon table.detaiInfoTable th.device { - text-align: right; - font-size: 12px; - color: #333333; - padding-left: 12px; -} -.topologyBalloon table.detaiInfoTable td { - padding-right: 5px; - white-space: nowrap; -} -.topologyBalloon table.detaiInfoTable td.delete { - padding-right: 0; - text-align: right; -} -.topologyBalloon table.detaiInfoTable .btn { - line-height: 1.4; -} -.topologyBalloon table.detaiInfoTable .btn:before { - content: "Delete "; -} -.topologyBalloon table.detaiInfoTable .btn.deleting:before { - content: "Deleting "; -} -.topologyBalloon:before { - border-top: 7px solid transparent; - border-bottom: 7px solid transparent; - border-right: 9px solid #bbbbbb; - display: block; - position: absolute; - top: 30px; - left: -9px; - width: 0; - height: 0; - content: ""; -} -.topologyBalloon:after { - border-top: 6px solid transparent; - border-bottom: 6px solid transparent; - border-right: 8px solid #ffffff; - display: block; - position: absolute; - top: 31px; - left: -8px; - width: 0; - height: 0; - content: ""; -} -.topologyBalloon.leftPosition:before { - border-right: none; - border-left: 9px solid #bbbbbb; - right: -9px; - top: 30px; - left: auto; -} -.topologyBalloon.leftPosition:after { - border-right: none; - border-left: 8px solid #ffffff; - right: -8px; - top: 31px; - left: auto; -} - -.quota-dynamic { - height: 200px; - min-width: 840px; -} -.d3_quota_bar { - float: left; - width: 160px; - text-align: center; - position: relative; - left: -30px; -} -#date_form h3 { - margin-bottom: 19px; -} - -#volumes, #volume-types { - position: relative; - top: -8px; -} -td.normal_column, td.actions_column { - font-size: 12px; - color:#000000; - border-left: 1px solid #EEEEEE; -} -.display_name { - line-height: 36px; -} -.nodata { - display: none; -} - -#no_update_flavor_access_members li { - line-height: 24px; - height: 48px; -} \ No newline at end of file + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; } + + .fa-stack-1x, .fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; } + + .fa-stack-1x { + line-height: inherit; } + + .fa-stack-2x { + font-size: 2em; } + + .fa-inverse { + color: #fff; } + +.fa-glass:before { + content: "\f000"; } + + .fa-music:before { + content: "\f001"; } + + .fa-search:before { + content: "\f002"; } + + .fa-envelope-o:before { + content: "\f003"; } + + .fa-heart:before { + content: "\f004"; } + + .fa-star:before { + content: "\f005"; } + + .fa-star-o:before { + content: "\f006"; } + + .fa-user:before { + content: "\f007"; } + + .fa-film:before { + content: "\f008"; } + + .fa-th-large:before { + content: "\f009"; } + + .fa-th:before { + content: "\f00a"; } + + .fa-th-list:before { + content: "\f00b"; } + + .fa-check:before { + content: "\f00c"; } + + .fa-times:before { + content: "\f00d"; } + + .fa-search-plus:before { + content: "\f00e"; } + + .fa-search-minus:before { + content: "\f010"; } + + .fa-power-off:before { + content: "\f011"; } + + .fa-signal:before { + content: "\f012"; } + + .fa-gear:before, .fa-cog:before { + content: "\f013"; } + + .fa-trash-o:before { + content: "\f014"; } + + .fa-home:before { + content: "\f015"; } + + .fa-file-o:before { + content: "\f016"; } + + .fa-clock-o:before { + content: "\f017"; } + + .fa-road:before { + content: "\f018"; } + + .fa-download:before { + content: "\f019"; } + + .fa-arrow-circle-o-down:before { + content: "\f01a"; } + + .fa-arrow-circle-o-up:before { + content: "\f01b"; } + + .fa-inbox:before { + content: "\f01c"; } + + .fa-play-circle-o:before { + content: "\f01d"; } + + .fa-rotate-right:before, .fa-repeat:before { + content: "\f01e"; } + + .fa-refresh:before { + content: "\f021"; } + + .fa-list-alt:before { + content: "\f022"; } + + .fa-lock:before { + content: "\f023"; } + + .fa-flag:before { + content: "\f024"; } + + .fa-headphones:before { + content: "\f025"; } + + .fa-volume-off:before { + content: "\f026"; } + + .fa-volume-down:before { + content: "\f027"; } + + .fa-volume-up:before { + content: "\f028"; } + + .fa-qrcode:before { + content: "\f029"; } + + .fa-barcode:before { + content: "\f02a"; } + + .fa-tag:before { + content: "\f02b"; } + + .fa-tags:before { + content: "\f02c"; } + + .fa-book:before { + content: "\f02d"; } + + .fa-bookmark:before { + content: "\f02e"; } + + .fa-print:before { + content: "\f02f"; } + + .fa-camera:before { + content: "\f030"; } + + .fa-font:before { + content: "\f031"; } + + .fa-bold:before { + content: "\f032"; } + + .fa-italic:before { + content: "\f033"; } + + .fa-text-height:before { + content: "\f034"; } + + .fa-text-width:before { + content: "\f035"; } + + .fa-align-left:before { + content: "\f036"; } + + .fa-align-center:before { + content: "\f037"; } + + .fa-align-right:before { + content: "\f038"; } + + .fa-align-justify:before { + content: "\f039"; } + + .fa-list:before { + content: "\f03a"; } + + .fa-dedent:before, .fa-outdent:before { + content: "\f03b"; } + + .fa-indent:before { + content: "\f03c"; } + + .fa-video-camera:before { + content: "\f03d"; } + + .fa-photo:before, .fa-image:before, .fa-picture-o:before { + content: "\f03e"; } + + .fa-pencil:before { + content: "\f040"; } + + .fa-map-marker:before { + content: "\f041"; } + + .fa-adjust:before { + content: "\f042"; } + + .fa-tint:before { + content: "\f043"; } + + .fa-edit:before, .fa-pencil-square-o:before { + content: "\f044"; } + + .fa-share-square-o:before { + content: "\f045"; } + + .fa-check-square-o:before { + content: "\f046"; } + + .fa-arrows:before { + content: "\f047"; } + + .fa-step-backward:before { + content: "\f048"; } + + .fa-fast-backward:before { + content: "\f049"; } + + .fa-backward:before { + content: "\f04a"; } + + .fa-play:before { + content: "\f04b"; } + + .fa-pause:before { + content: "\f04c"; } + + .fa-stop:before { + content: "\f04d"; } + + .fa-forward:before { + content: "\f04e"; } + + .fa-fast-forward:before { + content: "\f050"; } + + .fa-step-forward:before { + content: "\f051"; } + + .fa-eject:before { + content: "\f052"; } + + .fa-chevron-left:before { + content: "\f053"; } + + .fa-chevron-right:before { + content: "\f054"; } + + .fa-plus-circle:before { + content: "\f055"; } + + .fa-minus-circle:before { + content: "\f056"; } + + .fa-times-circle:before { + content: "\f057"; } + + .fa-check-circle:before { + content: "\f058"; } + + .fa-question-circle:before { + content: "\f059"; } + + .fa-info-circle:before { + content: "\f05a"; } + + .fa-crosshairs:before { + content: "\f05b"; } + + .fa-times-circle-o:before { + content: "\f05c"; } + + .fa-check-circle-o:before { + content: "\f05d"; } + + .fa-ban:before { + content: "\f05e"; } + + .fa-arrow-left:before { + content: "\f060"; } + + .fa-arrow-right:before { + content: "\f061"; } + + .fa-arrow-up:before { + content: "\f062"; } + + .fa-arrow-down:before { + content: "\f063"; } + + .fa-mail-forward:before, .fa-share:before { + content: "\f064"; } + + .fa-expand:before { + content: "\f065"; } + + .fa-compress:before { + content: "\f066"; } + + .fa-plus:before { + content: "\f067"; } + + .fa-minus:before { + content: "\f068"; } + + .fa-asterisk:before { + content: "\f069"; } + + .fa-exclamation-circle:before { + content: "\f06a"; } + + .fa-gift:before { + content: "\f06b"; } + + .fa-leaf:before { + content: "\f06c"; } + + .fa-fire:before { + content: "\f06d"; } + + .fa-eye:before { + content: "\f06e"; } + + .fa-eye-slash:before { + content: "\f070"; } + + .fa-warning:before, .fa-exclamation-triangle:before { + content: "\f071"; } + + .fa-plane:before { + content: "\f072"; } + + .fa-calendar:before { + content: "\f073"; } + + .fa-random:before { + content: "\f074"; } + + .fa-comment:before { + content: "\f075"; } + + .fa-magnet:before { + content: "\f076"; } + + .fa-chevron-up:before { + content: "\f077"; } + + .fa-chevron-down:before { + content: "\f078"; } + + .fa-retweet:before { + content: "\f079"; } + + .fa-shopping-cart:before { + content: "\f07a"; } + + .fa-folder:before { + content: "\f07b"; } + + .fa-folder-open:before { + content: "\f07c"; } + + .fa-arrows-v:before { + content: "\f07d"; } + + .fa-arrows-h:before { + content: "\f07e"; } + + .fa-bar-chart-o:before { + content: "\f080"; } + + .fa-twitter-square:before { + content: "\f081"; } + + .fa-facebook-square:before { + content: "\f082"; } + + .fa-camera-retro:before { + content: "\f083"; } + + .fa-key:before { + content: "\f084"; } + + .fa-gears:before, .fa-cogs:before { + content: "\f085"; } + + .fa-comments:before { + content: "\f086"; } + + .fa-thumbs-o-up:before { + content: "\f087"; } + + .fa-thumbs-o-down:before { + content: "\f088"; } + + .fa-star-half:before { + content: "\f089"; } + + .fa-heart-o:before { + content: "\f08a"; } + + .fa-sign-out:before { + content: "\f08b"; } + + .fa-linkedin-square:before { + content: "\f08c"; } + + .fa-thumb-tack:before { + content: "\f08d"; } + + .fa-external-link:before { + content: "\f08e"; } + + .fa-sign-in:before { + content: "\f090"; } + + .fa-trophy:before { + content: "\f091"; } + + .fa-github-square:before { + content: "\f092"; } + + .fa-upload:before { + content: "\f093"; } + + .fa-lemon-o:before { + content: "\f094"; } + + .fa-phone:before { + content: "\f095"; } + + .fa-square-o:before { + content: "\f096"; } + + .fa-bookmark-o:before { + content: "\f097"; } + + .fa-phone-square:before { + content: "\f098"; } + + .fa-twitter:before { + content: "\f099"; } + + .fa-facebook:before { + content: "\f09a"; } + + .fa-github:before { + content: "\f09b"; } + + .fa-unlock:before { + content: "\f09c"; } + + .fa-credit-card:before { + content: "\f09d"; } + + .fa-rss:before { + content: "\f09e"; } + + .fa-hdd-o:before { + content: "\f0a0"; } + + .fa-bullhorn:before { + content: "\f0a1"; } + + .fa-bell:before { + content: "\f0f3"; } + + .fa-certificate:before { + content: "\f0a3"; } + + .fa-hand-o-right:before { + content: "\f0a4"; } + + .fa-hand-o-left:before { + content: "\f0a5"; } + + .fa-hand-o-up:before { + content: "\f0a6"; } + + .fa-hand-o-down:before { + content: "\f0a7"; } + + .fa-arrow-circle-left:before { + content: "\f0a8"; } + + .fa-arrow-circle-right:before { + content: "\f0a9"; } + + .fa-arrow-circle-up:before { + content: "\f0aa"; } + + .fa-arrow-circle-down:before { + content: "\f0ab"; } + + .fa-globe:before { + content: "\f0ac"; } + + .fa-wrench:before { + content: "\f0ad"; } + + .fa-tasks:before { + content: "\f0ae"; } + + .fa-filter:before { + content: "\f0b0"; } + + .fa-briefcase:before { + content: "\f0b1"; } + + .fa-arrows-alt:before { + content: "\f0b2"; } + + .fa-group:before, .fa-users:before { + content: "\f0c0"; } + + .fa-chain:before, .fa-link:before { + content: "\f0c1"; } + + .fa-cloud:before { + content: "\f0c2"; } + + .fa-flask:before { + content: "\f0c3"; } + + .fa-cut:before, .fa-scissors:before { + content: "\f0c4"; } + + .fa-copy:before, .fa-files-o:before { + content: "\f0c5"; } + + .fa-paperclip:before { + content: "\f0c6"; } + + .fa-save:before, .fa-floppy-o:before { + content: "\f0c7"; } + + .fa-square:before { + content: "\f0c8"; } + + .fa-navicon:before, .fa-reorder:before, .fa-bars:before { + content: "\f0c9"; } + + .fa-list-ul:before { + content: "\f0ca"; } + + .fa-list-ol:before { + content: "\f0cb"; } + + .fa-strikethrough:before { + content: "\f0cc"; } + + .fa-underline:before { + content: "\f0cd"; } + + .fa-table:before { + content: "\f0ce"; } + + .fa-magic:before { + content: "\f0d0"; } + + .fa-truck:before { + content: "\f0d1"; } + + .fa-pinterest:before { + content: "\f0d2"; } + + .fa-pinterest-square:before { + content: "\f0d3"; } + + .fa-google-plus-square:before { + content: "\f0d4"; } + + .fa-google-plus:before { + content: "\f0d5"; } + + .fa-money:before { + content: "\f0d6"; } + + .fa-caret-down:before { + content: "\f0d7"; } + + .fa-caret-up:before { + content: "\f0d8"; } + + .fa-caret-left:before { + content: "\f0d9"; } + + .fa-caret-right:before { + content: "\f0da"; } + + .fa-columns:before { + content: "\f0db"; } + + .fa-unsorted:before, .fa-sort:before { + content: "\f0dc"; } + + .fa-sort-down:before, .fa-sort-desc:before { + content: "\f0dd"; } + + .fa-sort-up:before, .fa-sort-asc:before { + content: "\f0de"; } + + .fa-envelope:before { + content: "\f0e0"; } + + .fa-linkedin:before { + content: "\f0e1"; } + + .fa-rotate-left:before, .fa-undo:before { + content: "\f0e2"; } + + .fa-legal:before, .fa-gavel:before { + content: "\f0e3"; } + + .fa-dashboard:before, .fa-tachometer:before { + content: "\f0e4"; } + + .fa-comment-o:before { + content: "\f0e5"; } + + .fa-comments-o:before { + content: "\f0e6"; } + + .fa-flash:before, .fa-bolt:before { + content: "\f0e7"; } + + .fa-sitemap:before { + content: "\f0e8"; } + + .fa-umbrella:before { + content: "\f0e9"; } + + .fa-paste:before, .fa-clipboard:before { + content: "\f0ea"; } + + .fa-lightbulb-o:before { + content: "\f0eb"; } + + .fa-exchange:before { + content: "\f0ec"; } + + .fa-cloud-download:before { + content: "\f0ed"; } + + .fa-cloud-upload:before { + content: "\f0ee"; } + + .fa-user-md:before { + content: "\f0f0"; } + + .fa-stethoscope:before { + content: "\f0f1"; } + + .fa-suitcase:before { + content: "\f0f2"; } + + .fa-bell-o:before { + content: "\f0a2"; } + + .fa-coffee:before { + content: "\f0f4"; } + + .fa-cutlery:before { + content: "\f0f5"; } + + .fa-file-text-o:before { + content: "\f0f6"; } + + .fa-building-o:before { + content: "\f0f7"; } + + .fa-hospital-o:before { + content: "\f0f8"; } + + .fa-ambulance:before { + content: "\f0f9"; } + + .fa-medkit:before { + content: "\f0fa"; } + + .fa-fighter-jet:before { + content: "\f0fb"; } + + .fa-beer:before { + content: "\f0fc"; } + + .fa-h-square:before { + content: "\f0fd"; } + + .fa-plus-square:before { + content: "\f0fe"; } + + .fa-angle-double-left:before { + content: "\f100"; } + + .fa-angle-double-right:before { + content: "\f101"; } + + .fa-angle-double-up:before { + content: "\f102"; } + + .fa-angle-double-down:before { + content: "\f103"; } + + .fa-angle-left:before { + content: "\f104"; } + + .fa-angle-right:before { + content: "\f105"; } + + .fa-angle-up:before { + content: "\f106"; } + + .fa-angle-down:before { + content: "\f107"; } + + .fa-desktop:before { + content: "\f108"; } + + .fa-laptop:before { + content: "\f109"; } + + .fa-tablet:before { + content: "\f10a"; } + + .fa-mobile-phone:before, .fa-mobile:before { + content: "\f10b"; } + + .fa-circle-o:before { + content: "\f10c"; } + + .fa-quote-left:before { + content: "\f10d"; } + + .fa-quote-right:before { + content: "\f10e"; } + + .fa-spinner:before { + content: "\f110"; } + + .fa-circle:before { + content: "\f111"; } + + .fa-mail-reply:before, .fa-reply:before { + content: "\f112"; } + + .fa-github-alt:before { + content: "\f113"; } + + .fa-folder-o:before { + content: "\f114"; } + + .fa-folder-open-o:before { + content: "\f115"; } + + .fa-smile-o:before { + content: "\f118"; } + + .fa-frown-o:before { + content: "\f119"; } + + .fa-meh-o:before { + content: "\f11a"; } + + .fa-gamepad:before { + content: "\f11b"; } + + .fa-keyboard-o:before { + content: "\f11c"; } + + .fa-flag-o:before { + content: "\f11d"; } + + .fa-flag-checkered:before { + content: "\f11e"; } + + .fa-terminal:before { + content: "\f120"; } + + .fa-code:before { + content: "\f121"; } + + .fa-mail-reply-all:before, .fa-reply-all:before { + content: "\f122"; } + + .fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before { + content: "\f123"; } + + .fa-location-arrow:before { + content: "\f124"; } + + .fa-crop:before { + content: "\f125"; } + + .fa-code-fork:before { + content: "\f126"; } + + .fa-unlink:before, .fa-chain-broken:before { + content: "\f127"; } + + .fa-question:before { + content: "\f128"; } + + .fa-info:before { + content: "\f129"; } + + .fa-exclamation:before { + content: "\f12a"; } + + .fa-superscript:before { + content: "\f12b"; } + + .fa-subscript:before { + content: "\f12c"; } + + .fa-eraser:before { + content: "\f12d"; } + + .fa-puzzle-piece:before { + content: "\f12e"; } + + .fa-microphone:before { + content: "\f130"; } + + .fa-microphone-slash:before { + content: "\f131"; } + + .fa-shield:before { + content: "\f132"; } + + .fa-calendar-o:before { + content: "\f133"; } + + .fa-fire-extinguisher:before { + content: "\f134"; } + + .fa-rocket:before { + content: "\f135"; } + + .fa-maxcdn:before { + content: "\f136"; } + + .fa-chevron-circle-left:before { + content: "\f137"; } + + .fa-chevron-circle-right:before { + content: "\f138"; } + + .fa-chevron-circle-up:before { + content: "\f139"; } + + .fa-chevron-circle-down:before { + content: "\f13a"; } + + .fa-html5:before { + content: "\f13b"; } + + .fa-css3:before { + content: "\f13c"; } + + .fa-anchor:before { + content: "\f13d"; } + + .fa-unlock-alt:before { + content: "\f13e"; } + + .fa-bullseye:before { + content: "\f140"; } + + .fa-ellipsis-h:before { + content: "\f141"; } + + .fa-ellipsis-v:before { + content: "\f142"; } + + .fa-rss-square:before { + content: "\f143"; } + + .fa-play-circle:before { + content: "\f144"; } + + .fa-ticket:before { + content: "\f145"; } + + .fa-minus-square:before { + content: "\f146"; } + + .fa-minus-square-o:before { + content: "\f147"; } + + .fa-level-up:before { + content: "\f148"; } + + .fa-level-down:before { + content: "\f149"; } + + .fa-check-square:before { + content: "\f14a"; } + + .fa-pencil-square:before { + content: "\f14b"; } + + .fa-external-link-square:before { + content: "\f14c"; } + + .fa-share-square:before { + content: "\f14d"; } + + .fa-compass:before { + content: "\f14e"; } + + .fa-toggle-down:before, .fa-caret-square-o-down:before { + content: "\f150"; } + + .fa-toggle-up:before, .fa-caret-square-o-up:before { + content: "\f151"; } + + .fa-toggle-right:before, .fa-caret-square-o-right:before { + content: "\f152"; } + + .fa-euro:before, .fa-eur:before { + content: "\f153"; } + + .fa-gbp:before { + content: "\f154"; } + + .fa-dollar:before, .fa-usd:before { + content: "\f155"; } + + .fa-rupee:before, .fa-inr:before { + content: "\f156"; } + + .fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before { + content: "\f157"; } + + .fa-ruble:before, .fa-rouble:before, .fa-rub:before { + content: "\f158"; } + + .fa-won:before, .fa-krw:before { + content: "\f159"; } + + .fa-bitcoin:before, .fa-btc:before { + content: "\f15a"; } + + .fa-file:before { + content: "\f15b"; } + + .fa-file-text:before { + content: "\f15c"; } + + .fa-sort-alpha-asc:before { + content: "\f15d"; } + + .fa-sort-alpha-desc:before { + content: "\f15e"; } + + .fa-sort-amount-asc:before { + content: "\f160"; } + + .fa-sort-amount-desc:before { + content: "\f161"; } + + .fa-sort-numeric-asc:before { + content: "\f162"; } + + .fa-sort-numeric-desc:before { + content: "\f163"; } + + .fa-thumbs-up:before { + content: "\f164"; } + + .fa-thumbs-down:before { + content: "\f165"; } + + .fa-youtube-square:before { + content: "\f166"; } + + .fa-youtube:before { + content: "\f167"; } + + .fa-xing:before { + content: "\f168"; } + + .fa-xing-square:before { + content: "\f169"; } + + .fa-youtube-play:before { + content: "\f16a"; } + + .fa-dropbox:before { + content: "\f16b"; } + + .fa-stack-overflow:before { + content: "\f16c"; } + + .fa-instagram:before { + content: "\f16d"; } + + .fa-flickr:before { + content: "\f16e"; } + + .fa-adn:before { + content: "\f170"; } + + .fa-bitbucket:before { + content: "\f171"; } + + .fa-bitbucket-square:before { + content: "\f172"; } + + .fa-tumblr:before { + content: "\f173"; } + + .fa-tumblr-square:before { + content: "\f174"; } + + .fa-long-arrow-down:before { + content: "\f175"; } + + .fa-long-arrow-up:before { + content: "\f176"; } + + .fa-long-arrow-left:before { + content: "\f177"; } + + .fa-long-arrow-right:before { + content: "\f178"; } + + .fa-apple:before { + content: "\f179"; } + + .fa-windows:before { + content: "\f17a"; } + + .fa-android:before { + content: "\f17b"; } + + .fa-linux:before { + content: "\f17c"; } + + .fa-dribbble:before { + content: "\f17d"; } + + .fa-skype:before { + content: "\f17e"; } + + .fa-foursquare:before { + content: "\f180"; } + + .fa-trello:before { + content: "\f181"; } + + .fa-female:before { + content: "\f182"; } + + .fa-male:before { + content: "\f183"; } + + .fa-gittip:before { + content: "\f184"; } + + .fa-sun-o:before { + content: "\f185"; } + + .fa-moon-o:before { + content: "\f186"; } + + .fa-archive:before { + content: "\f187"; } + + .fa-bug:before { + content: "\f188"; } + + .fa-vk:before { + content: "\f189"; } + + .fa-weibo:before { + content: "\f18a"; } + + .fa-renren:before { + content: "\f18b"; } + + .fa-pagelines:before { + content: "\f18c"; } + + .fa-stack-exchange:before { + content: "\f18d"; } + + .fa-arrow-circle-o-right:before { + content: "\f18e"; } + + .fa-arrow-circle-o-left:before { + content: "\f190"; } + + .fa-toggle-left:before, .fa-caret-square-o-left:before { + content: "\f191"; } + + .fa-dot-circle-o:before { + content: "\f192"; } + + .fa-wheelchair:before { + content: "\f193"; } + + .fa-vimeo-square:before { + content: "\f194"; } + + .fa-turkish-lira:before, .fa-try:before { + content: "\f195"; } + + .fa-plus-square-o:before { + content: "\f196"; } + + .fa-space-shuttle:before { + content: "\f197"; } + + .fa-slack:before { + content: "\f198"; } + + .fa-envelope-square:before { + content: "\f199"; } + + .fa-wordpress:before { + content: "\f19a"; } + + .fa-openid:before { + content: "\f19b"; } + + .fa-institution:before, .fa-bank:before, .fa-university:before { + content: "\f19c"; } + + .fa-mortar-board:before, .fa-graduation-cap:before { + content: "\f19d"; } + + .fa-yahoo:before { + content: "\f19e"; } + + .fa-google:before { + content: "\f1a0"; } + + .fa-reddit:before { + content: "\f1a1"; } + + .fa-reddit-square:before { + content: "\f1a2"; } + + .fa-stumbleupon-circle:before { + content: "\f1a3"; } + + .fa-stumbleupon:before { + content: "\f1a4"; } + + .fa-delicious:before { + content: "\f1a5"; } + + .fa-digg:before { + content: "\f1a6"; } + + .fa-pied-piper-square:before, .fa-pied-piper:before { + content: "\f1a7"; } + + .fa-pied-piper-alt:before { + content: "\f1a8"; } + + .fa-drupal:before { + content: "\f1a9"; } + + .fa-joomla:before { + content: "\f1aa"; } + + .fa-language:before { + content: "\f1ab"; } + + .fa-fax:before { + content: "\f1ac"; } + + .fa-building:before { + content: "\f1ad"; } + + .fa-child:before { + content: "\f1ae"; } + + .fa-paw:before { + content: "\f1b0"; } + + .fa-spoon:before { + content: "\f1b1"; } + + .fa-cube:before { + content: "\f1b2"; } + + .fa-cubes:before { + content: "\f1b3"; } + + .fa-behance:before { + content: "\f1b4"; } + + .fa-behance-square:before { + content: "\f1b5"; } + + .fa-steam:before { + content: "\f1b6"; } + + .fa-steam-square:before { + content: "\f1b7"; } + + .fa-recycle:before { + content: "\f1b8"; } + + .fa-automobile:before, .fa-car:before { + content: "\f1b9"; } + + .fa-cab:before, .fa-taxi:before { + content: "\f1ba"; } + + .fa-tree:before { + content: "\f1bb"; } + + .fa-spotify:before { + content: "\f1bc"; } + + .fa-deviantart:before { + content: "\f1bd"; } + + .fa-soundcloud:before { + content: "\f1be"; } + + .fa-database:before { + content: "\f1c0"; } + + .fa-file-pdf-o:before { + content: "\f1c1"; } + + .fa-file-word-o:before { + content: "\f1c2"; } + + .fa-file-excel-o:before { + content: "\f1c3"; } + + .fa-file-powerpoint-o:before { + content: "\f1c4"; } + + .fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before { + content: "\f1c5"; } + + .fa-file-zip-o:before, .fa-file-archive-o:before { + content: "\f1c6"; } + + .fa-file-sound-o:before, .fa-file-audio-o:before { + content: "\f1c7"; } + + .fa-file-movie-o:before, .fa-file-video-o:before { + content: "\f1c8"; } + + .fa-file-code-o:before { + content: "\f1c9"; } + + .fa-vine:before { + content: "\f1ca"; } + + .fa-codepen:before { + content: "\f1cb"; } + + .fa-jsfiddle:before { + content: "\f1cc"; } + + .fa-life-bouy:before, .fa-life-saver:before, .fa-support:before, + .fa-life-ring:before { + content: "\f1cd"; } + + .fa-circle-o-notch:before { + content: "\f1ce"; } + + .fa-ra:before, .fa-rebel:before { + content: "\f1d0"; } + + .fa-ge:before, .fa-empire:before { + content: "\f1d1"; } + + .fa-git-square:before { + content: "\f1d2"; } + + .fa-git:before { + content: "\f1d3"; } + + .fa-hacker-news:before { + content: "\f1d4"; } + + .fa-tencent-weibo:before { + content: "\f1d5"; } + + .fa-qq:before { + content: "\f1d6"; } + + .fa-wechat:before, .fa-weixin:before { + content: "\f1d7"; } + + .fa-send:before, .fa-paper-plane:before { + content: "\f1d8"; } + + .fa-send-o:before, .fa-paper-plane-o:before { + content: "\f1d9"; } + + .fa-history:before { + content: "\f1da"; } + + .fa-circle-thin:before { + content: "\f1db"; } + + .fa-header:before { + content: "\f1dc"; } + + .fa-paragraph:before { + content: "\f1dd"; } + + .fa-sliders:before { + content: "\f1de"; } + + .fa-share-alt:before { + content: "\f1e0"; } + + .fa-share-alt-square:before { + content: "\f1e1"; } + + .fa-bomb:before { + content: "\f1e2"; } diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/files/branding/img/OpenStack_banner.png Binary file components/openstack/horizon/files/branding/img/OpenStack_banner.png has changed diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/files/branding/img/Openstack_banner.png Binary file components/openstack/horizon/files/branding/img/Openstack_banner.png has changed diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/files/branding/img/dropdown_dwn.png Binary file components/openstack/horizon/files/branding/img/dropdown_dwn.png has changed diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/files/branding/img/dropdown_ena.png Binary file components/openstack/horizon/files/branding/img/dropdown_ena.png has changed diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/files/branding/img/favicon-solaris.ico Binary file components/openstack/horizon/files/branding/img/favicon-solaris.ico has changed diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/files/branding/img/favicon.ico Binary file components/openstack/horizon/files/branding/img/favicon.ico has changed diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/files/branding/theme/_stylesheets.html --- a/components/openstack/horizon/files/branding/theme/_stylesheets.html Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/horizon/files/branding/theme/_stylesheets.html Mon Apr 20 12:35:51 2015 -0700 @@ -1,2 +1,2 @@ - - + + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/files/local_settings.py --- a/components/openstack/horizon/files/local_settings.py Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/horizon/files/local_settings.py Mon Apr 20 12:35:51 2015 -0700 @@ -32,18 +32,25 @@ LOGOUT_URL = '/horizon/auth/logout/' LOGIN_REDIRECT_URL = '/horizon' -STATIC_ROOT = '/var/lib/openstack_dashboard/static' +STATIC_ROOT = '/usr/lib/python2.6/vendor-packages/openstack_dashboard/static' # Enable Solaris theme -TEMPLATE_DIRS = ('/var/lib/openstack_dashboard/static/solaris/theme', ) +TEMPLATE_DIRS = ( + '/usr/lib/python2.6/vendor-packages/openstack_dashboard/templates/solaris', +) + +# Application files are compressed during packaging +COMPRESS_OFFLINE = True # Overrides for OpenStack API versions. Use this setting to force the -# OpenStack dashboard to use a specfic API version for a given service API. +# OpenStack dashboard to use a specific API version for a given service API. # NOTE: The version should be formatted as it appears in the URL for the # service API. For example, The identity service APIs have inconsistent # use of the decimal point, so valid options would be "2.0" or "3". # OPENSTACK_API_VERSIONS = { -# "identity": 3 +# "data_processing": 1.1, +# "identity": 3, +# "volume": 2 # } # Set this to True if running on multi-domain model. When this is enabled, it @@ -55,7 +62,8 @@ # OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default' # Set Console type: -# valid options would be "AUTO", "VNC" or "SPICE" +# valid options would be "AUTO"(default), "VNC", "SPICE", "RDP" or None +# Set to None explicitly if you want to deactivate the console. # CONSOLE_TYPE = "AUTO" # Default OpenStack Dashboard configuration. @@ -73,6 +81,8 @@ 'exceptions': {'recoverable': exceptions.RECOVERABLE, 'not_found': exceptions.NOT_FOUND, 'unauthorized': exceptions.UNAUTHORIZED}, + 'angular_modules': [], + 'js_files': [], 'customization_module': 'openstack_dashboard.overrides', } @@ -86,13 +96,14 @@ # multiple floating IP pools or complex network requirements. # HORIZON_CONFIG["simple_ip_management"] = False -# Turn off browser autocompletion for the login form if so desired. +# Turn off browser autocompletion for forms including the login form and +# the database creation workflow if so desired. # HORIZON_CONFIG["password_autocomplete"] = "off" LOCAL_PATH = '/var/lib/openstack_dashboard' # Set custom secret key: -# You can either set it to a specific value or you can let horizion generate a +# You can either set it to a specific value or you can let horizon generate a # default secret key that is unique on this machine, e.i. regardless of the # amount of Python WSGI workers (if used behind Apache+mod_wsgi): However, there # may be situations where you would want to set this explicitly, e.g. when @@ -101,21 +112,22 @@ # requests routed to the same dashboard instance or you set the same SECRET_KEY # for all of them. from horizon.utils import secret_key -SECRET_KEY = secret_key.generate_or_read_from_file(os.path.join(LOCAL_PATH, '.secret_key_store')) +SECRET_KEY = secret_key.generate_or_read_from_file( + os.path.join(LOCAL_PATH, '.secret_key_store')) # We recommend you use memcached for development; otherwise after every reload # of the django development server, you will have to login again. To use # memcached set CACHES to something like # CACHES = { # 'default': { -# 'BACKEND' : 'django.core.cache.backends.memcached.MemcachedCache', -# 'LOCATION' : '127.0.0.1:11211', +# 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', +# 'LOCATION': '127.0.0.1:11211', # } #} CACHES = { 'default': { - 'BACKEND' : 'django.core.cache.backends.locmem.LocMemCache' + 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache' } } @@ -161,27 +173,46 @@ 'can_edit_role': True } +#Setting this to True, will add a new "Retrieve Password" action on instance, +#allowing Admin session password retrieval/decryption. +#OPENSTACK_ENABLE_PASSWORD_RETRIEVE = False + # The Xen Hypervisor has the ability to set the mount point for volumes # attached to instances (other Hypervisors currently do not). Setting # can_set_mount_point to True will add the option to set the mount point # from the UI. OPENSTACK_HYPERVISOR_FEATURES = { 'can_set_mount_point': False, + 'can_set_password': False, +} + +# The OPENSTACK_CINDER_FEATURES settings can be used to enable optional +# services provided by cinder that is not exposed by its extension API. +OPENSTACK_CINDER_FEATURES = { + 'enable_backup': False, } # The OPENSTACK_NEUTRON_NETWORK settings can be used to enable optional -# services provided by neutron. Options currenly available are load +# services provided by neutron. Options currently available are load # balancer service, security groups, quotas, VPN service. OPENSTACK_NEUTRON_NETWORK = { + 'enable_router': True, + 'enable_quotas': True, + 'enable_ipv6': True, + 'enable_distributed_router': False, + 'enable_ha_router': False, 'enable_lb': False, 'enable_firewall': False, - 'enable_quotas': True, 'enable_vpn': False, # The profile_support option is used to detect if an external router can be # configured via the dashboard. When using specific plugins the # profile_support can be turned on if needed. 'profile_support': None, #'profile_support': 'cisco', + # Set which provider network types are supported. Only the network types + # in this list will be available to choose from when creating a network. + # Network types include local, flat, vlan, gre, and vxlan. + 'supported_provider_types': ['*'], } # The OPENSTACK_IMAGE_BACKEND settings can be used to customize features @@ -189,7 +220,7 @@ # of supported image formats. # OPENSTACK_IMAGE_BACKEND = { # 'image_formats': [ -# ('', ''), +# ('', _('Select format')), # ('aki', _('AKI - Amazon Kernel Image')), # ('ami', _('AMI - Amazon Machine Image')), # ('ari', _('ARI - Amazon Ramdisk Image')), @@ -202,6 +233,22 @@ # ] # } +# The IMAGE_CUSTOM_PROPERTY_TITLES settings is used to customize the titles for +# image custom property attributes that appear on image detail pages. +IMAGE_CUSTOM_PROPERTY_TITLES = { + "architecture": _("Architecture"), + "kernel_id": _("Kernel ID"), + "ramdisk_id": _("Ramdisk ID"), + "image_state": _("Euca2ools state"), + "project_id": _("Project ID"), + "image_type": _("Image Type") +} + +# The IMAGE_RESERVED_CUSTOM_PROPERTIES setting is used to specify which image +# custom properties should not be displayed in the Image Custom Properties +# table. +IMAGE_RESERVED_CUSTOM_PROPERTIES = [] + # OPENSTACK_ENDPOINT_TYPE specifies the endpoint type to use for the endpoints # in the Keystone service catalog. Use this setting when Horizon is running # external to the OpenStack environment. The default is 'publicURL'. @@ -225,11 +272,14 @@ TIME_ZONE = "UTC" # When launching an instance, the menu of available flavors is -# sorted by RAM usage, ascending. Provide a callback method here -# (and/or a flag for reverse sort) for the sorted() method if you'd -# like a different behaviour. For more info, see +# sorted by RAM usage, ascending. If you would like a different sort order, +# you can provide another flavor attribute as sorting key. Alternatively, you +# can provide a custom callback method to use for sorting. You can also provide +# a flag for reverse sort. For more info, see # http://docs.python.org/2/library/functions.html#sorted # CREATE_INSTANCE_FLAVOR_SORT = { +# 'key': 'name', +# # or # 'key': my_awesome_callback_method, # 'reverse': False, # } @@ -244,7 +294,11 @@ # Map of local copy of service policy files #POLICY_FILES = { # 'identity': 'keystone_policy.json', -# 'compute': 'nova_policy.json' +# 'compute': 'nova_policy.json', +# 'volume': 'cinder_policy.json', +# 'image': 'glance_policy.json', +# 'orchestration': 'heat_policy.json', +# 'network': 'neutron_policy.json', #} # Trove user and database extension support. By default support for @@ -357,24 +411,30 @@ 'handlers': ['null'], 'propagate': False, }, + 'scss': { + 'handlers': ['null'], + 'propagate': False, + }, } } +# 'direction' should not be specified for all_tcp/udp/icmp. +# It is specified in the form. SECURITY_GROUP_RULES = { 'all_tcp': { - 'name': 'ALL TCP', + 'name': _('All TCP'), 'ip_protocol': 'tcp', 'from_port': '1', 'to_port': '65535', }, 'all_udp': { - 'name': 'ALL UDP', + 'name': _('All UDP'), 'ip_protocol': 'udp', 'from_port': '1', 'to_port': '65535', }, 'all_icmp': { - 'name': 'ALL ICMP', + 'name': _('All ICMP'), 'ip_protocol': 'icmp', 'from_port': '-1', 'to_port': '-1', @@ -464,3 +524,32 @@ 'to_port': '3389', }, } + +# Deprecation Notice: +# +# The setting FLAVOR_EXTRA_KEYS has been deprecated. +# Please load extra spec metadata into the Glance Metadata Definition Catalog. +# +# The sample quota definitions can be found in: +# /etc/metadefs/compute-quota.json +# +# The metadata definition catalog supports CLI and API: +# $glance --os-image-api-version 2 help md-namespace-import +# $glance-manage db_load_metadefs +# +# See Metadata Definitions on: http://docs.openstack.org/developer/glance/ + +# Indicate to the Sahara data processing service whether or not +# automatic floating IP allocation is in effect. If it is not +# in effect, the user will be prompted to choose a floating IP +# pool for use in their cluster. False by default. You would want +# to set this to True if you were running Nova Networking with +# auto_assign_floating_ip = True. +# SAHARA_AUTO_IP_ALLOCATION_ENABLED = False + +# The hash algorithm to use for authentication tokens. This must +# match the hash algorithm that the identity server and the +# auth_token middleware are using. Allowed values are the +# algorithms supported by Python's hashlib library. +# OPENSTACK_TOKEN_HASH_ALGORITHM = 'md5' + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/files/openstack-dashboard-http.conf --- a/components/openstack/horizon/files/openstack-dashboard-http.conf Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/horizon/files/openstack-dashboard-http.conf Mon Apr 20 12:35:51 2015 -0700 @@ -1,23 +1,35 @@ - - LoadModule wsgi_module libexec/64/mod_wsgi-2.6.so - - - LoadModule wsgi_module libexec/mod_wsgi-2.6.so - +LoadModule wsgi_module libexec/mod_wsgi-2.6.so -WSGIScriptAlias /horizon \ - /usr/lib/python2.6/vendor-packages/openstack_dashboard/wsgi/django.wsgi -WSGIDaemonProcess horizon user=webservd group=webservd processes=3 \ - threads=10 + + WSGIScriptAlias /horizon \ + /usr/lib/python2.6/vendor-packages/openstack_dashboard/wsgi/django.wsgi + WSGIDaemonProcess horizon user=webservd group=webservd processes=3 \ + threads=10 + + Alias /static /usr/lib/python2.6/vendor-packages/openstack_dashboard/static/ + + + Options FollowSymLinks + AllowOverride None + -Alias /static /var/lib/openstack_dashboard/static/ + + Options Indexes FollowSymLinks MultiViews + AllowOverride None + Order allow,deny + Allow from all + - - Order allow,deny - Allow from all - + + Options Indexes FollowSymLinks MultiViews + AllowOverride None + Order allow,deny + Allow from all + - - Order allow,deny - Allow from all - + ErrorLog "|/usr/bin/rotatelogs \ + /var/lib/openstack_dashboard/horizon_error.log 50M" + LogLevel warn + CustomLog "|/usr/bin/rotatelogs \ + /var/lib/openstack_dashboard/horizon_access.log 50M" combined + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/files/openstack-dashboard-tls.conf --- a/components/openstack/horizon/files/openstack-dashboard-tls.conf Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/horizon/files/openstack-dashboard-tls.conf Mon Apr 20 12:35:51 2015 -0700 @@ -1,14 +1,11 @@ - - LoadModule wsgi_module libexec/64/mod_wsgi-2.6.so - - - LoadModule wsgi_module libexec/mod_wsgi-2.6.so - +LoadModule ssl_module libexec/mod_ssl.so +LoadModule wsgi_module libexec/mod_wsgi-2.6.so # # Enable Solaris Cryptographic Framework +# (recommended for SPARC T1/T2/T3 based systems only) # -SSLCryptoDevice pkcs11 +#SSLCryptoDevice pkcs11 RedirectPermanent /horizon https://openstack.example.com/horizon @@ -21,12 +18,12 @@ SSLEngine On - # Disable the known insecure SSLv2 & SSLv3 protocols - SSLProtocol all -SSLv2 -SSLv3 + # Disable the known insecure SSLv3 protocol + SSLProtocol all -SSLv3 # # For an overview on SSL with Apache see: - # http://httpd.apache.org/docs/2.2/ssl/ssl_howto.html + # http://httpd.apache.org/docs/2.4/ssl/ssl_howto.html # For examples on how to configure certificates and keys see: # http://www.akadia.com/services/ssh_test_certificate.html # @@ -39,15 +36,30 @@ WSGIDaemonProcess horizon user=webservd group=webservd processes=3 \ threads=10 - Alias /static /var/lib/openstack_dashboard/static/ + Alias /static /usr/lib/python2.6/vendor-packages/openstack_dashboard/static/ - + + Options FollowSymLinks + AllowOverride None + + + + Options Indexes FollowSymLinks MultiViews + AllowOverride None Order allow,deny Allow from all - + + Options Indexes FollowSymLinks MultiViews + AllowOverride None Order allow,deny Allow from all + + ErrorLog "|/usr/bin/rotatelogs \ + /var/lib/openstack_dashboard/horizon_error.log 50M" + LogLevel warn + CustomLog "|/usr/bin/rotatelogs \ + /var/lib/openstack_dashboard/horizon_access.log 50M" combined diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/files/overrides.py --- a/components/openstack/horizon/files/overrides.py Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/horizon/files/overrides.py Mon Apr 20 12:35:51 2015 -0700 @@ -1,4 +1,4 @@ -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain @@ -30,7 +30,7 @@ from openstack_dashboard.dashboards.project.access_and_security.tabs import \ AccessAndSecurityTabs, APIAccessTab, FloatingIPsTab, KeypairsTab from \ - openstack_dashboard.dashboards.project.images_and_snapshots.images.tables \ + openstack_dashboard.dashboards.project.images.images.tables \ import EditImage, DeleteImage, ImagesTable, LaunchImage from openstack_dashboard.dashboards.project.instances import tables \ as project_tables @@ -74,13 +74,11 @@ # Remove 'SecurityGroupsTab' tab from Project/Access & Security AccessAndSecurityTabs.tabs = (KeypairsTab, FloatingIPsTab, APIAccessTab) -# Remove 'ConsoleTab' tab from Project/Instances/Instance Name -InstanceDetailTabs.tabs = (OverviewTab, LogTab) - -# Remove 'ConfirmResize', 'RevertResize', 'ConsoleLink', 'TogglePause', +# Remove 'ConfirmResize', 'RevertResize', 'TogglePause', # 'ToggleSuspend', 'MigrateInstance' actions from Admin/Instances/Actions admin_tables.AdminInstancesTable._meta.row_actions = ( admin_tables.AdminEditInstance, + project_tables.ConsoleLink, project_tables.LogLink, project_tables.CreateSnapshot, project_tables.SoftRebootInstance, @@ -89,8 +87,8 @@ ) # Remove 'ConfirmResize', 'RevertResize', 'EditInstanceSecurityGroups', -# 'ConsoleLink', 'TogglePause', 'ToggleSuspend', 'ResizeLink', -# 'RebuildInstance' actions from Project/Instances/Actions +# 'TogglePause', 'ToggleSuspend', 'ResizeLink', 'RebuildInstance' actions +# from Project/Instances/Actions project_tables.InstancesTable._meta.row_actions = ( project_tables.StartInstance, project_tables.CreateSnapshot, @@ -98,6 +96,7 @@ project_tables.AssociateIP, project_tables.SimpleDisassociateIP, project_tables.EditInstance, + project_tables.ConsoleLink, project_tables.LogLink, project_tables.SoftRebootInstance, project_tables.RebootInstance, @@ -105,14 +104,19 @@ project_tables.TerminateInstance ) -# Disable 'admin_state' and 'shared' checkboxes in -# Admin/Networks/Create Network -CreateNetwork.base_fields['admin_state'].widget.attrs['disabled'] = True +# Disable 'admin_state' in Admin/Networks/Create Network +admin_state = CreateNetwork.base_fields['admin_state'] +admin_state.widget.attrs['disabled'] = True +admin_state.widget.value_from_datadict = lambda *args: True + +# Disable 'shared' in Admin/Networks/Create Network. Note that this +# is unchecked by default. CreateNetwork.base_fields['shared'].widget.attrs['disabled'] = True -# Disable 'admin_state' checkbox in -# Admin/Networks/Network Name/Create Port -CreatePort.base_fields['admin_state'].widget.attrs['disabled'] = True +# Disable 'admin_state' in Admin/Networks/Network Name/Create Port +admin_state = CreatePort.base_fields['admin_state'] +admin_state.widget.attrs['disabled'] = True +admin_state.widget.value_from_datadict = lambda *args: True # Remove 'UpdatePort' action from Admin/Networks/Network Name/Actions PortsTable._meta.row_actions = (DeletePort,) @@ -134,11 +138,13 @@ projectNetworksTable._meta.row_actions = (projectCreateSubnet, projectDeleteNetwork) -# Disable 'admin_state' checkboxes in Project/Networks/Create Network/Network -CreateNetworkInfoAction.base_fields['admin_state'].widget.attrs['disabled'] = \ - True +# Disable 'admin_state' in Project/Networks/Create Network/Network +admin_state = CreateNetworkInfoAction.base_fields['admin_state'] +admin_state.widget.attrs['disabled'] = True +admin_state.widget.value_from_datadict = lambda *args: True -# Disable 'no_gateway' checkboxes in Project/Networks/Create Network/Subnet +# Disable 'no_gateway' in Project/Networks/Create Network/Network. Note that +# this is unchecked by default. CreateSubnetInfoAction.base_fields['no_gateway'].widget.attrs['disabled'] = \ True @@ -150,6 +156,3 @@ # Project/Networks/Create Network/Subnet Detail base_fields = CreateSubnetDetailAction.base_fields base_fields['host_routes'].widget.attrs['readonly'] = 'readonly' - -# Remove 'StackTopologyTab' from Project/Stacks/StackDetailTabs -StackDetailTabs.tabs = (StackOverviewTab, StackResourcesTab, StackEventsTab) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/font-awesome.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/font-awesome.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,136 @@ +The MIT License (MIT) + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +============================================================ + +SIL OFL 1.1 + +Copyright (c) , (), +with Reserved Font Name . +Copyright (c) , (), +with Reserved Font Name . +Copyright (c) , (). + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +============================================================ + +css/font-awesome.css +scss/font-awesome.scss +less/font-awesome.less + +/*! +* Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome +* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) +*/ +============================================================ + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/hogan.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/hogan.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,212 @@ +The following applies to all products licensed under the Apache 2.0 License: + +You may not use the identified files except in compliance with the +Apache License, Version 2.0 (the "License.") + +You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0. A copy of the license is +also reproduced below. + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied. + +See the License for the specific language governing permissions and +limitations under the License. + + 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. + +END OF TERMS AND CONDITIONS + +============================================================ + +web/builds/2.0.0/template-2.0.0.js + +/* +* Copyright 2011 Twitter, Inc. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/horizon.p5m --- a/components/openstack/horizon/horizon.p5m Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/horizon/horizon.p5m Mon Apr 20 12:35:51 2015 -0700 @@ -20,32 +20,15 @@ # # -# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. # -# the static dashboard files need to be written by the webserver, so -# change their ownership - default owner webservd> - default group webservd> - -# move the openstack_dashboard to var as portions of it need to be writeable - edit path \ - usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static \ - var/lib/openstack_dashboard/static> - set action.hash \ - usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/%<1>> -# set name=pkg.fmri \ value=pkg:/cloud/openstack/horizon@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION) set name=pkg.summary value="OpenStack Horizon (Dashboard)" set name=pkg.description \ - value="OpenStack Horizon is the canonical implementation of Openstack's Dashboard, which provides a web based user interface to OpenStack services including Nova, Swift, Keystone, etc." -set name=pkg.human-version value="Havana $(COMPONENT_VERSION)" + value="OpenStack Horizon is the canonical implementation of OpenStack's Dashboard, which provides a web based user interface to OpenStack services including Nova, Swift, Keystone, etc." +set name=pkg.human-version value="Juno $(COMPONENT_VERSION)" set name=info.classification \ value="org.opensolaris.category.2008:System/Administration and Configuration" \ value="org.opensolaris.category.2008:System/Enterprise Management" \ @@ -54,18 +37,22 @@ set name=info.source-url value=$(COMPONENT_ARCHIVE_URL) set name=info.upstream value="OpenStack " set name=info.upstream-url value=$(COMPONENT_PROJECT_URL) -set name=org.opensolaris.arc-caseid value=PSARC/2013/350 value=PSARC/2014/058 +set name=openstack.upgrade-id reboot-needed=true value=$(COMPONENT_BE_VERSION) +set name=org.opensolaris.arc-caseid value=PSARC/2013/350 value=PSARC/2014/058 \ + value=PSARC/2015/110 set name=org.opensolaris.consolidation value=$(CONSOLIDATION) +# file files/openstack-dashboard-http.conf \ path=etc/apache2/2.2/samples-conf.d/openstack-dashboard-http.conf file files/openstack-dashboard-tls.conf \ path=etc/apache2/2.2/samples-conf.d/openstack-dashboard-tls.conf file files/local_settings.py path=etc/openstack_dashboard/local_settings.py \ - mode=0644 overlay=allow pkg.tmp.autopyc=false preserve=renamenew + mode=0644 overlay=allow pkg.tmp.autopyc=false preserve=renameold file path=usr/lib/python$(PYVER)/vendor-packages/horizon-$(COMPONENT_VERSION)-py$(PYVER).egg-info/PKG-INFO file path=usr/lib/python$(PYVER)/vendor-packages/horizon-$(COMPONENT_VERSION)-py$(PYVER).egg-info/SOURCES.txt file path=usr/lib/python$(PYVER)/vendor-packages/horizon-$(COMPONENT_VERSION)-py$(PYVER).egg-info/dependency_links.txt file path=usr/lib/python$(PYVER)/vendor-packages/horizon-$(COMPONENT_VERSION)-py$(PYVER).egg-info/not-zip-safe +file path=usr/lib/python$(PYVER)/vendor-packages/horizon-$(COMPONENT_VERSION)-py$(PYVER).egg-info/pbr.json file path=usr/lib/python$(PYVER)/vendor-packages/horizon-$(COMPONENT_VERSION)-py$(PYVER).egg-info/requires.txt file path=usr/lib/python$(PYVER)/vendor-packages/horizon-$(COMPONENT_VERSION)-py$(PYVER).egg-info/top_level.txt file path=usr/lib/python$(PYVER)/vendor-packages/horizon/__init__.py @@ -90,6 +77,8 @@ file path=usr/lib/python$(PYVER)/vendor-packages/horizon/conf/panel_template/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/conf/panel_template/views.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/context_processors.py +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/contrib/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/contrib/bootstrap_datepicker.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/decorators.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/exceptions.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/forms/__init__.py @@ -97,30 +86,6 @@ file path=usr/lib/python$(PYVER)/vendor-packages/horizon/forms/fields.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/forms/views.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/loaders.py -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/en_AU/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/en_AU/LC_MESSAGES/djangojs.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/en_GB/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/en_GB/LC_MESSAGES/djangojs.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/es/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/es/LC_MESSAGES/djangojs.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/fr/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/fr/LC_MESSAGES/djangojs.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/ja/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/ja/LC_MESSAGES/djangojs.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/ko_KR/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/ko_KR/LC_MESSAGES/djangojs.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/nl_NL/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/nl_NL/LC_MESSAGES/djangojs.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/pl_PL/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/pl_PL/LC_MESSAGES/djangojs.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/pt_BR/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/pt_BR/LC_MESSAGES/djangojs.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/ru/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/ru/LC_MESSAGES/djangojs.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/zh_CN/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/zh_CN/LC_MESSAGES/djangojs.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/zh_TW/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/locale/zh_TW/LC_MESSAGES/djangojs.mo file path=usr/lib/python$(PYVER)/vendor-packages/horizon/management/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/management/commands/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/management/commands/startdash.py @@ -129,17 +94,22 @@ file path=usr/lib/python$(PYVER)/vendor-packages/horizon/middleware.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/models.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/site_urls.py -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/bootstrap/js/bootstrap-datepicker.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/bootstrap/js/bootstrap.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/bootstrap/js/bootstrap.min.js +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/angular/controllers/dummy.js +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/angular/controllers/metadata-widget-controller.js +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/angular/directives/forms.js +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/angular/horizon.conf.js +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/angular/horizon.js +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/angular/services/horizon.utils.js +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.accordion_nav.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.communication.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.conf.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.cookies.js +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.d3barchart.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.d3linechart.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.d3piechart.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.firewalls.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.forms.js +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.formset_table.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.heattop.js +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.images.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.instances.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.membership.js @@ -148,31 +118,15 @@ file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.networktopology.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.quota.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.tables.js +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.tables_inline_edit.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.tabs.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.templates.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.users.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/js/horizon.utils.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/d3.v3.min.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/hogan-2.0.0.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/jquery/jquery-ui-1.9.2.custom.min.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/jquery/jquery.cookie.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/jquery/jquery.min.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/jquery/jquery.quicksearch.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/jquery/jquery.table-sorter.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/json2.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/qunit/qunit.css -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/qunit/qunit.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/rickshaw.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/spin.jquery.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/spin.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/underscore/underscore-min.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/tests/messages.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/tests/modals.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/tests/tables.js -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/tests/templates.js +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon/lib/jquery/jquery.bootstrap.wizard.js file path=usr/lib/python$(PYVER)/vendor-packages/horizon/tables/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/tables/actions.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/tables/base.py +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/tables/formset.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/tables/views.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/tabs/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/tabs/base.py @@ -182,7 +136,10 @@ file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/auth/_login.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/auth/login.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/base.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/_accordion_nav.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/_conf.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/_custom_head_js.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/_custom_meta.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/_messages.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/_nav_list.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/_scripts.html @@ -197,17 +154,26 @@ file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/client_side/templates.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_breadcrumb.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_data_table.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_data_table_cell.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_data_table_row.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_data_table_row_action.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_data_table_row_actions.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_data_table_table_action.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_data_table_table_actions.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_detail_table.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_domain_page_header.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_form_errors.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_form_field.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_form_fields.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_formset_table.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_formset_table_row.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_horizontal_field.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_horizontal_fields.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_limit_summary.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_modal.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_modal_form.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_modal_form_add_members.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_modal_form_update_metadata.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_page_header.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_region_selector.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_resource_browser.html @@ -219,22 +185,26 @@ file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_workflow_base.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_workflow_step.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/common/_workflow_step_update_members.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/jasmine/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/jasmine/jasmine.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/horizon/qunit.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templates/splash.html file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templatetags/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templatetags/branding.py +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templatetags/form_helpers.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templatetags/horizon.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templatetags/parse_date.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templatetags/shellfilter.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templatetags/sizeformat.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/templatetags/truncate_filter.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/utils/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/horizon/utils/fields.py +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/utils/csvbase.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/utils/filters.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/utils/functions.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/utils/html.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/utils/memoized.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/utils/secret_key.py +file path=usr/lib/python$(PYVER)/vendor-packages/horizon/utils/urlresolvers.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/utils/validators.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/version.py file path=usr/lib/python$(PYVER)/vendor-packages/horizon/views.py @@ -255,14 +225,35 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/api/network_base.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/api/neutron.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/api/nova.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/api/sahara.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/api/swift.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/api/trove.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/api/vpn.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/conf/cinder_policy.json +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/conf/glance_policy.json +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/conf/heat_policy.json file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/conf/keystone_policy.json +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/conf/neutron_policy.json file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/conf/nova_policy.json file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/context_processors.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/_update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/_update_metadata.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/manage_hosts.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/templates/aggregates/update_metadata.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/aggregates/workflows.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/dashboard.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/defaults/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/defaults/panel.py @@ -273,57 +264,34 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/defaults/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/defaults/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/defaults/workflows.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/domains/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/domains/constants.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/domains/panel.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/domains/tables.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/domains/templates/domains/index.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/domains/tests.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/domains/urls.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/domains/views.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/domains/workflows.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/extras/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/extras/forms.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/extras/tables.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/extras/tests.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/extras/urls.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/extras/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/forms.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/panel.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/tables.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/templates/flavors/_update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/templates/flavors/_update_metadata.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/templates/flavors/create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_edit.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/_index.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/edit.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/templates/flavors/extras/index.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/templates/flavors/index.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/templates/flavors/update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/templates/flavors/update_metadata.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/flavors/workflows.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/constants.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/forms.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/panel.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/tables.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/templates/groups/_add_non_member.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/templates/groups/_create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/templates/groups/_update.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/templates/groups/add_non_member.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/templates/groups/create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/templates/groups/index.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/templates/groups/manage.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/templates/groups/update.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/tests.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/urls.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/groups/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/compute/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/compute/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/compute/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/compute/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/compute/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/compute/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/compute/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/panel.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/templates/hypervisors/compute/_evacuate_host.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/templates/hypervisors/compute/evacuate_host.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/templates/hypervisors/detail.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/templates/hypervisors/index.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/hypervisors/urls.py @@ -334,37 +302,51 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/images/tables.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/images/templates/images/_create.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/images/templates/images/_update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/images/templates/images/_update_metadata.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/images/templates/images/create.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/images/templates/images/index.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/images/templates/images/update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/images/templates/images/update_metadata.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/images/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/images/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/images/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/info/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/info/constants.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/info/panel.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/info/tables.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/info/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/info/templates/info/_cell_status.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/info/templates/info/index.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/info/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/info/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/info/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/instances/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/instances/forms.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/instances/panel.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/instances/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/instances/templates/instances/_live_migrate.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/instances/templates/instances/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/instances/templates/instances/live_migrate.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/instances/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/instances/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/instances/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/metering/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/metering/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/metering/tables.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/metering/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/metering/templates/metering/daily.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/metering/templates/metering/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/metering/templates/metering/report.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/metering/templates/metering/stats.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/metering/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/metering/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/metering/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/models.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/agents/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/agents/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/agents/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/agents/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/forms.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/panel.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/ports/__init__.py @@ -381,6 +363,8 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/tables.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/templates/networks/_create.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/templates/networks/_update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/templates/networks/agents/_add.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/templates/networks/agents/add.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/templates/networks/create.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/templates/networks/index.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/networks/templates/networks/ports/_create.html @@ -399,28 +383,11 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/overview/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/overview/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/overview/views.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/projects/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/projects/panel.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/projects/tables.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/projects/templates/projects/index.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/projects/templates/projects/usage.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/projects/tests.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/projects/urls.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/projects/views.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/projects/workflows.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/roles/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/roles/forms.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/roles/panel.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/roles/tables.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/roles/templates/roles/_create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/roles/templates/roles/_update.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/roles/templates/roles/create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/roles/templates/roles/index.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/roles/templates/roles/update.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/roles/tests.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/roles/urls.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/roles/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/extensions/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/extensions/routerrules/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/extensions/routerrules/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/forms.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/panel.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/ports/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/ports/tables.py @@ -430,34 +397,138 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/tables.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/tabs.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/templates/routers/_detail_overview.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/templates/routers/_update.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/templates/routers/detail.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/templates/routers/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/templates/routers/update.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/routers/views.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/users/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/users/forms.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/users/panel.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/users/tables.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/users/templates/users/_create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/users/templates/users/_update.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/users/templates/users/create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/users/templates/users/index.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/users/templates/users/update.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/users/tests.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/users/urls.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/users/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/forms.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/panel.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/tables.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/_create_volume_type.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/create_volume_type.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/detail.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/snapshots/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/snapshots/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/snapshots/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/snapshots/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/snapshots/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/snapshots/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/snapshots/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/tabs.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/snapshots/_detail_overview.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/snapshots/_update_status.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/snapshots/update_status.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/_associate_qos_spec.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/_create_qos_spec.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/_create_volume_type.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/_edit_qos_spec_consumer.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/associate_qos_spec.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/create_qos_spec.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/create_volume_type.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/edit_qos_spec_consumer.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/extras/_create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/extras/_edit.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/extras/_index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/extras/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/extras/edit.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/extras/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/_create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/_edit.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/_index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/edit.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/qos_specs/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/volume_types_tables.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volumes/_update_status.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volumes/detail.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volumes/update_status.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volumes/volumes_tables.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/extras/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/extras/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/extras/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/extras/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/extras/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/extras/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/qos_specs/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/qos_specs/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/qos_specs/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/qos_specs/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/qos_specs/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/qos_specs/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volume_types/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volumes/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volumes/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volumes/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volumes/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/admin/volumes/volumes/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/dashboard.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/domains/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/domains/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/domains/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/domains/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/domains/templates/domains/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/domains/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/domains/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/domains/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/domains/workflows.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/templates/groups/_add_non_member.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/templates/groups/_create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/templates/groups/_update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/templates/groups/add_non_member.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/templates/groups/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/templates/groups/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/templates/groups/manage.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/templates/groups/update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/groups/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/projects/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/projects/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/projects/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/projects/templates/projects/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/projects/templates/projects/usage.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/projects/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/projects/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/projects/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/projects/workflows.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/roles/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/roles/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/roles/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/roles/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/roles/templates/roles/_create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/roles/templates/roles/_update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/roles/templates/roles/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/roles/templates/roles/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/roles/templates/roles/update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/roles/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/roles/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/roles/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/users/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/users/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/users/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/users/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/users/templates/users/_create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/users/templates/users/_update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/users/templates/users/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/users/templates/users/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/users/templates/users/update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/users/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/users/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/identity/users/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/access_and_security/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/access_and_security/api_access/__init__.py @@ -512,20 +583,179 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/panel.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/tables.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/_container_detail.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/_container_metadata.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/_copy.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/_create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/_create_pseudo_folder.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/_object_detail.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/_update.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/_upload.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/container_detail.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/copy.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/create_pseudo_folder.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/index.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/object_detail.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/update.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/templates/containers/upload.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/containers/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/dashboard.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_configure_general_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_create_general_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_nodegroups_details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/_upload_file.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/cluster_node_groups_template.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/cluster_templates.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/configure.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/templates/data_processing.cluster_templates/upload_file.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/workflows/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/workflows/copy.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/cluster_templates/workflows/create.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/templates/data_processing.clusters/_configure_general_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/templates/data_processing.clusters/_create_cluster.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/templates/data_processing.clusters/_create_general_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/templates/data_processing.clusters/_details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/templates/data_processing.clusters/_instances_details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/templates/data_processing.clusters/_nodegroups_details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/templates/data_processing.clusters/clusters.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/templates/data_processing.clusters/configure.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/templates/data_processing.clusters/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/templates/data_processing.clusters/create_cluster.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/templates/data_processing.clusters/details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/templates/data_processing.clusters/scale.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/workflows/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/workflows/create.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/clusters/workflows/scale.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_edit_tags.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_list_tags.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_register_image.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/_tag_form.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/edit_tags.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/image_registry.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/templates/data_processing.data_image_registry/register_image.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_image_registry/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_plugins/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_plugins/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_plugins/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_plugins/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/_details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_plugins/templates/data_processing.data_plugins/plugins.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_plugins/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_plugins/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_plugins/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_create_data_source_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/_details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/data_sources.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/data_sources_form_script.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/templates/data_processing.data_sources/details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/workflows/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/data_sources/workflows/create.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_create_job_binary_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/_details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/job_binaries.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/templates/data_processing.job_binaries/job_binaries_form_script.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_binaries/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_executions/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_executions/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_executions/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_executions/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/_details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_executions/templates/data_processing.job_executions/job_executions.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_executions/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_executions/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/job_executions/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/templates/data_processing.jobs/_create_job_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/templates/data_processing.jobs/_create_job_libs_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/templates/data_processing.jobs/_details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/templates/data_processing.jobs/_launch_job_configure_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/templates/data_processing.jobs/_launch_job_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/templates/data_processing.jobs/config_template.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/templates/data_processing.jobs/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/templates/data_processing.jobs/details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/templates/data_processing.jobs/jobs.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/templates/data_processing.jobs/launch.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/templates/data_processing.jobs/library_template.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/workflows/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/workflows/create.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/jobs/workflows/launch.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_configure_general_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_create_general_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_fields_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/_service_confs.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/configure.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/templates/data_processing.nodegroup_templates/nodegroup_templates.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/workflows/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/workflows/copy.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/nodegroup_templates/workflows/create.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/utils/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/utils/anti_affinity.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/utils/helpers.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/utils/neutron_support.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/data_processing/utils/workflow_helpers.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/database_backups/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/database_backups/panel.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/database_backups/tables.py @@ -539,17 +769,26 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/database_backups/workflows/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/database_backups/workflows/create_backup.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/forms.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/panel.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/tables.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/tabs.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/_detail_overview.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/_detail_users.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/_detail_overview_cassandra.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/_detail_overview_couchbase.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/_detail_overview_mongodb.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/_detail_overview_mysql.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/_detail_overview_redis.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/_launch_details_help.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/_launch_initialize_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/_launch_network_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/_launch_networks.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/_launch_restore_help.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/_resize_volume.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/detail.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/index.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/launch.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/resize_volume.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/templates/databases/update.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/databases/urls.py @@ -584,60 +823,62 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/firewalls/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/firewalls/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/firewalls/workflows.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/images/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/images/forms.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/images/tables.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/images/tabs.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/images/tests.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/images/urls.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/images/views.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/panel.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/snapshots/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/snapshots/forms.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/snapshots/tests.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/snapshots/urls.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/snapshots/views.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/images/_create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/images/_detail_overview.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/images/_update.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/images/create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/images/detail.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/images/update.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/index.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/snapshots/_create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/snapshots/_detail_overview.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/snapshots/create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/templates/images_and_snapshots/snapshots/detail.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/tests.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/urls.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/utils.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/views.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/volume_snapshots/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/volume_snapshots/tables.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/volume_snapshots/tabs.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images_and_snapshots/volume_snapshots/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/images/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/images/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/images/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/images/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/images/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/images/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/images/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/panel.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/snapshots/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/snapshots/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/snapshots/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/snapshots/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/snapshots/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/templates/images/images/_create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/templates/images/images/_detail_overview.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/templates/images/images/_update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/templates/images/images/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/templates/images/images/detail.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/templates/images/images/update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/templates/images/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/templates/images/snapshots/_create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/templates/images/snapshots/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/images/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/audit_tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/console.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/forms.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/panel.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/tables.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_decryptpassword.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_audit.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_console.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_log.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_detail_overview.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_flavors_and_quotas.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_instance_flavor.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_instance_ips.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_launch_advanced_help.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_launch_customize_help.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_launch_details_help.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_launch_network_help.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_launch_volumes_help.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_rebuild.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/_update_networks.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/decryptpassword.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/detail.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/index.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/templates/instances/rebuild.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/utils.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/workflows/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py @@ -667,6 +908,7 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/loadbalancers/templates/loadbalancers/updatevip.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/loadbalancers/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/loadbalancers/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/loadbalancers/utils.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/loadbalancers/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/loadbalancers/workflows.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/models.py @@ -687,6 +929,7 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/create_router.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/iframe.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/network_topology/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/network_topology/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/network_topology/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/networks/__init__.py @@ -702,6 +945,7 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/networks/subnets/tables.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/networks/subnets/tabs.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/networks/subnets/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/networks/subnets/utils.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/networks/subnets/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/networks/subnets/workflows.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/networks/tables.py @@ -732,6 +976,13 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/overview/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/overview/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/extensions/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/extensions/routerrules/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/extensions/routerrules/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/extensions/routerrules/rulemanager.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/extensions/routerrules/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/extensions/routerrules/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/extensions/routerrules/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/forms.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/panel.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/ports/__init__.py @@ -744,13 +995,18 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/tabs.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/_create.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/_detail_overview.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/_update.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/create.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/detail.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/extensions/routerrules/_create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/extensions/routerrules/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/extensions/routerrules/grid.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/index.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/ports/_create.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/ports/_setgateway.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/ports/create.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/ports/setgateway.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/templates/routers/update.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/routers/views.py @@ -762,6 +1018,7 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/sro.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/tables.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/_change_template.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/_create.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_events.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_overview.html @@ -771,42 +1028,93 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/_resource_overview.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/_select_template.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/_stack_info.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/_update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/change_template.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/create.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/detail.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/index.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/resource.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/select_template.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/templates/stacks/update.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/stacks/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/backups/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/backups/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/backups/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/backups/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/backups/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/backups/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/backups/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/panel.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/snapshots/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/snapshots/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/snapshots/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/snapshots/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/snapshots/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/snapshots/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/snapshots/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/tabs.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/_attach.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/_create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/_create_snapshot.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/_detail_overview.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/_limits.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/attach.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/create.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/create_snapshot.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/detail.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/backups/_create_backup.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/backups/_detail_overview.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/backups/_restore_backup.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/backups/create_backup.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/backups/detail.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/backups/restore_backup.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/index.html -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/_detail_overview.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/_update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/detail.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/snapshots/update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_attach.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_create_snapshot.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_detail_overview.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_extend.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_extend_limits.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_limits.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_retype.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_snapshot_limits.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/_upload_to_image.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/attach.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/create.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/create_snapshot.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/detail.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/extend.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/retype.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/update.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/upload_to_image.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/test.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/volumes/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/volumes/forms.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/volumes/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/volumes/tabs.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/volumes/tests.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/volumes/urls.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/volumes/volumes/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/forms.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/panel.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/tables.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/tabs.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ikepolicy_details.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ipsecpolicy_details.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/_ipsecsiteconnection_details.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ikepolicy.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecpolicy.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecsiteconnection.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/_update_vpnservice.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/_vpnservice_details.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/details_tabs.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/index.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/update_ikepolicy.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/update_ipsecpolicy.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/update_ipsecsiteconnection.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/templates/vpn/update_vpnservice.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/project/vpn/views.py @@ -848,30 +1156,36 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/settings/user/tests.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/settings/user/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/dashboards/settings/user/views.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/django_pyscss_fix/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/enabled/_10_project.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/enabled/_20_admin.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/enabled/_25_identity.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/enabled/_30_settings.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/enabled/_40_router.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/enabled/_50_admin_add_panel.py.example +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/enabled/_60_admin_remove_panel.py.example +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/enabled/_70_admin_default_panel.py.example +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/enabled/_80_admin_add_panel_group.py.example +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/enabled/_90_admin_add_panel_to_group.py.example +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/enabled/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/exceptions.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/hooks.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/local/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/local/enabled/_40_router.py.example +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/local/enabled/__init__.py link \ path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/local/local_settings.py \ target=../../../../../../etc/openstack_dashboard/local_settings.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/locale/es/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/locale/fr/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/locale/ja/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/locale/nl_NL/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/locale/pl_PL/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/locale/ru/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/locale/zh_CN/LC_MESSAGES/django.mo -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/locale/zh_TW/LC_MESSAGES/django.mo +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/local/local_settings.py.example +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/management/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/management/commands/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/management/commands/apache_vhost.conf.template +file \ + path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/management/commands/horizon.wsgi.template \ + pkg.depend.bypass-generate=.* +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/management/commands/make_web_conf.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/config/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/config/generator.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/context.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/eventlet_backdoor.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/excutils.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/fileutils.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/gettextutils.py @@ -879,90 +1193,129 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/jsonutils.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/local.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/log.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/loopingcall.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/network_utils.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/notifier/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/notifier/api.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/notifier/log_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/notifier/no_op_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/notifier/rpc_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/notifier/rpc_notifier2.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/notifier/test_notifier.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/policy.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/amqp.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/common.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/dispatcher.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/impl_fake.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/impl_kombu.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/impl_qpid.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/impl_zmq.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/matchmaker.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/matchmaker_redis.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/matchmaker_ring.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/proxy.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/serializer.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/service.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/rpc/zmq_receiver.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/service.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/threadgroup.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/strutils.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/timeutils.py -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/openstack/common/uuidutils.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/overrides.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/policy.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/settings.py -dir path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static \ - owner=webservd group=webservd -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/img/glyphicons-halflings-white.png -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/img/glyphicons-halflings.png -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/accordion.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/alerts.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/bootstrap.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/breadcrumbs.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/button-groups.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/buttons.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/carousel.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/close.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/code.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/component-animations.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/datepicker.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/dropdowns.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/forms.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/grid.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/hero-unit.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/labels.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/layouts.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/mixins.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/modals.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/navbar.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/navs.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/pager.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/pagination.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/popovers.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/progress-bars.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/reset.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/responsive.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/scaffolding.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/sprites.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/tables.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/thumbnails.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/tooltip.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/type.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/utilities.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/variables.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/less/wells.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.eot +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.svg +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.ttf +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/fonts/bootstrap/glyphicons-halflings-regular.woff +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap-sprockets.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap/affix.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap/alert.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap/button.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap/carousel.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap/collapse.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap/dropdown.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap/modal.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap/popover.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap/scrollspy.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap/tab.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap/tooltip.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/js/bootstrap/transition.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/_bootstrap-compass.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/_bootstrap-mincer.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/_bootstrap-sprockets.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_alerts.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_badges.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_breadcrumbs.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_button-groups.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_buttons.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_carousel.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_close.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_code.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_component-animations.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_dropdowns.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_forms.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_glyphicons.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_grid.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_input-groups.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_jumbotron.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_labels.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_list-group.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_media.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_mixins.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_modals.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_navbar.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_navs.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_normalize.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_pager.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_pagination.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_panels.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_popovers.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_print.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_progress-bars.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-embed.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_responsive-utilities.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_scaffolding.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_tables.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_theme.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_thumbnails.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_tooltip.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_type.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_utilities.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_variables.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/_wells.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/bootstrap.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_alerts.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_background-variant.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_border-radius.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_buttons.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_center-block.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_clearfix.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_forms.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_gradients.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid-framework.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_grid.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_hide-text.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_image.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_labels.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_list-group.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-divider.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_nav-vertical-align.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_opacity.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_pagination.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_panels.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_progress-bar.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_reset-filter.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_resize.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_responsive-visibility.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_size.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_tab-focus.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_table-row.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-emphasis.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_text-overflow.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/bootstrap/scss/bootstrap/mixins/_vendor-prefixes.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/css/24c5e4c41a70.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/css/rickshaw.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/css/solaris.css file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/fonts/Anivers_Regular-webfont.eot file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/fonts/Anivers_Regular-webfont.svg file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/fonts/Anivers_Regular-webfont.ttf file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/fonts/Anivers_Regular-webfont.woff +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/OpenStack_Dashboard_txt.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/OpenStack_banner.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/OracleSolaris_Logo.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/OracleSolaris_login_banner.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/Oracle_Logo.png file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/action_required.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/content_tab_bkgd_selected.png file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/db-gray.gif file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/db-gray.svg file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/db-green.svg file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/db-red.svg +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/dots.png file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/drag.png file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/drop_arrow.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/dropdown_dwn.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/dropdown_ena.png file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/favicon.ico +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/header_shadow.png file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/lb-gray.gif file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/lb-gray.svg file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/lb-green.svg @@ -970,6 +1323,7 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/loading.gif file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/logo-splash.png file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/logo.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/profile_drop.png file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/right_droparrow.png file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/router.png file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/search.png @@ -978,36 +1332,648 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/server-green.svg file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/server-red.svg file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/server.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/spinner.gif file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/stack-gray.gif file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/stack-gray.svg file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/stack-green.svg file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/stack-red.svg +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/tab_bkgd_deselected.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/tab_bkgd_selected.png file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/unknown-gray.gif file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/unknown-gray.svg file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/unknown-green.svg file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/unknown-red.svg file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/img/up_arrow.png -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/less/horizon.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/less/horizon_charts.less -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/less/rickshaw.css -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/solaris/css/solaris.css -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/solaris/img/OpenStack_Dashboard_txt.png -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/solaris/img/Openstack_banner.png -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/solaris/img/OracleSolaris_Logo.png -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/solaris/img/OracleSolaris_login_banner.png -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/solaris/img/Oracle_Logo.png -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/solaris/img/content_tab_bkgd_selected.png -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/solaris/img/dots.png -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/solaris/img/favicon-solaris.ico -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/solaris/img/header_shadow.png -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/solaris/img/tab_bkgd_deselected.png -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/solaris/img/tab_bkgd_selected.png -file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/solaris/theme/_stylesheets.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/js/a1c6730ae0fb.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/js/db5b3a23c36d.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/js/ff63d45232c5.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/manifest.json +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/scss/_accordion_nav.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/scss/_context_selection.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/scss/_variables.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/scss/components/resource_browser.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/scss/horizon.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/scss/horizon_charts.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/dashboard/scss/horizon_workflow.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/angular/controllers/dummy.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/angular/controllers/metadata-widget-controller.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/angular/directives/forms.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/angular/horizon.conf.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/angular/horizon.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/angular/services/horizon.utils.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.accordion_nav.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.communication.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.d3barchart.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.d3linechart.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.d3piechart.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.firewalls.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.forms.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.formset_table.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.heattop.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.images.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.instances.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.membership.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.messages.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.modals.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.networktopology.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.quota.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.tables.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.tables_inline_edit.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.tabs.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.templates.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/js/horizon.users.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/angular-animate.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/angular-aria.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/angular-cookies.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/angular-csp.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/angular-loader.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/angular-messages.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/angular-mocks.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/angular-resource.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/angular-route.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/angular-sanitize.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/angular-scenario.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/angular-touch.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/angular.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/errors.json +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/version.json +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/angular/version.txt +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/bootstrap-datepicker.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/datepicker.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/datepicker3.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.ar.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.az.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.bg.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.ca.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.cs.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.cy.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.da.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.de.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.el.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.es.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.et.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.fa.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.fi.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.fr.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.gl.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.he.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.hr.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.hu.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.id.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.is.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.it.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.ja.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.ka.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.kk.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.kr.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.lt.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.lv.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.mk.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.ms.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.nb.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.nl-BE.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.nl.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.no.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.pl.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.pt-BR.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.pt.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.ro.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.rs-latin.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.rs.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.ru.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.sk.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.sl.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.sq.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.sv.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.sw.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.th.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.tr.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.ua.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.vi.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.zh-CN.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/bootstrap_datepicker/locales/bootstrap-datepicker.zh-TW.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/d3.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/css/font-awesome.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/css/font-awesome.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/fonts/FontAwesome.otf +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/fonts/fontawesome-webfont.eot +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/fonts/fontawesome-webfont.svg +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/fonts/fontawesome-webfont.ttf +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/fonts/fontawesome-webfont.woff +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/bordered-pulled.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/core.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/extras.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/fixed-width.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/font-awesome.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/icons.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/larger.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/list.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/mixins.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/path.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/rotated-flipped.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/spinning.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/stacked.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/less/variables.less +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/_bordered-pulled.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/_core.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/_extras.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/_fixed-width.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/_icons.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/_larger.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/_list.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/_mixins.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/_path.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/_rotated-flipped.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/_spinning.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/_stacked.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/_variables.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/font-awesome/scss/font-awesome.scss +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/hogan.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-bg_diagonals-thick_20_666666_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-bg_flat_10_000000_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-bg_glass_100_f6f6f6_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-bg_glass_100_fdf5ce_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-bg_glass_65_ffffff_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-icons_222222_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-icons_228ef1_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-icons_ef8c08_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-icons_ffd27a_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/jquery-ui.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/jquery-ui.min.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/jquery-ui.structure.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/jquery-ui.structure.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/jquery-ui.theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/jquery-ui.theme.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-bg_diagonals-thick_8_333333_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-bg_flat_65_ffffff_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-bg_glass_40_111111_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-bg_glass_55_1c1c1c_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-bg_highlight-hard_100_f9f9f9_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-bg_highlight-hard_40_aaaaaa_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-bg_highlight-soft_50_aaaaaa_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-bg_inset-hard_45_cd0a0a_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-bg_inset-hard_55_ffeb80_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-icons_222222_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-icons_4ca300_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-icons_bbbbbb_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-icons_ededed_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-icons_ffcf29_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/black-tie/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/images/ui-bg_diagonals-thick_75_f3d8d8_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/images/ui-bg_dots-small_65_a6a6a6_2x2.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/images/ui-bg_flat_0_333333_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/images/ui-bg_flat_65_ffffff_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/images/ui-bg_flat_75_ffffff_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/images/ui-bg_glass_55_fbf8ee_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/images/ui-bg_highlight-hard_100_eeeeee_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/images/ui-bg_highlight-hard_100_f6f6f6_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/images/ui-bg_highlight-soft_15_cc0000_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/images/ui-icons_004276_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/images/ui-icons_cc0000_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/blitzer/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-bg_flat_15_cd0a0a_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-bg_glass_50_3baae3_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-icons_2694e8_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-icons_2e83ff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-icons_3d80b3_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-icons_72a7cf_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/cupertino/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-bg_flat_30_cccccc_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-bg_flat_50_5c5c5c_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-bg_glass_40_ffc73d_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-bg_highlight-hard_20_0972a5_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-bg_highlight-soft_33_003147_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-bg_highlight-soft_35_222222_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-bg_highlight-soft_44_444444_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-bg_highlight-soft_80_eeeeee_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-bg_loop_25_000000_21x21.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-icons_222222_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-icons_4b8e0b_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-icons_a83300_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-icons_cccccc_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dark-hive/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/images/ui-bg_diagonals-thick_15_0b3e6f_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/images/ui-bg_dots-medium_30_0b58a2_4x4.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/images/ui-bg_dots-small_20_333333_2x2.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/images/ui-bg_dots-small_30_a32d00_2x2.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/images/ui-bg_dots-small_40_00498f_2x2.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/images/ui-bg_flat_0_aaaaaa_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/images/ui-bg_flat_40_292929_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/images/ui-bg_gloss-wave_20_111111_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/images/ui-icons_00498f_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/images/ui-icons_98d2fb_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/images/ui-icons_9ccdfc_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/dot-luv/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-bg_flat_0_aaaaaa_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-bg_flat_0_eeeeee_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-bg_flat_55_994d53_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-bg_flat_55_fafafa_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-bg_gloss-wave_30_3d3644_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-bg_highlight-soft_100_dcd9de_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-bg_highlight-soft_100_eae6ea_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-bg_highlight-soft_25_30273a_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-bg_highlight-soft_45_5f5964_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-icons_454545_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-icons_734d99_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-icons_8d78a5_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-icons_a8a3ae_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-icons_ebccce_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/eggplant/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/ui-bg_diagonals-small_25_c5ddfc_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/ui-bg_diagonals-thick_20_e69700_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/ui-bg_diagonals-thick_22_1484e6_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/ui-bg_diagonals-thick_26_2293f7_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/ui-bg_flat_0_e69700_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/ui-bg_flat_0_e6b900_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/ui-bg_highlight-soft_100_f9f9f9_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/ui-bg_inset-hard_100_eeeeee_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/ui-icons_0a82eb_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/ui-icons_0b54d5_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/ui-icons_5fa5e3_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/ui-icons_fcdd4a_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/excite-bike/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/ui-bg_flat_0_aaaaaa_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/ui-bg_flat_0_eeeeee_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/ui-bg_flat_55_ffffff_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/ui-bg_flat_75_ffffff_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/ui-bg_glass_65_ffffff_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/ui-bg_highlight-soft_100_f6f6f6_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/ui-bg_highlight-soft_25_0073ea_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/ui-bg_highlight-soft_50_dddddd_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/ui-icons_0073ea_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/ui-icons_454545_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/ui-icons_666666_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/ui-icons_ff0084_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/flick/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-bg_diagonals-small_40_db4865_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-bg_diagonals-small_50_93c3cd_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-bg_diagonals-small_50_ff3853_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-bg_diagonals-small_75_ccd232_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-bg_dots-medium_80_ffff38_4x4.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-bg_dots-small_35_35414f_2x2.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-bg_flat_75_ba9217_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-bg_flat_75_ffffff_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-bg_white-lines_85_f7f7ba_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-icons_454545_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-icons_88a206_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-icons_c02669_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-icons_e1e463_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-icons_ffeb33_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/hot-sneaks/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-bg_flat_75_aaaaaa_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-bg_glass_100_f5f0e5_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-bg_glass_25_cb842e_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-bg_glass_70_ede4d4_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-bg_highlight-hard_100_f4f0ec_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-bg_highlight-hard_65_fee4bd_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-bg_highlight-hard_75_f5f5b5_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-bg_inset-soft_100_f4f0ec_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-icons_c47a23_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-icons_cb672b_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-icons_f08000_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-icons_f35f07_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-icons_ff7519_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/humanity/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/ui-bg_diagonals-small_0_aaaaaa_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/ui-bg_diagonals-thick_15_444444_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/ui-bg_diagonals-thick_95_ffdc2e_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/ui-bg_glass_55_fbf5d0_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/ui-bg_highlight-hard_30_285c00_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/ui-bg_highlight-soft_33_3a8104_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/ui-bg_highlight-soft_50_4eb305_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/ui-bg_highlight-soft_60_4ca20b_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/ui-bg_inset-soft_10_285c00_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/ui-icons_4eb305_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/ui-icons_72b42d_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/ui-icons_cd0a0a_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/le-frog/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-bg_flat_0_aaaaaa_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-bg_glass_15_5f391b_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-bg_gloss-wave_20_1c160d_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-bg_gloss-wave_25_453326_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-bg_gloss-wave_30_44372c_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-bg_highlight-soft_20_201913_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-bg_highlight-soft_20_619226_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-bg_inset-soft_10_201913_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-icons_222222_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-icons_9bcc60_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-icons_add978_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-icons_e3ddc9_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-icons_f1fd86_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/mint-choc/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-bg_flat_0_aaaaaa_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-bg_flat_0_eeeeee_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-bg_flat_55_c0402a_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-bg_flat_55_eeeeee_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-bg_glass_100_f8f8f8_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-bg_glass_35_dddddd_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-bg_glass_60_eeeeee_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-bg_inset-hard_75_999999_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-bg_inset-soft_50_c9c9c9_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-icons_3383bb_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-icons_454545_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-icons_70b2e1_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-icons_999999_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/images/ui-icons_fbc856_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/overcast/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-bg_diagonal-maze_20_6e4f1c_10x10.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-bg_diagonal-maze_40_000000_10x10.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-bg_fine-grain_10_eceadf_60x60.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-bg_fine-grain_10_f8f7f6_60x60.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-bg_fine-grain_15_eceadf_60x60.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-bg_fine-grain_15_f7f3de_60x60.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-bg_fine-grain_15_ffffff_60x60.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-bg_fine-grain_65_654b24_60x60.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-bg_fine-grain_68_b83400_60x60.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-icons_222222_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-icons_3572ac_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-icons_8c291d_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-icons_b83400_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-icons_fbdb93_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/pepper-grinder/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-bg_flat_55_fbec88_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-bg_glass_85_dfeffc_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-bg_glass_95_fef1ec_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-icons_217bc0_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-icons_2e83ff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-icons_469bdd_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-icons_6da8d5_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-icons_cd0a0a_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-icons_d8e7f3_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/images/ui-icons_f9bd01_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/redmond/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/ui-icons_222222_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/ui-icons_454545_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/ui-icons_888888_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/smoothness/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-bg_glass_55_fcf0ba_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-bg_gloss-wave_100_ece8da_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-bg_highlight-hard_100_f5f3e5_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-bg_highlight-hard_100_fafaf4_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-bg_highlight-hard_15_459e00_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-bg_highlight-hard_95_cccccc_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-bg_highlight-soft_25_67b021_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-bg_highlight-soft_95_ffedad_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-bg_inset-soft_15_2b2922_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-icons_808080_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-icons_847e71_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-icons_8DC262_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-icons_cd0a0a_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-icons_eeeeee_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/south-street/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-bg_flat_55_999999_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-bg_flat_75_aaaaaa_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-bg_glass_45_0078ae_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-bg_glass_55_f8da4e_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-bg_glass_75_79c9ec_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-bg_gloss-wave_45_e14f1c_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-bg_gloss-wave_50_6eac2c_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-bg_gloss-wave_75_2191c0_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-icons_0078ae_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-icons_056b93_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-icons_d8e7f3_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-icons_e0fdff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-icons_f5e175_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-icons_f7a50d_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/images/ui-icons_fcd113_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/start/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-bg_diagonals-medium_20_d34d17_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-bg_flat_30_cccccc_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-bg_flat_50_5c5c5c_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-bg_gloss-wave_45_817865_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-bg_gloss-wave_60_fece2f_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-bg_gloss-wave_70_ffdd57_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-bg_gloss-wave_90_fff9e5_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-bg_highlight-soft_100_feeebd_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-bg_inset-soft_30_ffffff_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-icons_3d3d3d_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-icons_bd7b00_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-icons_d19405_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-icons_eb990f_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-icons_ed9f26_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-icons_fadc7a_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/images/ui-icons_ffe180_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/sunny/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-bg_diamond_10_4f4221_10x8.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-bg_diamond_20_372806_10x8.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-bg_diamond_25_675423_10x8.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-bg_diamond_25_d5ac5d_10x8.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-bg_diamond_8_261803_10x8.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-bg_diamond_8_443113_10x8.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-bg_flat_75_ddd4b0_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-bg_highlight-hard_65_fee4bd_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-icons_070603_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-icons_e8e2b5_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-icons_e9cd86_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-icons_efec9f_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-icons_f2ec64_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-icons_f9f2bd_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/images/ui-icons_ff7519_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/swanky-purse/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-bg_diagonals-small_50_262626_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-bg_flat_0_303030_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-bg_flat_0_4c4c4c_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-bg_glass_40_0a0a0a_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-bg_glass_55_f1fbe5_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-bg_glass_60_000000_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-bg_gloss-wave_55_000000_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-bg_gloss-wave_85_9fda58_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-bg_gloss-wave_95_f6ecd5_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-icons_000000_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-icons_1f1f1f_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-icons_9fda58_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-icons_b8ec79_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-icons_cd0a0a_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/trontastic/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-bg_flat_30_cccccc_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-bg_flat_50_5c5c5c_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-bg_glass_20_555555_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-icons_222222_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-icons_4b8e0b_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-icons_a83300_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-icons_cccccc_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-darkness/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-icons_222222_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-icons_228ef1_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-icons_ef8c08_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-icons_ffd27a_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/images/ui-icons_ffffff_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/ui-lightness/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/animated-overlay.gif +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-bg_flat_0_aaaaaa_40x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-bg_glass_95_fef1ec_1x400.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-bg_gloss-wave_16_121212_500x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-bg_highlight-hard_15_888888_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-bg_highlight-hard_55_555555_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-bg_highlight-soft_35_adadad_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-bg_highlight-soft_60_dddddd_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-bg_inset-soft_15_121212_1x100.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-icons_666666_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-icons_aaaaaa_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-icons_bbbbbb_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-icons_c98000_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-icons_cccccc_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-icons_cd0a0a_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/images/ui-icons_f29a00_256x240.png +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/jquery-ui.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/jquery-ui.min.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery-ui/ui/themes/vader/theme.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery/jquery-migrate.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery/jquery-migrate.min.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery/jquery.bootstrap.wizard.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery/jquery.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery/jquery.min.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery/jquery.quicksearch.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jquery/jquery.tablesorter.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/jsencrypt/jsencrypt.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/rickshaw.css +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/rickshaw.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/spin.jquery.js +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/static/horizon/lib/spin.js file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/templates/403.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/templates/404.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/templates/500.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/templates/_header.html file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/templates/_stylesheets.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/templates/context_selection/_domain_list.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/templates/context_selection/_overview.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/templates/context_selection/_project_list.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/templates/context_selection/_region_list.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/templates/solaris/_stylesheets.html +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/templatetags/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/templatetags/context_selection.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/urls.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/usage/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/usage/base.py @@ -1016,99 +1982,178 @@ file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/usage/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/utils/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/utils/filters.py +file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/utils/settings.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/views.py file path=usr/lib/python$(PYVER)/vendor-packages/openstack_dashboard/wsgi/django.wsgi dir path=var/lib/openstack_dashboard owner=webservd group=webservd -link path=var/lib/openstack_dashboard/static/horizon \ - target=../../../../../usr/lib/python$(PYVER)/vendor-packages/horizon/static/horizon +# license horizon.license license="Apache v2.0" \ com.oracle.info.description="Horizon, the OpenStack web based user interface service" \ - com.oracle.info.name=$(COMPONENT_NAME) com.oracle.info.tpno=17862 \ + com.oracle.info.name=$(COMPONENT_NAME) \ + com.oracle.info.tpno=$(TPNO_HORIZON) \ com.oracle.info.version=$(IPS_COMPONENT_VERSION) -license solaris.css.license license="Apache v2.0 (Solaris theme)" \ - com.oracle.info.description="the Solaris theme for the OpenStack Dashboard" \ - com.oracle.info.name=$(COMPONENT_NAME) com.oracle.info.tpno=16775 \ - com.oracle.info.version=1.0 +license bootstrap-datepicker.license \ + license="Apache v2.0 (bootstrap-datepicker)" \ + com.oracle.info.description="Bootstrap Datepicker JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) \ + com.oracle.info.tpno=$(TPNO_BOOTSTRAP_DP) \ + com.oracle.info.version=$(VERSION_BOOTSTRAP_DP) +license hogan.license license="Apache v2.0 (hogan)" \ + com.oracle.info.description="Hogan JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) com.oracle.info.tpno=$(TPNO_HOGAN) \ + com.oracle.info.version=$(VERSION_HOGAN) +license d3.license license="BSD, Apache v2.0 (d3)" \ + com.oracle.info.description="D3 JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) com.oracle.info.tpno=$(TPNO_D3) \ + com.oracle.info.version=$(VERSION_D3) +license bootstrap-scss.license license="MIT (Bootstrap-SCSS)" \ + com.oracle.info.description="Bootstrap SCSS JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) \ + com.oracle.info.tpno=$(TPNO_BOOTSTRAP_SCSS) \ + com.oracle.info.version=$(VERSION_BOOTSTRAP_SCSS) +license angular.license license="MIT (angularjs)" \ + com.oracle.info.description="AngularJS JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) \ + com.oracle.info.tpno=$(TPNO_ANGULAR) \ + com.oracle.info.version=$(VERSION_ANGULAR) +license jquery.license license="MIT (jquery)" \ + com.oracle.info.description="jQuery JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) \ + com.oracle.info.tpno=$(TPNO_JQUERY) \ + com.oracle.info.version=$(VERSION_JQUERY) +license jquery-migrate.license license="MIT (jquery-migrate)" \ + com.oracle.info.description="jQuery-Migrate JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) \ + com.oracle.info.tpno=$(TPNO_JQUERY_MIGRATE) \ + com.oracle.info.version=$(VERSION_JQUERY_MIGRATE) +license jquery-quicksearch.license license="MIT (jquery-quicksearch)" \ + com.oracle.info.description="jQuery-Quicksearch JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) \ + com.oracle.info.tpno=$(TPNO_JQUERY_QUICKSEARCH) \ + com.oracle.info.version=$(VERSION_JQUERY_QS) +license jquery-tablesorter.license license="MIT (jquery-tablesorter)" \ + com.oracle.info.description="jQuery-Tablesorter JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) \ + com.oracle.info.tpno=$(TPNO_JQUERY_TABLESORTER) \ + com.oracle.info.version=$(VERSION_JQUERY_TS) +license jquery-ui.license license="MIT (jquery-ui)" \ + com.oracle.info.description="jQuery-UI JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) \ + com.oracle.info.tpno=$(TPNO_JQUERY_UI) \ + com.oracle.info.version=$(VERSION_JQUERY_UI) +license jsencrypt.license license="MIT (jsencrypt)" \ + com.oracle.info.description="JSEncrypt JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) \ + com.oracle.info.tpno=$(TPNO_JSENCRYPT) \ + com.oracle.info.version=$(VERSION_JSENCRYPT) +license spin.license license="MIT (spin)" \ + com.oracle.info.description="Spin JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) com.oracle.info.tpno=$(TPNO_SPIN) \ + com.oracle.info.version=$(VERSION_SPIN) +license rickshaw.license license="MIT, Apache v2.0 (rickshaw)" \ + com.oracle.info.description="Rickshaw JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) \ + com.oracle.info.tpno=$(TPNO_RICKSHAW) \ + com.oracle.info.version=$(VERSION_RICKSHAW) +license font-awesome.license license="MIT, OFL (font-awesome)" \ + com.oracle.info.description="Font-Awesome JavaScript Library" \ + com.oracle.info.name=$(COMPONENT_NAME) \ + com.oracle.info.tpno=$(TPNO_FONT_AWESOME) \ + com.oracle.info.version=$(VERSION_FONT_AWESOME) # force a group dependency on the optional anyjson; pkgdepend work is needed to # flush this out. -depend type=group fmri=library/python-2/anyjson-26 +depend type=group fmri=library/python-2/anyjson-$(PYV) -# force a group dependency on the optional troveclient; pkgdepend work is needed +# force a group dependency on the optional simplejson; pkgdepend work is needed # to flush this out. -depend type=group fmri=library/python/troveclient-26 +depend type=group fmri=library/python-2/simplejson-$(PYV) # force a dependency on the Python runtime depend type=require fmri=__TBD pkg.debug.depend.file=python$(PYVER) \ pkg.debug.depend.path=usr/bin -# force a dependency on django_compressor; one of the applications defined in -# settings.py -depend type=require fmri=library/python-2/django_compressor-26 - -# force a dependency on django_openstack_auth; pkgdepend work is needed to flush -# this out -depend type=require fmri=library/python-2/django_openstack_auth-26 - -# force a dependency on greenlet; pkgdepend work is needed to flush this out -depend type=require fmri=library/python-2/greenlet-26 - -# force a dependency on kombu; pkgdepend work is needed to flush this out -depend type=require fmri=library/python-2/kombu-26 - -# force a dependency on lesscpy; one of the filters defined in settings.py -depend type=require fmri=library/python-2/lesscpy-26 - -# force a dependency on lockfile; pkgdepend work is needed to flush this out -depend type=require fmri=library/python-2/lockfile-26 - -# force a dependency on netaddr; pkgdepend work is needed to flush this out -depend type=require fmri=library/python-2/netaddr-26 - -# force a dependency on pytz; pkgdepend work is needed to flush this out -depend type=require fmri=library/python-2/pytz-26 +# force a dependency on babel; pkgdepend work is needed to flush this out +depend type=require fmri=library/python-2/babel-$(PYV) # force a dependency on ceilometerclient; pkgdepend work is needed to flush this # out -depend type=require fmri=library/python/ceilometerclient-26 +depend type=require fmri=library/python/ceilometerclient-$(PYV) # force a dependency on cinderclient; pkgdepend work is needed to flush this out -depend type=require fmri=library/python/cinderclient-26 +depend type=require fmri=library/python/cinderclient-$(PYV) # force a dependency on django; pkgdepend work is needed to flush this out -depend type=require fmri=library/python/django-26 +depend type=require fmri=library/python/django-$(PYV) + +# force a dependency on django-pyscss; one of the applications defined in +# settings.py +depend type=require fmri=library/python/django-pyscss-$(PYV) + +# force a dependency on django_compressor; one of the applications defined in +# settings.py +depend type=require fmri=library/python-2/django_compressor-$(PYV) + +# force a dependency on django_openstack_auth; pkgdepend work is needed to flush +# this out +depend type=require fmri=library/python-2/django_openstack_auth-$(PYV) # force a dependency on glanceclient; pkgdepend work is needed to flush this out -depend type=require fmri=library/python/glanceclient-26 +depend type=require fmri=library/python/glanceclient-$(PYV) # force a dependency on heatclient; pkgdepend work is needed to flush this out -depend type=require fmri=library/python/heatclient-26 +depend type=require fmri=library/python/heatclient-$(PYV) + +# force a dependency on httplib2; pkgdepend work is needed to flush this out +depend type=require fmri=library/python-2/httplib2-$(PYV) # force a dependency on iso8601; pkgdepend work is needed to flush this out -depend type=require fmri=library/python/iso8601-26 +depend type=require fmri=library/python/iso8601-$(PYV) # force a dependency on keystoneclient; pkgdepend work is needed to flush this # out -depend type=require fmri=library/python/keystoneclient-26 +depend type=require fmri=library/python/keystoneclient-$(PYV) + +# force a dependency on lockfile; pkgdepend work is needed to flush this out +depend type=require fmri=library/python-2/lockfile-$(PYV) + +# force a dependency on netaddr; pkgdepend work is needed to flush this out +depend type=require fmri=library/python-2/netaddr-$(PYV) # force a dependency on neutronclient; pkgdepend work is needed to flush this # out -depend type=require fmri=library/python/neutronclient-26 +depend type=require fmri=library/python/neutronclient-$(PYV) # force a dependency on novaclient; pkgdepend work is needed to flush this out -depend type=require fmri=library/python/novaclient-26 +depend type=require fmri=library/python/novaclient-$(PYV) + +# force a dependency on oslo.config; pkgdepend work is needed to flush this out +depend type=require fmri=library/python/oslo.config-$(PYV) # force a dependency on pbr; pkgdepend work is needed to flush this out -depend type=require fmri=library/python/pbr-26 +depend type=require fmri=library/python/pbr-$(PYV) + +# force a dependency on pytz; pkgdepend work is needed to flush this out +depend type=require fmri=library/python-2/pytz-$(PYV) + +# force a dependency on requests; pkgdepend work is needed to flush this out +depend type=require fmri=library/python-2/requests-$(PYV) + +# force a dependency on saharaclient; pkgdepend work is needed to flush this out +depend type=require fmri=library/python/saharaclient-$(PYV) # force a dependency on six; pkgdepend work is needed to flush this out -depend type=require fmri=library/python/six-26 +depend type=require fmri=library/python/six-$(PYV) # force a dependency on swiftclient; pkgdepend work is needed to flush this out -depend type=require fmri=library/python/swiftclient-26 +depend type=require fmri=library/python/swiftclient-$(PYV) + +# force a dependency on troveclient; pkgdepend work is needed to flush this +# out +depend type=require fmri=library/python/troveclient-$(PYV) # force a dependency on the Apache web server depend type=require fmri=web/server/apache-22 -# force a dependency on the apache-wsgi module -depend type=require fmri=web/server/apache-22/module/apache-wsgi-26 +# force a dependency on the mod_wsgi module +depend type=require fmri=web/server/apache-22/module/apache-wsgi-$(PYV) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/jquery-migrate.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/jquery-migrate.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,22 @@ +Copyright 2013 jQuery Foundation and other contributors +http://jquery.com/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/jquery-quicksearch.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/jquery-quicksearch.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,31 @@ +Copyright 2013 Deux Huit Huit + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +============================================================ + +./src/jquery.quicksearch.js + +/*! jQuery-QuickSearch - v2.0.2 - 2013-11-15 +* Copyright (c) 2013 Deux Huit Huit (http://deuxhuithuit.com/); +* Licensed MIT http://deuxhuithuit.mit-license.org */ +/** +* Copyrights: Deux Huit Huit, Rik Lomas. +* Licensed MIT: http://deuxhuithuit.mit-license.org +*/ diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/jquery-tablesorter.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/jquery-tablesorter.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,717 @@ +The MIT License (MIT) + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +============================================================ + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + +js/jquery.tablesorter.js + +/**! +* TableSorter 2.14.5 - Client-side table sorting with ease! +* @requires jQuery v1.2.6+ +* +* Copyright (c) 2007 Christian Bach +* Examples and docs at: http://tablesorter.com +* Dual licensed under the MIT and GPL licenses: +* http://www.opensource.org/licenses/mit-license.php +* http://www.gnu.org/licenses/gpl.html +* +* @type jQuery +* @name tablesorter +* @cat Plugins/Tablesorter +* @author Christian Bach/christian.bach@polyester.se +* @contributor Rob Garrison/https://github.com/Mottie/tablesorter +*/ diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/jquery-ui.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/jquery-ui.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,25 @@ +Copyright (c) 2010 Paul Bakaus, http://jqueryui.com/ + +This software consists of voluntary contributions made by many +individuals (AUTHORS.txt, http://jqueryui.com/about) For exact +contribution history, see the revision history and logs, available at +http://jquery-ui.googlecode.com/svn/. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/jquery.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/jquery.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,21 @@ +Copyright (c) 2011 John Resig, http://jquery.com/ + +Permission is hereby granted, free of charge, to any person obtaininga +copy of this software and associated documentation files +(the"Software"), to deal in the Software without restriction, +includingwithout limitation the rights to use, copy, modify, merge, +publish,distribute, sublicense, and/or sell copies of the Software, +and topermit persons to whom the Software is furnished to do so, +subject tothe following conditions: + +The above copyright notice and this permission notice shall beincluded +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OFMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +ANDNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BELIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTIONOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTIONWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/jsencrypt.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/jsencrypt.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,132 @@ +The MIT License (MIT) +Copyright (c) 2013 AllPlayers.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +CONTAINS CODE FROM YUI LIBRARY SEE LICENSE @ +http://yuilibrary.com/license/ + +The 'jsrsasign'(RSA-Sign JavaScript Library) License + +Copyright (c) 2010-2013 Kenji Urushima + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Licensing +--------- + +This software is covered under the following copyright: + +/* + * Copyright (c) 2003-2005 Tom Wu + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF + * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * In addition, the following condition applies: + * + * All redistributions must retain an intact copy of this copyright notice + * and disclaimer. + */ + +Address all questions regarding this license to: + + Tom Wu + tjw@cs.Stanford.EDU + +ASN.1 JavaScript decoder +Copyright (c) 2008-2013 Lapo Luchini + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Copyright (c) 2013, Yahoo! Inc. All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the +following conditions are met: + +Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +Neither the name of Yahoo! Inc. nor the names of YUI's contributors +may be used to endorse or promote products derived from this software +without specific prior written permission of Yahoo! Inc. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/01-CVE-2014-0157.patch --- a/components/openstack/horizon/patches/01-CVE-2014-0157.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +0,0 @@ -Upstream patch for CVE-2014-0157. This issue is fixed in Icehouse -2014.1 and Havana 2013.2.4. - -From 54ec015f720a4379e8ffc34345b3a7bf36b6f15b Mon Sep 17 00:00:00 2001 -From: CristianFiorentino -Date: Mon, 10 Mar 2014 17:36:31 -0300 -Subject: [PATCH] Introduces escaping in Horizon/Orchestration - -1) Escape help_text a second time to avoid bootstrap tooltip XSS issue - -The "Description" parameter in a Heat template is used to populate -a help_text tooltip in the dynamically generated Heat form. Bootstrap -inserts this tooltip into the DOM using .html() which undoes any -escaping we do in Django (it should be using .text()). - -This was fixed by forcing the help_text content to be escaped a second -time. The issue itself is mitigated in bootstrap.js release 2.0.3 -(ours is currently 2.0.1). - -2) Properly escape untrusted Heat template 'outputs' - -The 'outputs' parameter in a Heat template was included in a Django -template with HTML autoescaping turned off. Malicious HTML content -could be included in a Heat template and would be rendered by Horizon -when details about a created stack were displayed. - -This was fixed by not disabling autoescaping and explicitly escaping -untrusted values in any strings that are later marked "safe" to render -without further escaping. - -Conflicts: - openstack_dashboard/dashboards/project/stacks/mappings.py - -Change-Id: Icd9f9d9ca77068b12227d77469773a325c840001 -Closes-Bug: #1289033 -Co-Authored-By: Kieran Spear ---- - horizon/templates/horizon/common/_form_fields.html | 7 ++++++- - .../dashboards/project/stacks/mappings.py | 10 ++++++++-- - .../stacks/templates/stacks/_detail_overview.html | 3 +-- - .../dashboards/project/stacks/tests.py | 17 +++++++++++------ - 4 files changed, 26 insertions(+), 11 deletions(-) - -diff --git a/horizon/templates/horizon/common/_form_fields.html b/horizon/templates/horizon/common/_form_fields.html -index 3567614..f6fb98f 100644 ---- a/horizon/templates/horizon/common/_form_fields.html -+++ b/horizon/templates/horizon/common/_form_fields.html -@@ -14,7 +14,12 @@ - {{ error }} - {% endfor %} - {% endif %} -- {{ field.help_text }} -+ {% comment %} -+ Escape help_text a second time here, to avoid an XSS issue in bootstrap.js. -+ This can most likely be removed once we upgrade bootstrap.js past 2.0.2. -+ Note: the spaces are necessary here. -+ {% endcomment %} -+ {% filter force_escape %} {{ field.help_text }} {% endfilter %} -
- {{ field }} -
-diff --git a/openstack_dashboard/dashboards/project/stacks/mappings.py b/openstack_dashboard/dashboards/project/stacks/mappings.py -index 0353291..f1389c5 100644 ---- a/openstack_dashboard/dashboards/project/stacks/mappings.py -+++ b/openstack_dashboard/dashboards/project/stacks/mappings.py -@@ -19,6 +19,8 @@ import urlparse - - from django.core.urlresolvers import reverse # noqa - from django.template.defaultfilters import register # noqa -+from django.utils import html -+from django.utils import safestring - - from openstack_dashboard.api import swift - -@@ -76,11 +78,15 @@ def stack_output(output): - if not output: - return u'' - if isinstance(output, dict) or isinstance(output, list): -- return u'
%s
' % json.dumps(output, indent=2) -+ json_string = json.dumps(output, indent=2) -+ safe_output = u'
%s
' % html.escape(json_string) -+ return safestring.mark_safe(safe_output) - if isinstance(output, basestring): - parts = urlparse.urlsplit(output) - if parts.netloc and parts.scheme in ('http', 'https'): -- return u'%s' % (output, output) -+ url = html.escape(output) -+ safe_link = u'%s' % (url, url) -+ return safestring.mark_safe(safe_link) - return unicode(output) - - -diff --git a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_overview.html b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_overview.html -index f4756e0..33fe783 100644 ---- a/openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_overview.html -+++ b/openstack_dashboard/dashboards/project/stacks/templates/stacks/_detail_overview.html -@@ -36,9 +36,8 @@ -
{{ output.output_key }}
-
{{ output.description }}
-
-- {% autoescape off %} - {{ output.output_value|stack_output }} -- {% endautoescape %}
-+ - {% endfor %} - - -diff --git a/openstack_dashboard/dashboards/project/stacks/tests.py b/openstack_dashboard/dashboards/project/stacks/tests.py -index 408d86f..986e3e0 100644 ---- a/openstack_dashboard/dashboards/project/stacks/tests.py -+++ b/openstack_dashboard/dashboards/project/stacks/tests.py -@@ -16,6 +16,7 @@ import json - - from django.core.urlresolvers import reverse # noqa - from django import http -+from django.utils import html - - from mox import IsA # noqa - -@@ -77,12 +78,16 @@ class MappingsTests(test.TestCase): - self.assertEqual(u'foo', mappings.stack_output('foo')) - self.assertEqual(u'', mappings.stack_output(None)) - -- self.assertEqual( -- u'
[\n  "one", \n  "two", \n  "three"\n]
', -- mappings.stack_output(['one', 'two', 'three'])) -- self.assertEqual( -- u'
{\n  "foo": "bar"\n}
', -- mappings.stack_output({'foo': 'bar'})) -+ outputs = ['one', 'two', 'three'] -+ expected_text = """[\n "one", \n "two", \n "three"\n]""" -+ -+ self.assertEqual(u'
%s
' % html.escape(expected_text), -+ mappings.stack_output(outputs)) -+ -+ outputs = {'foo': 'bar'} -+ expected_text = """{\n "foo": "bar"\n}""" -+ self.assertEqual(u'
%s
' % html.escape(expected_text), -+ mappings.stack_output(outputs)) - - self.assertEqual( - u'' --- -1.7.9.5 - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/01-osprofiler.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/patches/01-osprofiler.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,19 @@ +In-house patch to address +https://bugs.launchpad.net/osprofiler/+bug/1361235 in Horizon. + +--- horizon-2014.2.1/openstack_dashboard/wsgi/django.wsgi.orig 2014-11-13 15:02:19.599694847 -0700 ++++ horizon-2014.2.1/openstack_dashboard/wsgi/django.wsgi 2014-11-13 15:03:31.633159017 -0700 +@@ -5,7 +5,12 @@ import django.core.handlers.wsgi + from django.conf import settings + + # Add this file path to sys.path in order to import settings +-sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), '../..')) ++ ++# XXX workaround until ++# https://bugs.launchpad.net/osprofiler/+bug/1361235 in osprofiler is ++# fixed ++# sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), '../..')) ++sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), os.path.realpath('../..'))) + os.environ['DJANGO_SETTINGS_MODULE'] = 'openstack_dashboard.settings' + sys.stdout = sys.stderr + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/02-change-angular-imports.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/patches/02-change-angular-imports.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,26 @@ +In-house patch to change how angularjs is imported. In +XStatic-Angular-1.3.7.0, angular_cookies and angular_mock were rolled +into the angular pacakge. + +--- horizon-2014.2.1/openstack_dashboard/settings.py.orig 2015-01-15 19:27:56.738322606 -0700 ++++ horizon-2014.2.1/openstack_dashboard/settings.py 2015-01-15 19:28:26.944716700 -0700 +@@ -24,8 +24,6 @@ import warnings + from django.utils.translation import ugettext_lazy as _ + import xstatic.main + import xstatic.pkg.angular +-import xstatic.pkg.angular_cookies +-import xstatic.pkg.angular_mock + import xstatic.pkg.bootstrap_datepicker + import xstatic.pkg.bootstrap_scss + import xstatic.pkg.d3 +@@ -155,10 +153,6 @@ STATICFILES_FINDERS = ( + STATICFILES_DIRS = [ + ('horizon/lib/angular', + xstatic.main.XStatic(xstatic.pkg.angular).base_dir), +- ('horizon/lib/angular', +- xstatic.main.XStatic(xstatic.pkg.angular_cookies).base_dir), +- ('horizon/lib/angular', +- xstatic.main.XStatic(xstatic.pkg.angular_mock).base_dir), + ('horizon/lib/bootstrap_datepicker', + xstatic.main.XStatic(xstatic.pkg.bootstrap_datepicker).base_dir), + ('bootstrap', diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/02-launchpad-1264228.patch --- a/components/openstack/horizon/patches/02-launchpad-1264228.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ -This proposed upstream patch addresses - - 18562372 Failed to create a new project under Horizon - -and is tracked under Launchpad bug 1264228. Although it's been -addressed in Icehouse 2014.1, the patch below is still not yet released -for Havana. It has been modified to apply cleanly into our current -Havana implementation - -From e02eaab30996af7e8770cd651bd8aa7d504358a8 Mon Sep 17 00:00:00 2001 -From: JiaHao Li -Date: Thu, 26 Dec 2013 15:37:14 +0800 -Subject: [PATCH] Sync OPENSTACK_KEYSTONE_DEFAULT_ROLE with keystone - -For now, keystone default role is _member_, while horizon set -OPENSTACK_KEYSTONE_DEFAULT_ROLE to Member. It will really be user -friendly to modify horizon default value to _member_ to sync with -keystone's default setting. - -Conflicts: - - doc/source/topics/settings.rst - -Change-Id: I55d15e6cfb74e52e933c5a44efd6c27930415738 -Closes-Bug: #1264228 -(cherry picked from commit 0aacc44f324c3db049f912da1f84d93c1142cb37) ---- - doc/source/topics/settings.rst | 2 +- - .../local/local_settings.py.example | 2 +- - openstack_dashboard/test/settings.py | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/doc/source/topics/settings.rst b/doc/source/topics/settings.rst -index 1f5eeea..2b2eabd 100644 ---- a/doc/source/topics/settings.rst -+++ b/doc/source/topics/settings.rst -@@ -176,7 +176,7 @@ If you do not have multiple regions you should use the ``OPENSTACK_HOST`` and - ``OPENSTACK_KEYSTONE_DEFAULT_ROLE`` - ----------------------------------- - --Default: "Member" -+Default: "_member_" - - The name of the role which will be assigned to a user when added to a project. - This name must correspond to a role name in Keystone. -diff --git a/openstack_dashboard/local/local_settings.py.example b/openstack_dashboard/local/local_settings.py.example -index a1a8474..92fcc16 100644 ---- a/openstack_dashboard/local/local_settings.py.example -+++ b/openstack_dashboard/local/local_settings.py.example -@@ -126,7 +126,7 @@ EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' - - OPENSTACK_HOST = "127.0.0.1" - OPENSTACK_KEYSTONE_URL = "http://%s:5000/v2.0" % OPENSTACK_HOST --OPENSTACK_KEYSTONE_DEFAULT_ROLE = "Member" -+OPENSTACK_KEYSTONE_DEFAULT_ROLE = "_member_" - - # Disable SSL certificate checks (useful for self-signed certificates): - # OPENSTACK_SSL_NO_VERIFY = True -diff --git a/openstack_dashboard/test/settings.py b/openstack_dashboard/test/settings.py -index 85f470d..08086a2 100644 ---- horizon-2013.2.3/openstack_dashboard/test/settings.py.~1~ 2014-04-03 11:45:53.000000000 -0700 -+++ horizon-2013.2.3/openstack_dashboard/test/settings.py 2014-05-19 11:50:14.914650963 -0700 -@@ -85,7 +85,7 @@ - } - - OPENSTACK_KEYSTONE_URL = "http://localhost:5000/v2.0" --OPENSTACK_KEYSTONE_DEFAULT_ROLE = "Member" -+OPENSTACK_KEYSTONE_DEFAULT_ROLE = "_member_" - - OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True - OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'test_domain' diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/03-launchpad-1254694.patch --- a/components/openstack/horizon/patches/03-launchpad-1254694.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -Although the following patch has been addressed in Icehouse 2014.1, it -still has not yet been released for Havana. It has been modified to -apply cleanly into our current Havana implementation - -commit 05ba5f81c390efbb6e5eb98db62f8f2599389ddb -Author: Matt Fischer -Date: Thu Jan 9 15:35:38 2014 -0700 - - Don't reset LOCAL_PATH if it's already set - - If LOCAL_PATH is set in local_settings, then settings should - not override it, even if SECRET_KEY is unset. - - Change-Id: I6aca03f65afddffb6cdd00e4084a8ab9b2255ef1 - Closes-Bug: #1254694 - -diff --git a/openstack_dashboard/settings.py b/openstack_dashboard/settings.py ---- horizon-2013.2.3/openstack_dashboard/settings.py.~1~ 2014-04-03 11:45:53.000000000 -0700 -+++ horizon-2013.2.3/openstack_dashboard/settings.py 2014-05-25 13:48:46.166574128 -0700 -@@ -206,6 +206,7 @@ - } - - SECRET_KEY = None -+LOCAL_PATH = None - - try: - from local.local_settings import * # noqa -@@ -216,9 +217,11 @@ - # file is present. See local_settings.py.example for full documentation on the - # horizon.utils.secret_key module and its use. - if not SECRET_KEY: -+ if not LOCAL_PATH: -+ LOCAL_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), -+ 'local') -+ - from horizon.utils import secret_key -- LOCAL_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), -- 'local') - SECRET_KEY = secret_key.generate_or_read_from_file(os.path.join(LOCAL_PATH, - '.secret_key_store')) - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/03-remove-qunit.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/patches/03-remove-qunit.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,34 @@ +In-house patch to remove qunit from Horizon. This JavaScript library +is only used for testing and not used by Horizon during normal +operation. + +--- horizon-2014.2.1/horizon/site_urls.py.orig 2015-02-02 14:37:19.045936926 -0700 ++++ horizon-2014.2.1/horizon/site_urls.py 2015-02-02 14:37:41.486751441 -0700 +@@ -41,7 +41,4 @@ urlpatterns += patterns('', + + if settings.DEBUG: + urlpatterns += patterns('', +- url(r'^qunit/$', +- TemplateView.as_view(template_name="horizon/qunit.html"), +- name='qunit_tests'), + url(r'^jasmine/(.*?)$', jasmine.dispatcher)) + +--- horizon-2014.2.1/openstack_dashboard/settings.py.orig 2015-02-02 14:40:40.569743749 -0700 ++++ horizon-2014.2.1/openstack_dashboard/settings.py 2015-02-02 14:40:49.741507297 -0700 +@@ -36,7 +36,6 @@ import xstatic.pkg.jquery_quicksearch + import xstatic.pkg.jquery_tablesorter + import xstatic.pkg.jquery_ui + import xstatic.pkg.jsencrypt +-import xstatic.pkg.qunit + import xstatic.pkg.rickshaw + import xstatic.pkg.spin + +@@ -175,8 +174,6 @@ STATICFILES_DIRS = [ + xstatic.main.XStatic(xstatic.pkg.jquery_tablesorter).base_dir), + ('horizon/lib/jsencrypt', + xstatic.main.XStatic(xstatic.pkg.jsencrypt).base_dir), +- ('horizon/lib/qunit', +- xstatic.main.XStatic(xstatic.pkg.qunit).base_dir), + ('horizon/lib', + xstatic.main.XStatic(xstatic.pkg.rickshaw).base_dir), + ('horizon/lib', diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/04-blue-piechart.patch --- a/components/openstack/horizon/patches/04-blue-piechart.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -Internal only patch to change the color of pie charts drawn by -Horizon to blue. This patch is a recommendation from the UX design -team and will not be committed upsteam. - ---- horizon-2013.2.3/horizon/static/horizon/js/horizon.d3piechart.js.orig 2014-06-11 13:19:35.874027396 -0600 -+++ horizon-2013.2.3/horizon/static/horizon/js/horizon.d3piechart.js 2014-06-11 13:19:42.692287410 -0600 -@@ -17,9 +17,13 @@ - r: 45, - bkgrnd: "#F2F2F2", - frgrnd: "#006CCF", -- full: "#D0342B", -- nearlyfull: "orange", -- -+ full: "#006CCF", -+ nearlyfull: "006CCF", -+ -+ // frgrnd: "#006CCF", -+ // full: "#D0342B", -+ // nearlyfull: "orange", -+ - init: function() { - var self = this; - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/04-remove-jasmine.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/patches/04-remove-jasmine.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,43 @@ +In-house patch to remove jasmine.js from Horizon. This JavaScript +library is only used for testing and not used by Horizon during normal +operation. + +--- horizon-2014.2.1/horizon/site_urls.py.orig 2015-02-02 15:31:57.209242227 -0700 ++++ horizon-2014.2.1/horizon/site_urls.py 2015-02-02 15:32:11.276168850 -0700 +@@ -22,8 +22,6 @@ from django.conf.urls import patterns + from django.conf.urls import url + from django.views.generic import TemplateView # noqa + +-from horizon.test.jasmine import jasmine +- + urlpatterns = patterns('horizon.views', + url(r'^home/$', 'user_home', name='user_home') + ) +@@ -38,7 +36,3 @@ urlpatterns += patterns('', + name="set_language"), + url(r'^i18n/', include('django.conf.urls.i18n')) + ) +- +-if settings.DEBUG: +- urlpatterns += patterns('', +- url(r'^jasmine/(.*?)$', jasmine.dispatcher)) + +--- horizon-2014.2.1/openstack_dashboard/settings.py.orig 2015-02-02 15:33:37.928460972 -0700 ++++ horizon-2014.2.1/openstack_dashboard/settings.py 2015-02-02 15:33:58.344285143 -0700 +@@ -29,7 +29,6 @@ import xstatic.pkg.bootstrap_scss + import xstatic.pkg.d3 + import xstatic.pkg.font_awesome + import xstatic.pkg.hogan +-import xstatic.pkg.jasmine + import xstatic.pkg.jquery + import xstatic.pkg.jquery_migrate + import xstatic.pkg.jquery_quicksearch +@@ -162,8 +161,6 @@ STATICFILES_DIRS = [ + xstatic.main.XStatic(xstatic.pkg.hogan).base_dir), + ('horizon/lib/font-awesome', + xstatic.main.XStatic(xstatic.pkg.font_awesome).base_dir), +- ('horizon/lib/jasmine-1.3.1', +- xstatic.main.XStatic(xstatic.pkg.jasmine).base_dir), + ('horizon/lib/jquery', + xstatic.main.XStatic(xstatic.pkg.jquery).base_dir), + ('horizon/lib/jquery', diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/05-disable-unsupported-bootsource.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/patches/05-disable-unsupported-bootsource.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,28 @@ +Internal patch to only enable the current supported boot source (Boot +from Image). This patch will not be committed upstream. + +--- horizon-2014.2.2/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py.~1~ 2014-10-16 06:20:50.000000000 -0700 ++++ horizon-2014.2.2/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py 2014-10-24 11:58:37.591052103 -0700 +@@ -141,22 +141,7 @@ class SetInstanceDetailsAction(workflows + source_type_choices = [ + ('', _("Select source")), + ("image_id", _("Boot from image")), +- ("instance_snapshot_id", _("Boot from snapshot")), + ] +- if base.is_service_enabled(request, 'volume'): +- source_type_choices.append(("volume_id", _("Boot from volume"))) +- +- try: +- if api.nova.extension_supported("BlockDeviceMappingV2Boot", +- request): +- source_type_choices.append(("volume_image_id", +- _("Boot from image (creates a new volume)"))) +- except Exception: +- exceptions.handle(request, _('Unable to retrieve extensions ' +- 'information.')) +- +- source_type_choices.append(("volume_snapshot_id", +- _("Boot from volume snapshot (creates a new volume)"))) + self.fields['source_type'].choices = source_type_choices + + def clean(self): diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/05-launchpad-1260439.patch --- a/components/openstack/horizon/patches/05-launchpad-1260439.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -This proposed upstream patch addresses - - 18720708 Error: Unable to add userto primary project when adding user - via Horizon - -and is tracked under Launchpad bug 1260439. Although it's been -addressed in the Juno trunk, the patch below is still not yet released -for Havana. It has been modified to apply cleanly into our current -Havana implementation - -commit f5ded29d9a73db4c225cbfb664e7d85e5aa0996b -Author: Matthias Runge -Date: Fri May 23 11:36:54 2014 +0200 - - Prevent error message when creating a user - - keystone changed behaviour and didn't add the user - to the specified role. Now it does; this patch - prevents an exception popping up without breaking - with previous versions. - - Change-Id: I115a5126b70ae3c7733aa065bf55104f88cc42e5 - Closes-Bug: #1260439 - ---- horizon-2013.2.3/openstack_dashboard/dashboards/admin/users/forms.py.~1~ 2014-04-03 11:45:53.000000000 -0700 -+++ horizon-2013.2.3/openstack_dashboard/dashboards/admin/users/forms.py 2014-06-11 12:54:51.517905246 -0700 -@@ -122,15 +122,21 @@ - _('User "%s" was successfully created.') - % data['name']) - if data['role_id']: -- try: -- api.keystone.add_tenant_user_role(request, -- data['project'], -- new_user.id, -- data['role_id']) -- except Exception: -- exceptions.handle(request, -- _('Unable to add user ' -- 'to primary project.')) -+ roles = api.keystone.roles_for_user(request, -+ new_user.id, -+ data['project']) or [] -+ assigned = [role for role in roles if role.id == str( -+ data['role_id'])] -+ if not assigned: -+ try: -+ api.keystone.add_tenant_user_role(request, -+ data['project'], -+ new_user.id, -+ data['role_id']) -+ except Exception: -+ exceptions.handle(request, -+ _('Unable to add user ' -+ 'to primary project.')) - return new_user - except Exception: - exceptions.handle(request, _('Unable to create user.')) ---- horizon-2013.2.3/openstack_dashboard/dashboards/admin/users/tests.py.~1~ 2014-04-03 11:45:53.000000000 -0700 -+++ horizon-2013.2.3/openstack_dashboard/dashboards/admin/users/tests.py 2014-06-11 13:44:29.437187509 -0700 -@@ -81,6 +81,7 @@ - 'tenant_list', - 'add_tenant_user_role', - 'get_default_role', -+ 'roles_for_user', - 'role_list')}) - def test_create(self): - user = self.users.get(id="1") -@@ -102,6 +103,7 @@ - domain=domain_id).AndReturn(user) - api.keystone.role_list(IgnoreArg()).AndReturn(self.roles.list()) - api.keystone.get_default_role(IgnoreArg()).AndReturn(role) -+ api.keystone.roles_for_user(IgnoreArg(), user.id, self.tenant.id) - api.keystone.add_tenant_user_role(IgnoreArg(), self.tenant.id, - user.id, role.id) - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/06-launchpad-1255136.patch --- a/components/openstack/horizon/patches/06-launchpad-1255136.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -Although the following patch has been addressed in Icehouse 2014.1, it -still has not yet been released for Havana. It has been modified to -apply cleanly into our current Havana implementation - -From 1b13a42b9edbd34e8bb4339a962cd2c30bda7d81 Mon Sep 17 00:00:00 2001 -From: Zhenguo Niu -Date: Wed, 4 Dec 2013 09:45:56 +0800 -Subject: [PATCH] Set can_set_mount_point default to False - -Patch https://review.openstack.org/#/c/59229/ only changed the default -value in the local_settings.py example file. If the setting isn't defined, -it still defaults to True -Change-Id: Ia3525786e5eb9ec83b8057c1cb6158ab153adc59 -Closes-Bug: #1255136 - ---- horizon-2013.2.3/doc/source/topics/settings.rst.orig 2014-06-20 05:00:21.858630069 -0700 -+++ horizon-2013.2.3/doc/source/topics/settings.rst 2014-06-20 06:27:39.151996410 -0700 -@@ -204,14 +204,15 @@ - ``OPENSTACK_HYPERVISOR_FEATURES`` - --------------------------------- - --Default: ``{'can_set_mount_point': True, 'can_encrypt_volumes': False}`` -+Default: ``{'can_set_mount_point': False, 'can_encrypt_volumes': False}`` - - A dictionary containing settings which can be used to identify the - capabilities of the hypervisor for Nova. - --Some hypervisors have the ability to set the mount point for volumes attached --to instances (KVM does not). Setting ``can_set_mount_point`` to ``False`` will --remove the option to set the mount point from the UI. -+The Xen Hypervisor has the ability to set the mount point for volumes attached -+to instances (other Hypervisors currently do not). Setting -+``can_set_mount_point`` to ``True`` will add the option to set the mount point -+from the UI. - - In the Havana release, there will be a feature for encrypted volumes - which will be controlled by the ``can_encrypt_volumes``. Setting it to ``True`` ---- horizon-2013.2.3/openstack_dashboard/dashboards/project/volumes/tests.py.orig 2014-06-20 04:56:16.805828523 -0700 -+++ horizon-2013.2.3/openstack_dashboard/dashboards/project/volumes/tests.py 2014-06-20 06:32:26.947240676 -0700 -@@ -555,6 +555,8 @@ - - @test.create_stubs({cinder: ('volume_get',), api.nova: ('server_list',)}) - def test_edit_attachments(self): -+ PREV = settings.OPENSTACK_HYPERVISOR_FEATURES['can_set_mount_point'] -+ settings.OPENSTACK_HYPERVISOR_FEATURES['can_set_mount_point'] = True - volume = self.volumes.first() - servers = [s for s in self.servers.list() - if s.tenant_id == self.request.user.tenant_id] -@@ -573,11 +575,10 @@ - self.assertEqual(res.status_code, 200) - self.assertTrue(isinstance(form.fields['device'].widget, - widgets.TextInput)) -+ settings.OPENSTACK_HYPERVISOR_FEATURES['can_set_mount_point'] = PREV - - @test.create_stubs({cinder: ('volume_get',), api.nova: ('server_list',)}) - def test_edit_attachments_cannot_set_mount_point(self): -- PREV = settings.OPENSTACK_HYPERVISOR_FEATURES['can_set_mount_point'] -- settings.OPENSTACK_HYPERVISOR_FEATURES['can_set_mount_point'] = False - - volume = self.volumes.first() - servers = [s for s in self.servers.list() -@@ -593,7 +594,6 @@ - form = res.context['form'] - self.assertTrue(isinstance(form.fields['device'].widget, - widgets.HiddenInput)) -- settings.OPENSTACK_HYPERVISOR_FEATURES['can_set_mount_point'] = PREV - - @test.create_stubs({cinder: ('volume_get',), - api.nova: ('server_get', 'server_list',), ---- horizon-2013.2.3/openstack_dashboard/dashboards/project/volumes/forms.py.orig 2014-06-20 04:54:21.534957784 -0700 -+++ horizon-2013.2.3/openstack_dashboard/dashboards/project/volumes/forms.py 2014-06-20 06:33:14.199293693 -0700 -@@ -230,7 +230,7 @@ - "OPENSTACK_HYPERVISOR_FEATURES", - {}) - can_set_mount_point = hypervisor_features.get("can_set_mount_point", -- True) -+ False) - if not can_set_mount_point: - self.fields['device'].widget = forms.widgets.HiddenInput() - self.fields['device'].required = False ---- horizon-2013.2.3/openstack_dashboard/local/local_settings.py.example.orig 2014-06-20 06:49:38.061148762 -0700 -+++ horizon-2013.2.3/openstack_dashboard/local/local_settings.py.example 2014-06-20 03:03:06.949623969 -0700 -@@ -149,8 +149,12 @@ - 'can_edit_role': True - } - -+# The Xen Hypervisor has the ability to set the mount point for volumes -+# attached to instances (other Hypervisors currently do not). Setting -+# can_set_mount_point to True will add the option to set the mount point -+# from the UI. - OPENSTACK_HYPERVISOR_FEATURES = { -- 'can_set_mount_point': True, -+ 'can_set_mount_point': False, - } - - # The OPENSTACK_NEUTRON_NETWORK settings can be used to enable optional ---- horizon-2013.2.3/openstack_dashboard/test/settings.py.orig 2014-06-20 04:59:02.205734858 -0700 -+++ horizon-2013.2.3/openstack_dashboard/test/settings.py 2014-06-20 06:28:57.101070812 -0700 -@@ -107,7 +107,7 @@ - } - - OPENSTACK_HYPERVISOR_FEATURES = { -- 'can_set_mount_point': True, -+ 'can_set_mount_point': False, - } - - OPENSTACK_IMAGE_BACKEND = { diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/06-remove-security-groups.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/patches/06-remove-security-groups.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,39 @@ +Solaris/EVS do not yet support security_groups so disable all +security_group quotas and remove the pie chart from the summary page. +This patch is not suitable for upstream contribution. + +--- horizon-2014.2.2/horizon/templates/horizon/common/_limit_summary.html.orig 2015-03-04 08:18:40.918393776 -0700 ++++ horizon-2014.2.2/horizon/templates/horizon/common/_limit_summary.html 2015-03-04 08:18:50.752267276 -0700 +@@ -30,12 +30,6 @@ + + + +-
+-
+- {% trans "Security Groups" %}
+- {% blocktrans with used=usage.limits.totalSecurityGroupsUsed|intcomma available=usage.limits.maxSecurityGroups|quotainf|intcomma%}Used {{ used }} of {{ available }} {% endblocktrans %} +-
+-
+ {% if usage.limits.totalVolumesUsed >= 0 %} +
+
+ +--- horizon-2014.2.2/openstack_dashboard/usage/quotas.py.orig 2015-03-04 13:53:40.924434219 -0700 ++++ horizon-2014.2.2/openstack_dashboard/usage/quotas.py 2015-03-04 13:54:19.737460759 -0700 +@@ -197,12 +197,10 @@ def get_disabled_quotas(request): + # Remove the nova network quotas + disabled_quotas.extend(['floating_ips', 'fixed_ips']) + +- if neutron.is_extension_supported(request, 'security-group'): +- # If Neutron security group is supported, disable Nova quotas +- disabled_quotas.extend(['security_groups', 'security_group_rules']) +- else: +- # If Nova security group is used, disable Neutron quotas +- disabled_quotas.extend(['security_group', 'security_group_rule']) ++ # Solaris/EVS do not yet support security_groups, so disable all ++ # security_group quotas ++ disabled_quotas.extend(['security_groups', 'security_group_rules']) ++ disabled_quotas.extend(['security_group', 'security_group_rule']) + + try: + if not neutron.is_quotas_extension_supported(request): diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/07-remove-console.patch --- a/components/openstack/horizon/patches/07-remove-console.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -In-house patch to remove the ">> open console" link from instance -elements in the Network Topology screen. This patch is -Solaris-specific and not suitable for upstream contribution. - ---- horizon-2013.2.3/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/client_side/_balloon_container.html.orig 2014-06-20 08:04:57.394535111 -0600 -+++ horizon-2013.2.3/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/client_side/_balloon_container.html 2014-06-20 08:05:47.621066190 -0600 -@@ -16,7 +16,6 @@ -
-
- diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/07-remove-image-source.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/patches/07-remove-image-source.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,16 @@ +Internal patch to disable the image_source (Create Volume -> Volume Source -> image) +because copy_volume_from_image is not supported yet. +This patch will not be committed upstream. + +--- horizon-2014.2.2/openstack_dashboard/dashboards/project/volumes/volumes/forms.py.orig 2015-03-06 00:02:20.754192323 -0800 ++++ horizon-2014.2.2/openstack_dashboard/dashboards/project/volumes/volumes/forms.py 2015-03-06 00:04:15.272654086 -0800 +@@ -203,6 +203,9 @@ + + images = utils.get_available_images(request, + request.user.tenant_id) ++ # Disable the image_source on Solaris ++ images = False ++ + if images: + source_type_choices.append(("image_source", _("Image"))) + choices = [('', _("Choose an image"))] diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/08-_get_reachable_subnets.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/patches/08-_get_reachable_subnets.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,17 @@ +This internal patch addresses an apparent Juno regression related to +Launchpad bug 1252403. It's not suitable for the upstream but a bug +report will be filed to cover the regression and eventually this patch +should be replaced with something official. + +--- horizon-2014.2.2/openstack_dashboard/api/neutron.py.orig 2015-02-05 09:06:50.000000000 -0800 ++++ horizon-2014.2.2/openstack_dashboard/api/neutron.py 2015-03-22 21:56:14.619688527 -0700 +@@ -411,8 +411,7 @@ class FloatingIpManager(network_base.Flo + in ext_net_ids)] + reachable_subnets = set([p.fixed_ips[0]['subnet_id'] for p in ports + if ((p.device_owner == +- 'network:router_interface') +- and (p.device_id in gw_routers))]) ++ 'network:router_interface'))]) + return reachable_subnets + + def list_targets(self): diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/08-flavor-names.patch --- a/components/openstack/horizon/patches/08-flavor-names.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -In-house patch to increate the maximum length of Flavor names, Flavor -keys, and Flavor values. This patch has not yet been submitted -upstream. - ---- horizon-2013.2.3/openstack_dashboard/dashboards/admin/flavors/workflows.py.orig 2014-06-27 09:55:09.196764242 -0600 -+++ horizon-2013.2.3/openstack_dashboard/dashboards/admin/flavors/workflows.py 2014-06-27 09:55:12.447224496 -0600 -@@ -35,7 +35,7 @@ - "Leave this field blank or use 'auto' to set " - "a random UUID4.") - name = forms.RegexField(label=_("Name"), -- max_length=25, -+ max_length=255, - regex=r'^[\w\.\- ]+$', - error_messages={'invalid': _('Name may only ' - 'contain letters, numbers, underscores, ' - ---- horizon-2013.2.3/openstack_dashboard/dashboards/admin/flavors/extras/forms.py.orig 2014-06-27 09:57:05.195849313 -0600 -+++ horizon-2013.2.3/openstack_dashboard/dashboards/admin/flavors/extras/forms.py 2014-06-27 09:57:19.351010746 -0600 -@@ -28,8 +28,8 @@ - - - class CreateExtraSpec(forms.SelfHandlingForm): -- key = forms.CharField(max_length="25", label=_("Key")) -- value = forms.CharField(max_length="25", label=_("Value")) -+ key = forms.CharField(max_length="255", label=_("Key")) -+ value = forms.CharField(max_length="255", label=_("Value")) - flavor_id = forms.CharField(widget=forms.widgets.HiddenInput) - - def handle(self, request, data): -@@ -46,8 +46,8 @@ - - - class EditExtraSpec(forms.SelfHandlingForm): -- key = forms.CharField(max_length="25", label=_("Key")) -- value = forms.CharField(max_length="25", label=_("Value")) -+ key = forms.CharField(max_length="255", label=_("Key")) -+ value = forms.CharField(max_length="255", label=_("Value")) - flavor_id = forms.CharField(widget=forms.widgets.HiddenInput) - - def handle(self, request, data): - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/09-disable-unsupported-bootsource.patch --- a/components/openstack/horizon/patches/09-disable-unsupported-bootsource.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -Internal patch to only enable the current supported boot source (Boot from Image). -This patch will not be committed upsteam. - ---- horizon-2013.2.3/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py.orig 2014-04-03 11:45:53.000000000 -0700 -+++ horizon-2013.2.3/openstack_dashboard/dashboards/project/instances/workflows/create_instance.py 2014-07-07 14:53:44.291365109 -0700 -@@ -137,22 +137,7 @@ - source_type_choices = [ - ('', _("--- Select source ---")), - ("image_id", _("Boot from image")), -- ("instance_snapshot_id", _("Boot from snapshot")), - ] -- if base.is_service_enabled(request, 'volume'): -- source_type_choices.append(("volume_id", _("Boot from volume"))) -- -- try: -- if api.nova.extension_supported("BlockDeviceMappingV2Boot", -- request): -- source_type_choices.append(("volume_image_id", -- _("Boot from image (creates a new volume)."))) -- except Exception: -- exceptions.handle(request, _('Unable to retrieve extensions ' -- 'information.')) -- -- source_type_choices.append(("volume_snapshot_id", -- _("Boot from volume snapshot (creates a new volume)."))) - self.fields['source_type'].choices = source_type_choices - - def clean(self): diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/10-network-agents.patch --- a/components/openstack/horizon/patches/10-network-agents.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -In-house patch to handle Resource Not Found exception while trying -to display the Network Agents panel. This is needed as our Neutron -doesn't support Agents extension. - ---- horizon-2013.2.3/openstack_dashboard/api/neutron.py 2014-04-03 11:45:53.000000000 -0700 -+++ NEW/openstack_dashboard/api/neutron.py 2014-07-08 09:35:42.219185826 -0700 -@@ -33,6 +33,7 @@ - from openstack_dashboard.api import network_base - from openstack_dashboard.api import nova - -+from neutronclient.common.exceptions import NeutronClientException - from neutronclient.v2_0 import client as neutron_client - - LOG = logging.getLogger(__name__) -@@ -718,7 +719,11 @@ - - - def agent_list(request): -- agents = neutronclient(request).list_agents() -+ try: -+ agents = neutronclient(request).list_agents() -+ except NeutronClientException as nce: -+ if nce.status_code == 404: -+ return [] - return [Agent(a) for a in agents['agents']] - - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/11-CVE-2014-3473-3474-3475.patch --- a/components/openstack/horizon/patches/11-CVE-2014-3473-3474-3475.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,175 +0,0 @@ -Upstream patch fixed in Havana 2013.2.4 and Icehouse 2014.1.2 - -From c844bd692894353c60b320005b804970605e910f Mon Sep 17 00:00:00 2001 -From: Julie Pichon -Date: Thu, 22 May 2014 16:45:03 +0100 -Subject: [PATCH] Fix multiple Cross-Site Scripting (XSS) vulnerabilities - - * Ensure user emails are properly escaped - -User emails in the Users and Groups panel are being passed through the -urlize filter to transform them into clickable links. However, urlize -expects input to be already escaped and safe. We should make sure to -escape the strings first as email addresses are not validated and can -contain any type of string. - -Closes-Bug: #1320235 - - * Ensure network names are properly escaped in the Launch Instance menu - -Closes-Bug: #1322197 - - * Escape the URLs generated for the Horizon tables - -When generating the Horizon tables, there was an assumption that only -the anchor text needed to be escaped. However some URLs are generated -based on user-provided data and should be escaped as well. Also escape -the link attributes for good measure. - - * Use 'reverse' to generate the Resource URLs in the stacks tables - -Closes-Bug: #1308727 - -Conflicts: - horizon/tables/base.py - openstack_dashboard/dashboards/admin/users/tables.py - -Change-Id: Ic8a92e69f66c2d265a802f350e30f091181aa42e ---- - horizon/static/horizon/js/horizon.instances.js | 9 ++++++++- - horizon/tables/base.py | 4 +++- - .../dashboards/admin/groups/tables.py | 3 ++- - .../dashboards/admin/users/tables.py | 3 ++- - .../dashboards/project/stacks/tables.py | 10 ++++++++-- - .../dashboards/project/stacks/tabs.py | 6 ++++++ - 6 files changed, 29 insertions(+), 6 deletions(-) - -diff --git a/horizon/static/horizon/js/horizon.instances.js b/horizon/static/horizon/js/horizon.instances.js -index c901180..c6ff323 100644 ---- a/horizon/static/horizon/js/horizon.instances.js -+++ b/horizon/static/horizon/js/horizon.instances.js -@@ -51,8 +51,15 @@ horizon.instances = { - $(this.get_network_element("")).each(function(){ - var $this = $(this); - var $input = $this.children("input"); -+ var name = $this.text().replace(/^\s+/,"") -+ .replace(/&/g, '&') -+ .replace(//g, '>') -+ .replace(/"/g, '"') -+ .replace(/'/g, ''') -+ .replace(/\//g, '/'); - var network_property = { -- name:$this.text().replace(/^\s+/,""), -+ name:name, - id:$input.attr("id"), - value:$input.attr("value") - }; -diff --git a/horizon/tables/base.py b/horizon/tables/base.py -index adc284c..9011b77 100644 ---- a/horizon/tables/base.py -+++ b/horizon/tables/base.py -@@ -585,7 +585,9 @@ class Cell(html.HTMLElement): - link_classes = ' '.join(self.column.link_classes) - # Escape the data inside while allowing our HTML to render - data = mark_safe('%s' % -- (self.url, link_classes, escape(data))) -+ (escape(self.url), -+ escape(link_classes), -+ escape(data))) - return data - - @property -diff --git a/openstack_dashboard/dashboards/admin/groups/tables.py b/openstack_dashboard/dashboards/admin/groups/tables.py -index bce8f50..ff8103b 100644 ---- a/openstack_dashboard/dashboards/admin/groups/tables.py -+++ b/openstack_dashboard/dashboards/admin/groups/tables.py -@@ -161,7 +161,8 @@ class AddMembersLink(tables.LinkAction): - class UsersTable(tables.DataTable): - name = tables.Column('name', verbose_name=_('User Name')) - email = tables.Column('email', verbose_name=_('Email'), -- filters=[defaultfilters.urlize]) -+ filters=[defaultfilters.escape, -+ defaultfilters.urlize]) - id = tables.Column('id', verbose_name=_('User ID')) - enabled = tables.Column('enabled', verbose_name=_('Enabled'), - status=True, -diff --git a/openstack_dashboard/dashboards/admin/users/tables.py b/openstack_dashboard/dashboards/admin/users/tables.py -index d47d68d..c0b0ea5 100644 ---- a/openstack_dashboard/dashboards/admin/users/tables.py -+++ b/openstack_dashboard/dashboards/admin/users/tables.py -@@ -117,7 +117,8 @@ class UsersTable(tables.DataTable): - ) - name = tables.Column('name', verbose_name=_('User Name')) - email = tables.Column('email', verbose_name=_('Email'), -- filters=[defaultfilters.urlize]) -+ filters=[defaultfilters.escape, -+ defaultfilters.urlize]) - # Default tenant is not returned from Keystone currently. - #default_tenant = tables.Column('default_tenant', - # verbose_name=_('Default Project')) -diff --git a/openstack_dashboard/dashboards/project/stacks/tables.py b/openstack_dashboard/dashboards/project/stacks/tables.py -index f0bc731..822726b 100644 ---- a/openstack_dashboard/dashboards/project/stacks/tables.py -+++ b/openstack_dashboard/dashboards/project/stacks/tables.py -@@ -12,6 +12,7 @@ - # License for the specific language governing permissions and limitations - # under the License. - -+from django.core import urlresolvers - from django.http import Http404 # noqa - from django.template.defaultfilters import timesince # noqa - from django.template.defaultfilters import title # noqa -@@ -94,11 +95,16 @@ class StacksTable(tables.DataTable): - row_actions = (DeleteStack, ) - - -+def get_resource_url(obj): -+ return urlresolvers.reverse('horizon:project:stacks:resource', -+ args=(obj.stack_id, obj.resource_name)) -+ -+ - class EventsTable(tables.DataTable): - - logical_resource = tables.Column('resource_name', - verbose_name=_("Stack Resource"), -- link=lambda d: d.resource_name,) -+ link=get_resource_url) - physical_resource = tables.Column('physical_resource_id', - verbose_name=_("Resource"), - link=mappings.resource_to_url) -@@ -142,7 +148,7 @@ class ResourcesTable(tables.DataTable): - - logical_resource = tables.Column('resource_name', - verbose_name=_("Stack Resource"), -- link=lambda d: d.resource_name) -+ link=get_resource_url) - physical_resource = tables.Column('physical_resource_id', - verbose_name=_("Resource"), - link=mappings.resource_to_url) -diff --git a/openstack_dashboard/dashboards/project/stacks/tabs.py b/openstack_dashboard/dashboards/project/stacks/tabs.py -index 15ef833..b5886f3 100644 ---- a/openstack_dashboard/dashboards/project/stacks/tabs.py -+++ b/openstack_dashboard/dashboards/project/stacks/tabs.py -@@ -75,6 +75,9 @@ class StackEventsTab(tabs.Tab): - stack_identifier = '%s/%s' % (stack.stack_name, stack.id) - events = api.heat.events_list(self.request, stack_identifier) - LOG.debug('got events %s' % events) -+ # The stack id is needed to generate the resource URL. -+ for event in events: -+ event.stack_id = stack.id - except Exception: - events = [] - messages.error(request, _( -@@ -95,6 +98,9 @@ class StackResourcesTab(tabs.Tab): - stack_identifier = '%s/%s' % (stack.stack_name, stack.id) - resources = api.heat.resources_list(self.request, stack_identifier) - LOG.debug('got resources %s' % resources) -+ # The stack id is needed to generate the resource URL. -+ for r in resources: -+ r.stack_id = stack.id - except Exception: - resources = [] - messages.error(request, _( --- -1.7.9.5 diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/11-requirements.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/patches/11-requirements.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,50 @@ +In-house patch to remove unnecessary dependencies from Horizon's +requirements files. The specific reasons are as follows: + +eventlet Not applicable + +kombu Not applicable + +pyscss Not applicable + +--- horizon-2014.2.2/horizon.egg-info/requires.txt.~1~ 2015-02-05 09:08:25.000000000 -0800 ++++ horizon-2014.2.2/horizon.egg-info/requires.txt 2015-02-25 00:24:13.790331173 -0800 +@@ -3,13 +3,10 @@ Django>=1.4.2,<1.7 + django_compressor>=1.4 + django_openstack_auth>=1.1.7,!=1.1.8 + django-pyscss>=1.0.3 # BSD License2 clause +-eventlet>=0.15.1,<0.16.0 + httplib2>=0.7.5 + iso8601>=0.1.9 +-kombu>=2.5.0 + lockfile>=0.8 + netaddr>=0.7.12 +-pyScss>=1.2.1,<1.3 # MIT License + python-ceilometerclient>=1.0.6 + python-cinderclient>=1.1.0 + python-glanceclient>=0.14.0 +@@ -40,4 +37,4 @@ xstatic-jquery-ui>=1.10.1 # MIT License + xstatic-jsencrypt>=2.0.0.2 # MIT License + xstatic-qunit>=1.14.0.2 # MIT License + xstatic-rickshaw>=1.5.0 # BSD Licenseprior +-xstatic-spin>=1.2.5.2 # MIT License ++xstatic-spin>=1.2.5.2 # MIT License +\ No newline at end of file +--- horizon-2014.2.2/requirements.txt.~1~ 2015-02-05 09:06:50.000000000 -0800 ++++ horizon-2014.2.2/requirements.txt 2015-02-25 00:24:12.542805712 -0800 +@@ -13,15 +13,12 @@ Django>=1.4.2,<1.7 + django_compressor>=1.4 + django_openstack_auth>=1.1.7,!=1.1.8 + django-pyscss>=1.0.3 # BSD License (2 clause) +-eventlet>=0.15.1,<0.16.0 + httplib2>=0.7.5 + iso8601>=0.1.9 +-kombu>=2.5.0 + # Horizon Utility Requirements + # for SECURE_KEY generation + lockfile>=0.8 + netaddr>=0.7.12 +-pyScss>=1.2.1,<1.3 # MIT License + python-ceilometerclient>=1.0.6 + python-cinderclient>=1.1.0 + python-glanceclient>=0.14.0 diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/12-launchpad-1265032.patch --- a/components/openstack/horizon/patches/12-launchpad-1265032.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,868 +0,0 @@ -Upstream patch to fix launchpad bug 1265032. This fix is available in -Icehouse 2014.1 but not yet available in Havana. - -From f3557786e2a9f026a16d2fd3b8fa9243bc4c70a9 Mon Sep 17 00:00:00 2001 -From: Assaf Muller -Date: Sun, 29 Dec 2013 16:44:46 +0200 -Subject: Get instance networking information from Neutron - -project/instances, admin/instances and the instance details page -all get networking information from Nova. However, with Neutron -enabled, floating IP associations are done direcly with Neutron, -meaning that Nova's DB will fall out of sync and thus the GUI -won't reflect successful floating IP associations until Nova -polls Neutron again and updates its DB. The polling can take -up to several minutes to complete for consecutive floating IP -operations. - -The solution is to update instances' networking information from -Neutron immediately after the call to list Nova instances. - -Conflicts: - openstack_dashboard/dashboards/project/instances/tests.py - openstack_dashboard/dashboards/project/instances/views.py - -Closes-Bug: #1265032 -Change-Id: I0382fa9a4a9fff21e7b4d05cd3b76783f826735f -(cherry picked from commit 715d6b822838009530b7792cd7749164ae3fc663) - -diff --git a/openstack_dashboard/api/network.py b/openstack_dashboard/api/network.py -index 7ab233c..ea76d41 100644 ---- a/openstack_dashboard/api/network.py -+++ b/openstack_dashboard/api/network.py -@@ -132,3 +132,15 @@ def server_update_security_groups(request, instance_id, - - def security_group_backend(request): - return NetworkClient(request).secgroups.backend -+ -+ -+def servers_update_addresses(request, servers): -+ """Retrieve servers networking information from Neutron if enabled. -+ -+ Should be used when up to date networking information is required, -+ and Nova's networking info caching mechanism is not fast enough. -+ -+ """ -+ neutron_enabled = base.is_service_enabled(request, 'network') -+ if neutron_enabled: -+ neutron.servers_update_addresses(request, servers) -diff --git a/openstack_dashboard/api/neutron.py b/openstack_dashboard/api/neutron.py -index 4443c9b..c09a674 100644 ---- a/openstack_dashboard/api/neutron.py -+++ b/openstack_dashboard/api/neutron.py -@@ -21,12 +21,15 @@ - - from __future__ import absolute_import - -+import collections - import logging -+import netaddr - - from django.conf import settings # noqa - from django.utils.datastructures import SortedDict # noqa - from django.utils.translation import ugettext_lazy as _ # noqa - -+from horizon import messages - from horizon.utils.memoized import memoized # noqa - - from openstack_dashboard.api import base -@@ -321,12 +324,12 @@ class FloatingIpManager(network_base.FloatingIpManager): - return [FloatingIpPool(pool) for pool - in self.client.list_networks(**search_opts).get('networks')] - -- def list(self): -+ def list(self, **search_opts): - tenant_id = self.request.user.tenant_id - # In Neutron, list_floatingips returns Floating IPs from all tenants - # when the API is called with admin role, so we need to filter them - # with tenant_id. -- fips = self.client.list_floatingips(tenant_id=tenant_id) -+ fips = self.client.list_floatingips(tenant_id=tenant_id, **search_opts) - fips = fips.get('floatingips') - # Get port list to add instance_id to floating IP list - # instance_id is stored in device_id attribute -@@ -727,6 +730,88 @@ def provider_list(request): - return providers['service_providers'] - - -+def servers_update_addresses(request, servers): -+ """Retrieve servers networking information from Neutron if enabled. -+ -+ Should be used when up to date networking information is required, -+ and Nova's networking info caching mechanism is not fast enough. -+ """ -+ -+ # Get all (filtered for relevant servers) information from Neutron -+ try: -+ ports = port_list(request, -+ device_id=[instance.id for instance in servers]) -+ floating_ips = FloatingIpManager(request).list( -+ port_id=[port.id for port in ports]) -+ networks = network_list(request, -+ id=[port.network_id for port in ports]) -+ except Exception: -+ error_message = _('Unable to connect to Neutron.') -+ LOG.error(error_message) -+ messages.error(request, error_message) -+ return -+ -+ # Map instance to its ports -+ instances_ports = collections.defaultdict(list) -+ for port in ports: -+ instances_ports[port.device_id].append(port) -+ -+ # Map port to its floating ips -+ ports_floating_ips = collections.defaultdict(list) -+ for fip in floating_ips: -+ ports_floating_ips[fip.port_id].append(fip) -+ -+ # Map network id to its name -+ network_names = dict(((network.id, network.name) for network in networks)) -+ -+ for server in servers: -+ try: -+ addresses = _server_get_addresses( -+ request, -+ server, -+ instances_ports, -+ ports_floating_ips, -+ network_names) -+ except Exception as e: -+ LOG.error(e) -+ else: -+ server.addresses = addresses -+ -+ -+def _server_get_addresses(request, server, ports, floating_ips, network_names): -+ def _format_address(mac, ip, type): -+ try: -+ version = netaddr.IPAddress(ip).version -+ except Exception as e: -+ error_message = _('Unable to parse IP address %s.') % ip -+ LOG.error(error_message) -+ messages.error(request, error_message) -+ raise e -+ return {u'OS-EXT-IPS-MAC:mac_addr': mac, -+ u'version': version, -+ u'addr': ip, -+ u'OS-EXT-IPS:type': type} -+ -+ addresses = collections.defaultdict(list) -+ instance_ports = ports.get(server.id, []) -+ for port in instance_ports: -+ network_name = network_names.get(port.network_id) -+ if network_name is not None: -+ for fixed_ip in port.fixed_ips: -+ addresses[network_name].append( -+ _format_address(port.mac_address, -+ fixed_ip['ip_address'], -+ u'fixed')) -+ port_fips = floating_ips.get(port.id, []) -+ for fip in port_fips: -+ addresses[network_name].append( -+ _format_address(port.mac_address, -+ fip.floating_ip_address, -+ u'floating')) -+ -+ return dict(addresses) -+ -+ - @memoized - def list_extensions(request): - extensions_list = neutronclient(request).list_extensions() -diff --git a/openstack_dashboard/dashboards/admin/instances/tests.py b/openstack_dashboard/dashboards/admin/instances/tests.py -index 6beb8fa..9236b4e 100644 ---- a/openstack_dashboard/dashboards/admin/instances/tests.py -+++ b/openstack_dashboard/dashboards/admin/instances/tests.py -@@ -20,6 +20,7 @@ from django.core.urlresolvers import reverse # noqa - from django import http - from django.utils.datastructures import SortedDict # noqa - -+from mox import IgnoreArg # noqa - from mox import IsA # noqa - - from openstack_dashboard import api -@@ -29,7 +30,8 @@ from openstack_dashboard.test import helpers as test - class InstanceViewTest(test.BaseAdminViewTests): - @test.create_stubs({api.nova: ('flavor_list', 'server_list', - 'extension_supported',), -- api.keystone: ('tenant_list',)}) -+ api.keystone: ('tenant_list',), -+ api.network: ('servers_update_addresses',)}) - def test_index(self): - servers = self.servers.list() - flavors = self.flavors.list() -@@ -42,6 +44,7 @@ class InstanceViewTest(test.BaseAdminViewTests): - api.nova.server_list(IsA(http.HttpRequest), - all_tenants=True, search_opts=search_opts) \ - .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.flavor_list(IsA(http.HttpRequest)).AndReturn(flavors) - self.mox.ReplayAll() - -@@ -52,7 +55,8 @@ class InstanceViewTest(test.BaseAdminViewTests): - - @test.create_stubs({api.nova: ('flavor_list', 'flavor_get', - 'server_list', 'extension_supported',), -- api.keystone: ('tenant_list',)}) -+ api.keystone: ('tenant_list',), -+ api.network: ('servers_update_addresses',)}) - def test_index_flavor_list_exception(self): - servers = self.servers.list() - tenants = self.tenants.list() -@@ -63,6 +67,7 @@ class InstanceViewTest(test.BaseAdminViewTests): - api.nova.server_list(IsA(http.HttpRequest), - all_tenants=True, search_opts=search_opts) \ - .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \ - .MultipleTimes().AndReturn(True) - api.nova.flavor_list(IsA(http.HttpRequest)). \ -@@ -82,7 +87,8 @@ class InstanceViewTest(test.BaseAdminViewTests): - - @test.create_stubs({api.nova: ('flavor_list', 'flavor_get', - 'server_list', 'extension_supported', ), -- api.keystone: ('tenant_list',)}) -+ api.keystone: ('tenant_list',), -+ api.network: ('servers_update_addresses',)}) - def test_index_flavor_get_exception(self): - servers = self.servers.list() - flavors = self.flavors.list() -@@ -96,6 +102,7 @@ class InstanceViewTest(test.BaseAdminViewTests): - api.nova.server_list(IsA(http.HttpRequest), - all_tenants=True, search_opts=search_opts) \ - .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \ - .MultipleTimes().AndReturn(True) - api.nova.flavor_list(IsA(http.HttpRequest)). \ -@@ -162,14 +169,17 @@ class InstanceViewTest(test.BaseAdminViewTests): - - @test.create_stubs({api.nova: ('flavor_list', 'server_list', - 'extension_supported', ), -- api.keystone: ('tenant_list',)}) -+ api.keystone: ('tenant_list',), -+ api.network: ('servers_update_addresses',)}) - def test_index_options_before_migrate(self): -+ servers = self.servers.list() - api.keystone.tenant_list(IsA(http.HttpRequest)).\ - AndReturn([self.tenants.list(), False]) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), - all_tenants=True, search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.extension_supported('AdminActions', IsA(http.HttpRequest)) \ - .MultipleTimes().AndReturn(True) - api.nova.flavor_list(IsA(http.HttpRequest)).\ -@@ -183,7 +193,8 @@ class InstanceViewTest(test.BaseAdminViewTests): - - @test.create_stubs({api.nova: ('flavor_list', 'server_list', - 'extension_supported', ), -- api.keystone: ('tenant_list',)}) -+ api.keystone: ('tenant_list',), -+ api.network: ('servers_update_addresses',)}) - def test_index_options_after_migrate(self): - servers = self.servers.list() - server1 = servers[0] -@@ -197,7 +208,8 @@ class InstanceViewTest(test.BaseAdminViewTests): - .MultipleTimes().AndReturn(True) - api.nova.server_list(IsA(http.HttpRequest), - all_tenants=True, search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.flavor_list(IsA(http.HttpRequest)).\ - AndReturn(self.flavors.list()) - self.mox.ReplayAll() -diff --git a/openstack_dashboard/dashboards/admin/instances/views.py b/openstack_dashboard/dashboards/admin/instances/views.py -index 3397f25..4bc6bee 100644 ---- a/openstack_dashboard/dashboards/admin/instances/views.py -+++ b/openstack_dashboard/dashboards/admin/instances/views.py -@@ -74,6 +74,14 @@ class AdminIndexView(tables.DataTableView): - exceptions.handle(self.request, - _('Unable to retrieve instance list.')) - if instances: -+ try: -+ api.network.servers_update_addresses(self.request, instances) -+ except Exception: -+ exceptions.handle( -+ self.request, -+ message=_('Unable to retrieve IP addresses from Neutron.'), -+ ignore=True) -+ - # Gather our flavors to correlate against IDs - try: - flavors = api.nova.flavor_list(self.request) -diff --git a/openstack_dashboard/dashboards/project/instances/tests.py b/openstack_dashboard/dashboards/project/instances/tests.py -index 8d56455..b2b066f 100644 ---- a/openstack_dashboard/dashboards/project/instances/tests.py -+++ b/openstack_dashboard/dashboards/project/instances/tests.py -@@ -52,9 +52,11 @@ class InstanceTests(test.TestCase): - 'extension_supported',), - api.glance: ('image_list_detailed',), - api.network: -- ('floating_ip_simple_associate_supported',), -+ ('floating_ip_simple_associate_supported', -+ 'servers_update_addresses',), - }) - def test_index(self): -+ servers = self.servers.list() - api.nova.extension_supported('AdminActions', - IsA(http.HttpRequest)) \ - .MultipleTimes().AndReturn(True) -@@ -64,7 +66,8 @@ class InstanceTests(test.TestCase): - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.tenant_absolute_limits(IsA(http.HttpRequest), reserved=True) \ - .MultipleTimes().AndReturn(self.limits['absolute']) - api.network.floating_ip_simple_associate_supported( -@@ -104,7 +107,8 @@ class InstanceTests(test.TestCase): - 'extension_supported',), - api.glance: ('image_list_detailed',), - api.network: -- ('floating_ip_simple_associate_supported',), -+ ('floating_ip_simple_associate_supported', -+ 'servers_update_addresses',), - }) - def test_index_flavor_list_exception(self): - servers = self.servers.list() -@@ -116,6 +120,7 @@ class InstanceTests(test.TestCase): - .MultipleTimes().AndReturn(True) - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ - .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.flavor_list(IsA(http.HttpRequest)) \ - .AndRaise(self.exceptions.nova) - api.glance.image_list_detailed(IgnoreArg()) \ -@@ -144,7 +149,8 @@ class InstanceTests(test.TestCase): - 'extension_supported',), - api.glance: ('image_list_detailed',), - api.network: -- ('floating_ip_simple_associate_supported',), -+ ('floating_ip_simple_associate_supported', -+ 'servers_update_addresses',), - }) - def test_index_flavor_get_exception(self): - servers = self.servers.list() -@@ -160,6 +166,7 @@ class InstanceTests(test.TestCase): - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ - .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.flavor_list(IsA(http.HttpRequest)).AndReturn(flavors) - api.glance.image_list_detailed(IgnoreArg()) \ - .AndReturn((self.images.list(), False)) -@@ -187,7 +194,8 @@ class InstanceTests(test.TestCase): - 'extension_supported',), - api.glance: ('image_list_detailed',), - api.network: -- ('floating_ip_simple_associate_supported',), -+ ('floating_ip_simple_associate_supported', -+ 'servers_update_addresses',), - }) - def test_index_with_instance_booted_from_volume(self): - volume_server = self.servers.first() -@@ -206,6 +214,7 @@ class InstanceTests(test.TestCase): - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ - .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.tenant_absolute_limits(IsA(http.HttpRequest), reserved=True) \ - .MultipleTimes().AndReturn(self.limits['absolute']) - api.network.floating_ip_simple_associate_supported( -@@ -223,18 +232,20 @@ class InstanceTests(test.TestCase): - @test.create_stubs({api.nova: ('server_list', - 'flavor_list', - 'server_delete',), -- api.glance: ('image_list_detailed',)}) -+ api.glance: ('image_list_detailed',), -+ api.network: ('servers_update_addresses',)}) - def test_terminate_instance(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.flavor_list(IgnoreArg()).AndReturn(self.flavors.list()) - api.glance.image_list_detailed(IgnoreArg()) \ - .AndReturn((self.images.list(), False)) - api.nova.server_delete(IsA(http.HttpRequest), server.id) -- - self.mox.ReplayAll() - - formData = {'action': 'instances__terminate__%s' % server.id} -@@ -245,13 +256,16 @@ class InstanceTests(test.TestCase): - @test.create_stubs({api.nova: ('server_list', - 'flavor_list', - 'server_delete',), -- api.glance: ('image_list_detailed',)}) -+ api.glance: ('image_list_detailed',), -+ api.network: ('servers_update_addresses',)}) - def test_terminate_instance_exception(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.flavor_list(IgnoreArg()).AndReturn(self.flavors.list()) - api.glance.image_list_detailed(IgnoreArg()) \ - .AndReturn((self.images.list(), False)) -@@ -269,9 +283,11 @@ class InstanceTests(test.TestCase): - 'server_list', - 'flavor_list', - 'extension_supported',), -- api.glance: ('image_list_detailed',)}) -+ api.glance: ('image_list_detailed',), -+ api.network: ('servers_update_addresses',)}) - def test_pause_instance(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - - api.nova.extension_supported('AdminActions', - IsA(http.HttpRequest)) \ -@@ -282,7 +298,8 @@ class InstanceTests(test.TestCase): - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.server_pause(IsA(http.HttpRequest), server.id) - - self.mox.ReplayAll() -@@ -296,9 +313,11 @@ class InstanceTests(test.TestCase): - 'server_list', - 'flavor_list', - 'extension_supported',), -- api.glance: ('image_list_detailed',)}) -+ api.glance: ('image_list_detailed',), -+ api.network: ('servers_update_addresses',)}) - def test_pause_instance_exception(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - - api.nova.extension_supported('AdminActions', - IsA(http.HttpRequest)) \ -@@ -309,7 +328,8 @@ class InstanceTests(test.TestCase): - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.server_pause(IsA(http.HttpRequest), server.id) \ - .AndRaise(self.exceptions.nova) - -@@ -324,9 +344,11 @@ class InstanceTests(test.TestCase): - 'server_list', - 'flavor_list', - 'extension_supported',), -- api.glance: ('image_list_detailed',)}) -+ api.glance: ('image_list_detailed',), -+ api.network: ('servers_update_addresses',)}) - def test_unpause_instance(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - server.status = "PAUSED" - api.nova.extension_supported('AdminActions', - IsA(http.HttpRequest)) \ -@@ -337,7 +359,8 @@ class InstanceTests(test.TestCase): - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.server_unpause(IsA(http.HttpRequest), server.id) - - self.mox.ReplayAll() -@@ -351,9 +374,11 @@ class InstanceTests(test.TestCase): - 'server_list', - 'flavor_list', - 'extension_supported',), -- api.glance: ('image_list_detailed',)}) -+ api.glance: ('image_list_detailed',), -+ api.network: ('servers_update_addresses',)}) - def test_unpause_instance_exception(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - server.status = "PAUSED" - - api.nova.extension_supported('AdminActions', -@@ -365,7 +390,8 @@ class InstanceTests(test.TestCase): - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.server_unpause(IsA(http.HttpRequest), server.id) \ - .AndRaise(self.exceptions.nova) - -@@ -379,16 +405,19 @@ class InstanceTests(test.TestCase): - @test.create_stubs({api.nova: ('server_reboot', - 'server_list', - 'flavor_list',), -- api.glance: ('image_list_detailed',)}) -+ api.glance: ('image_list_detailed',), -+ api.network: ('servers_update_addresses',)}) - def test_reboot_instance(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - api.nova.flavor_list(IsA(http.HttpRequest)) \ - .AndReturn(self.flavors.list()) - api.glance.image_list_detailed(IgnoreArg()) \ - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.server_reboot(IsA(http.HttpRequest), server.id, - soft_reboot=False) - -@@ -402,9 +431,11 @@ class InstanceTests(test.TestCase): - @test.create_stubs({api.nova: ('server_reboot', - 'server_list', - 'flavor_list',), -- api.glance: ('image_list_detailed',)}) -+ api.glance: ('image_list_detailed',), -+ api.network: ('servers_update_addresses',)}) - def test_reboot_instance_exception(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - - api.nova.flavor_list(IsA(http.HttpRequest)) \ - .AndReturn(self.flavors.list()) -@@ -412,7 +443,8 @@ class InstanceTests(test.TestCase): - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.server_reboot(IsA(http.HttpRequest), server.id, - soft_reboot=False) \ - .AndRaise(self.exceptions.nova) -@@ -427,9 +459,11 @@ class InstanceTests(test.TestCase): - @test.create_stubs({api.nova: ('server_reboot', - 'server_list', - 'flavor_list',), -- api.glance: ('image_list_detailed',)}) -+ api.glance: ('image_list_detailed',), -+ api.network: ('servers_update_addresses',)}) - def test_soft_reboot_instance(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - - api.nova.flavor_list(IsA(http.HttpRequest)) \ - .AndReturn(self.flavors.list()) -@@ -437,7 +471,8 @@ class InstanceTests(test.TestCase): - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.server_reboot(IsA(http.HttpRequest), server.id, - soft_reboot=True) - -@@ -452,9 +487,11 @@ class InstanceTests(test.TestCase): - 'server_list', - 'flavor_list', - 'extension_supported',), -- api.glance: ('image_list_detailed',)}) -+ api.glance: ('image_list_detailed',), -+ api.network: ('servers_update_addresses',)}) - def test_suspend_instance(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - - api.nova.extension_supported('AdminActions', - IsA(http.HttpRequest)) \ -@@ -465,7 +502,8 @@ class InstanceTests(test.TestCase): - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.server_suspend(IsA(http.HttpRequest), unicode(server.id)) - - self.mox.ReplayAll() -@@ -479,9 +517,11 @@ class InstanceTests(test.TestCase): - 'server_list', - 'flavor_list', - 'extension_supported',), -- api.glance: ('image_list_detailed',)}) -+ api.glance: ('image_list_detailed',), -+ api.network: ('servers_update_addresses',)}) - def test_suspend_instance_exception(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - - api.nova.extension_supported('AdminActions', - IsA(http.HttpRequest)) \ -@@ -492,7 +532,8 @@ class InstanceTests(test.TestCase): - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.server_suspend(IsA(http.HttpRequest), unicode(server.id)) \ - .AndRaise(self.exceptions.nova) - -@@ -507,9 +548,11 @@ class InstanceTests(test.TestCase): - 'server_list', - 'flavor_list', - 'extension_supported',), -- api.glance: ('image_list_detailed',)}) -+ api.glance: ('image_list_detailed',), -+ api.network: ('servers_update_addresses',)}) - def test_resume_instance(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - server.status = "SUSPENDED" - - api.nova.extension_supported('AdminActions', -@@ -521,7 +564,8 @@ class InstanceTests(test.TestCase): - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.server_resume(IsA(http.HttpRequest), unicode(server.id)) - - self.mox.ReplayAll() -@@ -535,9 +579,11 @@ class InstanceTests(test.TestCase): - 'server_list', - 'flavor_list', - 'extension_supported',), -- api.glance: ('image_list_detailed',)}) -+ api.glance: ('image_list_detailed',), -+ api.network: ('servers_update_addresses',)}) - def test_resume_instance_exception(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - server.status = "SUSPENDED" - - api.nova.extension_supported('AdminActions', -@@ -549,7 +595,8 @@ class InstanceTests(test.TestCase): - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.server_resume(IsA(http.HttpRequest), - unicode(server.id)) \ - .AndRaise(self.exceptions.nova) -@@ -564,12 +611,15 @@ class InstanceTests(test.TestCase): - @test.create_stubs({api.nova: ("server_get", - "instance_volumes_list", - "flavor_get"), -- api.network: ("server_security_groups",)}) -+ api.network: ("server_security_groups", -+ "servers_update_addresses")}) - def test_instance_details_volumes(self): - server = self.servers.first() - volumes = [self.volumes.list()[1]] - - api.nova.server_get(IsA(http.HttpRequest), server.id).AndReturn(server) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), -+ IgnoreArg()) - api.nova.instance_volumes_list(IsA(http.HttpRequest), - server.id).AndReturn(volumes) - api.nova.flavor_get(IsA(http.HttpRequest), server.flavor['id']) \ -@@ -588,12 +638,15 @@ class InstanceTests(test.TestCase): - @test.create_stubs({api.nova: ("server_get", - "instance_volumes_list", - "flavor_get"), -- api.network: ("server_security_groups",)}) -+ api.network: ("server_security_groups", -+ "servers_update_addresses")}) - def test_instance_details_volume_sorting(self): - server = self.servers.first() - volumes = self.volumes.list()[1:3] - - api.nova.server_get(IsA(http.HttpRequest), server.id).AndReturn(server) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), -+ IgnoreArg()) - api.nova.instance_volumes_list(IsA(http.HttpRequest), - server.id).AndReturn(volumes) - api.nova.flavor_get(IsA(http.HttpRequest), server.flavor['id']) \ -@@ -616,11 +669,14 @@ class InstanceTests(test.TestCase): - @test.create_stubs({api.nova: ("server_get", - "instance_volumes_list", - "flavor_get"), -- api.network: ("server_security_groups",)}) -+ api.network: ("server_security_groups", -+ "servers_update_addresses")}) - def test_instance_details_metadata(self): - server = self.servers.first() - - api.nova.server_get(IsA(http.HttpRequest), server.id).AndReturn(server) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), -+ IgnoreArg()) - api.nova.instance_volumes_list(IsA(http.HttpRequest), - server.id).AndReturn([]) - api.nova.flavor_get(IsA(http.HttpRequest), server.flavor['id']) \ -@@ -1668,9 +1724,11 @@ class InstanceTests(test.TestCase): - 'extension_supported',), - api.glance: ('image_list_detailed',), - api.network: -- ('floating_ip_simple_associate_supported',), -+ ('floating_ip_simple_associate_supported', -+ 'servers_update_addresses',), - }) - def test_launch_button_disabled_when_quota_exceeded(self): -+ servers = self.servers.list() - limits = self.limits['absolute'] - limits['totalInstancesUsed'] = limits['maxTotalInstances'] - -@@ -1683,7 +1741,8 @@ class InstanceTests(test.TestCase): - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.tenant_absolute_limits(IsA(http.HttpRequest), reserved=True) \ - .MultipleTimes().AndReturn(limits) - api.network.floating_ip_simple_associate_supported( -@@ -1709,9 +1768,11 @@ class InstanceTests(test.TestCase): - 'extension_supported',), - api.glance: ('image_list_detailed',), - api.network: -- ('floating_ip_simple_associate_supported',), -+ ('floating_ip_simple_associate_supported', -+ 'servers_update_addresses',), - }) - def test_index_options_after_migrate(self): -+ servers = self.servers.list() - server = self.servers.first() - server.status = "VERIFY_RESIZE" - api.nova.extension_supported('AdminActions', -@@ -1723,7 +1784,8 @@ class InstanceTests(test.TestCase): - .AndReturn((self.images.list(), False)) - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.tenant_absolute_limits(IsA(http.HttpRequest), reserved=True) \ - .MultipleTimes().AndReturn(self.limits['absolute']) - api.network.floating_ip_simple_associate_supported( -@@ -1802,17 +1864,20 @@ class InstanceTests(test.TestCase): - - @test.create_stubs({api.network: ('floating_ip_target_get_by_instance', - 'tenant_floating_ip_allocate', -- 'floating_ip_associate'), -+ 'floating_ip_associate', -+ 'servers_update_addresses',), - api.glance: ('image_list_detailed',), - api.nova: ('server_list', - 'flavor_list')}) - def test_associate_floating_ip(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - fip = self.q_floating_ips.first() - - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.flavor_list(IgnoreArg()).AndReturn(self.flavors.list()) - api.glance.image_list_detailed(IgnoreArg()) \ - .AndReturn((self.images.list(), False)) -@@ -1839,13 +1905,15 @@ class InstanceTests(test.TestCase): - - api.nova: ('server_list', - 'flavor_list')}) - def test_disassociate_floating_ip(self): -- server = self.servers.first() -+ servers = self.servers.list() -+ server = servers[0] - fip = self.q_floating_ips.first() - fip.port_id = server.id - - search_opts = {'marker': None, 'paginate': True} - api.nova.server_list(IsA(http.HttpRequest), search_opts=search_opts) \ -- .AndReturn([self.servers.list(), False]) -+ .AndReturn([servers, False]) -+ api.network.servers_update_addresses(IsA(http.HttpRequest), servers) - api.nova.flavor_list(IgnoreArg()).AndReturn(self.flavors.list()) - api.glance.image_list_detailed(IgnoreArg()) \ - .AndReturn((self.images.list(), False)) -diff --git a/openstack_dashboard/dashboards/project/instances/views.py b/openstack_dashboard/dashboards/project/instances/views.py -index 4826d8a..cebc5c0 100644 ---- a/openstack_dashboard/dashboards/project/instances/views.py -+++ b/openstack_dashboard/dashboards/project/instances/views.py -@@ -66,9 +66,18 @@ class IndexView(tables.DataTableView): - instances = [] - exceptions.handle(self.request, - _('Unable to retrieve instances.')) -- # Gather our flavors and images and correlate our instances to them -+ - if instances: - try: -+ api.network.servers_update_addresses(self.request, instances) -+ except Exception: -+ exceptions.handle( -+ self.request, -+ message=_('Unable to retrieve IP addresses from Neutron.'), -+ ignore=True) -+ -+ # Gather our flavors and images and correlate our instances to them -+ try: - flavors = api.nova.flavor_list(self.request) - except Exception: - flavors = [] -@@ -233,6 +242,15 @@ class DetailView(tabs.TabView): - 'instance "%s".') % instance_id, - redirect=redirect) - self._instance = instance -+ -+ try: -+ api.network.servers_update_addresses(self.request, [instance]) -+ except Exception: -+ exceptions.handle( -+ self.request, -+ _('Unable to retrieve IP addresses from Neutron for ' -+ 'instance "%s".') % instance_id, ignore=True) -+ - return self._instance - - def get_tabs(self, request, *args, **kwargs): --- -cgit v0.10.1 - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/13-CVE-2014-3594.patch --- a/components/openstack/horizon/patches/13-CVE-2014-3594.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -Upstream patch to fix CVE-2014-3594. This will be fixed in future -2013.2.4 and 2014.1.3 releases. - -From 96c6cdaa084857b82b9681378d5d3a6a4732015e Mon Sep 17 00:00:00 2001 -From: Julie Pichon -Date: Thu, 7 Aug 2014 12:01:56 +0100 -Subject: [PATCH] Fix XSS issue with the unordered_list filter - -When using the unordered_list filter in a Horizon table (as opposed to -a template directly), autoescaping is not set by default and the input -wasn't sanitised. - -Closes-Bug: #1349491 -Change-Id: Id82eefe48ccb17a158751ec65d24f3ac779380ec ---- - .../dashboards/admin/info/tables.py | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/openstack_dashboard/dashboards/admin/info/tables.py b/openstack_dashboard/dashboards/admin/info/tables.py -index d4f3fe7..a123fab 100644 ---- a/openstack_dashboard/dashboards/admin/info/tables.py -+++ b/openstack_dashboard/dashboards/admin/info/tables.py -@@ -127,6 +127,10 @@ def get_metadata(aggregate): - in aggregate.metadata.iteritems()] - - -+def safe_unordered_list(value): -+ return filters.unordered_list(value, autoescape=True) -+ -+ - class AggregatesTable(tables.DataTable): - name = tables.Column("name", - verbose_name=_("Name")) -@@ -135,11 +139,11 @@ class AggregatesTable(tables.DataTable): - hosts = tables.Column(get_hosts, - verbose_name=_("Hosts"), - wrap_list=True, -- filters=(filters.unordered_list,)) -+ filters=(safe_unordered_list,)) - metadata = tables.Column(get_metadata, - verbose_name=_("Metadata"), - wrap_list=True, -- filters=(filters.unordered_list,)) -+ filters=(safe_unordered_list,)) - - class Meta: - name = "aggregates" --- -1.7.9.5 diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/14-CVE-2014-8124.patch --- a/components/openstack/horizon/patches/14-CVE-2014-8124.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -Upstream patch to fix CVE-2014-8124. This will be fixed in future -2014.1.3 and 2014.2.1 releases. - -From 61d09f6f96a22cd6c0ade58f6486cdbd118c5e2a Mon Sep 17 00:00:00 2001 -From: lin-hua-cheng -Date: Mon, 1 Dec 2014 18:16:15 -0800 -Subject: [PATCH] Horizon login page contains DOS attack mechanism - -the horizon login page (really the middleware) accesses the session -too early in the login process, which will create session records -in the session backend. This is especially problematic when non-cookie -backends are used. - -Change-Id: I9d2c40403fb9b0cfb512f2ff45397cbe0b050c71 -Closes-Bug: 1394370 - ---- horizon-2013.2.3/horizon/middleware.py.orig 2014-12-10 12:59:24.714541383 -0700 -+++ horizon-2013.2.3/horizon/middleware.py 2014-12-10 13:00:30.362642269 -0700 -@@ -49,6 +49,17 @@ class HorizonMiddleware(object): - - def process_request(self, request): - """ Adds data necessary for Horizon to function to the request. """ -+ -+ request.horizon = {'dashboard': None, -+ 'panel': None, -+ 'async_messages': []} -+ if not hasattr(request, "user") or not request.user.is_authenticated(): -+ # proceed no further if the current request is already known -+ # not to be authenticated -+ # it is CRITICAL to perform this check as early as possible -+ # to avoid creating too many sessions -+ return None -+ - # Activate timezone handling - tz = request.session.get('django_timezone') - if tz: -@@ -62,9 +73,6 @@ class HorizonMiddleware(object): - - last_activity = request.session.get('last_activity', None) - timestamp = int(time.time()) -- request.horizon = {'dashboard': None, -- 'panel': None, -- 'async_messages': []} - if (isinstance(last_activity, int) - and (timestamp - last_activity) > timeout): - request.session.pop('last_activity') ---- horizon-2013.2.3/openstack_dashboard/views.py.orig 2014-12-10 13:01:22.648498614 -0700 -+++ horizon-2013.2.3/openstack_dashboard/views.py 2014-12-10 13:01:29.987667852 -0700 -@@ -33,6 +33,4 @@ def splash(request): - if request.user.is_authenticated(): - return shortcuts.redirect(get_user_home(request.user)) - form = views.Login(request) -- request.session.clear() -- request.session.set_test_cookie() - return shortcuts.render(request, 'splash.html', {'form': form}) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/patches/99-remove.xstatic.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/patches/99-remove.xstatic.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,78 @@ +In-house patch to remove the imports of xstatic packages. These +imports are no longer needed as the static assets are collected at +package time and the xstatic modules are not being delivered. + +NOTE: This patch is applied AFTER gmake install has completed rather +than during gmake prep. We need the xstatic functionality to collect +all the JavaScript libraries before packaging. + +--- a/usr/lib/python2.6/vendor-packages/openstack_dashboard/settings.py 2015-01-13 10:40:30.930622964 -0700 ++++ b/usr/lib/python2.6/vendor-packages/openstack_dashboard/settings.py 2015-01-13 10:40:57.470743881 -0700 +@@ -22,21 +22,6 @@ import sys + import warnings + + from django.utils.translation import ugettext_lazy as _ +-import xstatic.main +-import xstatic.pkg.angular +-import xstatic.pkg.bootstrap_datepicker +-import xstatic.pkg.bootstrap_scss +-import xstatic.pkg.d3 +-import xstatic.pkg.font_awesome +-import xstatic.pkg.hogan +-import xstatic.pkg.jquery +-import xstatic.pkg.jquery_migrate +-import xstatic.pkg.jquery_quicksearch +-import xstatic.pkg.jquery_tablesorter +-import xstatic.pkg.jquery_ui +-import xstatic.pkg.jsencrypt +-import xstatic.pkg.rickshaw +-import xstatic.pkg.spin + + from openstack_dashboard import exceptions + +@@ -148,45 +133,6 @@ STATICFILES_FINDERS = ( + 'compressor.finders.CompressorFinder', + ) + +-STATICFILES_DIRS = [ +- ('horizon/lib/angular', +- xstatic.main.XStatic(xstatic.pkg.angular).base_dir), +- ('horizon/lib/bootstrap_datepicker', +- xstatic.main.XStatic(xstatic.pkg.bootstrap_datepicker).base_dir), +- ('bootstrap', +- xstatic.main.XStatic(xstatic.pkg.bootstrap_scss).base_dir), +- ('horizon/lib', +- xstatic.main.XStatic(xstatic.pkg.d3).base_dir), +- ('horizon/lib', +- xstatic.main.XStatic(xstatic.pkg.hogan).base_dir), +- ('horizon/lib/font-awesome', +- xstatic.main.XStatic(xstatic.pkg.font_awesome).base_dir), +- ('horizon/lib/jquery', +- xstatic.main.XStatic(xstatic.pkg.jquery).base_dir), +- ('horizon/lib/jquery', +- xstatic.main.XStatic(xstatic.pkg.jquery_migrate).base_dir), +- ('horizon/lib/jquery', +- xstatic.main.XStatic(xstatic.pkg.jquery_quicksearch).base_dir), +- ('horizon/lib/jquery', +- xstatic.main.XStatic(xstatic.pkg.jquery_tablesorter).base_dir), +- ('horizon/lib/jsencrypt', +- xstatic.main.XStatic(xstatic.pkg.jsencrypt).base_dir), +- ('horizon/lib', +- xstatic.main.XStatic(xstatic.pkg.rickshaw).base_dir), +- ('horizon/lib', +- xstatic.main.XStatic(xstatic.pkg.spin).base_dir), +-] +- +- +-if xstatic.main.XStatic(xstatic.pkg.jquery_ui).version.startswith('1.10.'): +- # The 1.10.x versions already contain the 'ui' directory. +- STATICFILES_DIRS.append(('horizon/lib/jquery-ui', +- xstatic.main.XStatic(xstatic.pkg.jquery_ui).base_dir)) +-else: +- # Newer versions dropped the directory, add it to keep the path the same. +- STATICFILES_DIRS.append(('horizon/lib/jquery-ui/ui', +- xstatic.main.XStatic(xstatic.pkg.jquery_ui).base_dir)) +- + COMPRESS_PRECOMPILERS = ( + ('text/scss', 'django_pyscss.compressor.DjangoScssFilter'), + ) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/resolve.deps --- a/components/openstack/horizon/resolve.deps Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/horizon/resolve.deps Mon Apr 20 12:35:51 2015 -0700 @@ -1,5 +1,21 @@ -library/python-2/eventlet-26 -library/python-2/oslo.config-26 -library/python/eventlet-26 +library/python-2/babel-26 +library/python-2/django_compressor-26 +library/python-2/django_openstack_auth-26 +library/python-2/lockfile-26 +library/python-2/requests-26 +library/python/ceilometerclient-26 +library/python/cinderclient-26 +library/python/django-26 +library/python/django-pyscss-26 +library/python/glanceclient-26 +library/python/heatclient-26 +library/python/iso8601-26 +library/python/keystoneclient-26 +library/python/neutronclient-26 +library/python/novaclient-26 library/python/oslo.config-26 +library/python/saharaclient-26 +library/python/six-26 +library/python/swiftclient-26 +library/python/troveclient-26 runtime/python-26 diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/rickshaw.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/rickshaw.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,21 @@ +Copyright (C) 2011-2014 by Shutterstock Images, LLC + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/spin.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/spin.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2011-2014 Felix Gnass [fgnass at neteye dot de] + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/horizon/xstatic.license --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/horizon/xstatic.license Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) 2011-2014 Thomas Waldmann and other contributors, see +AUTHORS.txt. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +“Software”), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/Makefile --- a/components/openstack/keystone/Makefile Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/keystone/Makefile Mon Apr 20 12:35:51 2015 -0700 @@ -20,25 +20,29 @@ # # -# Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. # + include ../../../make-rules/shared-macros.mk COMPONENT_NAME= keystone -COMPONENT_CODENAME= havana -COMPONENT_VERSION= 2013.2.3 +COMPONENT_CODENAME= juno +COMPONENT_VERSION= 2014.2.2 +COMPONENT_BE_VERSION= 2014.2 COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION) COMPONENT_ARCHIVE= $(COMPONENT_SRC).tar.gz COMPONENT_ARCHIVE_HASH= \ - sha256:0d27a32c6c211706f8b13aafe2fd51c7ddbea97897be90663fd8c2527ef56032 + sha256:5674c1ae0aa7203cca0aba634e939bcfb7e1e0f60f62a6d6fceeb05efb84980e COMPONENT_ARCHIVE_URL= http://launchpad.net/$(COMPONENT_NAME)/$(COMPONENT_CODENAME)/$(COMPONENT_VERSION)/+download/$(COMPONENT_ARCHIVE) COMPONENT_PROJECT_URL= http://www.openstack.org/ COMPONENT_BUGDB= service/keystone -IPS_COMPONENT_VERSION= 0.$(COMPONENT_VERSION) +IPS_COMPONENT_VERSION= 0.$(COMPONENT_VERSION) + +TPNO= 21823 -include $(WS_TOP)/make-rules/prep.mk -include $(WS_TOP)/make-rules/setup.py.mk -include $(WS_TOP)/make-rules/ips.mk +include $(WS_MAKE_RULES)/prep.mk +include $(WS_MAKE_RULES)/setup.py.mk +include $(WS_MAKE_RULES)/ips.mk ASLR_MODE = $(ASLR_NOT_APPLICABLE) @@ -46,7 +50,20 @@ # only need to deliver one version. The manifest is parameterized, though. PYTHON_VERSIONS= 2.6 +PKG_MACROS += COMPONENT_BE_VERSION=$(COMPONENT_BE_VERSION) PKG_MACROS += PYVER=$(PYTHON_VERSIONS) +PKG_MACROS += PYV=$(shell echo $(PYTHON_VERSIONS) | tr -d .) + +# +# keystone depends on keystone-upgrade so copy all of the service +# manifests into the proto directory for pkgdepend(1) to find. +# +COMPONENT_POST_INSTALL_ACTION += \ + ($(MKDIR) $(PROTO_DIR)/lib/svc/manifest/application/openstack; \ + $(CP) \ + files/keystone.xml \ + files/keystone-upgrade.xml \ + $(PROTO_DIR)/lib/svc/manifest/application/openstack;) # common targets build: $(BUILD_NO_ARCH) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/files/keystone-paste.ini --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/keystone/files/keystone-paste.ini Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,121 @@ +# Keystone PasteDeploy configuration file. + +[filter:debug] +paste.filter_factory = keystone.common.wsgi:Debug.factory + +[filter:build_auth_context] +paste.filter_factory = keystone.middleware:AuthContextMiddleware.factory + +[filter:token_auth] +paste.filter_factory = keystone.middleware:TokenAuthMiddleware.factory + +[filter:admin_token_auth] +paste.filter_factory = keystone.middleware:AdminTokenAuthMiddleware.factory + +[filter:xml_body] +paste.filter_factory = keystone.middleware:XmlBodyMiddleware.factory + +[filter:xml_body_v2] +paste.filter_factory = keystone.middleware:XmlBodyMiddlewareV2.factory + +[filter:xml_body_v3] +paste.filter_factory = keystone.middleware:XmlBodyMiddlewareV3.factory + +[filter:json_body] +paste.filter_factory = keystone.middleware:JsonBodyMiddleware.factory + +[filter:user_crud_extension] +paste.filter_factory = keystone.contrib.user_crud:CrudExtension.factory + +[filter:crud_extension] +paste.filter_factory = keystone.contrib.admin_crud:CrudExtension.factory + +[filter:ec2_extension] +paste.filter_factory = keystone.contrib.ec2:Ec2Extension.factory + +[filter:ec2_extension_v3] +paste.filter_factory = keystone.contrib.ec2:Ec2ExtensionV3.factory + +[filter:federation_extension] +paste.filter_factory = keystone.contrib.federation.routers:FederationExtension.factory + +[filter:oauth1_extension] +paste.filter_factory = keystone.contrib.oauth1.routers:OAuth1Extension.factory + +[filter:s3_extension] +paste.filter_factory = keystone.contrib.s3:S3Extension.factory + +[filter:endpoint_filter_extension] +paste.filter_factory = keystone.contrib.endpoint_filter.routers:EndpointFilterExtension.factory + +[filter:endpoint_policy_extension] +paste.filter_factory = keystone.contrib.endpoint_policy.routers:EndpointPolicyExtension.factory + +[filter:simple_cert_extension] +paste.filter_factory = keystone.contrib.simple_cert:SimpleCertExtension.factory + +[filter:revoke_extension] +paste.filter_factory = keystone.contrib.revoke.routers:RevokeExtension.factory + +[filter:url_normalize] +paste.filter_factory = keystone.middleware:NormalizingFilter.factory + +[filter:sizelimit] +paste.filter_factory = keystone.middleware:RequestBodySizeLimiter.factory + +[filter:stats_monitoring] +paste.filter_factory = keystone.contrib.stats:StatsMiddleware.factory + +[filter:stats_reporting] +paste.filter_factory = keystone.contrib.stats:StatsExtension.factory + +[filter:access_log] +paste.filter_factory = keystone.contrib.access:AccessLogMiddleware.factory + +[app:public_service] +paste.app_factory = keystone.service:public_app_factory + +[app:service_v3] +paste.app_factory = keystone.service:v3_app_factory + +[app:admin_service] +paste.app_factory = keystone.service:admin_app_factory + +[pipeline:public_api] +# The last item in this pipeline must be public_service or an equivalent +# application. It cannot be a filter. +pipeline = sizelimit url_normalize build_auth_context token_auth admin_token_auth json_body ec2_extension user_crud_extension public_service + +[pipeline:admin_api] +# The last item in this pipeline must be admin_service or an equivalent +# application. It cannot be a filter. +pipeline = sizelimit url_normalize build_auth_context token_auth admin_token_auth json_body ec2_extension s3_extension crud_extension admin_service + +[pipeline:api_v3] +# The last item in this pipeline must be service_v3 or an equivalent +# application. It cannot be a filter. +pipeline = sizelimit url_normalize build_auth_context token_auth admin_token_auth json_body ec2_extension_v3 s3_extension simple_cert_extension revoke_extension service_v3 + +[app:public_version_service] +paste.app_factory = keystone.service:public_version_app_factory + +[app:admin_version_service] +paste.app_factory = keystone.service:admin_version_app_factory + +[pipeline:public_version_api] +pipeline = sizelimit url_normalize public_version_service + +[pipeline:admin_version_api] +pipeline = sizelimit url_normalize admin_version_service + +[composite:main] +use = egg:Paste#urlmap +/v2.0 = public_api +/v3 = api_v3 +/ = public_version_api + +[composite:admin] +use = egg:Paste#urlmap +/v2.0 = admin_api +/v3 = api_v3 +/ = admin_version_api diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/files/keystone-upgrade --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/keystone/files/keystone-upgrade Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,273 @@ +#!/usr/bin/python2.6 + +# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from ConfigParser import NoOptionError +from datetime import datetime +import errno +import glob +import os +import shutil +from subprocess import check_call, Popen, PIPE +import sys +import time +import traceback + +import iniparse +import smf_include +import sqlalchemy + + +KEYSTONE_CONF_MAPPINGS = { + # Deprecated group/name + ('DEFAULT', 'rabbit_durable_queues'): ('DEFAULT', 'amqp_durable_queues'), + ('rpc_notifier2', 'topics'): ('DEFAULT', 'notification_topics'), + ('DEFAULT', 'log_config'): ('DEFAULT', 'log_config_append'), + ('DEFAULT', 'logfile'): ('DEFAULT', 'log_file'), + ('DEFAULT', 'logdir'): ('DEFAULT', 'log_dir'), + ('DEFAULT', 'db_backend'): ('database', 'backend'), + ('DEFAULT', 'sql_connection'): ('database', 'connection'), + ('DATABASE', 'sql_connection'): ('database', 'connection'), + ('sql', 'connection'): ('database', 'connection'), + ('DEFAULT', 'sql_idle_timeout'): ('database', 'idle_timeout'), + ('DATABASE', 'sql_idle_timeout'): ('database', 'idle_timeout'), + ('sql', 'idle_timeout'): ('database', 'idle_timeout'), + ('DEFAULT', 'sql_min_pool_size'): ('database', 'min_pool_size'), + ('DATABASE', 'sql_min_pool_size'): ('database', 'min_pool_size'), + ('DEFAULT', 'sql_max_pool_size'): ('database', 'max_pool_size'), + ('DATABASE', 'sql_max_pool_size'): ('database', 'max_pool_size'), + ('DEFAULT', 'sql_max_retries'): ('database', 'max_retries'), + ('DATABASE', 'sql_max_retries'): ('database', 'max_retries'), + ('DEFAULT', 'sql_retry_interval'): ('database', 'retry_interval'), + ('DATABASE', 'reconnect_interval'): ('database', 'retry_interval'), + ('DEFAULT', 'sql_max_overflow'): ('database', 'max_overflow'), + ('DATABASE', 'sqlalchemy_max_overflow'): ('database', 'max_overflow'), + ('DEFAULT', 'sql_connection_debug'): ('database', 'connection_debug'), + ('DEFAULT', 'sql_connection_trace'): ('database', 'connection_trace'), + ('DATABASE', 'sqlalchemy_pool_timeout'): ('database', 'pool_timeout'), + ('ldap', 'tenant_tree_dn'): ('ldap', 'project_tree_dn'), + ('ldap', 'tenant_filter'): ('ldap', 'project_filter'), + ('ldap', 'tenant_objectclass'): ('ldap', 'project_objectclass'), + ('ldap', 'tenant_id_attribute'): ('ldap', 'project_id_attribute'), + ('ldap', 'tenant_member_attribute'): ('ldap', 'project_member_attribute'), + ('ldap', 'tenant_name_attribute'): ('ldap', 'project_name_attribute'), + ('ldap', 'tenant_desc_attribute'): ('ldap', 'project_desc_attribute'), + ('ldap', 'tenant_enabled_attribute'): + ('ldap', 'project_enabled_attribute'), + ('ldap', 'tenant_domain_id_attribute'): + ('ldap', 'project_domain_id_attribute'), + ('ldap', 'tenant_attribute_ignore'): ('ldap', 'project_attribute_ignore'), + ('ldap', 'tenant_allow_create'): ('ldap', 'project_allow_create'), + ('ldap', 'tenant_allow_update'): ('ldap', 'project_allow_update'), + ('ldap', 'tenant_allow_delete'): ('ldap', 'project_allow_delete'), + ('ldap', 'tenant_enabled_emulation'): + ('ldap', 'project_enabled_emulation'), + ('ldap', 'tenant_enabled_emulation_dn'): + ('ldap', 'project_enabled_emulation_dn'), + ('ldap', 'tenant_additional_attribute_mapping'): + ('ldap', 'project_additional_attribute_mapping'), + ('DEFAULT', 'matchmaker_ringfile'): ('matchmaker_ring', 'ringfile'), +} + + +def update_mapping(section, key, mapping): + """ look for deprecated variables and, if found, convert it to the new + section/key. + """ + + if (section, key) in mapping: + print "Deprecated value found: [%s] %s" % (section, key) + section, key = mapping[(section, key)] + if section is None and key is None: + print "Removing from configuration" + else: + print "Updating to: [%s] %s" % (section, key) + return section, key + + +def alter_mysql_tables(engine): + """ Convert MySQL tables to use utf8 + """ + + import MySQLdb + + for _none in range(5): + try: + db = MySQLdb.connect(host=engine.url.host, + user=engine.url.username, + passwd=engine.url.password, + db=engine.url.database) + break + except MySQLdb.OperationalError as err: + # mysql is not ready. sleep for 2 more seconds + time.sleep(2) + else: + print "Unable to connect to MySQL: %s" % err + print ("Please verify MySQL is properly configured and online " + "before using svcadm(1M) to clear this service.") + sys.exit(smf_include.SMF_EXIT_ERR_FATAL) + + cursor = db.cursor() + cursor.execute("ALTER DATABASE %s CHARACTER SET = 'utf8'" % + engine.url.database) + cursor.execute("ALTER DATABASE %s COLLATE = 'utf8_general_ci'" % + engine.url.database) + cursor.execute("SHOW tables") + res = cursor.fetchall() + if res: + cursor.execute("SET foreign_key_checks = 0") + for item in res: + cursor.execute("ALTER TABLE %s.%s CONVERT TO " + "CHARACTER SET 'utf8', COLLATE 'utf8_general_ci'" + % (engine.url.database, item[0])) + cursor.execute("SET foreign_key_checks = 1") + db.commit() + db.close() + + +def modify_conf(old_file, mapping=None): + """ Copy over all uncommented options from the old configuration file. In + addition, look for deprecated section/keys and convert them to the new + section/key. + """ + + new_file = old_file + '.new' + + # open the previous version + old = iniparse.ConfigParser() + old.readfp(open(old_file)) + + # open the new version + new = iniparse.ConfigParser() + try: + new.readfp(open(new_file)) + except IOError as err: + if err.errno == errno.ENOENT: + # The upgrade did not deliver a .new file so, return + print "%s not found - continuing with %s" % (new_file, old_file) + return + else: + raise + print "\nupdating %s" % old_file + + # walk every single section for uncommented options + default_items = set(old.items('DEFAULT')) + for section in old.sections() + ['DEFAULT']: + + # DEFAULT items show up in every section so remove them + if section != 'DEFAULT': + section_items = set(old.items(section)) - default_items + else: + section_items = default_items + + for key, value in section_items: + # keep a copy of the old value + oldvalue = value + + if mapping is not None: + section, key = update_mapping(section, key, mapping) + + if section is None and key is None: + # option is deprecated so continue + continue + + if not new.has_section(section): + if section != 'DEFAULT': + new.add_section(section) + + # print to the log when a value for the same section.key is + # changing to a new value + try: + new_value = new.get(section, key) + if new_value != value and '%SERVICE' not in new_value: + print "Changing [%s] %s:\n- %s\n+ %s" % \ + (section, key, oldvalue, new_value) + print + except NoOptionError: + # the new configuration file does not have this option set so + # just continue + pass + + # Only copy the old value to the new conf file if the entry doesn't + # exist or if it contains '%SERVICE' + if not new.has_option(section, key) or \ + '%SERVICE' in new.get(section, key): + new.set(section, key, value) + + # copy the old conf file to a backup + today = datetime.now().strftime("%Y%m%d%H%M%S") + shutil.copy2(old_file, old_file + '.' + today) + + # copy the new conf file in place + with open(old_file, 'wb+') as fh: + new.write(fh) + + +def start(): + # pull out the current version of config/upgrade-id + p = Popen(['/usr/bin/svcprop', '-p', 'config/upgrade-id', + os.environ['SMF_FMRI']], stdout=PIPE, stderr=PIPE) + curr_ver, _err = p.communicate() + curr_ver = curr_ver.strip() + + # extract the openstack-upgrade-id from the pkg + p = Popen(['/usr/bin/pkg', 'contents', '-H', '-t', 'set', '-o', 'value', + '-a', 'name=openstack.upgrade-id', + 'pkg:/cloud/openstack/keystone'], stdout=PIPE, stderr=PIPE) + pkg_ver, _err = p.communicate() + pkg_ver = pkg_ver.strip() + + if curr_ver == pkg_ver: + # No need to upgrade + sys.exit(smf_include.SMF_EXIT_OK) + + # look for any .new files + if glob.glob('/etc/keystone/*.new'): + # the versions are different, so perform an upgrade + # modify the configuration files + modify_conf('/etc/keystone/keystone.conf', KEYSTONE_CONF_MAPPINGS) + modify_conf('/etc/keystone/keystone-paste.ini') + modify_conf('/etc/keystone/logging.conf') + + config = iniparse.RawConfigParser() + config.read('/etc/keystone/keystone.conf') + # In certain cases the database section does not exist and the + # default database chosen is sqlite. + if config.has_section('database'): + db_connection = config.get('database', 'connection') + + if db_connection.startswith('mysql'): + engine = sqlalchemy.create_engine(db_connection) + if engine.url.username != '%SERVICE_USER%': + alter_mysql_tables(engine) + print "altered character set to utf8 in keystone tables" + + # update the current version + check_call(['/usr/sbin/svccfg', '-s', os.environ['SMF_FMRI'], 'setprop', + 'config/upgrade-id', '=', pkg_ver]) + check_call(['/usr/sbin/svccfg', '-s', os.environ['SMF_FMRI'], 'refresh']) + + sys.exit(smf_include.SMF_EXIT_OK) + + +if __name__ == '__main__': + os.putenv('LC_ALL', 'C') + try: + smf_include.smf_main() + except Exception as err: + print 'Unknown error: %s' % err + print + traceback.print_exc(file=sys.stdout) + sys.exit(smf_include.SMF_EXIT_ERR_FATAL) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/files/keystone-upgrade.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/keystone/files/keystone-upgrade.xml Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/files/keystone.conf --- a/components/openstack/keystone/files/keystone.conf Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/keystone/files/keystone.conf Mon Apr 20 12:35:51 2015 -0700 @@ -1,428 +1,1587 @@ [DEFAULT] -# A "shared secret" between keystone and other openstack services -# admin_token = ADMIN + +# +# Options defined in keystone +# + +# A "shared secret" that can be used to bootstrap Keystone. +# This "token" does not represent a user, and carries no +# explicit authorization. To disable in production (highly +# recommended), remove AdminTokenAuthMiddleware from your +# paste application pipelines (for example, in keystone- +# paste.ini). (string value) +#admin_token=ADMIN + +# The IP address of the network interface for the public +# service to listen on. (string value) +# Deprecated group/name - [DEFAULT]/bind_host +#public_bind_host=0.0.0.0 + +# The IP address of the network interface for the admin +# service to listen on. (string value) +# Deprecated group/name - [DEFAULT]/bind_host +#admin_bind_host=0.0.0.0 + +# (Deprecated) The port which the OpenStack Compute service +# listens on. This option was only used for string replacement +# in the templated catalog backend. Templated catalogs should +# replace the "$(compute_port)s" substitution with the static +# port of the compute service. As of Juno, this option is +# deprecated and will be removed in the L release. (integer +# value) +#compute_port=8774 + +# The port number which the admin service listens on. (integer +# value) +#admin_port=35357 + +# The port number which the public service listens on. +# (integer value) +#public_port=5000 -# The IP address of the network interface to listen on -# bind_host = 0.0.0.0 +# The base public endpoint URL for Keystone that is advertised +# to clients (NOTE: this does NOT affect how Keystone listens +# for connections). Defaults to the base host URL of the +# request. E.g. a request to http://server:5000/v2.0/users +# will default to http://server:5000. You should only need to +# set this value if the base URL contains a path (e.g. +# /prefix/v2.0) or the endpoint should be found on a different +# server. (string value) +#public_endpoint= + +# The base admin endpoint URL for Keystone that is advertised +# to clients (NOTE: this does NOT affect how Keystone listens +# for connections). Defaults to the base host URL of the +# request. E.g. a request to http://server:35357/v2.0/users +# will default to http://server:35357. You should only need to +# set this value if the base URL contains a path (e.g. +# /prefix/v2.0) or the endpoint should be found on a different +# server. (string value) +#admin_endpoint= -# The port number which the public service listens on -# public_port = 5000 +# The number of worker processes to serve the public WSGI +# application. Defaults to number of CPUs (minimum of 2). +# (integer value) +public_workers=2 + +# The number of worker processes to serve the admin WSGI +# application. Defaults to number of CPUs (minimum of 2). +# (integer value) +admin_workers=2 -# The port number which the public admin listens on -# admin_port = 35357 +# Enforced by optional sizelimit middleware +# (keystone.middleware:RequestBodySizeLimiter). (integer +# value) +#max_request_body_size=114688 + +# Limit the sizes of user & project ID/names. (integer value) +#max_param_size=64 + +# Similar to max_param_size, but provides an exception for +# token values. (integer value) +#max_token_size=8192 + +# During a SQL upgrade member_role_id will be used to create a +# new role that will replace records in the assignment table +# with explicit role grants. After migration, the +# member_role_id will be used in the API add_user_to_project. +# (string value) +#member_role_id=9fe2ff9ee4384b1894a90878d3e92bab -# The base endpoint URLs for keystone that are advertised to clients -# (NOTE: this does NOT affect how keystone listens for connections) -# public_endpoint = http://localhost:%(public_port)s/ -# admin_endpoint = http://localhost:%(admin_port)s/ +# During a SQL upgrade member_role_name will be used to create +# a new role that will replace records in the assignment table +# with explicit role grants. After migration, member_role_name +# will be ignored. (string value) +#member_role_name=_member_ + +# The value passed as the keyword "rounds" to passlib's +# encrypt method. (integer value) +#crypt_strength=40000 + +# Set this to true if you want to enable TCP_KEEPALIVE on +# server sockets, i.e. sockets used by the Keystone wsgi +# server for client connections. (boolean value) +#tcp_keepalive=false + +# Sets the value of TCP_KEEPIDLE in seconds for each server +# socket. Only applies if tcp_keepalive is true. Not supported +# on OS X. (integer value) +#tcp_keepidle=600 + +# The maximum number of entities that will be returned in a +# collection, with no limit set by default. This global limit +# may be then overridden for a specific driver, by specifying +# a list_limit in the appropriate section (e.g. [assignment]). +# (integer value) +#list_limit= + +# Set this to false if you want to enable the ability for +# user, group and project entities to be moved between domains +# by updating their domain_id. Allowing such movement is not +# recommended if the scope of a domain admin is being +# restricted by use of an appropriate policy file (see +# policy.v3cloudsample as an example). (boolean value) +#domain_id_immutable=true + +# If set to true, strict password length checking is performed +# for password manipulation. If a password exceeds the maximum +# length, the operation will fail with an HTTP 403 Forbidden +# error. If set to false, passwords are automatically +# truncated to the maximum length. (boolean value) +#strict_password_check=false + + +# +# Options defined in oslo.messaging +# -# The port number which the OpenStack Compute service listens on -# compute_port = 8774 +# Use durable queues in amqp. (boolean value) +# Deprecated group/name - [DEFAULT]/rabbit_durable_queues +#amqp_durable_queues=false + +# Auto-delete queues in amqp. (boolean value) +#amqp_auto_delete=false + +# Size of RPC connection pool. (integer value) +#rpc_conn_pool_size=30 + +# Qpid broker hostname. (string value) +#qpid_hostname=localhost + +# Qpid broker port. (integer value) +#qpid_port=5672 + +# Qpid HA cluster host:port pairs. (list value) +#qpid_hosts=$qpid_hostname:$qpid_port + +# Username for Qpid connection. (string value) +#qpid_username= + +# Password for Qpid connection. (string value) +#qpid_password= -# Path to your policy definition containing identity actions -# policy_file = policy.json +# Space separated list of SASL mechanisms to use for auth. +# (string value) +#qpid_sasl_mechanisms= + +# Seconds between connection keepalive heartbeats. (integer +# value) +#qpid_heartbeat=60 + +# Transport to use, either 'tcp' or 'ssl'. (string value) +#qpid_protocol=tcp -# Rule to check if no matching policy definition is found -# FIXME(dolph): This should really be defined as [policy] default_rule -# policy_default_rule = admin_required +# Whether to disable the Nagle algorithm. (boolean value) +#qpid_tcp_nodelay=true + +# The number of prefetched messages held by receiver. (integer +# value) +#qpid_receiver_capacity=1 + +# The qpid topology version to use. Version 1 is what was +# originally used by impl_qpid. Version 2 includes some +# backwards-incompatible changes that allow broker federation +# to work. Users should update to version 2 when they are +# able to take everything down, as it requires a clean break. +# (integer value) +#qpid_topology_version=1 -# Role for migrating membership relationships -# During a SQL upgrade, the following values will be used to create a new role -# that will replace records in the user_tenant_membership table with explicit -# role grants. After migration, the member_role_id will be used in the API -# add_user_to_project, and member_role_name will be ignored. -# member_role_id = 9fe2ff9ee4384b1894a90878d3e92bab -# member_role_name = _member_ +# SSL version to use (valid only if SSL enabled). valid values +# are TLSv1, SSLv23 and SSLv3. SSLv2 may be available on some +# distributions. (string value) +#kombu_ssl_version= + +# SSL key file (valid only if SSL enabled). (string value) +#kombu_ssl_keyfile= + +# SSL cert file (valid only if SSL enabled). (string value) +#kombu_ssl_certfile= + +# SSL certification authority file (valid only if SSL +# enabled). (string value) +#kombu_ssl_ca_certs= + +# How long to wait before reconnecting in response to an AMQP +# consumer cancel notification. (floating point value) +#kombu_reconnect_delay=1.0 + +# The RabbitMQ broker address where a single node is used. +# (string value) +#rabbit_host=localhost + +# The RabbitMQ broker port where a single node is used. +# (integer value) +#rabbit_port=5672 + +# RabbitMQ HA cluster host:port pairs. (list value) +#rabbit_hosts=$rabbit_host:$rabbit_port + +# Connect over SSL for RabbitMQ. (boolean value) +#rabbit_use_ssl=false + +# The RabbitMQ userid. (string value) +#rabbit_userid=guest + +# The RabbitMQ password. (string value) +#rabbit_password=guest + +# the RabbitMQ login method (string value) +#rabbit_login_method=AMQPLAIN + +# The RabbitMQ virtual host. (string value) +#rabbit_virtual_host=/ -# enforced by optional sizelimit middleware (keystone.middleware:RequestBodySizeLimiter) -# max_request_body_size = 114688 +# How frequently to retry connecting with RabbitMQ. (integer +# value) +#rabbit_retry_interval=1 + +# How long to backoff for between retries when connecting to +# RabbitMQ. (integer value) +#rabbit_retry_backoff=2 + +# Maximum number of RabbitMQ connection retries. Default is 0 +# (infinite retry count). (integer value) +#rabbit_max_retries=0 + +# Use HA queues in RabbitMQ (x-ha-policy: all). If you change +# this option, you must wipe the RabbitMQ database. (boolean +# value) +#rabbit_ha_queues=false + +# If passed, use a fake RabbitMQ provider. (boolean value) +#fake_rabbit=false + +# ZeroMQ bind address. Should be a wildcard (*), an ethernet +# interface, or IP. The "host" option should point or resolve +# to this address. (string value) +#rpc_zmq_bind_address=* -# limit the sizes of user & tenant ID/names -# max_param_size = 64 +# MatchMaker driver. (string value) +#rpc_zmq_matchmaker=oslo.messaging._drivers.matchmaker.MatchMakerLocalhost + +# ZeroMQ receiver listening port. (integer value) +#rpc_zmq_port=9501 + +# Number of ZeroMQ contexts, defaults to 1. (integer value) +#rpc_zmq_contexts=1 -# similar to max_param_size, but provides an exception for token values -# max_token_size = 8192 +# Maximum number of ingress messages to locally buffer per +# topic. Default is unlimited. (integer value) +#rpc_zmq_topic_backlog= + +# Directory for holding IPC sockets. (string value) +#rpc_zmq_ipc_dir=/var/run/openstack + +# Name of this node. Must be a valid hostname, FQDN, or IP +# address. Must match "host" option, if running Nova. (string +# value) +#rpc_zmq_host=keystone + +# Seconds to wait before a cast expires (TTL). Only supported +# by impl_zmq. (integer value) +#rpc_cast_timeout=30 -# === Logging Options === -# Print debugging output -# (includes plaintext request logging, potentially including passwords) -# debug = False +# Heartbeat frequency. (integer value) +#matchmaker_heartbeat_freq=300 + +# Heartbeat time-to-live. (integer value) +#matchmaker_heartbeat_ttl=600 + +# Size of RPC greenthread pool. (integer value) +#rpc_thread_pool_size=64 + +# Driver or drivers to handle sending notifications. (multi +# valued) +#notification_driver= + +# AMQP topic used for OpenStack notifications. (list value) +# Deprecated group/name - [rpc_notifier2]/topics +#notification_topics=notifications + +# Seconds to wait for a response from a call. (integer value) +#rpc_response_timeout=60 -# Print more verbose output -# verbose = False +# A URL representing the messaging driver to use and its full +# configuration. If not set, we fall back to the rpc_backend +# option and driver specific configuration. (string value) +#transport_url= + +# The messaging driver to use, defaults to rabbit. Other +# drivers include qpid and zmq. (string value) +#rpc_backend=rabbit + +# The default exchange under which topics are scoped. May be +# overridden by an exchange name specified in the +# transport_url option. (string value) +#control_exchange=keystone -# Name of log file to output to. If not set, logging will go to stdout. -# log_file = keystone.log + +# +# Options defined in keystone.notifications +# + +# Default publisher_id for outgoing notifications (string +# value) +#default_publisher_id= + + +# +# Options defined in keystone.openstack.common.eventlet_backdoor +# -# The directory to keep log files in (will be prepended to --logfile) -# log_dir = /var/log/keystone +# Enable eventlet backdoor. Acceptable values are 0, , +# and :, where 0 results in listening on a random +# tcp port number; results in listening on the +# specified port number (and not enabling backdoor if that +# port is in use); and : results in listening on +# the smallest unused port number within the specified range +# of port numbers. The chosen port is displayed in the +# service's log file. (string value) +#backdoor_port= + -# Use syslog for logging. -# use_syslog = False +# +# Options defined in keystone.openstack.common.log +# + +# Print debugging output (set logging level to DEBUG instead +# of default WARNING level). (boolean value) +#debug=false + +# Print more verbose output (set logging level to INFO instead +# of default WARNING level). (boolean value) +#verbose=false -# syslog facility to receive log lines -# syslog_log_facility = LOG_USER +# Log output to standard error. (boolean value) +#use_stderr=true + +# Format string to use for log messages with context. (string +# value) +#logging_context_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s + +# Format string to use for log messages without context. +# (string value) +#logging_default_format_string=%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s -# If this option is specified, the logging configuration file specified is -# used and overrides any other logging options specified. Please see the -# Python logging module documentation for details on logging configuration -# files. -# log_config = logging.conf +# Data to append to log format when level is DEBUG. (string +# value) +#logging_debug_format_suffix=%(funcName)s %(pathname)s:%(lineno)d + +# Prefix each line of exception output with this format. +# (string value) +#logging_exception_prefix=%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s %(instance)s + +# List of logger=LEVEL pairs. (list value) +#default_log_levels=amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN + +# Enables or disables publication of error events. (boolean +# value) +#publish_errors=false -# A logging.Formatter log message format string which may use any of the -# available logging.LogRecord attributes. -# log_format = %(asctime)s %(levelname)8s [%(name)s] %(message)s +# Enables or disables fatal status of deprecations. (boolean +# value) +#fatal_deprecations=false + +# The format for an instance that is passed with the log +# message. (string value) +#instance_format="[instance: %(uuid)s] " + +# The format for an instance UUID that is passed with the log +# message. (string value) +#instance_uuid_format="[instance: %(uuid)s] " + +# The name of a logging configuration file. This file is +# appended to any existing logging configuration files. For +# details about logging configuration files, see the Python +# logging module documentation. (string value) +# Deprecated group/name - [DEFAULT]/log_config +#log_config_append= -# Format string for %(asctime)s in log records. -# log_date_format = %Y-%m-%d %H:%M:%S +# DEPRECATED. A logging.Formatter log message format string +# which may use any of the available logging.LogRecord +# attributes. This option is deprecated. Please use +# logging_context_format_string and +# logging_default_format_string instead. (string value) +#log_format= + +# Format string for %%(asctime)s in log records. Default: +# %(default)s . (string value) +#log_date_format=%Y-%m-%d %H:%M:%S + +# (Optional) Name of log file to output to. If no default is +# set, logging will go to stdout. (string value) +# Deprecated group/name - [DEFAULT]/logfile +#log_file= + +# (Optional) The base directory used for relative --log-file +# paths. (string value) +# Deprecated group/name - [DEFAULT]/logdir +#log_dir= + +# Use syslog for logging. Existing syslog format is DEPRECATED +# during I, and will change in J to honor RFC5424. (boolean +# value) +#use_syslog=false -# onready allows you to send a notification when the process is ready to serve -# For example, to have it notify using systemd, one could set shell command: -# onready = systemd-notify --ready -# or a module with notify() method: -# onready = keystone.common.systemd +# (Optional) Enables or disables syslog rfc5424 format for +# logging. If enabled, prefixes the MSG part of the syslog +# message with APP-NAME (RFC5424). The format without the APP- +# NAME is deprecated in I, and will be removed in J. (boolean +# value) +#use_syslog_rfc_format=false + +# Syslog facility to receive log lines. (string value) +#syslog_log_facility=LOG_USER + + +# +# Options defined in keystone.openstack.common.policy +# + +# The JSON file that defines policies. (string value) +#policy_file=policy.json + +# Default rule. Enforced when a requested rule is not found. +# (string value) +#policy_default_rule=default + + +[assignment] -# === Notification Options === +# +# Options defined in keystone +# + +# Assignment backend driver. (string value) +#driver= + +# Toggle for assignment caching. This has no effect unless +# global caching is enabled. (boolean value) +#caching=true + +# TTL (in seconds) to cache assignment data. This has no +# effect unless global caching is enabled. (integer value) +#cache_time= + +# Maximum number of entities that will be returned in an +# assignment collection. (integer value) +#list_limit= + + +[auth] + +# +# Options defined in keystone +# -# Notifications can be sent when users or projects are created, updated or -# deleted. There are three methods of sending notifications: logging (via the -# log_file directive), rpc (via a message queue) and no_op (no notifications -# sent, the default) +# Default auth methods. (list value) +#methods=external,password,token + +# The password auth plugin module. (string value) +#password=keystone.auth.plugins.password.Password + +# The token auth plugin module. (string value) +#token=keystone.auth.plugins.token.Token + +# The external (REMOTE_USER) auth plugin module. (string +# value) +#external=keystone.auth.plugins.external.DefaultDomain + + +[cache] + +# +# Options defined in keystone +# + +# Prefix for building the configuration dictionary for the +# cache region. This should not need to be changed unless +# there is another dogpile.cache region with the same +# configuration name. (string value) +#config_prefix=cache.keystone + +# Default TTL, in seconds, for any cached item in the +# dogpile.cache region. This applies to any cached method that +# doesn't have an explicit cache expiration time defined for +# it. (integer value) +#expiration_time=600 + +# Dogpile.cache backend module. It is recommended that +# Memcache with pooling (keystone.cache.memcache_pool) or +# Redis (dogpile.cache.redis) be used in production +# deployments. Small workloads (single process) like devstack +# can use the dogpile.cache.memory backend. (string value) +#backend=keystone.common.cache.noop + +# Arguments supplied to the backend module. Specify this +# option once per argument to be passed to the dogpile.cache +# backend. Example format: ":". (multi valued) +#backend_argument= -# notification_driver can be defined multiple times -# Do nothing driver (the default) -# notification_driver = keystone.openstack.common.notifier.no_op_notifier -# Logging driver example (not enabled by default) -# notification_driver = keystone.openstack.common.notifier.log_notifier -# RPC driver example (not enabled by default) -# notification_driver = keystone.openstack.common.notifier.rpc_notifier +# Proxy classes to import that will affect the way the +# dogpile.cache backend functions. See the dogpile.cache +# documentation on changing-backend-behavior. (list value) +#proxies= + +# Global toggle for all caching using the should_cache_fn +# mechanism. (boolean value) +#enabled=false + +# Extra debugging from the cache backend (cache keys, +# get/set/delete/etc calls). This is only really useful if you +# need to see the specific cache-backend get/set/delete calls +# with the keys/values. Typically this should be left set to +# false. (boolean value) +#debug_cache_backend=false + +# Memcache servers in the format of "host:port". +# (dogpile.cache.memcache and keystone.cache.memcache_pool +# backends only) (list value) +#memcache_servers=localhost:11211 + +# Number of seconds memcached server is considered dead before +# it is tried again. (dogpile.cache.memcache and +# keystone.cache.memcache_pool backends only) (integer value) +#memcache_dead_retry=300 -# Default notification level for outgoing notifications -# default_notification_level = INFO +# Timeout in seconds for every call to a server. +# (dogpile.cache.memcache and keystone.cache.memcache_pool +# backends only) (integer value) +#memcache_socket_timeout=3 + +# Max total number of open connections to every memcached +# server. (keystone.cache.memcache_pool backend only) (integer +# value) +#memcache_pool_maxsize=10 -# Default publisher_id for outgoing notifications; included in the payload. -# default_publisher_id = +# Number of seconds a connection to memcached is held unused +# in the pool before it is closed. +# (keystone.cache.memcache_pool backend only) (integer value) +#memcache_pool_unused_timeout=60 + +# Number of seconds that an operation will wait to get a +# memcache client connection. (integer value) +#memcache_pool_connection_get_timeout=10 + + +[catalog] + +# +# Options defined in keystone +# -# AMQP topics to publish to when using the RPC notification driver. -# Multiple values can be specified by separating with commas. -# The actual topic names will be %s.%(default_notification_level)s -# notification_topics = notifications +# Catalog template file name for use with the template catalog +# backend. (string value) +#template_file=default_catalog.templates + +# Catalog backend driver. (string value) +#driver=keystone.catalog.backends.sql.Catalog + +# Toggle for catalog caching. This has no effect unless global +# caching is enabled. (boolean value) +#caching=true + +# Time to cache catalog data (in seconds). This has no effect +# unless global and catalog caching are enabled. (integer +# value) +#cache_time= + +# Maximum number of entities that will be returned in a +# catalog collection. (integer value) +#list_limit= -# === RPC Options === +# (Deprecated) List of possible substitutions for use in +# formatting endpoints. Use caution when modifying this list. +# It will give users with permission to create endpoints the +# ability to see those values in your configuration file. This +# option will be removed in Juno. (list value) +#endpoint_substitution_whitelist=tenant_id,user_id,public_bind_host,admin_bind_host,compute_host,compute_port,admin_port,public_port,public_endpoint,admin_endpoint + + +[credential] + +# +# Options defined in keystone +# + +# Credential backend driver. (string value) +#driver=keystone.credential.backends.sql.Credential + + +[database] + +# +# Options defined in oslo.db +# -# For Keystone, these options apply only when the RPC notification driver is -# used. +# The file name to use with SQLite. (string value) +#sqlite_db=oslo.sqlite + +# If True, SQLite uses synchronous mode. (boolean value) +#sqlite_synchronous=true + +# The back end to use for the database. (string value) +# Deprecated group/name - [DEFAULT]/db_backend +#backend=sqlalchemy -# The messaging module to use, defaults to kombu. -# rpc_backend = keystone.openstack.common.rpc.impl_kombu +# The SQLAlchemy connection string to use to connect to the +# database. (string value) +# Deprecated group/name - [DEFAULT]/sql_connection +# Deprecated group/name - [DATABASE]/sql_connection +# Deprecated group/name - [sql]/connection +connection=mysql://%SERVICE_USER%:%SERVICE_PASSWORD%@localhost/keystone + +# The SQLAlchemy connection string to use to connect to the +# slave database. (string value) +#slave_connection= -# Size of RPC thread pool -# rpc_thread_pool_size = 64 +# The SQL mode to be used for MySQL sessions. This option, +# including the default, overrides any server-set SQL mode. To +# use whatever SQL mode is set by the server configuration, +# set this to no value. Example: mysql_sql_mode= (string +# value) +#mysql_sql_mode=TRADITIONAL -# Size of RPC connection pool -# rpc_conn_pool_size = 30 +# Timeout before idle SQL connections are reaped. (integer +# value) +# Deprecated group/name - [DEFAULT]/sql_idle_timeout +# Deprecated group/name - [DATABASE]/sql_idle_timeout +# Deprecated group/name - [sql]/idle_timeout +#idle_timeout=3600 + +# Minimum number of SQL connections to keep open in a pool. +# (integer value) +# Deprecated group/name - [DEFAULT]/sql_min_pool_size +# Deprecated group/name - [DATABASE]/sql_min_pool_size +#min_pool_size=1 + +# Maximum number of SQL connections to keep open in a pool. +# (integer value) +# Deprecated group/name - [DEFAULT]/sql_max_pool_size +# Deprecated group/name - [DATABASE]/sql_max_pool_size +#max_pool_size= -# Seconds to wait for a response from call or multicall -# rpc_response_timeout = 60 +# Maximum db connection retries during startup. Set to -1 to +# specify an infinite retry count. (integer value) +# Deprecated group/name - [DEFAULT]/sql_max_retries +# Deprecated group/name - [DATABASE]/sql_max_retries +#max_retries=10 + +# Interval between retries of opening a SQL connection. +# (integer value) +# Deprecated group/name - [DEFAULT]/sql_retry_interval +# Deprecated group/name - [DATABASE]/reconnect_interval +#retry_interval=10 + +# If set, use this value for max_overflow with SQLAlchemy. +# (integer value) +# Deprecated group/name - [DEFAULT]/sql_max_overflow +# Deprecated group/name - [DATABASE]/sqlalchemy_max_overflow +#max_overflow= + +# Verbosity of SQL debugging information: 0=None, +# 100=Everything. (integer value) +# Deprecated group/name - [DEFAULT]/sql_connection_debug +#connection_debug=0 -# Seconds to wait before a cast expires (TTL). Only supported by impl_zmq. -# rpc_cast_timeout = 30 +# Add Python stack traces to SQL as comment strings. (boolean +# value) +# Deprecated group/name - [DEFAULT]/sql_connection_trace +#connection_trace=false + +# If set, use this value for pool_timeout with SQLAlchemy. +# (integer value) +# Deprecated group/name - [DATABASE]/sqlalchemy_pool_timeout +#pool_timeout= -# Modules of exceptions that are permitted to be recreated upon receiving -# exception data from an rpc call. -# allowed_rpc_exception_modules = keystone.openstack.common.exception,nova.exception,cinder.exception,exceptions +# Enable the experimental use of database reconnect on +# connection lost. (boolean value) +#use_db_reconnect=false + +# Seconds between database connection retries. (integer value) +#db_retry_interval=1 + +# If True, increases the interval between database connection +# retries up to db_max_retry_interval. (boolean value) +#db_inc_retry_interval=true + +# If db_inc_retry_interval is set, the maximum seconds between +# database connection retries. (integer value) +#db_max_retry_interval=10 -# If True, use a fake RabbitMQ provider -# fake_rabbit = False +# Maximum database connection retries before error is raised. +# Set to -1 to specify an infinite retry count. (integer +# value) +#db_max_retries=20 + + +[ec2] + +# +# Options defined in keystone +# -# AMQP exchange to connect to if using RabbitMQ or Qpid -# control_exchange = openstack +# EC2Credential backend driver. (string value) +#driver=keystone.contrib.ec2.backends.kvs.Ec2 + + +[endpoint_filter] + +# +# Options defined in keystone +# + +# Endpoint Filter backend driver (string value) +#driver=keystone.contrib.endpoint_filter.backends.sql.EndpointFilter -[sql] -# The SQLAlchemy connection string used to connect to the database -connection = sqlite:////var/lib/keystone/keystone.sqlite +# Toggle to return all active endpoints if no filter exists. +# (boolean value) +#return_all_endpoints_if_no_filter=true + + +[endpoint_policy] + +# +# Options defined in keystone +# + +# Endpoint policy backend driver (string value) +#driver=keystone.contrib.endpoint_policy.backends.sql.EndpointPolicy -# the timeout before idle sql connections are reaped -# idle_timeout = 200 + +[federation] + +# +# Options defined in keystone +# + +# Federation backend driver. (string value) +#driver=keystone.contrib.federation.backends.sql.Federation + +# Value to be used when filtering assertion parameters from +# the environment. (string value) +#assertion_prefix= + [identity] -# driver = keystone.identity.backends.sql.Identity + +# +# Options defined in keystone +# -# This references the domain to use for all Identity API v2 requests (which are -# not aware of domains). A domain with this ID will be created for you by -# keystone-manage db_sync in migration 008. The domain referenced by this ID -# cannot be deleted on the v3 API, to prevent accidentally breaking the v2 API. -# There is nothing special about this domain, other than the fact that it must -# exist to order to maintain support for your v2 clients. -# default_domain_id = default -# -# A subset (or all) of domains can have their own identity driver, each with -# their own partial configuration file in a domain configuration directory. -# Only values specific to the domain need to be placed in the domain specific +# This references the domain to use for all Identity API v2 +# requests (which are not aware of domains). A domain with +# this ID will be created for you by keystone-manage db_sync +# in migration 008. The domain referenced by this ID cannot be +# deleted on the v3 API, to prevent accidentally breaking the +# v2 API. There is nothing special about this domain, other +# than the fact that it must exist to order to maintain +# support for your v2 clients. (string value) +#default_domain_id=default + +# A subset (or all) of domains can have their own identity +# driver, each with their own partial configuration file in a +# domain configuration directory. Only values specific to the +# domain need to be placed in the domain specific # configuration file. This feature is disabled by default; set -# domain_specific_drivers_enabled to True to enable. -# domain_specific_drivers_enabled = False -# domain_config_dir = /etc/keystone/domains +# to true to enable. (boolean value) +#domain_specific_drivers_enabled=false + +# Path for Keystone to locate the domain specific identity +# configuration files if domain_specific_drivers_enabled is +# set to true. (string value) +#domain_config_dir=/etc/keystone/domains + +# Identity backend driver. (string value) +#driver=keystone.identity.backends.sql.Identity + +# Maximum supported length for user passwords; decrease to +# improve performance. (integer value) +#max_password_length=4096 + +# Maximum number of entities that will be returned in an +# identity collection. (integer value) +#list_limit= + + +[identity_mapping] + +# +# Options defined in keystone +# + +# Keystone Identity Mapping backend driver. (string value) +#driver=keystone.identity.mapping_backends.sql.Mapping + +# Public ID generator for user and group entities. The +# Keystone identity mapper only supports generators that +# produce no more than 64 characters. (string value) +#generator=keystone.identity.id_generators.sha256.Generator + +# The format of user and group IDs changed in Juno for +# backends that do not generate UUIDs (e.g. LDAP), with +# keystone providing a hash mapping to the underlying +# attribute in LDAP. By default this mapping is disabled, +# which ensures that existing IDs will not change. Even when +# the mapping is enabled by using domain specific drivers, any +# users and groups from the default domain being handled by +# LDAP will still not be mapped to ensure their IDs remain +# backward compatible. Setting this value to False will enable +# the mapping for even the default LDAP driver. It is only +# safe to do this if you do not already have assignments for +# users and groups from the default LDAP domain, and it is +# acceptable for Keystone to provide the different IDs to +# clients than it did previously. Typically this means that +# the only time you can set this value to False is when +# configuring a fresh installation. (boolean value) +#backward_compatible_ids=true + + +[kvs] + +# +# Options defined in keystone +# + +# Extra dogpile.cache backend modules to register with the +# dogpile.cache library. (list value) +#backends= + +# Prefix for building the configuration dictionary for the KVS +# region. This should not need to be changed unless there is +# another dogpile.cache region with the same configuration +# name. (string value) +#config_prefix=keystone.kvs + +# Toggle to disable using a key-mangling function to ensure +# fixed length keys. This is toggle-able for debugging +# purposes, it is highly recommended to always leave this set +# to true. (boolean value) +#enable_key_mangler=true + +# Default lock timeout for distributed locking. (integer +# value) +#default_lock_timeout=5 + + +[ldap] + +# +# Options defined in keystone +# + +# URL for connecting to the LDAP server. (string value) +#url=ldap://localhost + +# User BindDN to query the LDAP server. (string value) +#user= + +# Password for the BindDN to query the LDAP server. (string +# value) +#password= + +# LDAP server suffix (string value) +#suffix=cn=example,cn=com + +# If true, will add a dummy member to groups. This is required +# if the objectclass for groups requires the "member" +# attribute. (boolean value) +#use_dumb_member=false + +# DN of the "dummy member" to use when "use_dumb_member" is +# enabled. (string value) +#dumb_member=cn=dumb,dc=nonexistent + +# Delete subtrees using the subtree delete control. Only +# enable this option if your LDAP server supports subtree +# deletion. (boolean value) +#allow_subtree_delete=false + +# The LDAP scope for queries, this can be either "one" +# (onelevel/singleLevel) or "sub" (subtree/wholeSubtree). +# (string value) +#query_scope=one + +# Maximum results per page; a value of zero ("0") disables +# paging. (integer value) +#page_size=0 -# Maximum supported length for user passwords; decrease to improve performance. -# max_password_length = 4096 +# The LDAP dereferencing option for queries. This can be +# either "never", "searching", "always", "finding" or +# "default". The "default" option falls back to using default +# dereferencing configured by your ldap.conf. (string value) +#alias_dereferencing=default + +# Sets the LDAP debugging level for LDAP calls. A value of 0 +# means that debugging is not enabled. This value is a +# bitmask, consult your LDAP documentation for possible +# values. (integer value) +#debug_level= + +# Override the system's default referral chasing behavior for +# queries. (boolean value) +#chase_referrals= + +# Search base for users. (string value) +#user_tree_dn= + +# LDAP search filter for users. (string value) +#user_filter= + +# LDAP objectclass for users. (string value) +#user_objectclass=inetOrgPerson + +# LDAP attribute mapped to user id. WARNING: must not be a +# multivalued attribute. (string value) +#user_id_attribute=cn + +# LDAP attribute mapped to user name. (string value) +#user_name_attribute=sn + +# LDAP attribute mapped to user email. (string value) +#user_mail_attribute=mail + +# LDAP attribute mapped to password. (string value) +#user_pass_attribute=userPassword + +# LDAP attribute mapped to user enabled flag. (string value) +#user_enabled_attribute=enabled + +# Invert the meaning of the boolean enabled values. Some LDAP +# servers use a boolean lock attribute where "true" means an +# account is disabled. Setting "user_enabled_invert = true" +# will allow these lock attributes to be used. This setting +# will have no effect if "user_enabled_mask" or +# "user_enabled_emulation" settings are in use. (boolean +# value) +#user_enabled_invert=false + +# Bitmask integer to indicate the bit that the enabled value +# is stored in if the LDAP server represents "enabled" as a +# bit on an integer rather than a boolean. A value of "0" +# indicates the mask is not used. If this is not set to "0" +# the typical value is "2". This is typically used when +# "user_enabled_attribute = userAccountControl". (integer +# value) +#user_enabled_mask=0 + +# Default value to enable users. This should match an +# appropriate int value if the LDAP server uses non-boolean +# (bitmask) values to indicate if a user is enabled or +# disabled. If this is not set to "True" the typical value is +# "512". This is typically used when "user_enabled_attribute = +# userAccountControl". (string value) +#user_enabled_default=True + +# List of attributes stripped off the user on update. (list +# value) +#user_attribute_ignore=default_project_id,tenants + +# LDAP attribute mapped to default_project_id for users. +# (string value) +#user_default_project_id_attribute= + +# Allow user creation in LDAP backend. (boolean value) +#user_allow_create=true + +# Allow user updates in LDAP backend. (boolean value) +#user_allow_update=true + +# Allow user deletion in LDAP backend. (boolean value) +#user_allow_delete=true + +# If true, Keystone uses an alternative method to determine if +# a user is enabled or not by checking if they are a member of +# the "user_enabled_emulation_dn" group. (boolean value) +#user_enabled_emulation=false + +# DN of the group entry to hold enabled users when using +# enabled emulation. (string value) +#user_enabled_emulation_dn= + +# List of additional LDAP attributes used for mapping +# additional attribute mappings for users. Attribute mapping +# format is :, where ldap_attr is the +# attribute in the LDAP entry and user_attr is the Identity +# API attribute. (list value) +#user_additional_attribute_mapping= + +# Search base for projects (string value) +# Deprecated group/name - [ldap]/tenant_tree_dn +#project_tree_dn= + +# LDAP search filter for projects. (string value) +# Deprecated group/name - [ldap]/tenant_filter +#project_filter= + +# LDAP objectclass for projects. (string value) +# Deprecated group/name - [ldap]/tenant_objectclass +#project_objectclass=groupOfNames + +# LDAP attribute mapped to project id. (string value) +# Deprecated group/name - [ldap]/tenant_id_attribute +#project_id_attribute=cn + +# LDAP attribute mapped to project membership for user. +# (string value) +# Deprecated group/name - [ldap]/tenant_member_attribute +#project_member_attribute=member + +# LDAP attribute mapped to project name. (string value) +# Deprecated group/name - [ldap]/tenant_name_attribute +#project_name_attribute=ou + +# LDAP attribute mapped to project description. (string value) +# Deprecated group/name - [ldap]/tenant_desc_attribute +#project_desc_attribute=description -[credential] -# driver = keystone.credential.backends.sql.Credential +# LDAP attribute mapped to project enabled. (string value) +# Deprecated group/name - [ldap]/tenant_enabled_attribute +#project_enabled_attribute=enabled + +# LDAP attribute mapped to project domain_id. (string value) +# Deprecated group/name - [ldap]/tenant_domain_id_attribute +#project_domain_id_attribute=businessCategory + +# List of attributes stripped off the project on update. (list +# value) +# Deprecated group/name - [ldap]/tenant_attribute_ignore +#project_attribute_ignore= + +# Allow project creation in LDAP backend. (boolean value) +# Deprecated group/name - [ldap]/tenant_allow_create +#project_allow_create=true + +# Allow project update in LDAP backend. (boolean value) +# Deprecated group/name - [ldap]/tenant_allow_update +#project_allow_update=true + +# Allow project deletion in LDAP backend. (boolean value) +# Deprecated group/name - [ldap]/tenant_allow_delete +#project_allow_delete=true + +# If true, Keystone uses an alternative method to determine if +# a project is enabled or not by checking if they are a member +# of the "project_enabled_emulation_dn" group. (boolean value) +# Deprecated group/name - [ldap]/tenant_enabled_emulation +#project_enabled_emulation=false + +# DN of the group entry to hold enabled projects when using +# enabled emulation. (string value) +# Deprecated group/name - [ldap]/tenant_enabled_emulation_dn +#project_enabled_emulation_dn= + +# Additional attribute mappings for projects. Attribute +# mapping format is :, where ldap_attr +# is the attribute in the LDAP entry and user_attr is the +# Identity API attribute. (list value) +# Deprecated group/name - [ldap]/tenant_additional_attribute_mapping +#project_additional_attribute_mapping= + +# Search base for roles. (string value) +#role_tree_dn= + +# LDAP search filter for roles. (string value) +#role_filter= + +# LDAP objectclass for roles. (string value) +#role_objectclass=organizationalRole + +# LDAP attribute mapped to role id. (string value) +#role_id_attribute=cn + +# LDAP attribute mapped to role name. (string value) +#role_name_attribute=ou + +# LDAP attribute mapped to role membership. (string value) +#role_member_attribute=roleOccupant + +# List of attributes stripped off the role on update. (list +# value) +#role_attribute_ignore= + +# Allow role creation in LDAP backend. (boolean value) +#role_allow_create=true + +# Allow role update in LDAP backend. (boolean value) +#role_allow_update=true + +# Allow role deletion in LDAP backend. (boolean value) +#role_allow_delete=true + +# Additional attribute mappings for roles. Attribute mapping +# format is :, where ldap_attr is the +# attribute in the LDAP entry and user_attr is the Identity +# API attribute. (list value) +#role_additional_attribute_mapping= + +# Search base for groups. (string value) +#group_tree_dn= + +# LDAP search filter for groups. (string value) +#group_filter= + +# LDAP objectclass for groups. (string value) +#group_objectclass=groupOfNames + +# LDAP attribute mapped to group id. (string value) +#group_id_attribute=cn + +# LDAP attribute mapped to group name. (string value) +#group_name_attribute=ou + +# LDAP attribute mapped to show group membership. (string +# value) +#group_member_attribute=member + +# LDAP attribute mapped to group description. (string value) +#group_desc_attribute=description + +# List of attributes stripped off the group on update. (list +# value) +#group_attribute_ignore= + +# Allow group creation in LDAP backend. (boolean value) +#group_allow_create=true + +# Allow group update in LDAP backend. (boolean value) +#group_allow_update=true + +# Allow group deletion in LDAP backend. (boolean value) +#group_allow_delete=true + +# Additional attribute mappings for groups. Attribute mapping +# format is :, where ldap_attr is the +# attribute in the LDAP entry and user_attr is the Identity +# API attribute. (list value) +#group_additional_attribute_mapping= + +# CA certificate file path for communicating with LDAP +# servers. (string value) +#tls_cacertfile= -[trust] -# driver = keystone.trust.backends.sql.Trust +# CA certificate directory path for communicating with LDAP +# servers. (string value) +#tls_cacertdir= + +# Enable TLS for communicating with LDAP servers. (boolean +# value) +#use_tls=false + +# Valid options for tls_req_cert are demand, never, and allow. +# (string value) +#tls_req_cert=demand + +# Enable LDAP connection pooling. (boolean value) +#use_pool=false + +# Connection pool size. (integer value) +#pool_size=10 + +# Maximum count of reconnect trials. (integer value) +#pool_retry_max=3 + +# Time span in seconds to wait between two reconnect trials. +# (floating point value) +#pool_retry_delay=0.1 + +# Connector timeout in seconds. Value -1 indicates indefinite +# wait for response. (integer value) +#pool_connection_timeout=-1 + +# Connection lifetime in seconds. (integer value) +#pool_connection_lifetime=600 + +# Enable LDAP connection pooling for end user authentication. +# If use_pool is disabled, then this setting is meaningless +# and is not used at all. (boolean value) +#use_auth_pool=false + +# End user auth connection pool size. (integer value) +#auth_pool_size=100 + +# End user auth connection lifetime in seconds. (integer +# value) +#auth_pool_connection_lifetime=60 + + +[matchmaker_redis] + +# +# Options defined in oslo.messaging +# + +# Host to locate redis. (string value) +#host=127.0.0.1 + +# Use this port to connect to redis host. (integer value) +#port=6379 + +# Password for Redis server (optional). (string value) +#password= + + +[matchmaker_ring] -# delegation and impersonation features can be optionally disabled -# enabled = True +# +# Options defined in oslo.messaging +# + +# Matchmaker ring file (JSON). (string value) +# Deprecated group/name - [DEFAULT]/matchmaker_ringfile +#ringfile=/etc/oslo/matchmaker_ring.json + + +[memcache] + +# +# Options defined in keystone +# + +# Memcache servers in the format of "host:port". (list value) +#servers=localhost:11211 + +# Number of seconds memcached server is considered dead before +# it is tried again. This is used by the key value store +# system (e.g. token pooled memcached persistence backend). +# (integer value) +#dead_retry=300 + +# Timeout in seconds for every call to a server. This is used +# by the key value store system (e.g. token pooled memcached +# persistence backend). (integer value) +#socket_timeout=3 + +# Max total number of open connections to every memcached +# server. This is used by the key value store system (e.g. +# token pooled memcached persistence backend). (integer value) +#pool_maxsize=10 + +# Number of seconds a connection to memcached is held unused +# in the pool before it is closed. This is used by the key +# value store system (e.g. token pooled memcached persistence +# backend). (integer value) +#pool_unused_timeout=60 + +# Number of seconds that an operation will wait to get a +# memcache client connection. This is used by the key value +# store system (e.g. token pooled memcached persistence +# backend). (integer value) +#pool_connection_get_timeout=10 + + +[oauth1] + +# +# Options defined in keystone +# + +# Credential backend driver. (string value) +#driver=keystone.contrib.oauth1.backends.sql.OAuth1 + +# Duration (in seconds) for the OAuth Request Token. (integer +# value) +#request_token_duration=28800 + +# Duration (in seconds) for the OAuth Access Token. (integer +# value) +#access_token_duration=86400 + [os_inherit] -# role-assignment inheritance to projects from owning domain can be -# optionally enabled -# enabled = False + +# +# Options defined in keystone +# + +# role-assignment inheritance to projects from owning domain +# can be optionally enabled. (boolean value) +#enabled=false + + +[paste_deploy] + +# +# Options defined in keystone +# + +# Name of the paste configuration file that defines the +# available pipelines. (string value) +#config_file=keystone-paste.ini + + +[policy] + +# +# Options defined in keystone +# + +# Policy backend driver. (string value) +#driver=keystone.policy.backends.sql.Policy + +# Maximum number of entities that will be returned in a policy +# collection. (integer value) +#list_limit= + + +[revoke] + +# +# Options defined in keystone +# + +# An implementation of the backend for persisting revocation +# events. (string value) +#driver=keystone.contrib.revoke.backends.sql.Revoke + +# This value (calculated in seconds) is added to token +# expiration before a revocation event may be removed from the +# backend. (integer value) +#expiration_buffer=1800 + +# Toggle for revocation event caching. This has no effect +# unless global caching is enabled. (boolean value) +#caching=true + -[catalog] -# dynamic, sql-based backend (supports API/CLI-based management commands) -# driver = keystone.catalog.backends.sql.Catalog +[saml] + +# +# Options defined in keystone +# + +# Default TTL, in seconds, for any generated SAML assertion +# created by Keystone. (integer value) +#assertion_expiration_time=3600 + +# Binary to be called for XML signing. Install the appropriate +# package, specify absolute path or adjust your PATH +# environment variable if the binary cannot be found. (string +# value) +#xmlsec1_binary=xmlsec1 + +# Path of the certfile for SAML signing. For non-production +# environments, you may be interested in using `keystone- +# manage pki_setup` to generate self-signed certificates. +# Note, the path cannot contain a comma. (string value) +#certfile=/etc/keystone/ssl/certs/signing_cert.pem + +# Path of the keyfile for SAML signing. Note, the path cannot +# contain a comma. (string value) +#keyfile=/etc/keystone/ssl/private/signing_key.pem + +# Entity ID value for unique Identity Provider identification. +# Usually FQDN is set with a suffix. A value is required to +# generate IDP Metadata. For example: +# https://keystone.example.com/v3/OS-FEDERATION/saml2/idp +# (string value) +#idp_entity_id= + +# Identity Provider Single-Sign-On service value, required in +# the Identity Provider's metadata. A value is required to +# generate IDP Metadata. For example: +# https://keystone.example.com/v3/OS-FEDERATION/saml2/sso +# (string value) +#idp_sso_endpoint= + +# Language used by the organization. (string value) +#idp_lang=en + +# Organization name the installation belongs to. (string +# value) +#idp_organization_name= + +# Organization name to be displayed. (string value) +#idp_organization_display_name= + +# URL of the organization. (string value) +#idp_organization_url= + +# Company of contact person. (string value) +#idp_contact_company= -# static, file-based backend (does *NOT* support any management commands) -# driver = keystone.catalog.backends.templated.TemplatedCatalog +# Given name of contact person (string value) +#idp_contact_name= + +# Surname of contact person. (string value) +#idp_contact_surname= + +# Email address of contact person. (string value) +#idp_contact_email= + +# Telephone number of contact person. (string value) +#idp_contact_telephone= + +# Contact type. Allowed values are: technical, support, +# administrative billing, and other (string value) +#idp_contact_type=other + +# Path to the Identity Provider Metadata file. This file +# should be generated with the keystone-manage +# saml_idp_metadata command. (string value) +#idp_metadata_path=/etc/keystone/saml2_idp_metadata.xml + + +[signing] -# template_file = default_catalog.templates +# +# Options defined in keystone +# + +# Deprecated in favor of provider in the [token] section. +# (string value) +#token_format= + +# Path of the certfile for token signing. For non-production +# environments, you may be interested in using `keystone- +# manage pki_setup` to generate self-signed certificates. +# (string value) +#certfile=/etc/keystone/ssl/certs/signing_cert.pem + +# Path of the keyfile for token signing. (string value) +#keyfile=/etc/keystone/ssl/private/signing_key.pem + +# Path of the CA for token signing. (string value) +#ca_certs=/etc/keystone/ssl/certs/ca.pem + +# Path of the CA key for token signing. (string value) +#ca_key=/etc/keystone/ssl/private/cakey.pem + +# Key size (in bits) for token signing cert (auto generated +# certificate). (integer value) +#key_size=2048 + +# Days the token signing cert is valid for (auto generated +# certificate). (integer value) +#valid_days=3650 -[endpoint_filter] -# extension for creating associations between project and endpoints in order to -# provide a tailored catalog for project-scoped token requests. -# driver = keystone.contrib.endpoint_filter.backends.sql.EndpointFilter -# return_all_endpoints_if_no_filter = True +# Certificate subject (auto generated certificate) for token +# signing. (string value) +#cert_subject=/C=US/ST=Unset/L=Unset/O=Unset/CN=www.example.com + + +[ssl] + +# +# Options defined in keystone +# + +# Toggle for SSL support on the Keystone eventlet servers. +# (boolean value) +#enable=false + +# Path of the certfile for SSL. For non-production +# environments, you may be interested in using `keystone- +# manage ssl_setup` to generate self-signed certificates. +# (string value) +#certfile=/etc/keystone/ssl/certs/keystone.pem + +# Path of the keyfile for SSL. (string value) +#keyfile=/etc/keystone/ssl/private/keystonekey.pem + +# Path of the ca cert file for SSL. (string value) +#ca_certs=/etc/keystone/ssl/certs/ca.pem + +# Path of the CA key file for SSL. (string value) +#ca_key=/etc/keystone/ssl/private/cakey.pem + +# Require client certificate. (boolean value) +#cert_required=false + +# SSL key length (in bits) (auto generated certificate). +# (integer value) +#key_size=1024 + +# Days the certificate is valid for once signed (auto +# generated certificate). (integer value) +#valid_days=3650 + +# SSL certificate subject (auto generated certificate). +# (string value) +#cert_subject=/C=US/ST=Unset/L=Unset/O=Unset/CN=localhost + + +[stats] + +# +# Options defined in keystone +# + +# Stats backend driver. (string value) +#driver=keystone.contrib.stats.backends.kvs.Stats + [token] -# Provides token persistence. -# driver = keystone.token.backends.sql.Token -# Controls the token construction, validation, and revocation operations. -# Core providers are keystone.token.providers.[pki|uuid].Provider -# provider = - -# Amount of time a token should remain valid (in seconds) -# expiration = 86400 - -# External auth mechanisms that should add bind information to token. -# eg kerberos, x509 -# bind = - -# Enforcement policy on tokens presented to keystone with bind information. -# One of disabled, permissive, strict, required or a specifically required bind -# mode e.g. kerberos or x509 to require binding to that authentication. -# enforce_token_bind = permissive - -# Token specific caching toggle. This has no effect unless the global caching -# option is set to True -# caching = True - -# Token specific cache time-to-live (TTL) in seconds. -# cache_time = +# +# Options defined in keystone +# -# Revocation-List specific cache time-to-live (TTL) in seconds. -# revocation_cache_time = 3600 - -[cache] -# Global cache functionality toggle. -# enabled = False - -# Prefix for building the configuration dictionary for the cache region. This -# should not need to be changed unless there is another dogpile.cache region -# with the same configuration name -# config_prefix = cache.keystone +# External auth mechanisms that should add bind information to +# token, e.g., kerberos,x509. (list value) +#bind= -# Default TTL, in seconds, for any cached item in the dogpile.cache region. -# This applies to any cached method that doesn't have an explicit cache -# expiration time defined for it. -# expiration_time = 600 - -# Dogpile.cache backend module. It is recommended that Memcache -# (dogpile.cache.memcache) or Redis (dogpile.cache.redis) be used in production -# deployments. Small workloads (single process) like devstack can use the -# dogpile.cache.memory backend. -# backend = keystone.common.cache.noop - -# Arguments supplied to the backend module. Specify this option once per -# argument to be passed to the dogpile.cache backend. -# Example format: : -# backend_argument = +# Enforcement policy on tokens presented to Keystone with bind +# information. One of disabled, permissive, strict, required +# or a specifically required bind mode, e.g., kerberos or x509 +# to require binding to that authentication. (string value) +#enforce_token_bind=permissive -# Proxy Classes to import that will affect the way the dogpile.cache backend -# functions. See the dogpile.cache documentation on changing-backend-behavior. -# Comma delimited list e.g. my.dogpile.proxy.Class, my.dogpile.proxyClass2 -# proxies = - -# Use a key-mangling function (sha1) to ensure fixed length cache-keys. This -# is toggle-able for debugging purposes, it is highly recommended to always -# leave this set to True. -# use_key_mangler = True - -# Extra debugging from the cache backend (cache keys, get/set/delete/etc calls) -# This is only really useful if you need to see the specific cache-backend -# get/set/delete calls with the keys/values. Typically this should be left -# set to False. -# debug_cache_backend = False - -[policy] -# driver = keystone.policy.backends.sql.Policy - -[ec2] -# driver = keystone.contrib.ec2.backends.kvs.Ec2 - -[assignment] -# driver = - -# Assignment specific caching toggle. This has no effect unless the global -# caching option is set to True -# caching = True +# Amount of time a token should remain valid (in seconds). +# (integer value) +#expiration=3600 -# Assignment specific cache time-to-live (TTL) in seconds. -# cache_time = - -[oauth1] -# driver = keystone.contrib.oauth1.backends.sql.OAuth1 - -# The Identity service may include expire attributes. -# If no such attribute is included, then the token lasts indefinitely. -# Specify how quickly the request token will expire (in seconds) -# request_token_duration = 28800 -# Specify how quickly the access token will expire (in seconds) -# access_token_duration = 86400 +# Controls the token construction, validation, and revocation +# operations. Core providers are +# "keystone.token.providers.[pkiz|pki|uuid].Provider". The +# default provider is uuid. (string value) +#provider= -[ssl] -#enable = True -#certfile = /etc/keystone/pki/certs/ssl_cert.pem -#keyfile = /etc/keystone/pki/private/ssl_key.pem -#ca_certs = /etc/keystone/pki/certs/cacert.pem -#ca_key = /etc/keystone/pki/private/cakey.pem -#key_size = 1024 -#valid_days = 3650 -#cert_required = False -#cert_subject = /C=US/ST=Unset/L=Unset/O=Unset/CN=localhost +# Token persistence backend driver. (string value) +#driver=keystone.token.persistence.backends.sql.Token -[signing] -# Deprecated in favor of provider in the [token] section -# Allowed values are PKI or UUID -#token_format = +# Toggle for token system caching. This has no effect unless +# global caching is enabled. (boolean value) +#caching=true -#certfile = /etc/keystone/pki/certs/signing_cert.pem -#keyfile = /etc/keystone/pki/private/signing_key.pem -#ca_certs = /etc/keystone/pki/certs/cacert.pem -#ca_key = /etc/keystone/pki/private/cakey.pem -#key_size = 2048 -#valid_days = 3650 -#cert_subject = /C=US/ST=Unset/L=Unset/O=Unset/CN=www.example.com - -[ldap] -# url = ldap://localhost -# user = dc=Manager,dc=example,dc=com -# password = None -# suffix = cn=example,cn=com -# use_dumb_member = False -# allow_subtree_delete = False -# dumb_member = cn=dumb,dc=example,dc=com - -# Maximum results per page; a value of zero ('0') disables paging (default) -# page_size = 0 +# Time to cache the revocation list and the revocation events +# if revoke extension is enabled (in seconds). This has no +# effect unless global and token caching are enabled. (integer +# value) +#revocation_cache_time=3600 -# The LDAP dereferencing option for queries. This can be either 'never', -# 'searching', 'always', 'finding' or 'default'. The 'default' option falls -# back to using default dereferencing configured by your ldap.conf. -# alias_dereferencing = default - -# The LDAP scope for queries, this can be either 'one' -# (onelevel/singleLevel) or 'sub' (subtree/wholeSubtree) -# query_scope = one +# Time to cache tokens (in seconds). This has no effect unless +# global and token caching are enabled. (integer value) +#cache_time= -# user_tree_dn = ou=Users,dc=example,dc=com -# user_filter = -# user_objectclass = inetOrgPerson -# user_id_attribute = cn -# user_name_attribute = sn -# user_mail_attribute = email -# user_pass_attribute = userPassword -# user_enabled_attribute = enabled -# user_enabled_mask = 0 -# user_enabled_default = True -# user_attribute_ignore = default_project_id,tenants -# user_default_project_id_attribute = -# user_allow_create = True -# user_allow_update = True -# user_allow_delete = True -# user_enabled_emulation = False -# user_enabled_emulation_dn = +# Revoke token by token identifier. Setting revoke_by_id to +# true enables various forms of enumerating tokens, e.g. `list +# tokens for user`. These enumerations are processed to +# determine the list of tokens to revoke. Only disable if you +# are switching to using the Revoke extension with a backend +# other than KVS, which stores events in memory. (boolean +# value) +#revoke_by_id=true -# tenant_tree_dn = ou=Projects,dc=example,dc=com -# tenant_filter = -# tenant_objectclass = groupOfNames -# tenant_domain_id_attribute = businessCategory -# tenant_id_attribute = cn -# tenant_member_attribute = member -# tenant_name_attribute = ou -# tenant_desc_attribute = desc -# tenant_enabled_attribute = enabled -# tenant_attribute_ignore = -# tenant_allow_create = True -# tenant_allow_update = True -# tenant_allow_delete = True -# tenant_enabled_emulation = False -# tenant_enabled_emulation_dn = +# The hash algorithm to use for PKI tokens. This can be set to +# any algorithm that hashlib supports. WARNING: Before +# changing this value, the auth_token middleware must be +# configured with the hash_algorithms, otherwise token +# revocation will not be processed correctly. (string value) +#hash_algorithm=md5 -# role_tree_dn = ou=Roles,dc=example,dc=com -# role_filter = -# role_objectclass = organizationalRole -# role_id_attribute = cn -# role_name_attribute = ou -# role_member_attribute = roleOccupant -# role_attribute_ignore = -# role_allow_create = True -# role_allow_update = True -# role_allow_delete = True + +[trust] -# group_tree_dn = -# group_filter = -# group_objectclass = groupOfNames -# group_id_attribute = cn -# group_name_attribute = ou -# group_member_attribute = member -# group_desc_attribute = desc -# group_attribute_ignore = -# group_allow_create = True -# group_allow_update = True -# group_allow_delete = True - -# ldap TLS options -# if both tls_cacertfile and tls_cacertdir are set then -# tls_cacertfile will be used and tls_cacertdir is ignored -# valid options for tls_req_cert are demand, never, and allow -# use_tls = False -# tls_cacertfile = -# tls_cacertdir = -# tls_req_cert = demand +# +# Options defined in keystone +# -# Additional attribute mappings can be used to map ldap attributes to internal -# keystone attributes. This allows keystone to fulfill ldap objectclass -# requirements. An example to map the description and gecos attributes to a -# user's name would be: -# user_additional_attribute_mapping = description:name, gecos:name -# -# domain_additional_attribute_mapping = -# group_additional_attribute_mapping = -# role_additional_attribute_mapping = -# project_additional_attribute_mapping = -# user_additional_attribute_mapping = +# Delegation and impersonation features can be optionally +# disabled. (boolean value) +#enabled=true -[auth] -methods = external,password,token,oauth1 -#external = keystone.auth.plugins.external.ExternalDefault -password = keystone.auth.plugins.password.Password -token = keystone.auth.plugins.token.Token -oauth1 = keystone.auth.plugins.oauth1.OAuth +# Trust backend driver. (string value) +#driver=keystone.trust.backends.sql.Trust -[paste_deploy] -# Name of the paste configuration file that defines the available pipelines -config_file = keystone-paste.ini + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/files/keystone.prof_attr --- a/components/openstack/keystone/files/keystone.prof_attr Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/keystone/files/keystone.prof_attr Mon Apr 20 12:35:51 2015 -0700 @@ -1,9 +1,9 @@ OpenStack Identity Management:RO::\ Manage OpenStack Keystone:\ -auths=solaris.admin.edit/etc/keystone/default_catalog.templates,\ -solaris.admin.edit/etc/keystone/keystone.conf,\ -solaris.admin.edit/etc/keystone/logging.conf,\ -solaris.admin.edit/etc/keystone/policy.json,\ +auths=solaris.admin.edit/etc/keystone/*.conf,\ +solaris.admin.edit/etc/keystone/*.ini,\ +solaris.admin.edit/etc/keystone/*.json,\ +solaris.admin.edit/etc/keystone/default_catalog.templates,\ solaris.smf.manage.keystone,\ solaris.smf.value.keystone;\ defaultpriv={file_dac_read}\:/var/svc/log/application-openstack-* diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/files/keystone.user_attr --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/keystone/files/keystone.user_attr Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,1 @@ +keystone::RO::profiles=OpenStack Identity Management diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/files/keystone.xml --- a/components/openstack/keystone/files/keystone.xml Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/keystone/files/keystone.xml Mon Apr 20 12:35:51 2015 -0700 @@ -1,7 +1,7 @@ - + + + + + + + + + + + + + -Date: Fri Oct 25 00:26:43 2013 +0800 - - remove 8888 port in sample_data.sh - - Swift now doesn't use 8888 port as any default service. And the origin - sample_data.sh always let new users to fail and modify swift bind port. - So switching 8888 port here to 8080 could generate sample data without - any change for building swift + keystone environment. - - Closes-Bug: #1244304 - Change-Id: If58f9f025f57565733aa25efc2fdf06865781391 - -diff --git a/keystone/tests/test_token_provider.py b/keystone/tests/test_token_provider.py -index c93bd73..8b2c212 100644 ---- a/keystone/tests/test_token_provider.py -+++ b/keystone/tests/test_token_provider.py -@@ -92,10 +92,10 @@ SAMPLE_V2_TOKEN = { - { - "endpoints": [ - { -- "adminURL": "http://localhost:8888/v1", -+ "adminURL": "http://localhost:8080/v1", - "id": "7bd0c643e05a4a2ab40902b2fa0dd4e6", -- "internalURL": "http://localhost:8888/v1/AUTH_01257", -- "publicURL": "http://localhost:8888/v1/AUTH_01257", -+ "internalURL": "http://localhost:8080/v1/AUTH_01257", -+ "publicURL": "http://localhost:8080/v1/AUTH_01257", - "region": "RegionOne" - } - ], -@@ -202,19 +202,19 @@ SAMPLE_V3_TOKEN = { - "id": "7bd0c643e05a4a2ab40902b2fa0dd4e6", - "interface": "admin", - "region": "RegionOne", -- "url": "http://localhost:8888/v1" -+ "url": "http://localhost:8080/v1" - }, - { - "id": "43bef154594d4ccb8e49014d20624e1d", - "interface": "internal", - "region": "RegionOne", -- "url": "http://localhost:8888/v1/AUTH_01257" -+ "url": "http://localhost:8080/v1/AUTH_01257" - }, - { - "id": "e63b5f5d7aa3493690189d0ff843b9b3", - "interface": "public", - "region": "RegionOne", -- "url": "http://localhost:8888/v1/AUTH_01257" -+ "url": "http://localhost:8080/v1/AUTH_01257" - } - ], - "id": "a669e152f1104810a4b6701aade721bb", -@@ -399,10 +399,10 @@ SAMPLE_V2_TOKEN_WITH_EMBEDED_VERSION = { - { - "endpoints": [ - { -- "adminURL": "http://localhost:8888/v1", -+ "adminURL": "http://localhost:8080/v1", - "id": "7bd0c643e05a4a2ab40902b2fa0dd4e6", -- "internalURL": "http://localhost:8888/v1/AUTH_01257", -- "publicURL": "http://localhost:8888/v1/AUTH_01257", -+ "internalURL": "http://localhost:8080/v1/AUTH_01257", -+ "publicURL": "http://localhost:8080/v1/AUTH_01257", - "region": "RegionOne" - } - ], -@@ -509,19 +509,19 @@ SAMPLE_V3_TOKEN_WITH_EMBEDED_VERSION = { - "id": "7bd0c643e05a4a2ab40902b2fa0dd4e6", - "interface": "admin", - "region": "RegionOne", -- "url": "http://localhost:8888/v1" -+ "url": "http://localhost:8080/v1" - }, - { - "id": "43bef154594d4ccb8e49014d20624e1d", - "interface": "internal", - "region": "RegionOne", -- "url": "http://localhost:8888/v1/AUTH_01257" -+ "url": "http://localhost:8080/v1/AUTH_01257" - }, - { - "id": "e63b5f5d7aa3493690189d0ff843b9b3", - "interface": "public", - "region": "RegionOne", -- "url": "http://localhost:8888/v1/AUTH_01257" -+ "url": "http://localhost:8080/v1/AUTH_01257" - } - ], - "id": "a669e152f1104810a4b6701aade721bb", -diff --git a/tools/sample_data.sh b/tools/sample_data.sh -index d09502d..65030b5 100755 ---- a/tools/sample_data.sh -+++ b/tools/sample_data.sh -@@ -215,9 +215,9 @@ keystone service-create --name=swift \ - --description="Swift Service") - if [[ -z "$DISABLE_ENDPOINTS" ]]; then - keystone endpoint-create --region RegionOne --service-id $SWIFT_SERVICE \ -- --publicurl "http://$CONTROLLER_PUBLIC_ADDRESS:8888/v1/AUTH_\$(tenant_id)s" \ -- --adminurl "http://$CONTROLLER_ADMIN_ADDRESS:8888/v1" \ -- --internalurl "http://$CONTROLLER_INTERNAL_ADDRESS:8888/v1/AUTH_\$(tenant_id)s" -+ --publicurl "http://$CONTROLLER_PUBLIC_ADDRESS:8080/v1/AUTH_\$(tenant_id)s" \ -+ --adminurl "http://$CONTROLLER_ADMIN_ADDRESS:8080/v1" \ -+ --internalurl "http://$CONTROLLER_INTERNAL_ADDRESS:8080/v1/AUTH_\$(tenant_id)s" - fi - - # create ec2 creds and parse the secret and access key returned diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/patches/02-launchpad-1178740.patch --- a/components/openstack/keystone/patches/02-launchpad-1178740.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -This upstream patch addresses Launchpad bug 1178740. Although it's been -addressed in Icehouse 2014.1, the patch below is still not yet released -for Havana. - -commit 4f800bbe7f5ba07895a4cb32c14007e2f1818bd7 -Author: Lei Zhang -Date: Tue Oct 8 17:40:37 2013 +0800 - - remove the nova dependency in the ec2_token middleware - - Change-Id: I34812522b55e38d3ea030638bbae75d65f507c90 - Closes-Bug: #1178740 - -diff --git a/keystone/middleware/ec2_token.py b/keystone/middleware/ec2_token.py -index 0cd5841..4e58eac 100644 ---- a/keystone/middleware/ec2_token.py -+++ b/keystone/middleware/ec2_token.py -@@ -25,18 +25,22 @@ Starting point for routing EC2 requests. - import urlparse - - from eventlet.green import httplib -+from oslo.config import cfg - import webob.dec - import webob.exc - --from nova import flags --from nova import utils --from nova import wsgi -+from keystone.common import config -+from keystone.common import wsgi -+from keystone.openstack.common import jsonutils - -+keystone_ec2_opts = [ -+ cfg.StrOpt('keystone_ec2_url', -+ default='http://localhost:5000/v2.0/ec2tokens', -+ help='URL to get token from ec2 request.'), -+] - --FLAGS = flags.FLAGS --flags.DEFINE_string('keystone_ec2_url', -- 'http://localhost:5000/v2.0/ec2tokens', -- 'URL to get token from ec2 request.') -+CONF = config.CONF -+CONF.register_opts(keystone_ec2_opts) - - - class EC2Token(wsgi.Middleware): -@@ -67,13 +71,13 @@ class EC2Token(wsgi.Middleware): - 'params': auth_params, - } - } -- creds_json = utils.dumps(creds) -+ creds_json = jsonutils.dumps(creds) - headers = {'Content-Type': 'application/json'} - - # Disable 'has no x member' pylint error - # for httplib and urlparse - # pylint: disable-msg=E1101 -- o = urlparse.urlparse(FLAGS.keystone_ec2_url) -+ o = urlparse.urlparse(CONF.keystone_ec2_url) - if o.scheme == 'http': - conn = httplib.HTTPConnection(o.netloc) - else: -@@ -86,7 +90,7 @@ class EC2Token(wsgi.Middleware): - # having keystone return token, tenant, - # user, and roles from this call. - -- result = utils.loads(response) -+ result = jsonutils.loads(response) - try: - token_id = result['access']['token']['id'] - except (AttributeError, KeyError): diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/patches/03-sample-data-sh.patch --- a/components/openstack/keystone/patches/03-sample-data-sh.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,214 +0,0 @@ -In-house patch to the sample_data.sh script installed in -/usr/demo/openstack/keystone in order to support all of the standard -services and to allow customization of the individual service -endpoints. Solaris-specific patch and is not suitable for upstream - -It also includes a change to use the standard Solaris tr(1) rather than -GNU sed. - ---- keystone-2013.2.3/tools/sample_data.sh.orig 2014-05-27 09:17:02.379736817 -0700 -+++ keystone-2013.2.3/tools/sample_data.sh 2014-05-27 11:09:25.741756254 -0700 -@@ -2,6 +2,8 @@ - - # Copyright 2013 OpenStack Foundation - # -+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. -+# - # Licensed under the Apache License, Version 2.0 (the "License"); you may - # not use this file except in compliance with the License. You may obtain - # a copy of the License at -@@ -23,8 +25,8 @@ - # and the administrative API. It will get the admin_token (SERVICE_TOKEN) - # and admin_port from keystone.conf if available. - # --# Disable creation of endpoints by setting DISABLE_ENDPOINTS environment variable. --# Use this with the Catalog Templated backend. -+# Disable creation of endpoints by setting DISABLE_ENDPOINTS environment -+# variable. Use this with the Catalog Templated backend. - # - # A EC2-compatible credential is created for the admin user and - # placed in etc/ec2rc. -@@ -36,22 +38,48 @@ - # service nova admin - # service ec2 admin - # service swift admin -+# service cinder admin -+# service neutron admin -+ -+# By default, passwords used are those in the OpenStack Install and Deploy -+# Manual. One can override these (publicly known, and hence, insecure) -+# passwords by setting the appropriate environment variables. A common default -+# password for all the services can be used by setting the "SERVICE_PASSWORD" -+# environment variable. - --# By default, passwords used are those in the OpenStack Install and Deploy Manual. --# One can override these (publicly known, and hence, insecure) passwords by setting the appropriate --# environment variables. A common default password for all the services can be used by --# setting the "SERVICE_PASSWORD" environment variable. -+PATH=/usr/bin - - ADMIN_PASSWORD=${ADMIN_PASSWORD:-secrete} - NOVA_PASSWORD=${NOVA_PASSWORD:-${SERVICE_PASSWORD:-nova}} - GLANCE_PASSWORD=${GLANCE_PASSWORD:-${SERVICE_PASSWORD:-glance}} - EC2_PASSWORD=${EC2_PASSWORD:-${SERVICE_PASSWORD:-ec2}} - SWIFT_PASSWORD=${SWIFT_PASSWORD:-${SERVICE_PASSWORD:-swiftpass}} -+CINDER_PASSWORD=${CINDER_PASSWORD:-${SERVICE_PASSWORD:-cinder}} -+NEUTRON_PASSWORD=${NEUTRON_PASSWORD:-${SERVICE_PASSWORD:-neutron}} - - CONTROLLER_PUBLIC_ADDRESS=${CONTROLLER_PUBLIC_ADDRESS:-localhost} - CONTROLLER_ADMIN_ADDRESS=${CONTROLLER_ADMIN_ADDRESS:-localhost} - CONTROLLER_INTERNAL_ADDRESS=${CONTROLLER_INTERNAL_ADDRESS:-localhost} - -+NOVA_PUBLIC_ADDRESS=${NOVA_PUBLIC_ADDRESS:-$CONTROLLER_PUBLIC_ADDRESS} -+NOVA_ADMIN_ADDRESS=${NOVA_ADMIN_ADDRESS:-$CONTROLLER_ADMIN_ADDRESS} -+NOVA_INTERNAL_ADDRESS=${NOVA_INTERNAL_ADDRESS:-$CONTROLLER_INTERNAL_ADDRESS} -+GLANCE_PUBLIC_ADDRESS=${GLANCE_PUBLIC_ADDRESS:-$CONTROLLER_PUBLIC_ADDRESS} -+GLANCE_ADMIN_ADDRESS=${GLANCE_ADMIN_ADDRESS:-$CONTROLLER_ADMIN_ADDRESS} -+GLANCE_INTERNAL_ADDRESS=${GLANCE_INTERNAL_ADDRESS:-$CONTROLLER_INTERNAL_ADDRESS} -+EC2_PUBLIC_ADDRESS=${EC2_PUBLIC_ADDRESS:-$CONTROLLER_PUBLIC_ADDRESS} -+EC2_ADMIN_ADDRESS=${EC2_ADMIN_ADDRESS:-$CONTROLLER_ADMIN_ADDRESS} -+EC2_INTERNAL_ADDRESS=${EC2_INTERNAL_ADDRESS:-$CONTROLLER_INTERNAL_ADDRESS} -+SWIFT_PUBLIC_ADDRESS=${SWIFT_PUBLIC_ADDRESS:-$CONTROLLER_PUBLIC_ADDRESS} -+SWIFT_ADMIN_ADDRESS=${SWIFT_ADMIN_ADDRESS:-$CONTROLLER_ADMIN_ADDRESS} -+SWIFT_INTERNAL_ADDRESS=${SWIFT_INTERNAL_ADDRESS:-$CONTROLLER_INTERNAL_ADDRESS} -+CINDER_PUBLIC_ADDRESS=${CINDER_PUBLIC_ADDRESS:-$CONTROLLER_PUBLIC_ADDRESS} -+CINDER_ADMIN_ADDRESS=${CINDER_ADMIN_ADDRESS:-$CONTROLLER_ADMIN_ADDRESS} -+CINDER_INTERNAL_ADDRESS=${CINDER_INTERNAL_ADDRESS:-$CONTROLLER_INTERNAL_ADDRESS} -+NEUTRON_PUBLIC_ADDRESS=${NEUTRON_PUBLIC_ADDRESS:-$CONTROLLER_PUBLIC_ADDRESS} -+NEUTRON_ADMIN_ADDRESS=${NEUTRON_ADMIN_ADDRESS:-$CONTROLLER_ADMIN_ADDRESS} -+NEUTRON_INTERNAL_ADDRESS=${NEUTRON_INTERNAL_ADDRESS:-$CONTROLLER_INTERNAL_ADDRESS} -+ - TOOLS_DIR=$(cd $(dirname "$0") && pwd) - KEYSTONE_CONF=${KEYSTONE_CONF:-/etc/keystone/keystone.conf} - if [[ -r "$KEYSTONE_CONF" ]]; then -@@ -67,8 +95,8 @@ - - # Extract some info from Keystone's configuration file - if [[ -r "$KEYSTONE_CONF" ]]; then -- CONFIG_SERVICE_TOKEN=$(sed 's/[[:space:]]//g' $KEYSTONE_CONF | grep ^admin_token= | cut -d'=' -f2) -- CONFIG_ADMIN_PORT=$(sed 's/[[:space:]]//g' $KEYSTONE_CONF | grep ^admin_port= | cut -d'=' -f2) -+ CONFIG_SERVICE_TOKEN=$(tr -d '[\t ]' < $KEYSTONE_CONF | grep ^admin_token= | cut -d'=' -f2) -+ CONFIG_ADMIN_PORT=$(tr -d '[\t ]' < $KEYSTONE_CONF | grep ^admin_port= | cut -d'=' -f2) - fi - - export SERVICE_TOKEN=${SERVICE_TOKEN:-$CONFIG_SERVICE_TOKEN} -@@ -136,6 +164,22 @@ - --role-id $ADMIN_ROLE \ - --tenant-id $SERVICE_TENANT - -+CINDER_USER=$(get_id keystone user-create --name=cinder \ -+ --pass="${CINDER_PASSWORD}" \ -+ --tenant-id $SERVICE_TENANT) -+ -+keystone user-role-add --user-id $CINDER_USER \ -+ --role-id $ADMIN_ROLE \ -+ --tenant-id $SERVICE_TENANT -+ -+NEUTRON_USER=$(get_id keystone user-create --name=neutron \ -+ --pass="${NEUTRON_PASSWORD}" \ -+ --tenant-id $SERVICE_TENANT) -+ -+keystone user-role-add --user-id $NEUTRON_USER \ -+ --role-id $ADMIN_ROLE \ -+ --tenant-id $SERVICE_TENANT -+ - # - # Keystone service - # -@@ -159,23 +203,23 @@ - --description="Nova Compute Service") - if [[ -z "$DISABLE_ENDPOINTS" ]]; then - keystone endpoint-create --region RegionOne --service-id $NOVA_SERVICE \ -- --publicurl "http://$CONTROLLER_PUBLIC_ADDRESS:\$(compute_port)s/v1.1/\$(tenant_id)s" \ -- --adminurl "http://$CONTROLLER_ADMIN_ADDRESS:\$(compute_port)s/v1.1/\$(tenant_id)s" \ -- --internalurl "http://$CONTROLLER_INTERNAL_ADDRESS:\$(compute_port)s/v1.1/\$(tenant_id)s" -+ --publicurl "http://$NOVA_PUBLIC_ADDRESS:\$(compute_port)s/v1.1/\$(tenant_id)s" \ -+ --adminurl "http://$NOVA_ADMIN_ADDRESS:\$(compute_port)s/v1.1/\$(tenant_id)s" \ -+ --internalurl "http://$NOVA_INTERNAL_ADDRESS:\$(compute_port)s/v1.1/\$(tenant_id)s" - fi - - # - # Volume service - # - VOLUME_SERVICE=$(get_id \ --keystone service-create --name=volume \ -+keystone service-create --name=cinder \ - --type=volume \ -- --description="Nova Volume Service") -+ --description="Cinder Volume Service") - if [[ -z "$DISABLE_ENDPOINTS" ]]; then - keystone endpoint-create --region RegionOne --service-id $VOLUME_SERVICE \ -- --publicurl "http://$CONTROLLER_PUBLIC_ADDRESS:8776/v1/\$(tenant_id)s" \ -- --adminurl "http://$CONTROLLER_ADMIN_ADDRESS:8776/v1/\$(tenant_id)s" \ -- --internalurl "http://$CONTROLLER_INTERNAL_ADDRESS:8776/v1/\$(tenant_id)s" -+ --publicurl "http://$CINDER_PUBLIC_ADDRESS:8776/v1/\$(tenant_id)s" \ -+ --adminurl "http://$CINDER_ADMIN_ADDRESS:8776/v1/\$(tenant_id)s" \ -+ --internalurl "http://$CINDER_INTERNAL_ADDRESS:8776/v1/\$(tenant_id)s" - fi - - # -@@ -187,9 +231,9 @@ - --description="Glance Image Service") - if [[ -z "$DISABLE_ENDPOINTS" ]]; then - keystone endpoint-create --region RegionOne --service-id $GLANCE_SERVICE \ -- --publicurl "http://$CONTROLLER_PUBLIC_ADDRESS:9292" \ -- --adminurl "http://$CONTROLLER_ADMIN_ADDRESS:9292" \ -- --internalurl "http://$CONTROLLER_INTERNAL_ADDRESS:9292" -+ --publicurl "http://$GLANCE_PUBLIC_ADDRESS:9292" \ -+ --adminurl "http://$GLANCE_ADMIN_ADDRESS:9292" \ -+ --internalurl "http://$GLANCE_INTERNAL_ADDRESS:9292" - fi - - # -@@ -201,9 +245,9 @@ - --description="EC2 Compatibility Layer") - if [[ -z "$DISABLE_ENDPOINTS" ]]; then - keystone endpoint-create --region RegionOne --service-id $EC2_SERVICE \ -- --publicurl "http://$CONTROLLER_PUBLIC_ADDRESS:8773/services/Cloud" \ -- --adminurl "http://$CONTROLLER_ADMIN_ADDRESS:8773/services/Admin" \ -- --internalurl "http://$CONTROLLER_INTERNAL_ADDRESS:8773/services/Cloud" -+ --publicurl "http://$EC2_PUBLIC_ADDRESS:8773/services/Cloud" \ -+ --adminurl "http://$EC2_ADMIN_ADDRESS:8773/services/Admin" \ -+ --internalurl "http://$EC2_INTERNAL_ADDRESS:8773/services/Cloud" - fi - - # -@@ -212,15 +256,34 @@ - SWIFT_SERVICE=$(get_id \ - keystone service-create --name=swift \ - --type="object-store" \ -- --description="Swift Service") -+ --description="Swift Object Store Service") - if [[ -z "$DISABLE_ENDPOINTS" ]]; then - keystone endpoint-create --region RegionOne --service-id $SWIFT_SERVICE \ -- --publicurl "http://$CONTROLLER_PUBLIC_ADDRESS:8080/v1/AUTH_\$(tenant_id)s" \ -- --adminurl "http://$CONTROLLER_ADMIN_ADDRESS:8080/v1" \ -- --internalurl "http://$CONTROLLER_INTERNAL_ADDRESS:8080/v1/AUTH_\$(tenant_id)s" -+ --publicurl "http://$SWIFT_PUBLIC_ADDRESS:8080/v1/AUTH_\$(tenant_id)s" \ -+ --adminurl "http://$SWIFT_ADMIN_ADDRESS:8080/v1" \ -+ --internalurl "http://$SWIFT_INTERNAL_ADDRESS:8080/v1/AUTH_\$(tenant_id)s" -+fi -+ -+# -+# Neutron service -+# -+NEUTRON_SERVICE=$(get_id \ -+keystone service-create --name=neutron \ -+ --type=network \ -+ --description="Neutron Network Service") -+if [[ -z "$DISABLE_ENDPOINTS" ]]; then -+ keystone endpoint-create --region RegionOne --service-id $NEUTRON_SERVICE \ -+ --publicurl "http://$NEUTRON_PUBLIC_ADDRESS:9696/" \ -+ --adminurl "http://$NEUTRON_ADMIN_ADDRESS:9696/" \ -+ --internalurl "http://$NEUTRON_INTERNAL_ADDRESS:9696/" - fi - - # create ec2 creds and parse the secret and access key returned -+unset SERVICE_ENDPOINT SERVICE_TOKEN -+export OS_AUTH_URL=http://localhost:5000/v2.0 -+export OS_PASSWORD="${ADMIN_PASSWORD}" -+export OS_TENANT_NAME=demo -+export OS_USERNAME=admin - RESULT=$(keystone ec2-credentials-create --tenant-id=$SERVICE_TENANT --user-id=$ADMIN_USER) - ADMIN_ACCESS=`echo "$RESULT" | grep access | awk '{print $4}'` - ADMIN_SECRET=`echo "$RESULT" | grep secret | awk '{print $4}'` diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/patches/04-CVE-2014-2828.patch --- a/components/openstack/keystone/patches/04-CVE-2014-2828.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -Upstream patch for bug 1300274. - -Fixed in Havana 2013.2.4, Icehouse 2014.1 - -From: Florent Flament -Date: Tue, 1 Apr 2014 12:48:22 +0000 (+0000) -Subject: Sanitizes authentication methods received in requests. -X-Git-Url: https://review.openstack.org/gitweb?p=openstack%2Fkeystone.git;a=commitdiff_plain;h=e364ba5b12de8e4c11bd80bcca903f9615dcfc2e - -Sanitizes authentication methods received in requests. - -When a user authenticates against Identity V3 API, he can specify -multiple authentication methods. This patch removes duplicates, which -could have been used to achieve DoS attacks. - -Closes-Bug: 1300274 -(cherry picked from commit ef868ad92c00e23a4a5e9eb71e3e0bf5ae2fff0c) -Cherry-pick from https://review.openstack.org/#/c/84425/ - -Change-Id: I6e60324309baa094a5e54b012fb0fc528fea72ab ---- - -diff --git a/keystone/auth/controllers.py b/keystone/auth/controllers.py -index c3399df..4944316 100644 ---- a/keystone/auth/controllers.py -+++ b/keystone/auth/controllers.py -@@ -225,7 +225,13 @@ class AuthInfo(object): - :returns: list of auth method names - - """ -- return self.auth['identity']['methods'] or [] -+ # Sanitizes methods received in request's body -+ # Filters out duplicates, while keeping elements' order. -+ method_names = [] -+ for method in self.auth['identity']['methods']: -+ if method not in method_names: -+ method_names.append(method) -+ return method_names - - def get_method_data(self, method): - """Get the auth method payload. -diff --git a/keystone/tests/test_v3_auth.py b/keystone/tests/test_v3_auth.py -index d07e6ae..e89e29f 100644 ---- a/keystone/tests/test_v3_auth.py -+++ b/keystone/tests/test_v3_auth.py -@@ -81,6 +81,18 @@ class TestAuthInfo(test_v3.RestfulTestCase): - None, - auth_data) - -+ def test_get_method_names_duplicates(self): -+ auth_data = self.build_authentication_request( -+ token='test', -+ user_id='test', -+ password='test')['auth'] -+ auth_data['identity']['methods'] = ['password', 'token', -+ 'password', 'password'] -+ context = None -+ auth_info = auth.controllers.AuthInfo(context, auth_data) -+ self.assertEqual(auth_info.get_method_names(), -+ ['password', 'token']) -+ - def test_get_method_data_invalid_method(self): - auth_data = self.build_authentication_request( - user_id='test', diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/patches/05-requirements.patch --- a/components/openstack/keystone/patches/05-requirements.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -In-house patch to remove unnecessary dependencies from Keystone's -requirements files. The specific reasons are as follows: - -oauth2 Not applicable to Solaris (being replaced with oauthlib) - (upstream commit bed88a2e724f5f23a1c839b7872b1bc56f059df5) - -pam No longer applicable - (upstream commit ff1b41c15b2d65443234ccdb60565d6f6709f879) - ---- keystone-2013.2.3/keystone.egg-info/requires.txt.orig 2014-04-03 11:49:55.000000000 -0700 -+++ keystone-2013.2.3/keystone.egg-info/requires.txt 2014-05-24 23:09:25.817082422 -0700 -@@ -1,5 +1,4 @@ - pbr>=0.5.21,<1.0 --pam>=0.1.4 - WebOb>=1.2.3,<1.3 - eventlet>=0.13.0 - greenlet>=0.3.2 -@@ -15,5 +14,4 @@ - python-keystoneclient>=0.3.2 - oslo.config>=1.2.0 - Babel>=1.3 --oauth2 --dogpile.cache>=0.5.0 -\ No newline at end of file -+dogpile.cache>=0.5.0 - ---- keystone-2013.2.3/requirements.txt.orig 2014-04-03 11:47:39.000000000 -0700 -+++ keystone-2013.2.3/requirements.txt 2014-05-24 23:09:35.044573447 -0700 -@@ -1,6 +1,5 @@ - # keystone dependencies - pbr>=0.5.21,<1.0 --pam>=0.1.4 - WebOb>=1.2.3,<1.3 - eventlet>=0.13.0 - greenlet>=0.3.2 -@@ -16,5 +15,4 @@ - python-keystoneclient>=0.3.2 - oslo.config>=1.2.0 - Babel>=1.3 --oauth2 - dogpile.cache>=0.5.0 diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/patches/06-CVE-2014-3476.patch --- a/components/openstack/keystone/patches/06-CVE-2014-3476.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,341 +0,0 @@ -Upstream patch for CVE-2014-3476. This fix will be included in the -Juno-2 development milestone and in future 2013.2.4 and 2014.1.2 releases - -From 9162837329665b4316afc2270a602dc8ae11f6d2 Mon Sep 17 00:00:00 2001 -From: Adam Young -Date: Thu, 29 May 2014 13:56:17 -0400 -Subject: [PATCH] Block delegation escalation of privilege - -Forbids doing the following with either a trust - or oauth based token: - creating a trust - approving a request_token - listing request tokens - -Change-Id: I1528f9dd003f5e03cbc50b78e1b32dbbf85ffcc2 -Closes-Bug: 1324592 ---- - keystone/common/controller.py | 36 +++++++++++- - keystone/contrib/oauth1/controllers.py | 12 ++++ - keystone/tests/test_v3_auth.py | 62 ++++++++++++++++++++ - keystone/tests/test_v3_oauth1.py | 98 ++++++++++++++++++++++++++++++++ - keystone/trust/controllers.py | 9 +++ - 5 files changed, 216 insertions(+), 1 deletion(-) - -diff --git a/keystone/common/controller.py b/keystone/common/controller.py -index faadc09..d6c33df 100644 ---- a/keystone/common/controller.py -+++ b/keystone/common/controller.py -@@ -44,7 +44,7 @@ def _build_policy_check_credentials(self, action, context, kwargs): - # it would otherwise need to reload the token_ref from backing store. - wsgi.validate_token_bind(context, token_ref) - -- creds = {} -+ creds = {'is_delegated_auth': False} - if 'token_data' in token_ref and 'token' in token_ref['token_data']: - #V3 Tokens - token_data = token_ref['token_data']['token'] -@@ -66,9 +66,32 @@ def _build_policy_check_credentials(self, action, context, kwargs): - creds['roles'] = [] - for role in token_data['roles']: - creds['roles'].append(role['name']) -+ -+ trust = token_data.get('OS-TRUST:trust') -+ if trust is None: -+ creds['trust_id'] = None -+ creds['trustor_id'] = None -+ creds['trustee_id'] = None -+ else: -+ creds['trust_id'] = trust['id'] -+ creds['trustor_id'] = trust['trustor_user']['id'] -+ creds['trustee_id'] = trust['trustee_user']['id'] -+ creds['is_delegated_auth'] = True -+ -+ oauth1 = token_data.get('OS-OAUTH1') -+ if oauth1 is None: -+ creds['consumer_id'] = None -+ creds['access_token_id'] = None -+ else: -+ creds['consumer_id'] = oauth1['consumer_id'] -+ creds['access_token_id'] = oauth1['access_token_id'] -+ creds['is_delegated_auth'] = True -+ - else: - #v2 Tokens - creds = token_ref.get('metadata', {}).copy() -+ creds['is_delegated_auth'] = False -+ - try: - creds['user_id'] = token_ref['user'].get('id') - except AttributeError: -@@ -81,6 +104,16 @@ def _build_policy_check_credentials(self, action, context, kwargs): - # NOTE(vish): this is pretty inefficient - creds['roles'] = [self.identity_api.get_role(role)['name'] - for role in creds.get('roles', [])] -+ trust = token_ref.get('trust') -+ if trust is None: -+ creds['trust_id'] = None -+ creds['trustor_id'] = None -+ creds['trustee_id'] = None -+ else: -+ creds['trust_id'] = trust.get('id') -+ creds['trustor_id'] = trust.get('trustor_id') -+ creds['trustee_id'] = trust.get('trustee_id') -+ creds['is_delegated_auth'] = True - - return creds - -@@ -155,6 +188,7 @@ def protected(callback=None): - policy_dict.update(kwargs) - self.policy_api.enforce(creds, action, flatten(policy_dict)) - LOG.debug(_('RBAC: Authorization granted')) -+ context['environment'] = {'KEYSTONE_AUTH_CONTEXT': creds} - return f(self, context, *args, **kwargs) - return inner - return wrapper -diff --git a/keystone/contrib/oauth1/controllers.py b/keystone/contrib/oauth1/controllers.py -index b8c2441..d4024df 100644 ---- a/keystone/contrib/oauth1/controllers.py -+++ b/keystone/contrib/oauth1/controllers.py -@@ -86,6 +86,12 @@ class AccessTokenCrudV3(controller.V3Controller): - - @controller.protected() - def list_access_tokens(self, context, user_id): -+ auth_context = context.get('environment', -+ {}).get('KEYSTONE_AUTH_CONTEXT', {}) -+ if auth_context.get('is_delegated_auth'): -+ raise exception.Forbidden( -+ _('Cannot list request tokens' -+ ' with a token issued via delegation.')) - refs = self.oauth_api.list_access_tokens(user_id) - formatted_refs = ([self._format_token_entity(x) for x in refs]) - return AccessTokenCrudV3.wrap_collection(context, formatted_refs) -@@ -314,6 +320,12 @@ class OAuthControllerV3(controller.V3Controller): - there is not another easy way to make sure the user knows which roles - are being requested before authorizing. - """ -+ auth_context = context.get('environment', -+ {}).get('KEYSTONE_AUTH_CONTEXT', {}) -+ if auth_context.get('is_delegated_auth'): -+ raise exception.Forbidden( -+ _('Cannot authorize a request token' -+ ' with a token issued via delegation.')) - - req_token = self.oauth_api.get_request_token(request_token_id) - -diff --git a/keystone/tests/test_v3_auth.py b/keystone/tests/test_v3_auth.py -index e89e29f..f3e3ace 100644 ---- a/keystone/tests/test_v3_auth.py -+++ b/keystone/tests/test_v3_auth.py -@@ -2150,6 +2150,68 @@ class TestTrustAuth(TestAuthInfo): - self.assertEqual(r.result['token']['project']['name'], - self.project['name']) - -+ def test_impersonation_token_cannot_create_new_trust(self): -+ ref = self.new_trust_ref( -+ trustor_user_id=self.user_id, -+ trustee_user_id=self.trustee_user_id, -+ project_id=self.project_id, -+ impersonation=True, -+ expires=dict(minutes=1), -+ role_ids=[self.role_id]) -+ del ref['id'] -+ -+ r = self.post('/OS-TRUST/trusts', body={'trust': ref}) -+ trust = self.assertValidTrustResponse(r) -+ -+ auth_data = self.build_authentication_request( -+ user_id=self.trustee_user['id'], -+ password=self.trustee_user['password'], -+ trust_id=trust['id']) -+ r = self.post('/auth/tokens', body=auth_data) -+ -+ trust_token = r.headers['X-Subject-Token'] -+ -+ # Build second trust -+ ref = self.new_trust_ref( -+ trustor_user_id=self.user_id, -+ trustee_user_id=self.trustee_user_id, -+ project_id=self.project_id, -+ impersonation=True, -+ expires=dict(minutes=1), -+ role_ids=[self.role_id]) -+ del ref['id'] -+ -+ self.post('/OS-TRUST/trusts', -+ body={'trust': ref}, -+ token=trust_token, -+ expected_status=403) -+ -+ def test_delete_trust_revokes_tokens(self): -+ ref = self.new_trust_ref( -+ trustor_user_id=self.user_id, -+ trustee_user_id=self.trustee_user_id, -+ project_id=self.project_id, -+ impersonation=False, -+ expires=dict(minutes=1), -+ role_ids=[self.role_id]) -+ del ref['id'] -+ r = self.post('/OS-TRUST/trusts', body={'trust': ref}) -+ trust = self.assertValidTrustResponse(r) -+ trust_id = trust['id'] -+ auth_data = self.build_authentication_request( -+ user_id=self.trustee_user['id'], -+ password=self.trustee_user['password'], -+ trust_id=trust_id) -+ r = self.post('/auth/tokens', body=auth_data) -+ self.assertValidProjectTrustScopedTokenResponse( -+ r, self.trustee_user) -+ trust_token = r.headers['X-Subject-Token'] -+ self.delete('/OS-TRUST/trusts/%(trust_id)s' % { -+ 'trust_id': trust_id}, -+ expected_status=204) -+ headers = {'X-Subject-Token': trust_token} -+ self.head('/auth/tokens', headers=headers, expected_status=404) -+ - def test_delete_trust(self): - ref = self.new_trust_ref( - trustor_user_id=self.user_id, -diff --git a/keystone/tests/test_v3_oauth1.py b/keystone/tests/test_v3_oauth1.py -index 73a34d7..a83c86e 100644 ---- a/keystone/tests/test_v3_oauth1.py -+++ b/keystone/tests/test_v3_oauth1.py -@@ -16,6 +16,7 @@ - - import copy - import os -+import tempfile - import urlparse - import uuid - -@@ -26,6 +27,8 @@ from keystone import contrib - from keystone.contrib import oauth1 - from keystone.contrib.oauth1 import controllers - from keystone.openstack.common import importutils -+from keystone.openstack.common import jsonutils -+from keystone.policy.backends import rules - from keystone.tests import test_v3 - - -@@ -447,6 +450,101 @@ class AuthTokenTests(OAuthFlowTests): - self.assertTrue(len(tokens) > 0) - self.assertTrue(keystone_token_uuid in tokens) - -+ def _create_trust_get_token(self): -+ ref = self.new_trust_ref( -+ trustor_user_id=self.user_id, -+ trustee_user_id=self.user_id, -+ project_id=self.project_id, -+ impersonation=True, -+ expires=dict(minutes=1), -+ role_ids=[self.role_id]) -+ del ref['id'] -+ -+ r = self.post('/OS-TRUST/trusts', body={'trust': ref}) -+ trust = self.assertValidTrustResponse(r) -+ -+ auth_data = self.build_authentication_request( -+ user_id=self.user['id'], -+ password=self.user['password'], -+ trust_id=trust['id']) -+ r = self.post('/auth/tokens', body=auth_data) -+ -+ trust_token = r.headers['X-Subject-Token'] -+ return trust_token -+ -+ def _approve_request_token_url(self): -+ consumer = self._create_single_consumer() -+ consumer_id = consumer.get('id') -+ consumer_secret = consumer.get('secret') -+ self.consumer = oauth1.Consumer(consumer_id, consumer_secret) -+ self.assertIsNotNone(self.consumer.key) -+ -+ url, headers = self._create_request_token(self.consumer, -+ self.project_id) -+ content = self.post(url, headers=headers) -+ credentials = urlparse.parse_qs(content.result) -+ request_key = credentials.get('oauth_token')[0] -+ request_secret = credentials.get('oauth_token_secret')[0] -+ self.request_token = oauth1.Token(request_key, request_secret) -+ self.assertIsNotNone(self.request_token.key) -+ -+ url = self._authorize_request_token(request_key) -+ -+ return url -+ -+ def test_oauth_token_cannot_create_new_trust(self): -+ self.test_oauth_flow() -+ ref = self.new_trust_ref( -+ trustor_user_id=self.user_id, -+ trustee_user_id=self.user_id, -+ project_id=self.project_id, -+ impersonation=True, -+ expires=dict(minutes=1), -+ role_ids=[self.role_id]) -+ del ref['id'] -+ -+ self.post('/OS-TRUST/trusts', -+ body={'trust': ref}, -+ token=self.keystone_token_id, -+ expected_status=403) -+ -+ def test_oauth_token_cannot_authorize_request_token(self): -+ self.test_oauth_flow() -+ url = self._approve_request_token_url() -+ body = {'roles': [{'id': self.role_id}]} -+ self.put(url, body=body, token=self.keystone_token_id, -+ expected_status=403) -+ -+ def test_oauth_token_cannot_list_request_tokens(self): -+ self._set_policy({"identity:list_access_tokens": [], -+ "identity:create_consumer": [], -+ "identity:authorize_request_token": []}) -+ self.test_oauth_flow() -+ url = '/users/%s/OS-OAUTH1/access_tokens' % self.user_id -+ self.get(url, token=self.keystone_token_id, -+ expected_status=403) -+ -+ def _set_policy(self, new_policy): -+ _unused, self.tmpfilename = tempfile.mkstemp() -+ rules.reset() -+ self.opt(policy_file=self.tmpfilename) -+ with open(self.tmpfilename, "w") as policyfile: -+ policyfile.write(jsonutils.dumps(new_policy)) -+ self.addCleanup(os.remove, self.tmpfilename) -+ -+ def test_trust_token_cannot_authorize_request_token(self): -+ trust_token = self._create_trust_get_token() -+ url = self._approve_request_token_url() -+ body = {'roles': [{'id': self.role_id}]} -+ self.put(url, body=body, token=trust_token, expected_status=403) -+ -+ def test_trust_token_cannot_list_request_tokens(self): -+ self._set_policy({"identity:list_access_tokens": [], -+ "identity:create_trust": []}) -+ trust_token = self._create_trust_get_token() -+ url = '/users/%s/OS-OAUTH1/access_tokens' % self.user_id -+ self.get(url, token=trust_token, expected_status=403) -+ - - class MaliciousOAuth1Tests(OAuth1Tests): - -diff --git a/keystone/trust/controllers.py b/keystone/trust/controllers.py -index 1d54f51..7fdc8c2 100644 ---- a/keystone/trust/controllers.py -+++ b/keystone/trust/controllers.py -@@ -144,6 +144,15 @@ class TrustV3(controller.V3Controller): - - # TODO(ayoung): instead of raising ValidationError on the first - # problem, return a collection of all the problems. -+ -+ # Explicitly prevent a trust token from creating a new trust. -+ auth_context = context.get('environment', -+ {}).get('KEYSTONE_AUTH_CONTEXT', {}) -+ if auth_context.get('is_delegated_auth'): -+ raise exception.Forbidden( -+ _('Cannot create a trust' -+ ' with a token issued via delegation.')) -+ - if not trust: - raise exception.ValidationError(attribute='trust', - target='request') diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/patches/07-CVE-2014-3520.patch --- a/components/openstack/keystone/patches/07-CVE-2014-3520.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -This upstream patch addresses CVE-2014-3520 and is tracked under -Launchpad bug 1331912. It is addressed in Icehouse 2014.1.2 and Havana -2013.2.4. - -commit 96d9bcf230a74d6122a2b14e00ef10915c8f76e3 -Author: Jamie Lennox -Date: Thu Jun 19 14:41:22 2014 +1000 - - Ensure that in v2 auth tenant_id matches trust - - Previously if a trustee requests a trust scoped token for a project that - is different to the one in the trust, however the trustor has the - appropriate roles then a token would be issued. - - Ensure that the trust that was given matches the project that was - specified in the scope. - - (cherry picked from commit 1556faec2f65dba60584f0a9657d5b717a6ede3a) - - Closes-Bug: #1331912 - Change-Id: I00ad783bcb93cea9e5622965f81b91c80f4570cc - -diff --git a/keystone/tests/test_auth.py b/keystone/tests/test_auth.py -index 6371caf..0d97f44 100644 ---- a/keystone/tests/test_auth.py -+++ b/keystone/tests/test_auth.py -@@ -624,13 +624,15 @@ class AuthWithTrust(AuthTest): - self.new_trust = self.trust_controller.create_trust( - context, trust=trust_data)['trust'] - -- def build_v2_token_request(self, username, password): -+ def build_v2_token_request(self, username, password, tenant_id=None): -+ if not tenant_id: -+ tenant_id = self.tenant_bar['id'] - body_dict = _build_user_auth(username=username, password=password) - self.unscoped_token = self.controller.authenticate({}, body_dict) - unscoped_token_id = self.unscoped_token['access']['token']['id'] - request_body = _build_user_auth(token={'id': unscoped_token_id}, - trust_id=self.new_trust['id'], -- tenant_id=self.tenant_bar['id']) -+ tenant_id=tenant_id) - return request_body - - def test_create_trust_bad_data_fails(self): -@@ -704,6 +706,15 @@ class AuthWithTrust(AuthTest): - exception.Forbidden, - self.controller.authenticate, {}, request_body) - -+ def test_token_from_trust_wrong_project_fails(self): -+ for assigned_role in self.assigned_roles: -+ self.assignment_api.add_role_to_user_and_project( -+ self.trustor['id'], self.tenant_baz['id'], assigned_role) -+ request_body = self.build_v2_token_request('TWO', 'two2', -+ self.tenant_baz['id']) -+ self.assertRaises(exception.Forbidden, self.controller.authenticate, -+ {}, request_body) -+ - def fetch_v2_token_from_trust(self): - request_body = self.build_v2_token_request('TWO', 'two2') - auth_response = self.controller.authenticate({}, request_body) -diff --git a/keystone/token/controllers.py b/keystone/token/controllers.py -index 72486a1..de7e473 100644 ---- a/keystone/token/controllers.py -+++ b/keystone/token/controllers.py -@@ -160,6 +160,8 @@ class Auth(controller.V2Controller): - - user_ref = old_token_ref['user'] - user_id = user_ref['id'] -+ tenant_id = self._get_project_id_from_auth(auth) -+ - if not CONF.trust.enabled and 'trust_id' in auth: - raise exception.Forbidden('Trusts are disabled.') - elif CONF.trust.enabled and 'trust_id' in auth: -@@ -168,6 +170,9 @@ class Auth(controller.V2Controller): - raise exception.Forbidden() - if user_id != trust_ref['trustee_user_id']: - raise exception.Forbidden() -+ if (trust_ref['project_id'] and -+ tenant_id != trust_ref['project_id']): -+ raise exception.Forbidden() - if ('expires' in trust_ref) and (trust_ref['expires']): - expiry = trust_ref['expires'] - if expiry < timeutils.parse_isotime(timeutils.isotime()): -@@ -190,7 +195,6 @@ class Auth(controller.V2Controller): - current_user_ref = self.identity_api.get_user(user_id) - - metadata_ref = {} -- tenant_id = self._get_project_id_from_auth(auth) - tenant_ref, metadata_ref['roles'] = self._get_project_roles_and_ref( - user_id, tenant_id) - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/patches/08-CVE-2014-3621.patch --- a/components/openstack/keystone/patches/08-CVE-2014-3621.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,184 +0,0 @@ -This upstream patch addresses CVE-2014-3621 and is tracked under -Launchpad bug 1354208. It is addressed in Icehouse 2014.1.3 and -Havana 2013.2.4 - -From 52714633c9a4dae5e60279217090859aa6dbcb4f Mon Sep 17 00:00:00 2001 -From: David Stanek -Date: Fri, 15 Aug 2014 13:30:33 -0500 -Subject: [PATCH] Adds a whitelist for endpoint catalog substitution - -Change-Id: If02327d70d0143d805969fe927898f08eb84c4c2 -Closes-Bug: #1354208 ---- - etc/keystone.conf.sample | 7 ++++ - keystone/catalog/core.py | 4 ++ - keystone/common/config.py | 14 ++++++- - keystone/common/utils.py | 12 ++++++ - keystone/tests/unit/catalog/test_core.py | 62 ++++++++++++++++++++++++++++++ - 5 files changed, 97 insertions(+), 2 deletions(-) - create mode 100644 keystone/tests/unit/__init__.py - create mode 100644 keystone/tests/unit/catalog/__init__.py - create mode 100644 keystone/tests/unit/catalog/test_core.py - -diff --git a/etc/keystone.conf.sample b/etc/keystone.conf.sample -index d7e1c44..c24f8ff 100644 ---- a/etc/keystone.conf.sample -+++ b/etc/keystone.conf.sample -@@ -190,6 +190,13 @@ - - # template_file = default_catalog.templates - -+# (Deprecated) List of possible substitutions for use in -+# formatting endpoints. Use caution when modifying this list. -+# It will give users with permission to create endpoints the -+# ability to see those values in your configuration file. This -+# option will be removed in Juno. (list value) -+#endpoint_substitution_whitelist=tenant_id,user_id,public_bind_host,admin_bind_hostompute_hostompute_port,admin_port,public_port,public_endpoint,admin_endpoint -+ - [endpoint_filter] - # extension for creating associations between project and endpoints in order to - # provide a tailored catalog for project-scoped token requests. -diff --git a/keystone/catalog/core.py b/keystone/catalog/core.py -index 7cc49d5..ebd56ed 100644 ---- a/keystone/catalog/core.py -+++ b/keystone/catalog/core.py -@@ -19,6 +19,7 @@ - - from keystone.common import dependency - from keystone.common import manager -+from keystone.common import utils - from keystone import config - from keystone import exception - from keystone.openstack.common import log as logging -@@ -30,6 +31,9 @@ LOG = logging.getLogger(__name__) - - def format_url(url, data): - """Safely string formats a user-defined URL with the given data.""" -+ data = utils.WhiteListedItemFilter( -+ CONF.catalog.endpoint_substitution_whitelist, -+ data) - try: - result = url.replace('$(', '%(') % data - except AttributeError: -diff --git a/keystone/common/config.py b/keystone/common/config.py -index f1a7b74..7199c43 100644 ---- a/keystone/common/config.py -+++ b/keystone/common/config.py -@@ -260,8 +260,18 @@ FILE_OPTIONS = { - cfg.StrOpt('template_file', - default='default_catalog.templates'), - cfg.StrOpt('driver', -- default='keystone.catalog.backends.sql.Catalog')]} -- -+ default='keystone.catalog.backends.sql.Catalog'), -+ cfg.ListOpt('endpoint_substitution_whitelist', -+ default=['tenant_id', 'user_id', 'public_bind_host', -+ 'admin_bind_host', 'compute_host', 'compute_port', -+ 'admin_port', 'public_port', 'public_endpoint', -+ 'admin_endpoint'], -+ help='(Deprecated) List of possible substitutions for use ' -+ 'in formatting endpoints. Use caution when modifying ' -+ 'this list. It will give users with permission to ' -+ 'create endpoints the ability to see those values ' -+ 'in your configuration file. This option will be ' -+ 'removed in Juno.')]} - - CONF = cfg.CONF - -diff --git a/keystone/common/utils.py b/keystone/common/utils.py -index 402f8a2..3d4a62a 100644 ---- a/keystone/common/utils.py -+++ b/keystone/common/utils.py -@@ -516,3 +516,15 @@ def make_dirs(path, mode=None, user=None, group=None, log=None): - raise EnvironmentError("makedirs('%s'): %s" % (path, exc.strerror)) - - set_permissions(path, mode, user, group, log) -+ -+ -+class WhiteListedItemFilter(object): -+ -+ def __init__(self, whitelist, data): -+ self._whitelist = set(whitelist or []) -+ self._data = data -+ -+ def __getitem__(self, name): -+ if name not in self._whitelist: -+ raise KeyError -+ return self._data[name] -diff --git a/keystone/tests/unit/__init__.py b/keystone/tests/unit/__init__.py -new file mode 100644 -index 0000000..e69de29 -diff --git a/keystone/tests/unit/catalog/__init__.py b/keystone/tests/unit/catalog/__init__.py -new file mode 100644 -index 0000000..e69de29 -diff --git a/keystone/tests/unit/catalog/test_core.py b/keystone/tests/unit/catalog/test_core.py -new file mode 100644 -index 0000000..b4372b9 ---- /dev/null -+++ b/keystone/tests/unit/catalog/test_core.py -@@ -0,0 +1,62 @@ -+# Licensed under the Apache License, Version 2.0 (the "License"); you may -+# not use this file except in compliance with the License. You may obtain -+# a copy of the License at -+# -+# http://www.apache.org/licenses/LICENSE-2.0 -+# -+# Unless required by applicable law or agreed to in writing, software -+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -+# 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 keystone.catalog import core -+from keystone import config -+from keystone import exception -+from keystone import tests -+ -+ -+CONF = config.CONF -+ -+ -+class FormatUrlTests(tests.TestCase): -+ -+ def setUp(self): -+ super(FormatUrlTests, self).setUp() -+ whitelist = ['host', 'port', 'part1', 'part2'] -+ self.opt_in_group('catalog', endpoint_substitution_whitelist=whitelist) -+ -+ def test_successful_formatting(self): -+ url_template = 'http://%(host)s:%(port)d/%(part1)s/%(part2)s' -+ values = {'host': 'server', 'port': 9090, 'part1': 'A', 'part2': 'B'} -+ actual_url = core.format_url(url_template, values) -+ -+ expected_url = 'http://server:9090/A/B' -+ self.assertEqual(actual_url, expected_url) -+ -+ def test_raises_malformed_on_missing_key(self): -+ self.assertRaises(exception.MalformedEndpoint, -+ core.format_url, -+ "http://%(foo)s/%(bar)s", -+ {"foo": "1"}) -+ -+ def test_raises_malformed_on_wrong_type(self): -+ self.assertRaises(exception.MalformedEndpoint, -+ core.format_url, -+ "http://%foo%s", -+ {"foo": "1"}) -+ -+ def test_raises_malformed_on_incomplete_format(self): -+ self.assertRaises(exception.MalformedEndpoint, -+ core.format_url, -+ "http://%(foo)", -+ {"foo": "1"}) -+ -+ def test_substitution_with_key_not_whitelisted(self): -+ url_template = 'http://%(host)s:%(port)d/%(part1)s/%(part2)s/%(part3)s' -+ values = {'host': 'server', 'port': 9090, -+ 'part1': 'A', 'part2': 'B', 'part3': 'C'} -+ self.assertRaises(exception.MalformedEndpoint, -+ core.format_url, -+ url_template, -+ values) --- -1.7.9.5 - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/patches/launchpad-1384775.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/keystone/patches/launchpad-1384775.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,34 @@ +commit 8bd0f6ecd882a3119acb5fd7a760122c8931db94 +Author: wanghong +Date: Sat Oct 25 10:26:55 2014 +0800 + + default revoke driver should be the non-deprecated driver + + Have checked other config options that default is not the deprecated + option, others are OK. + + Change-Id: Ie6e7351114d79eb25b392faaa0e6376c24c45fa0 + Closes-Bug: #1384775 + +--- keystone-2014.2.2/etc/keystone.conf.sample.~1~ 2014-12-04 21:03:56.000000000 -0800 ++++ keystone-2014.2.2/etc/keystone.conf.sample 2015-01-25 17:25:46.677132074 -0800 +@@ -1332,7 +1332,7 @@ + + # An implementation of the backend for persisting revocation + # events. (string value) +-#driver=keystone.contrib.revoke.backends.kvs.Revoke ++#driver=keystone.contrib.revoke.backends.sql.Revoke + + # This value (calculated in seconds) is added to token + # expiration before a revocation event may be removed from the +--- keystone-2014.2.2/keystone/common/config.py.~1~ 2014-12-04 21:03:56.000000000 -0800 ++++ keystone-2014.2.2/keystone/common/config.py 2015-01-25 17:25:46.677474875 -0800 +@@ -275,7 +275,7 @@ FILE_OPTIONS = { + ], + 'revoke': [ + cfg.StrOpt('driver', +- default='keystone.contrib.revoke.backends.kvs.Revoke', ++ default='keystone.contrib.revoke.backends.sql.Revoke', + help='An implementation of the backend for persisting ' + 'revocation events.'), + cfg.IntOpt('expiration_buffer', default=1800, diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/patches/launchpad-1404354.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/keystone/patches/launchpad-1404354.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,32 @@ +commit 600c236e2111a770e478040a8a78bb62ef27ac39 +Author: Brant Knudson +Date: Fri Dec 19 14:11:00 2014 -0600 + + Fix to not use empty IN clause + + When an empty IN clause is used with sqlalchemy, a warning is + printed: + + SAWarning: The IN-predicate on "assignment.actor_id" was invoked + with an empty sequence. ... + + With this fix, these warnings should no longer be printed. + + The tests are changed to convert these warnings into errors. + + Change-Id: I58c7e5f11fdac9bbc1e9a970ce690ea113e2bd95 + Closes-Bug: #1404354 + +--- keystone-2014.2.2/keystone/assignment/backends/sql.py.orig 2014-12-04 21:03:56.000000000 -0800 ++++ keystone-2014.2.2/keystone/assignment/backends/sql.py 2015-01-25 20:44:40.377007906 -0800 +@@ -356,6 +356,10 @@ class Assignment(keystone_assignment.Dri + + def _get_group_project_roles(self, session, groups, project_id, + project_domain_id): ++ if not groups: ++ # If there's no groups then there will be no project roles. ++ return [] ++ + sql_constraints = sqlalchemy.and_( + RoleAssignment.type == AssignmentType.GROUP_PROJECT, + RoleAssignment.target_id == project_id) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/patches/requirements.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/keystone/patches/requirements.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,56 @@ +In-house patch to remove unnecessary dependencies from Keystone's +requirements files. The specific reasons are as follows: + +oslo.serialization Not applicable + +paste Not applicable + +posix_ipc Not applicable + +--- keystone-2014.2.2/keystone.egg-info/requires.txt.~1~ 2015-02-05 06:56:18.000000000 -0800 ++++ keystone-2014.2.2/keystone.egg-info/requires.txt 2015-02-24 22:46:53.872644685 -0800 +@@ -4,7 +4,6 @@ eventlet>=0.15.1,<0.16.0 + greenlet>=0.3.2 + netaddr>=0.7.12 + PasteDeploy>=1.5.0 +-Paste + Routes>=1.12.3,!=2.0 + six>=1.7.0 + SQLAlchemy>=0.8.4,<=0.9.99,!=0.9.0,!=0.9.1,!=0.9.2,!=0.9.3,!=0.9.4,!=0.9.5,!=0.9.6 +@@ -17,11 +16,9 @@ oslo.config>=1.4.0 # Apache-2.0 + oslo.messaging>=1.4.0,!=1.5.0,<1.6.0 + oslo.db>=1.0.0,<1.1 # Apache-2.0 + oslo.i18n>=1.0.0 # Apache-2.0 +-oslo.serialization>=1.0.0 # Apache-2.0 + oslo.utils>=1.0.0 # Apache-2.0 + Babel>=1.3 + oauthlib>=0.6 + dogpile.cache>=0.5.3 + jsonschema>=2.0.0,<3.0.0 +-pycadf>=0.6.0 +-posix_ipc ++pycadf>=0.6.0 +\ No newline at end of file +--- keystone-2014.2.2/requirements.txt.~1~ 2015-02-05 06:53:51.000000000 -0800 ++++ keystone-2014.2.2/requirements.txt 2015-02-24 22:46:14.319449987 -0800 +@@ -9,7 +9,6 @@ eventlet>=0.15.1,<0.16.0 + greenlet>=0.3.2 + netaddr>=0.7.12 + PasteDeploy>=1.5.0 +-Paste + Routes>=1.12.3,!=2.0 + six>=1.7.0 + SQLAlchemy>=0.8.4,<=0.9.99,!=0.9.0,!=0.9.1,!=0.9.2,!=0.9.3,!=0.9.4,!=0.9.5,!=0.9.6 +@@ -22,12 +21,9 @@ oslo.config>=1.4.0 # Apache-2.0 + oslo.messaging>=1.4.0,!=1.5.0,<1.6.0 + oslo.db>=1.0.0,<1.1 # Apache-2.0 + oslo.i18n>=1.0.0 # Apache-2.0 +-# only for Keystone tests running against keystoneclient master +-oslo.serialization>=1.0.0 # Apache-2.0 + oslo.utils>=1.0.0 # Apache-2.0 + Babel>=1.3 + oauthlib>=0.6 + dogpile.cache>=0.5.3 + jsonschema>=2.0.0,<3.0.0 + pycadf>=0.6.0 +-posix_ipc diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/patches/sample-data.sh.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/keystone/patches/sample-data.sh.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,199 @@ +In-house patch to the sample_data.sh script installed in +/usr/demo/openstack/keystone in order to support all of the standard +services and to allow customization of the individual service +endpoints. Solaris-specific patch and is not suitable for upstream + +It also includes a change to use the standard Solaris tr(1) rather than +GNU sed. + +--- keystone-2014.2.rc1/tools/sample_data.sh.~1~ 2014-09-30 00:14:14.000000000 -0700 ++++ keystone-2014.2.rc1/tools/sample_data.sh 2014-10-13 00:53:30.614564163 -0700 +@@ -2,6 +2,8 @@ + + # Copyright 2013 OpenStack Foundation + # ++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++# + # Licensed under the Apache License, Version 2.0 (the "License"); you may + # not use this file except in compliance with the License. You may obtain + # a copy of the License at +@@ -36,22 +38,47 @@ + # service nova admin + # service ec2 admin + # service swift admin ++# service cinder admin ++# service neutron admin + + # By default, passwords used are those in the OpenStack Install and Deploy Manual. + # One can override these (publicly known, and hence, insecure) passwords by setting the appropriate + # environment variables. A common default password for all the services can be used by + # setting the "SERVICE_PASSWORD" environment variable. + ++PATH=/usr/bin ++ + ADMIN_PASSWORD=${ADMIN_PASSWORD:-secrete} + NOVA_PASSWORD=${NOVA_PASSWORD:-${SERVICE_PASSWORD:-nova}} + GLANCE_PASSWORD=${GLANCE_PASSWORD:-${SERVICE_PASSWORD:-glance}} + EC2_PASSWORD=${EC2_PASSWORD:-${SERVICE_PASSWORD:-ec2}} +-SWIFT_PASSWORD=${SWIFT_PASSWORD:-${SERVICE_PASSWORD:-swiftpass}} ++SWIFT_PASSWORD=${SWIFT_PASSWORD:-${SERVICE_PASSWORD:-swift}} ++CINDER_PASSWORD=${CINDER_PASSWORD:-${SERVICE_PASSWORD:-cinder}} ++NEUTRON_PASSWORD=${NEUTRON_PASSWORD:-${SERVICE_PASSWORD:-neutron}} + + CONTROLLER_PUBLIC_ADDRESS=${CONTROLLER_PUBLIC_ADDRESS:-localhost} + CONTROLLER_ADMIN_ADDRESS=${CONTROLLER_ADMIN_ADDRESS:-localhost} + CONTROLLER_INTERNAL_ADDRESS=${CONTROLLER_INTERNAL_ADDRESS:-localhost} + ++NOVA_PUBLIC_ADDRESS=${NOVA_PUBLIC_ADDRESS:-$CONTROLLER_PUBLIC_ADDRESS} ++NOVA_ADMIN_ADDRESS=${NOVA_ADMIN_ADDRESS:-$CONTROLLER_ADMIN_ADDRESS} ++NOVA_INTERNAL_ADDRESS=${NOVA_INTERNAL_ADDRESS:-$CONTROLLER_INTERNAL_ADDRESS} ++GLANCE_PUBLIC_ADDRESS=${GLANCE_PUBLIC_ADDRESS:-$CONTROLLER_PUBLIC_ADDRESS} ++GLANCE_ADMIN_ADDRESS=${GLANCE_ADMIN_ADDRESS:-$CONTROLLER_ADMIN_ADDRESS} ++GLANCE_INTERNAL_ADDRESS=${GLANCE_INTERNAL_ADDRESS:-$CONTROLLER_INTERNAL_ADDRESS} ++EC2_PUBLIC_ADDRESS=${EC2_PUBLIC_ADDRESS:-$CONTROLLER_PUBLIC_ADDRESS} ++EC2_ADMIN_ADDRESS=${EC2_ADMIN_ADDRESS:-$CONTROLLER_ADMIN_ADDRESS} ++EC2_INTERNAL_ADDRESS=${EC2_INTERNAL_ADDRESS:-$CONTROLLER_INTERNAL_ADDRESS} ++SWIFT_PUBLIC_ADDRESS=${SWIFT_PUBLIC_ADDRESS:-$CONTROLLER_PUBLIC_ADDRESS} ++SWIFT_ADMIN_ADDRESS=${SWIFT_ADMIN_ADDRESS:-$CONTROLLER_ADMIN_ADDRESS} ++SWIFT_INTERNAL_ADDRESS=${SWIFT_INTERNAL_ADDRESS:-$CONTROLLER_INTERNAL_ADDRESS} ++CINDER_PUBLIC_ADDRESS=${CINDER_PUBLIC_ADDRESS:-$CONTROLLER_PUBLIC_ADDRESS} ++CINDER_ADMIN_ADDRESS=${CINDER_ADMIN_ADDRESS:-$CONTROLLER_ADMIN_ADDRESS} ++CINDER_INTERNAL_ADDRESS=${CINDER_INTERNAL_ADDRESS:-$CONTROLLER_INTERNAL_ADDRESS} ++NEUTRON_PUBLIC_ADDRESS=${NEUTRON_PUBLIC_ADDRESS:-$CONTROLLER_PUBLIC_ADDRESS} ++NEUTRON_ADMIN_ADDRESS=${NEUTRON_ADMIN_ADDRESS:-$CONTROLLER_ADMIN_ADDRESS} ++NEUTRON_INTERNAL_ADDRESS=${NEUTRON_INTERNAL_ADDRESS:-$CONTROLLER_INTERNAL_ADDRESS} ++ + TOOLS_DIR=$(cd $(dirname "$0") && pwd) + KEYSTONE_CONF=${KEYSTONE_CONF:-/etc/keystone/keystone.conf} + if [[ -r "$KEYSTONE_CONF" ]]; then +@@ -67,8 +94,8 @@ fi + + # Extract some info from Keystone's configuration file + if [[ -r "$KEYSTONE_CONF" ]]; then +- CONFIG_SERVICE_TOKEN=$(sed 's/[[:space:]]//g' $KEYSTONE_CONF | grep ^admin_token= | cut -d'=' -f2) +- CONFIG_ADMIN_PORT=$(sed 's/[[:space:]]//g' $KEYSTONE_CONF | grep ^admin_port= | cut -d'=' -f2) ++ CONFIG_SERVICE_TOKEN=$(tr -d '[\t ]' < $KEYSTONE_CONF | grep ^admin_token= | cut -d'=' -f2) ++ CONFIG_ADMIN_PORT=$(tr -d '[\t ]' < $KEYSTONE_CONF | grep ^admin_port= | cut -d'=' -f2) + fi + + export OS_SERVICE_TOKEN=${OS_SERVICE_TOKEN:-$CONFIG_SERVICE_TOKEN} +@@ -136,6 +163,22 @@ keystone user-role-add --user-id $SWIFT_ + --role-id $ADMIN_ROLE \ + --tenant-id $SERVICE_TENANT + ++CINDER_USER=$(get_id keystone user-create --name=cinder \ ++ --pass="${CINDER_PASSWORD}" \ ++ --tenant-id $SERVICE_TENANT) ++ ++keystone user-role-add --user-id $CINDER_USER \ ++ --role-id $ADMIN_ROLE \ ++ --tenant-id $SERVICE_TENANT ++ ++NEUTRON_USER=$(get_id keystone user-create --name=neutron \ ++ --pass="${NEUTRON_PASSWORD}" \ ++ --tenant-id $SERVICE_TENANT) ++ ++keystone user-role-add --user-id $NEUTRON_USER \ ++ --role-id $ADMIN_ROLE \ ++ --tenant-id $SERVICE_TENANT ++ + # + # Keystone service + # +@@ -159,23 +202,23 @@ keystone service-create --name=nova \ + --description="Nova Compute Service") + if [[ -z "$DISABLE_ENDPOINTS" ]]; then + keystone endpoint-create --region RegionOne --service-id $NOVA_SERVICE \ +- --publicurl "http://$CONTROLLER_PUBLIC_ADDRESS:8774/v2/\$(tenant_id)s" \ +- --adminurl "http://$CONTROLLER_ADMIN_ADDRESS:8774/v2/\$(tenant_id)s" \ +- --internalurl "http://$CONTROLLER_INTERNAL_ADDRESS:8774/v2/\$(tenant_id)s" ++ --publicurl "http://$NOVA_PUBLIC_ADDRESS:8774/v2/\$(tenant_id)s" \ ++ --adminurl "http://$NOVA_ADMIN_ADDRESS:8774/v2/\$(tenant_id)s" \ ++ --internalurl "http://$NOVA_INTERNAL_ADDRESS:8774/v2/\$(tenant_id)s" + fi + + # + # Volume service + # + VOLUME_SERVICE=$(get_id \ +-keystone service-create --name=volume \ ++keystone service-create --name=cinder \ + --type=volume \ +- --description="Nova Volume Service") ++ --description="Cinder Volume Service") + if [[ -z "$DISABLE_ENDPOINTS" ]]; then + keystone endpoint-create --region RegionOne --service-id $VOLUME_SERVICE \ +- --publicurl "http://$CONTROLLER_PUBLIC_ADDRESS:8776/v1/\$(tenant_id)s" \ +- --adminurl "http://$CONTROLLER_ADMIN_ADDRESS:8776/v1/\$(tenant_id)s" \ +- --internalurl "http://$CONTROLLER_INTERNAL_ADDRESS:8776/v1/\$(tenant_id)s" ++ --publicurl "http://$CINDER_PUBLIC_ADDRESS:8776/v1/\$(tenant_id)s" \ ++ --adminurl "http://$CINDER_ADMIN_ADDRESS:8776/v1/\$(tenant_id)s" \ ++ --internalurl "http://$CINDER_INTERNAL_ADDRESS:8776/v1/\$(tenant_id)s" + fi + + # +@@ -187,9 +230,9 @@ keystone service-create --name=glance \ + --description="Glance Image Service") + if [[ -z "$DISABLE_ENDPOINTS" ]]; then + keystone endpoint-create --region RegionOne --service-id $GLANCE_SERVICE \ +- --publicurl "http://$CONTROLLER_PUBLIC_ADDRESS:9292" \ +- --adminurl "http://$CONTROLLER_ADMIN_ADDRESS:9292" \ +- --internalurl "http://$CONTROLLER_INTERNAL_ADDRESS:9292" ++ --publicurl "http://$GLANCE_PUBLIC_ADDRESS:9292" \ ++ --adminurl "http://$GLANCE_ADMIN_ADDRESS:9292" \ ++ --internalurl "http://$GLANCE_INTERNAL_ADDRESS:9292" + fi + + # +@@ -201,9 +244,9 @@ keystone service-create --name=ec2 \ + --description="EC2 Compatibility Layer") + if [[ -z "$DISABLE_ENDPOINTS" ]]; then + keystone endpoint-create --region RegionOne --service-id $EC2_SERVICE \ +- --publicurl "http://$CONTROLLER_PUBLIC_ADDRESS:8773/services/Cloud" \ +- --adminurl "http://$CONTROLLER_ADMIN_ADDRESS:8773/services/Admin" \ +- --internalurl "http://$CONTROLLER_INTERNAL_ADDRESS:8773/services/Cloud" ++ --publicurl "http://$EC2_PUBLIC_ADDRESS:8773/services/Cloud" \ ++ --adminurl "http://$EC2_ADMIN_ADDRESS:8773/services/Admin" \ ++ --internalurl "http://$EC2_INTERNAL_ADDRESS:8773/services/Cloud" + fi + + # +@@ -212,15 +255,34 @@ fi + SWIFT_SERVICE=$(get_id \ + keystone service-create --name=swift \ + --type="object-store" \ +- --description="Swift Service") ++ --description="Swift Object Store Service") + if [[ -z "$DISABLE_ENDPOINTS" ]]; then + keystone endpoint-create --region RegionOne --service-id $SWIFT_SERVICE \ +- --publicurl "http://$CONTROLLER_PUBLIC_ADDRESS:8080/v1/AUTH_\$(tenant_id)s" \ +- --adminurl "http://$CONTROLLER_ADMIN_ADDRESS:8080/v1" \ +- --internalurl "http://$CONTROLLER_INTERNAL_ADDRESS:8080/v1/AUTH_\$(tenant_id)s" ++ --publicurl "http://$SWIFT_PUBLIC_ADDRESS:8080/v1/AUTH_\$(tenant_id)s" \ ++ --adminurl "http://$SWIFT_ADMIN_ADDRESS:8080/v1" \ ++ --internalurl "http://$SWIFT_INTERNAL_ADDRESS:8080/v1/AUTH_\$(tenant_id)s" ++fi ++ ++# ++# Neutron service ++# ++NEUTRON_SERVICE=$(get_id \ ++keystone service-create --name=neutron \ ++ --type=network \ ++ --description="Neutron Network Service") ++if [[ -z "$DISABLE_ENDPOINTS" ]]; then ++ keystone endpoint-create --region RegionOne --service-id $NEUTRON_SERVICE \ ++ --publicurl "http://$NEUTRON_PUBLIC_ADDRESS:9696/" \ ++ --adminurl "http://$NEUTRON_ADMIN_ADDRESS:9696/" \ ++ --internalurl "http://$NEUTRON_INTERNAL_ADDRESS:9696/" + fi + + # create ec2 creds and parse the secret and access key returned ++unset SERVICE_ENDPOINT SERVICE_TOKEN ++export OS_AUTH_URL=http://localhost:5000/v2.0 ++export OS_PASSWORD="${ADMIN_PASSWORD}" ++export OS_TENANT_NAME=demo ++export OS_USERNAME=admin + RESULT=$(keystone ec2-credentials-create --tenant-id=$SERVICE_TENANT --user-id=$ADMIN_USER) + ADMIN_ACCESS=`echo "$RESULT" | grep access | awk '{print $4}'` + ADMIN_SECRET=`echo "$RESULT" | grep secret | awk '{print $4}'` diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/keystone/resolve.deps --- a/components/openstack/keystone/resolve.deps Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/keystone/resolve.deps Mon Apr 20 12:35:51 2015 -0700 @@ -1,12 +1,9 @@ -library/python-2/eventlet-26 -library/python-2/oslo.config-26 -library/python-2/pbr-26 +library/python-2/python-mysql-26 library/python-2/sqlalchemy-26 library/python-2/sqlalchemy-migrate-26 -library/python/eventlet-26 +library/python/iniparse-26 library/python/oslo.config-26 library/python/pbr-26 -library/python/sqlalchemy-26 -library/python/sqlalchemy-migrate-26 +library/security/openssl runtime/python-26 system/core-os diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/Makefile --- a/components/openstack/neutron/Makefile Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/Makefile Mon Apr 20 12:35:51 2015 -0700 @@ -20,25 +20,29 @@ # # -# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. # + include ../../../make-rules/shared-macros.mk COMPONENT_NAME= neutron -COMPONENT_CODENAME= havana -COMPONENT_VERSION= 2013.2.3 +COMPONENT_CODENAME= juno +COMPONENT_VERSION= 2014.2.2 +COMPONENT_BE_VERSION= 2014.2 COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION) COMPONENT_ARCHIVE= $(COMPONENT_SRC).tar.gz COMPONENT_ARCHIVE_HASH= \ - sha256:116cc2ce9f2f5b2dcbd5a314d78a496b180a148dadd02a076ff664b0f3c20cd3 + sha256:6b0509f7bc12a52ef4e90e1464720cd240eb93f0db2eef7d109d51fdb836a412 COMPONENT_ARCHIVE_URL= http://launchpad.net/$(COMPONENT_NAME)/$(COMPONENT_CODENAME)/$(COMPONENT_VERSION)/+download/$(COMPONENT_ARCHIVE) COMPONENT_PROJECT_URL= http://www.openstack.org/ COMPONENT_BUGDB= service/neutron -IPS_COMPONENT_VERSION= 0.$(COMPONENT_VERSION) +IPS_COMPONENT_VERSION= 0.$(COMPONENT_VERSION) + +TPNO= 21824 -include $(WS_TOP)/make-rules/prep.mk -include $(WS_TOP)/make-rules/setup.py.mk -include $(WS_TOP)/make-rules/ips.mk +include $(WS_MAKE_RULES)/prep.mk +include $(WS_MAKE_RULES)/setup.py.mk +include $(WS_MAKE_RULES)/ips.mk ASLR_MODE = $(ASLR_NOT_APPLICABLE) @@ -46,30 +50,43 @@ # only need to deliver one version. The manifest is parameterized, though. PYTHON_VERSIONS= 2.6 +PKG_MACROS += COMPONENT_BE_VERSION=$(COMPONENT_BE_VERSION) PKG_MACROS += PYVER=$(PYTHON_VERSIONS) +PKG_MACROS += PYV=$(shell echo $(PYTHON_VERSIONS) | tr -d .) # move all the proper files into place and construct .pyc files for them COMPONENT_POST_BUILD_ACTION += \ - ($(MKDIR) $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/agent; \ + ($(MKDIR) $(PROTO_DIR)/lib/svc/manifest/application/openstack; \ + $(CP) \ + files/neutron-dhcp-agent.xml \ + files/neutron-l3-agent.xml \ + files/neutron-metadata-agent.xml \ + files/neutron-server.xml \ + files/neutron-upgrade.xml \ + $(PROTO_DIR)/lib/svc/manifest/application/openstack; \ + $(MKDIR) $(PROTO_DIR)/usr/lib/neutron; \ + $(CP) files/evs/migrate/evs-neutron-migration.py \ + $(PROTO_DIR)/usr/lib/neutron/evs-neutron-migration; \ + $(MKDIR) $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/agent; \ $(CP) files/agent/evs_l3_agent.py $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/agent; \ $(MKDIR) $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/agent/solaris; \ - $(CP) files/agent/solaris/__init__.py $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/agent/solaris; \ - $(CP) files/agent/solaris/dhcp.py $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/agent/solaris; \ - $(CP) files/agent/solaris/interface.py $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/agent/solaris; \ - $(CP) files/agent/solaris/ipfilters_manager.py $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/agent/solaris; \ - $(CP) files/agent/solaris/net_lib.py $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/agent/solaris; \ + $(CP) \ + files/agent/solaris/__init__.py \ + files/agent/solaris/dhcp.py \ + files/agent/solaris/interface.py \ + files/agent/solaris/ipfilters_manager.py \ + files/agent/solaris/net_lib.py \ + files/agent/solaris/ra.py \ + $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/agent/solaris; \ $(MKDIR) $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/plugins/evs; \ $(TOUCH) $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/plugins/evs/__init__.py; \ $(CP) files/evs/plugin.py $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/plugins/evs; \ - $(MKDIR) $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/plugins/evs/db; \ - $(TOUCH) $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/plugins/evs/db/__init__.py; \ - $(CP) files/evs/db/api.py $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/plugins/evs/db; \ - $(CP) files/evs/db/l3nat.py $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/plugins/evs/db; \ - $(CP) files/evs/db/quotas_db.py $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/plugins/evs/db) - + $(MKDIR) $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/plugins/evs/migrate; \ + $(CP) files/evs/migrate/__init__.py $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/plugins/evs/migrate; \ + $(CP) files/evs/migrate/havana_api.py $(PROTO_DIR)/usr/lib/python$(PYTHON_VERSION)/vendor-packages/neutron/plugins/evs/migrate) COMPONENT_POST_INSTALL_ACTION += \ - $(PYTHON) -m compileall $(PROTO_DIR)/$(PYTHON_VENDOR_PACKAGES) + $(PYTHON) -m compileall $(PROTO_DIR)/$(PYTHON_VENDOR_PACKAGES) # common targets build: $(BUILD_NO_ARCH) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/agent/evs_l3_agent.py --- a/components/openstack/neutron/files/agent/evs_l3_agent.py Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/agent/evs_l3_agent.py Mon Apr 20 12:35:51 2015 -0700 @@ -1,8 +1,8 @@ # vim: tabstop=4 shiftwidth=4 softtabstop=4 -# Copyright 2012 Nicira Networks, Inc. All rights reserved. +# Copyright 2012 VMware, Inc. All rights reserved. # -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain @@ -16,24 +16,24 @@ # License for the specific language governing permissions and limitations # under the License. # -# @author: Dan Wendlandt, Nicira, Inc -# @author: Girish Moodalbail, Oracle, Inc. -# """ Based off generic l3_agent (neutron/agent/l3_agent) code """ +import errno import netaddr from oslo.config import cfg +from neutron.agent.common import config from neutron.agent import l3_agent from neutron.agent.linux import utils from neutron.agent.solaris import interface -from neutron.agent.solaris import ipfilters_manager from neutron.agent.solaris import net_lib +from neutron.agent.solaris import ra from neutron.common import constants as l3_constants +from neutron.common import utils as common_utils from neutron.openstack.common import log as logging @@ -43,56 +43,7 @@ FLOATING_IP_CIDR_SUFFIX = '/32' -class RouterInfo(object): - - def __init__(self, router_id, root_helper, use_namespaces, router): - self.router_id = router_id - self.ex_gw_port = None - self._snat_enabled = None - self._snat_action = None - self.internal_ports = [] - # We do not need either root_helper or namespace, so set them to None - self.root_helper = None - self.use_namespaces = None - # Invoke the setter for establishing initial SNAT action - self.router = router - self.ipfilters_manager = ipfilters_manager.IPfiltersManager() - self.routes = [] - - @property - def router(self): - return self._router - - @router.setter - def router(self, value): - self._router = value - if not self._router: - return - # enable_snat by default if it wasn't specified by plugin - self._snat_enabled = self._router.get('enable_snat', True) - # Set a SNAT action for the router - if self._router.get('gw_port'): - self._snat_action = ('add_rules' if self._snat_enabled - else 'remove_rules') - elif self.ex_gw_port: - # Gateway port was removed, remove rules - self._snat_action = 'remove_rules' - - def ns_name(self): - pass - - def perform_snat_action(self, snat_callback, *args): - # Process SNAT rules for attached subnets - if self._snat_action: - snat_callback(self, self._router.get('gw_port'), - *args, action=self._snat_action) - self._snat_action = None - - -class EVSL3NATAgent(l3_agent.L3NATAgent): - - RouterInfo = RouterInfo - +class EVSL3NATAgent(l3_agent.L3NATAgentWithStateReport): OPTS = [ cfg.StrOpt('external_network_datalink', default='net0', help=_("Name of the datalink that connects to " @@ -108,19 +59,86 @@ super(EVSL3NATAgent, self).__init__(host=host, conf=conf) def _router_added(self, router_id, router): - ri = RouterInfo(router_id, self.root_helper, - self.conf.use_namespaces, router) + ri = l3_agent.RouterInfo(router_id, None, + self.conf.use_namespaces, router) self.router_info[router_id] = ri + if self.conf.enable_metadata_proxy: + self._spawn_metadata_proxy(ri.router_id, ri.ns_name) + def _router_removed(self, router_id): - ri = self.router_info[router_id] + ri = self.router_info.get(router_id) + if ri is None: + LOG.warn(_("Info for router %s were not found. " + "Skipping router removal"), router_id) + return ri.router['gw_port'] = None ri.router[l3_constants.INTERFACE_KEY] = [] ri.router[l3_constants.FLOATINGIP_KEY] = [] self.process_router(ri) + if self.conf.enable_metadata_proxy: + self._destroy_metadata_proxy(ri.router_id, ri.ns_name) + del self.router_info[router_id] + def _get_metadata_proxy_callback(self, router_id): + """Need to override this since we need to pass the absolute + path to neutron-ns-metadata-proxy binary. + """ + def callback(pid_file): + metadata_proxy_socket = cfg.CONF.metadata_proxy_socket + proxy_cmd = ['/usr/lib/neutron/neutron-ns-metadata-proxy', + '--pid_file=%s' % pid_file, + '--metadata_proxy_socket=%s' % metadata_proxy_socket, + '--router_id=%s' % router_id, + '--state_path=%s' % self.conf.state_path, + '--metadata_port=%s' % self.conf.metadata_port] + proxy_cmd.extend(config.get_log_args( + cfg.CONF, 'neutron-ns-metadata-proxy-%s.log' % + router_id)) + return proxy_cmd + + return callback + + def external_gateway_snat_rules(self, ex_gw_ip, internal_cidrs, + interface_name): + rules = [] + for cidr in internal_cidrs: + rules.append('map %s %s -> %s/32' % + (interface_name, cidr, ex_gw_ip)) + return rules + + def _handle_router_snat_rules(self, ri, ex_gw_port, internal_cidrs, + interface_name, action): + assert not ri.router['distributed'] + + # Remove all the old SNAT rules + # This is safe because if use_namespaces is set as False + # then the agent can only configure one router, otherwise + # each router's SNAT rules will be in their own namespace + + # get only the SNAT rules + old_snat_rules = [rule for rule in ri.ipfilters_manager.ipv4['nat'] + if rule.startswith('map')] + ri.ipfilters_manager.remove_nat_rules(old_snat_rules) + + # And add them back if the action is add_rules + if action == 'add_rules' and ex_gw_port: + # NAT rules are added only if ex_gw_port has an IPv4 address + for ip_addr in ex_gw_port['fixed_ips']: + ex_gw_ip = ip_addr['ip_address'] + if netaddr.IPAddress(ex_gw_ip).version == 4: + rules = self.external_gateway_snat_rules(ex_gw_ip, + internal_cidrs, + interface_name) + ri.ipfilters_manager.add_nat_rules(rules) + break + + @common_utils.exception_logger() def process_router(self, ri): + # TODO(mrsmith) - we shouldn't need to check here + if 'distributed' not in ri.router: + ri.router['distributed'] = False ex_gw_port = self._get_ex_gw_port(ri) internal_ports = ri.router.get(l3_constants.INTERFACE_KEY, []) existing_port_ids = set([p['id'] for p in ri.internal_ports]) @@ -131,16 +149,43 @@ p['id'] not in existing_port_ids] old_ports = [p for p in ri.internal_ports if p['id'] not in current_port_ids] + new_ipv6_port = False + old_ipv6_port = False for p in new_ports: self._set_subnet_info(p) + self.internal_network_added(ri, p) ri.internal_ports.append(p) - self.internal_network_added(ri, p) + if (not new_ipv6_port and + netaddr.IPNetwork(p['subnet']['cidr']).version == 6): + new_ipv6_port = True for p in old_ports: + self.internal_network_removed(ri, p) ri.internal_ports.remove(p) - self.internal_network_removed(ri, p) + if (not old_ipv6_port and + netaddr.IPNetwork(p['subnet']['cidr']).version == 6): + old_ipv6_port = True + + if new_ipv6_port or old_ipv6_port: + # refresh ndpd daemon after filling in ndpd.conf + # with the right entries + ra.enable_ipv6_ra(ri.router_id, + internal_ports, + self.get_internal_device_name) - internal_cidrs = [p['ip_cidr'] for p in ri.internal_ports] + # remove any internal stale router interfaces (i.e., l3i.. VNICs) + existing_devices = net_lib.Datalink.show_vnic() + current_internal_devs = set([n for n in existing_devices + if n.startswith(INTERNAL_DEV_PREFIX)]) + current_port_devs = set([self.get_internal_device_name(id) for + id in current_port_ids]) + stale_devs = current_internal_devs - current_port_devs + for stale_dev in stale_devs: + LOG.debug(_('Deleting stale internal router device: %s'), + stale_dev) + self.driver.fini_l3(stale_dev) + self.driver.unplug(stale_dev) + # TODO(salv-orlando): RouterInfo would be a better place for # this logic too ex_gw_port_id = (ex_gw_port and ex_gw_port['id'] or @@ -149,26 +194,63 @@ interface_name = None if ex_gw_port_id: interface_name = self.get_external_device_name(ex_gw_port_id) - if ex_gw_port and not ri.ex_gw_port: + if ex_gw_port: + def _gateway_ports_equal(port1, port2): + def _get_filtered_dict(d, ignore): + return dict((k, v) for k, v in d.iteritems() + if k not in ignore) + + keys_to_ignore = set(['binding:host_id']) + port1_filtered = _get_filtered_dict(port1, keys_to_ignore) + port2_filtered = _get_filtered_dict(port2, keys_to_ignore) + return port1_filtered == port2_filtered + self._set_subnet_info(ex_gw_port) - self.external_gateway_added(ri, ex_gw_port, - interface_name, internal_cidrs) + if not ri.ex_gw_port: + self.external_gateway_added(ri, ex_gw_port, interface_name) + elif not _gateway_ports_equal(ex_gw_port, ri.ex_gw_port): + self.external_gateway_updated(ri, ex_gw_port, interface_name) elif not ex_gw_port and ri.ex_gw_port: - self.external_gateway_removed(ri, ri.ex_gw_port, - interface_name, internal_cidrs) + self.external_gateway_removed(ri, ri.ex_gw_port, interface_name) - # We don't need this since our IPnat rules are bi-directional - # Process SNAT rules for external gateway - # ri.perform_snat_action(self._handle_router_snat_rules, - # internal_cidrs, interface_name) + # Remove any external stale router interfaces (i.e., l3e.. VNICs) + stale_devs = [dev for dev in existing_devices + if dev.startswith(EXTERNAL_DEV_PREFIX) + and dev != interface_name] + for stale_dev in stale_devs: + LOG.debug(_('Deleting stale external router device: %s'), + stale_dev) + self.driver.fini_l3(stale_dev) + self.driver.unplug(stale_dev) + + # Process static routes for router + self.routes_updated(ri) - # Process DNAT rules for floating IPs + # Process SNAT rules for external gateway + if (not ri.router['distributed'] or + ex_gw_port and self.get_gw_port_host(ri.router) == self.host): + # Get IPv4 only internal CIDRs + internal_cidrs = [p['ip_cidr'] for p in ri.internal_ports + if netaddr.IPNetwork(p['ip_cidr']).version == 4] + ri.perform_snat_action(self._handle_router_snat_rules, + internal_cidrs, interface_name) + + # Process SNAT/DNAT rules for floating IPs + fip_statuses = {} if ex_gw_port: - self.process_router_floating_ips(ri, ex_gw_port) + existing_floating_ips = ri.floating_ips + fip_statuses = self.process_router_floating_ips(ri, ex_gw_port) + # Identify floating IPs which were disabled + ri.floating_ips = set(fip_statuses.keys()) + for fip_id in existing_floating_ips - ri.floating_ips: + fip_statuses[fip_id] = l3_constants.FLOATINGIP_STATUS_DOWN + # Update floating IP status on the neutron server + self.plugin_rpc.update_floatingip_statuses( + self.context, ri.router_id, fip_statuses) + # Update ex_gw_port and enable_snat on the router info cache ri.ex_gw_port = ex_gw_port ri.enable_snat = ri.router.get('enable_snat') - self.routes_updated(ri) def process_router_floating_ips(self, ri, ex_gw_port): """Configure the router's floating IPs @@ -180,7 +262,7 @@ ipintf = net_lib.IPInterface(ifname) ipaddr_list = ipintf.ipaddr_list()['static'] - existing_cidrs = set([addr for addr in ipaddr_list]) + existing_cidrs = set(ipaddr_list) new_cidrs = set() existing_nat_rules = [nat_rule for nat_rule in @@ -188,6 +270,7 @@ new_nat_rules = [] # Loop once to ensure that floating ips are configured. + fip_statuses = {} for fip in ri.router.get(l3_constants.FLOATINGIP_KEY, []): fip_ip = fip['floating_ip_address'] fip_cidr = str(fip_ip) + FLOATING_IP_CIDR_SUFFIX @@ -196,18 +279,36 @@ nat_rule = 'bimap %s %s -> %s' % (ifname, fixed_cidr, fip_cidr) if fip_cidr not in existing_cidrs: - ipintf.create_address(fip_cidr) - ri.ipfilters_manager.add_nat_rules([nat_rule]) + try: + ipintf.create_address(fip_cidr) + ri.ipfilters_manager.add_nat_rules([nat_rule]) + except Exception as err: + # TODO(gmoodalb): If we fail in add_nat_rules(), then + # we need to remove the fip_cidr address + + # any exception occurred here should cause the floating IP + # to be set in error state + fip_statuses[fip['id']] = ( + l3_constants.FLOATINGIP_STATUS_ERROR) + LOG.warn(_("Unable to configure IP address for " + "floating IP: %s: %s") % (fip['id'], err)) + continue + fip_statuses[fip['id']] = ( + l3_constants.FLOATINGIP_STATUS_ACTIVE) new_nat_rules.append(nat_rule) # remove all the old NAT rules - ri.ipfilters_manager.remove_nat_rules(list(set(existing_nat_rules) - - set(new_nat_rules))) + old_nat_rules = list(set(existing_nat_rules) - set(new_nat_rules)) + # Filter out 'bimap' NAT rules as we don't want to remove NAT rules + # that were added for Metadata server + old_nat_rules = [rule for rule in old_nat_rules if "bimap" in rule] + ri.ipfilters_manager.remove_nat_rules(old_nat_rules) # Clean up addresses that no longer belong on the gateway interface. for ip_cidr in existing_cidrs - new_cidrs: if ip_cidr.endswith(FLOATING_IP_CIDR_SUFFIX): ipintf.delete_address(ip_cidr) + return fip_statuses def get_internal_device_name(self, port_id): # Because of the way how dnsmasq works on Solaris, the length @@ -225,32 +326,67 @@ dname += '_0' return dname.replace('-', '_') - def external_gateway_added(self, ri, ex_gw_port, - external_dlname, internal_cidrs): + def external_gateway_added(self, ri, ex_gw_port, external_dlname): if not net_lib.Datalink.datalink_exists(external_dlname): dl = net_lib.Datalink(external_dlname) - # need to determine the VLAN ID for the VNIC + # determine the network type of the external network evsname = ex_gw_port['network_id'] - tenantname = ex_gw_port['tenant_id'] - cmd = ['/usr/sbin/evsadm', 'show-evs', '-co', 'vid', - '-f', 'tenant=%s' % tenantname, evsname] + cmd = ['/usr/sbin/evsadm', 'show-evs', '-co', 'l2type,vid', + '-f', 'evs=%s' % evsname] try: stdout = utils.execute(cmd) except Exception as err: - LOG.error(_("Failed to retrieve the VLAN ID associated " - "with the external network, and it is required " - "to create external gateway port: %s") % err) + LOG.error(_("Failed to retrieve the network type for " + "the external network, and it is required " + "to create an external gateway port: %s") % err) + return + output = stdout.splitlines()[0].strip() + l2type, vid = output.split(':') + if l2type != 'flat' and l2type != 'vlan': + LOG.error(_("External network should be either Flat or " + "VLAN based, and it is required to " + "create an external gateway port")) return - vid = stdout.splitlines()[0].strip() - if vid == "": - LOG.error(_("External Network does not have a VLAN ID " - "associated with it, and it is required to " - "create external gateway port")) - return - mac_address = ex_gw_port['mac_address'] - dl.create_vnic(self.conf.external_network_datalink, - mac_address=mac_address, vid=vid) + elif (l2type == 'vlan' and + self.conf.get("external_network_datalink", None)): + LOG.warning(_("external_network_datalink is deprecated in " + "Juno and will be removed in the next release of " + "Solaris OpenStack. Please use the evsadm " + "set-controlprop subcommand to setup the " + "uplink-port for an external network")) + # proceed with the old-style of doing things + mac_address = ex_gw_port['mac_address'] + dl.create_vnic(self.conf.external_network_datalink, + mac_address=mac_address, vid=vid) + else: + # This is to handle HA by Solaris Cluster and is similar to + # the code we already have for the DHCP Agent. So, when + # the 1st L3 agent is down and the second L3 agent tries to + # connect its VNIC to EVS, we will end up in "vport in use" + # error. So, we need to reset the vport before we connect + # the VNIC to EVS. + cmd = ['/usr/sbin/evsadm', 'show-vport', '-f', + 'vport=%s' % ex_gw_port['id'], '-co', + 'evs,vport,status'] + stdout = utils.execute(cmd) + evsname, vportname, status = stdout.strip().split(':') + tenant_id = ex_gw_port['tenant_id'] + if status == 'used': + cmd = ['/usr/sbin/evsadm', 'reset-vport', '-T', tenant_id, + '%s/%s' % (evsname, vportname)] + utils.execute(cmd) + + # next remove protection setting on the VPort to allow + # multiple floating IPs to be configured on the l3e* + # interface + evsvport = "%s/%s" % (ex_gw_port['network_id'], + ex_gw_port['id']) + cmd = ['/usr/sbin/evsadm', 'set-vportprop', '-T', + tenant_id, '-p', 'protection=none', evsvport] + utils.execute(cmd) + dl.connect_vnic(evsvport, tenant_id) + self.driver.init_l3(external_dlname, [ex_gw_port['ip_cidr']]) # TODO(gmoodalb): wrap route(1m) command within a class in net_lib.py @@ -258,7 +394,10 @@ if gw_ip: cmd = ['/usr/bin/pfexec', '/usr/sbin/route', 'add', 'default', gw_ip] - utils.execute(cmd, check_exit_code=False) + stdout = utils.execute(cmd, extra_ok_codes=[errno.EEXIST]) + ri.remove_route = True + if 'entry exists' in stdout: + ri.remove_route = False # for each of the internal ports, add Policy Based # Routing (PBR) rule @@ -270,9 +409,11 @@ ipversion = netaddr.IPNetwork(port['subnet']['cidr']).version ri.ipfilters_manager.add_ipf_rules(rules, ipversion) - def external_gateway_removed(self, ri, ex_gw_port, - external_dlname, internal_cidrs): + def external_gateway_updated(self, ri, ex_gw_port, external_dlname): + # There is nothing to do on Solaris + pass + def external_gateway_removed(self, ri, ex_gw_port, external_dlname): gw_ip = ex_gw_port['subnet']['gateway_ip'] if gw_ip: # remove PBR rules @@ -284,14 +425,25 @@ ipversion = netaddr.IPNetwork(port['subnet']['cidr']).version ri.ipfilters_manager.remove_ipf_rules(rules, ipversion) - cmd = ['/usr/bin/pfexec', '/usr/sbin/route', 'delete', 'default', - gw_ip] - utils.execute(cmd, check_exit_code=False) + if ri.remove_route: + cmd = ['/usr/bin/pfexec', '/usr/sbin/route', 'delete', + 'default', gw_ip] + utils.execute(cmd, check_exit_code=False) if net_lib.Datalink.datalink_exists(external_dlname): self.driver.fini_l3(external_dlname) self.driver.unplug(external_dlname) + # remove the EVS VPort associated with external network + cmd = ['/usr/sbin/evsadm', 'remove-vport', + '-T', ex_gw_port['tenant_id'], + '%s/%s' % (ex_gw_port['network_id'], ex_gw_port['id'])] + try: + utils.execute(cmd) + except Exception as err: + LOG.error(_("Failed to delete the EVS VPort associated with " + "external network: %s") % err) + def _get_ippool_name(self, mac_address, suffix=None): # Generate a unique-name for ippool(1m) from that last 3 # bytes of mac-address. It is called pool name, but it is @@ -368,6 +520,19 @@ ipversion = netaddr.IPNetwork(port_subnet).version ri.ipfilters_manager.add_ipf_rules(rules, ipversion) + # if metadata proxy is enabled, then add the necessary + # IP NAT rules to forward the metadata requests to the + # metadata proxy server + if self.conf.enable_metadata_proxy and ipversion == 4: + # TODO(gmoodalb): when IP Filter allows redirection of packets + # to loopback IP address, then we need to add an IPF rule allowing + # only packets destined to 127.0.0.1:9697 to + # neutron-ns-metadata-proxy server + rules = ['rdr %s 169.254.169.254/32 port 80 -> %s port %d tcp' % + (internal_dlname, port['fixed_ips'][0]['ip_address'], + self.conf.metadata_port)] + ri.ipfilters_manager.add_nat_rules(rules) + def internal_network_removed(self, ri, port): internal_dlname = self.get_internal_device_name(port['id']) port_subnet = port['subnet']['cidr'] @@ -411,18 +576,26 @@ ri.ipfilters_manager.remove_ippool(iport_block_pname, [port_subnet]) + # if metadata proxy is enabled, then remove the IP NAT rules that + # were added while adding the internal network + if self.conf.enable_metadata_proxy and ipversion == 4: + rules = ['rdr %s 169.254.169.254/32 port 80 -> %s port %d tcp' % + (internal_dlname, port['fixed_ips'][0]['ip_address'], + self.conf.metadata_port)] + ri.ipfilters_manager.remove_nat_rules(rules) + if net_lib.Datalink.datalink_exists(internal_dlname): self.driver.fini_l3(internal_dlname) self.driver.unplug(internal_dlname) - def routers_updated(self, context, routers): - super(EVSL3NATAgent, self).routers_updated(context, routers) - if routers: - # If router's interface was removed, then the VNIC associated - # with that interface must be deleted immediately. The EVS - # plugin can delete the virtual port iff the VNIC associated - # with that virtual port is deleted first. - self._rpc_loop() + # remove the EVS VPort associated with internal network + cmd = ['/usr/sbin/evsadm', 'remove-vport', '-T', port['tenant_id'], + '%s/%s' % (port['network_id'], port['id'])] + try: + utils.execute(cmd) + except Exception as err: + LOG.error(_("Failed to delete the EVS VPort associated with " + "internal network: %s") % err) def routes_updated(self, ri): pass diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/agent/solaris/dhcp.py --- a/components/openstack/neutron/files/agent/solaris/dhcp.py Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/agent/solaris/dhcp.py Mon Apr 20 12:35:51 2015 -0700 @@ -20,16 +20,17 @@ # @author: Girish Moodalbail, Oracle, Inc. import abc +import collections import os import re import shutil import socket -import StringIO import sys import uuid import netaddr from oslo.config import cfg +import six from neutron.agent.linux import utils from neutron.agent.solaris import net_lib @@ -52,15 +53,16 @@ cfg.StrOpt('dnsmasq_config_file', default='', help=_('Override the default dnsmasq settings with this file')), - cfg.StrOpt('dnsmasq_dns_server', - help=_('Use another DNS server before any in ' - '/etc/resolv.conf.')), + cfg.ListOpt('dnsmasq_dns_servers', + help=_('Comma-separated list of the DNS servers which will be ' + 'used as forwarders.'), + deprecated_name='dnsmasq_dns_server'), + cfg.BoolOpt('dhcp_delete_namespaces', default=False, + help=_("Delete namespace after removing a dhcp server.")), cfg.IntOpt( 'dnsmasq_lease_max', default=(2 ** 24), help=_('Limit number of leases to prevent a denial-of-service.')), - cfg.StrOpt('interface_driver', - help=_("The driver used to manage the virtual interface.")), ] IPV4 = 4 @@ -78,17 +80,46 @@ WIN2k3_STATIC_DNS = 249 -class DictModel(object): +class DictModel(dict): """Convert dict into an object that provides attribute access to values.""" - def __init__(self, d): - for key, value in d.iteritems(): - if isinstance(value, list): - value = [DictModel(item) if isinstance(item, dict) else item - for item in value] - elif isinstance(value, dict): - value = DictModel(value) + + def __init__(self, *args, **kwargs): + """Convert dict values to DictModel values.""" + super(DictModel, self).__init__(*args, **kwargs) + + def needs_upgrade(item): + """Check if `item` is a dict and needs to be changed to DictModel. + """ + return isinstance(item, dict) and not isinstance(item, DictModel) + + def upgrade(item): + """Upgrade item if it needs to be upgraded.""" + if needs_upgrade(item): + return DictModel(item) + else: + return item - setattr(self, key, value) + for key, value in self.iteritems(): + if isinstance(value, (list, tuple)): + # Keep the same type but convert dicts to DictModels + self[key] = type(value)( + (upgrade(item) for item in value) + ) + elif needs_upgrade(value): + # Change dict instance values to DictModel instance values + self[key] = DictModel(value) + + def __getattr__(self, name): + try: + return self[name] + except KeyError as e: + raise AttributeError(e) + + def __setattr__(self, name, value): + self[name] = value + + def __delattr__(self, name): + del self[name] class NetModel(DictModel): @@ -103,8 +134,8 @@ return self._ns_name +@six.add_metaclass(abc.ABCMeta) class DhcpBase(object): - __metaclass__ = abc.ABCMeta def __init__(self, conf, network, root_helper='sudo', version=None, plugin=None): @@ -127,17 +158,12 @@ """Restart the dhcp service for the network.""" self.disable(retain_port=True) self.enable() - self.device_manager.update(self.network) @abc.abstractproperty def active(self): """Boolean representing the running state of the DHCP server.""" @abc.abstractmethod - def release_lease(self, mac_address, removed_ips): - """Release a DHCP lease.""" - - @abc.abstractmethod def reload_allocations(self): """Force the DHCP server to reload the assignment database.""" @@ -145,13 +171,23 @@ def existing_dhcp_networks(cls, conf, root_helper): """Return a list of existing networks ids that we have configs for.""" - raise NotImplementedError + raise NotImplementedError() @classmethod def check_version(cls): """Execute version checks on DHCP server.""" - raise NotImplementedError + raise NotImplementedError() + + @classmethod + def get_isolated_subnets(cls, network): + """Returns a dict indicating whether or not a subnet is isolated""" + raise NotImplementedError() + + @classmethod + def should_enable_metadata(cls, conf, network): + """True if the metadata-proxy should be enabled for the network.""" + raise NotImplementedError() class DhcpLocalProcess(DhcpBase): @@ -166,11 +202,10 @@ def enable(self): """Enables DHCP for this network by spawning a local process.""" - interface_name = self.device_manager.setup(self.network, - reuse_existing=True) if self.active: self.restart() elif self._enable_dhcp(): + interface_name = self.device_manager.setup(self.network) self.interface_name = interface_name self.spawn_process() @@ -178,15 +213,17 @@ """Disable DHCP for this network by killing the local process.""" pid = self.pid - if self.active: - cmd = ['kill', '-9', pid] - utils.execute(cmd, self.root_helper) + if pid: + if self.active: + cmd = ['kill', '-9', pid] + utils.execute(cmd, self.root_helper) + else: + LOG.debug(_('DHCP for %(net_id)s is stale, pid %(pid)d ' + 'does not exist, performing cleanup'), + {'net_id': self.network.id, 'pid': pid}) if not retain_port: - self.device_manager.destroy(self.network, self.interface_name) - - elif pid: - LOG.debug(_('DHCP for %(net_id)s pid %(pid)d is stale, ignoring ' - 'command'), {'net_id': self.network.id, 'pid': pid}) + self.device_manager.destroy(self.network, + self.interface_name) else: LOG.debug(_('No DHCP started for %s'), self.network.id) @@ -268,7 +305,8 @@ NEUTRON_NETWORK_ID_KEY = 'NEUTRON_NETWORK_ID' NEUTRON_RELAY_SOCKET_PATH_KEY = 'NEUTRON_RELAY_SOCKET_PATH' - MINIMUM_VERSION = 2.59 + MINIMUM_VERSION = 2.63 + MINIMUM_IPV6_VERSION = 2.67 @classmethod def check_version(cls): @@ -285,10 +323,19 @@ 'DHCP AGENT MAY NOT RUN CORRECTLY! ' 'Please ensure that its version is %s ' 'or above!'), cls.MINIMUM_VERSION) + raise SystemExit(1) + is_valid_version = float(ver) >= cls.MINIMUM_IPV6_VERSION + if not is_valid_version: + LOG.warning(_('FAILED VERSION REQUIREMENT FOR DNSMASQ. ' + 'DHCP AGENT MAY NOT RUN CORRECTLY WHEN ' + 'SERVING IPV6 STATEFUL SUBNETS! ' + 'Please ensure that its version is %s ' + 'or above!'), cls.MINIMUM_IPV6_VERSION) except (OSError, RuntimeError, IndexError, ValueError): LOG.warning(_('Unable to determine dnsmasq version. ' 'Please ensure that its version is %s ' 'or above!'), cls.MINIMUM_VERSION) + raise SystemExit(1) return float(ver) @classmethod @@ -319,43 +366,60 @@ '--pid-file=%s' % self.get_conf_file_name( 'pid', ensure_conf_dir=True), '--dhcp-hostsfile=%s' % self._output_hosts_file(), + '--addn-hosts=%s' % self._output_addn_hosts_file(), '--dhcp-optsfile=%s' % self._output_opts_file(), '--leasefile-ro', ] possible_leases = 0 for i, subnet in enumerate(self.network.subnets): + mode = None # if a subnet is specified to have dhcp disabled if not subnet.enable_dhcp: continue if subnet.ip_version == 4: mode = 'static' else: - # TODO(gmoodalb): how do we indicate other options - # ra-only, slaac, ra-nameservers, and ra-stateless. # We need to also set the DUID for the DHCPv6 server to use macaddr_cmd = ['/usr/sbin/dladm', 'show-linkprop', '-co', 'value', '-p', 'mac-address', self.interface_name] stdout = utils.execute(macaddr_cmd) uid = stdout.splitlines()[0].strip() + # format the MAC address + uid = ':'.join(['%.2x' % w for w in netaddr.EUI(uid).words]) # IANA assigned ID for Oracle enterprise_id = '111' cmd.append('--dhcp-duid=%s,%s' % (enterprise_id, uid)) - mode = 'static' - if self.version >= self.MINIMUM_VERSION: - set_tag = 'set:' - else: - set_tag = '' + + # Note(scollins) If the IPv6 attributes are not set, set it as + # static to preserve previous behavior + addr_mode = getattr(subnet, 'ipv6_address_mode', None) + ra_mode = getattr(subnet, 'ipv6_ra_mode', None) + if (addr_mode in [constants.DHCPV6_STATEFUL, + constants.DHCPV6_STATELESS] or + not addr_mode and not ra_mode): + mode = 'static' cidr = netaddr.IPNetwork(subnet.cidr) - cmd.append('--dhcp-range=%s%s,%s,%s,%ss' % - (set_tag, self._TAG_PREFIX % i, - cidr.network, - mode, - self.conf.dhcp_lease_duration)) - possible_leases += cidr.size + if self.conf.dhcp_lease_duration == -1: + lease = 'infinite' + else: + lease = '%ss' % self.conf.dhcp_lease_duration + + # mode is optional and is not set - skip it + if mode: + if subnet.ip_version == 4: + cmd.append('--dhcp-range=%s%s,%s,%s,%s' % + ('set:', self._TAG_PREFIX % i, + cidr.network, mode, lease)) + else: + cmd.append('--dhcp-range=%s%s,%s,%s,%d,%s' % + ('set:', self._TAG_PREFIX % i, + cidr.network, mode, + cidr.prefixlen, lease)) + possible_leases += cidr.size # Cap the limit because creating lots of subnets can inflate # this possible lease cap. @@ -363,8 +427,10 @@ min(possible_leases, self.conf.dnsmasq_lease_max)) cmd.append('--conf-file=%s' % self.conf.dnsmasq_config_file) - if self.conf.dnsmasq_dns_server: - cmd.append('--server=%s' % self.conf.dnsmasq_dns_server) + if self.conf.dnsmasq_dns_servers: + cmd.extend( + '--server=%s' % server + for server in self.conf.dnsmasq_dns_servers) if self.conf.dhcp_domain: cmd.append('--domain=%s' % self.conf.dhcp_domain) @@ -372,12 +438,11 @@ # TODO(gmoodalb): prepend the env vars before command utils.execute(cmd, self.root_helper) - def release_lease(self, mac_address, removed_ips): + def _release_lease(self, mac_address, ip): """Release a DHCP lease.""" - for ip in removed_ips or []: - cmd = ['/usr/lib/inet/dhcp_release', self.interface_name, - ip, mac_address] - utils.execute(cmd, self.root_helper) + cmd = ['/usr/lib/inet/dhcp_release', self.interface_name, + ip, mac_address] + utils.execute(cmd, self.root_helper) def reload_allocations(self): """Rebuild the dnsmasq config and signal the dnsmasq to reload.""" @@ -389,7 +454,9 @@ 'turned off DHCP: %s'), self.network.id) return + self._release_unused_leases() self._output_hosts_file() + self._output_addn_hosts_file() self._output_opts_file() if self.active: cmd = ['kill', '-HUP', self.pid] @@ -397,32 +464,120 @@ else: LOG.debug(_('Pid %d is stale, relaunching dnsmasq'), self.pid) LOG.debug(_('Reloading allocations for network: %s'), self.network.id) - self.device_manager.update(self.network) + self.device_manager.update(self.network, self.interface_name) + + def _iter_hosts(self): + """Iterate over hosts. - def _output_hosts_file(self): - """Writes a dnsmasq compatible hosts file.""" - r = re.compile('[:.]') - buf = StringIO.StringIO() - + For each host on the network we yield a tuple containing: + ( + port, # a DictModel instance representing the port. + alloc, # a DictModel instance of the allocated ip and subnet. + host_name, # Host name. + name, # Canonical hostname in the format 'hostname[.domain]'. + ) + """ + v6_nets = dict((subnet.id, subnet) for subnet in + self.network.subnets if subnet.ip_version == 6) for port in self.network.ports: for alloc in port.fixed_ips: - name = 'host-%s.%s' % (r.sub('-', alloc.ip_address), - self.conf.dhcp_domain) - set_tag = '' - if getattr(port, 'extra_dhcp_opts', False): - if self.version >= self.MINIMUM_VERSION: - set_tag = 'set:' + # Note(scollins) Only create entries that are + # associated with the subnet being managed by this + # dhcp agent + if alloc.subnet_id in v6_nets: + addr_mode = v6_nets[alloc.subnet_id].ipv6_address_mode + if addr_mode != constants.DHCPV6_STATEFUL: + continue + hostname = 'host-%s' % alloc.ip_address.replace( + '.', '-').replace(':', '-') + fqdn = hostname + if self.conf.dhcp_domain: + fqdn = '%s.%s' % (fqdn, self.conf.dhcp_domain) + yield (port, alloc, hostname, fqdn) + + def _output_hosts_file(self): + """Writes a dnsmasq compatible dhcp hosts file. + + The generated file is sent to the --dhcp-hostsfile option of dnsmasq, + and lists the hosts on the network which should receive a dhcp lease. + Each line in this file is in the form:: + + 'mac_address,FQDN,ip_address' + + IMPORTANT NOTE: a dnsmasq instance does not resolve hosts defined in + this file if it did not give a lease to a host listed in it (e.g.: + multiple dnsmasq instances on the same network if this network is on + multiple network nodes). This file is only defining hosts which + should receive a dhcp lease, the hosts resolution in itself is + defined by the `_output_addn_hosts_file` method. + """ + buf = six.StringIO() + filename = self.get_conf_file_name('host') + + LOG.debug(_('Building host file: %s'), filename) + for (port, alloc, hostname, name) in self._iter_hosts(): + # (dzyu) Check if it is legal ipv6 address, if so, need wrap + # it with '[]' to let dnsmasq to distinguish MAC address from + # IPv6 address. + ip_address = alloc.ip_address + if netaddr.valid_ipv6(ip_address): + ip_address = '[%s]' % ip_address + + LOG.debug(_('Adding %(mac)s : %(name)s : %(ip)s'), + {"mac": port.mac_address, "name": name, + "ip": ip_address}) - buf.write('%s,%s,%s,%s%s\n' % - (port.mac_address, name, alloc.ip_address, - set_tag, port.id)) - else: - buf.write('%s,%s,%s\n' % - (port.mac_address, name, alloc.ip_address)) + if getattr(port, 'extra_dhcp_opts', False): + buf.write('%s,%s,%s,%s%s\n' % + (port.mac_address, name, ip_address, + 'set:', port.id)) + else: + buf.write('%s,%s,%s\n' % + (port.mac_address, name, ip_address)) + + utils.replace_file(filename, buf.getvalue()) + LOG.debug(_('Done building host file %s'), filename) + return filename + + def _read_hosts_file_leases(self, filename): + leases = set() + if os.path.exists(filename): + with open(filename) as f: + for l in f.readlines(): + host = l.strip().split(',') + leases.add((host[2], host[0])) + return leases + + def _release_unused_leases(self): + filename = self.get_conf_file_name('host') + old_leases = self._read_hosts_file_leases(filename) - name = self.get_conf_file_name('host') - utils.replace_file(name, buf.getvalue()) - return name + new_leases = set() + for port in self.network.ports: + for alloc in port.fixed_ips: + new_leases.add((alloc.ip_address, port.mac_address)) + + for ip, mac in old_leases - new_leases: + self._release_lease(mac, ip) + + def _output_addn_hosts_file(self): + """Writes a dnsmasq compatible additional hosts file. + + The generated file is sent to the --addn-hosts option of dnsmasq, + and lists the hosts on the network which should be resolved even if + the dnsmaq instance did not give a lease to the host (see the + `_output_hosts_file` method). + Each line in this file is in the same form as a standard /etc/hosts + file. + """ + buf = six.StringIO() + for (port, alloc, hostname, fqdn) in self._iter_hosts(): + # It is compulsory to write the `fqdn` before the `hostname` in + # order to obtain it in PTR responses. + buf.write('%s\t%s %s\n' % (alloc.ip_address, fqdn, hostname)) + addn_hosts = self.get_conf_file_name('addn_hosts') + utils.replace_file(addn_hosts, buf.getvalue()) + return addn_hosts def _output_opts_file(self): """Write a dnsmasq compatible options file.""" @@ -431,53 +586,109 @@ subnet_to_interface_ip = self._make_subnet_interface_ip_map() options = [] + + isolated_subnets = self.get_isolated_subnets(self.network) + dhcp_ips = collections.defaultdict(list) + subnet_idx_map = {} for i, subnet in enumerate(self.network.subnets): - if not subnet.enable_dhcp: + if (not subnet.enable_dhcp or + (subnet.ip_version == 6 and + getattr(subnet, 'ipv6_address_mode', None) + in [None, constants.IPV6_SLAAC])): continue if subnet.dns_nameservers: options.append( - self._format_option(i, 'dns-server', - ','.join(subnet.dns_nameservers))) + self._format_option( + subnet.ip_version, i, 'dns-server', + ','.join( + Dnsmasq._convert_to_literal_addrs( + subnet.ip_version, subnet.dns_nameservers)))) + else: + # use the dnsmasq ip as nameservers only if there is no + # dns-server submitted by the server + subnet_idx_map[subnet.id] = i + + if self.conf.dhcp_domain and subnet.ip_version == 6: + options.append('tag:tag%s,option6:domain-search,%s' % + (i, ''.join(self.conf.dhcp_domain))) gateway = subnet.gateway_ip host_routes = [] for hr in subnet.host_routes: if hr.destination == "0.0.0.0/0": - gateway = hr.nexthop + if not gateway: + gateway = hr.nexthop else: host_routes.append("%s,%s" % (hr.destination, hr.nexthop)) # Add host routes for isolated network segments - enable_metadata = ( - self.conf.enable_isolated_metadata - and not subnet.gateway_ip - and subnet.ip_version == 4) - if enable_metadata: + if (isolated_subnets[subnet.id] and + self.conf.enable_isolated_metadata and + subnet.ip_version == 4): subnet_dhcp_ip = subnet_to_interface_ip[subnet.id] host_routes.append( '%s/32,%s' % (METADATA_DEFAULT_IP, subnet_dhcp_ip) ) - if host_routes: - options.append( - self._format_option(i, 'classless-static-route', - ','.join(host_routes))) - options.append( - self._format_option(i, WIN2k3_STATIC_DNS, - ','.join(host_routes))) + if subnet.ip_version == 4: + if host_routes: + if gateway: + host_routes.append("%s,%s" % ("0.0.0.0/0", gateway)) + options.append( + self._format_option(subnet.ip_version, i, + 'classless-static-route', + ','.join(host_routes))) + options.append( + self._format_option(subnet.ip_version, i, + WIN2k3_STATIC_DNS, + ','.join(host_routes))) - if subnet.ip_version == 4: if gateway: - options.append(self._format_option(i, 'router', gateway)) + options.append(self._format_option(subnet.ip_version, + i, 'router', + gateway)) else: - options.append(self._format_option(i, 'router')) + options.append(self._format_option(subnet.ip_version, + i, 'router')) for port in self.network.ports: if getattr(port, 'extra_dhcp_opts', False): - options.extend( - self._format_option(port.id, opt.opt_name, opt.opt_value) - for opt in port.extra_dhcp_opts) + for ip_version in (4, 6): + if any( + netaddr.IPAddress(ip.ip_address).version == ip_version + for ip in port.fixed_ips): + options.extend( + # TODO(xuhanp):Instead of applying extra_dhcp_opts + # to both DHCPv4 and DHCPv6, we need to find a new + # way to specify options for v4 and v6 + # respectively. We also need to validate the option + # before applying it. + self._format_option(ip_version, port.id, + opt.opt_name, opt.opt_value) + for opt in port.extra_dhcp_opts) + + # provides all dnsmasq ip as dns-server if there is more than + # one dnsmasq for a subnet and there is no dns-server submitted + # by the server + if port.device_owner == constants.DEVICE_OWNER_DHCP: + for ip in port.fixed_ips: + i = subnet_idx_map.get(ip.subnet_id) + if i is None: + continue + dhcp_ips[i].append(ip.ip_address) + + for i, ips in dhcp_ips.items(): + for ip_version in (4, 6): + vx_ips = [ip for ip in ips + if netaddr.IPAddress(ip).version == ip_version] + if vx_ips: + options.append( + self._format_option( + ip_version, i, 'dns-server', + ','.join( + Dnsmasq._convert_to_literal_addrs(ip_version, + vx_ips)))) name = self.get_conf_file_name('opts') utils.replace_file(name, '\n'.join(options)) @@ -487,22 +698,52 @@ # TODO(gmoodalb): need to complete this when we support metadata pass - def _format_option(self, tag, option, *args): + def _format_option(self, ip_version, tag, option, *args): """Format DHCP option by option name or code.""" - if self.version >= self.MINIMUM_VERSION: - set_tag = 'tag:' - else: - set_tag = '' - option = str(option) if isinstance(tag, int): tag = self._TAG_PREFIX % tag if not option.isdigit(): - option = 'option:%s' % option + if ip_version == 4: + option = 'option:%s' % option + else: + option = 'option6:%s' % option + + return ','.join(('tag:' + tag, '%s' % option) + args) + + @staticmethod + def _convert_to_literal_addrs(ip_version, ips): + if ip_version == 4: + return ips + return ['[' + ip + ']' for ip in ips] + + @classmethod + def get_isolated_subnets(cls, network): + """Returns a dict indicating whether or not a subnet is isolated - return ','.join((set_tag + tag, '%s' % option) + args) + A subnet is considered non-isolated if there is a port connected to + the subnet, and the port's ip address matches that of the subnet's + gateway. The port must be owned by a nuetron router. + """ + isolated_subnets = collections.defaultdict(lambda: True) + subnets = dict((subnet.id, subnet) for subnet in network.subnets) + + for port in network.ports: + if port.device_owner != constants.DEVICE_OWNER_ROUTER_INTF: + continue + for alloc in port.fixed_ips: + if subnets[alloc.subnet_id].gateway_ip == alloc.ip_address: + isolated_subnets[alloc.subnet_id] = False + + return isolated_subnets + + @classmethod + def should_enable_metadata(cls, conf, network): + """True if there exists a subnet for which a metadata proxy is needed + """ + return False @classmethod def lease_update(cls): @@ -538,7 +779,9 @@ self.root_helper = root_helper self.plugin = plugin if not conf.interface_driver: - raise SystemExit(_('You must specify an interface driver')) + msg = _('An interface driver must be specified') + LOG.error(msg) + raise SystemExit(1) try: self.driver = importutils.import_object( conf.interface_driver, conf) @@ -546,7 +789,8 @@ msg = (_("Error importing interface driver '%(driver)s': " "%(inner)s") % {'driver': conf.interface_driver, 'inner': e}) - raise SystemExit(msg) + LOG.error(msg) + raise SystemExit(1) def get_interface_name(self, network, port): """Return interface(device) name for use by the DHCP process.""" @@ -560,6 +804,16 @@ host_uuid = uuid.uuid5(uuid.NAMESPACE_DNS, socket.gethostname()) return 'dhcp%s-%s' % (host_uuid, network.id) + def _set_default_route(self, network, device_name): + """Sets the default gateway for this dhcp namespace. + + This method is idempotent and will only adjust the route if adjusting + it would change it from what it already is. This makes it safe to call + and avoids unnecessary perturbation of the system. + """ + # we do not support namespaces + pass + def setup_dhcp_port(self, network): """Create/update DHCP port for the host if needed and return port.""" @@ -595,12 +849,29 @@ port_fixed_ips.extend( [dict(subnet_id=s) for s in dhcp_enabled_subnet_ids]) dhcp_port = self.plugin.update_dhcp_port( - port.id, {'port': {'fixed_ips': port_fixed_ips}}) + port.id, {'port': {'network_id': network.id, + 'fixed_ips': port_fixed_ips}}) + if not dhcp_port: + raise exceptions.Conflict() else: dhcp_port = port # break since we found port that matches device_id break + # check for a reserved DHCP port + if dhcp_port is None: + LOG.debug(_('DHCP port %(device_id)s on network %(network_id)s' + ' does not yet exist. Checking for a reserved port.'), + {'device_id': device_id, 'network_id': network.id}) + for port in network.ports: + port_device_id = getattr(port, 'device_id', None) + if port_device_id == constants.DEVICE_ID_RESERVED_DHCP_PORT: + dhcp_port = self.plugin.update_dhcp_port( + port.id, {'port': {'network_id': network.id, + 'device_id': device_id}}) + if dhcp_port: + break + # DHCP port has not yet been created. if dhcp_port is None: LOG.debug(_('DHCP port %(device_id)s on network %(network_id)s' @@ -615,6 +886,9 @@ fixed_ips=[dict(subnet_id=s) for s in dhcp_enabled_subnet_ids]) dhcp_port = self.plugin.create_dhcp_port({'port': port_dict}) + if not dhcp_port: + raise exceptions.Conflict() + # Convert subnet_id to subnet dict fixed_ips = [dict(subnet_id=fixed_ip.subnet_id, ip_address=fixed_ip.ip_address, @@ -627,21 +901,16 @@ return dhcp_port - def setup(self, network, reuse_existing=False): + def setup(self, network): """Create and initialize a device for network's DHCP on this host.""" port = self.setup_dhcp_port(network) interface_name = self.get_interface_name(network, port) if net_lib.Datalink.datalink_exists(interface_name): - if not reuse_existing: - raise exceptions.PreexistingDeviceFailure( - dev_name=interface_name) - - LOG.debug(_('Reusing existing device: %s.'), interface_name) + LOG.debug(_('Reusing existing device: %s.'), interface_name) else: self.driver.plug(network.tenant_id, network.id, - port.id, - interface_name) + port.id, interface_name) ip_cidrs = [] for fixed_ip in port.fixed_ips: subnet = fixed_ip.subnet @@ -649,14 +918,18 @@ ip_cidr = '%s/%s' % (fixed_ip.ip_address, net.prefixlen) ip_cidrs.append(ip_cidr) - if (self.conf.enable_isolated_metadata and self.conf.use_namespaces): + if (self.conf.enable_isolated_metadata and + self.conf.use_namespaces): ip_cidrs.append(METADATA_DEFAULT_CIDR) self.driver.init_l3(interface_name, ip_cidrs) + if self.conf.use_namespaces: + self._set_default_route(network, interface_name) + return interface_name - def update(self, network): + def update(self, network, device_name): """Update device settings for the network's DHCP on this host.""" pass diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/agent/solaris/interface.py --- a/components/openstack/neutron/files/agent/solaris/interface.py Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/agent/solaris/interface.py Mon Apr 20 12:35:51 2015 -0700 @@ -37,7 +37,7 @@ # length including the NUL character. If we change it to use new style # `lifreq', then we will be able to extend the length to 32 characters. VNIC_NAME_MAXLEN = 15 - VNIC_NAME_PREFIX = 'evs' + VNIC_NAME_PREFIX = 'dh' VNIC_NAME_SUFFIX = '_0' VNIC_NAME_LEN_WO_SUFFIX = VNIC_NAME_MAXLEN - \ len(VNIC_NAME_SUFFIX) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/agent/solaris/net_lib.py --- a/components/openstack/neutron/files/agent/solaris/net_lib.py Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/agent/solaris/net_lib.py Mon Apr 20 12:35:51 2015 -0700 @@ -196,6 +196,13 @@ cmd = ['/usr/sbin/dladm', 'delete-vnic', self._dlname] self.execute_with_pfexec(cmd) + @classmethod + def show_vnic(cls): + cmd = ['/usr/sbin/dladm', 'show-vnic', '-po', 'link'] + stdout = utils.execute(cmd) + + return stdout.splitlines() + class IPpoolCommand(CommandBase): '''Wrapper around Solaris ippool(1m) command''' diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/agent/solaris/ra.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/neutron/files/agent/solaris/ra.py Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,108 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2014 OpenStack Foundation +# All Rights Reserved. +# +# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import jinja2 +import netaddr +from oslo.config import cfg +import six + +from neutron.agent.linux import utils +from neutron.common import constants +from neutron.openstack.common import log as logging + + +LOG = logging.getLogger(__name__) + +OPTS = [ + cfg.StrOpt('ra_confs', + default='$state_path/ra', + help=_('Location to store IPv6 RA config files')), +] + +cfg.CONF.register_opts(OPTS) + +NDP_SMF_FMRI = 'svc:/network/routing/ndp:default' + +CONFIG_TEMPLATE = jinja2.Template("""if {{ interface_name }} \ + AdvSendAdvertisements on \ + MinRtrAdvInterval 3 \ + MaxRtrAdvInterval 10 \ + {% if ra_mode == constants.DHCPV6_STATELESS %} + AdvOtherConfigFlag on \ + {% endif %} + + {% if ra_mode == constants.DHCPV6_STATEFUL %} + AdvManagedFlag on + {% endif %} + +{% if ra_mode in (constants.IPV6_SLAAC, constants.DHCPV6_STATELESS) %} +prefix {{ prefix }} {{ interface_name }} \ + AdvOnLinkFlag on \ + AdvAutonomousFlag on +{% endif %} +""") + + +def _generate_ndpd_conf(router_id, router_ports, dev_name_helper): + ndpd_conf = utils.get_conf_file_name(cfg.CONF.ra_confs, router_id, + 'ndpd.conf', True) + buf = six.StringIO() + for p in router_ports: + prefix = p['subnet']['cidr'] + if netaddr.IPNetwork(prefix).version == 6: + interface_name = dev_name_helper(p['id']) + ra_mode = p['subnet']['ipv6_ra_mode'] + buf.write('%s' % CONFIG_TEMPLATE.render( + ra_mode=ra_mode, + interface_name=interface_name, + prefix=prefix, + constants=constants)) + + utils.replace_file(ndpd_conf, buf.getvalue()) + return ndpd_conf + + +def _refresh_ndpd(ndpd_conf): + cmd = ['/usr/sbin/svccfg', '-s', NDP_SMF_FMRI, 'setprop', + 'routing/config_file', '=', ndpd_conf] + utils.execute(cmd) + # ndpd SMF service doesn't support refresh method, so we + # need to restart + cmd = ['/usr/sbin/svcadm', 'restart', NDP_SMF_FMRI] + utils.execute(cmd) + LOG.debug(_("ndpd daemon has been refreshed to re-read the " + "configuration file")) + + +def enable_ipv6_ra(router_id, router_ports, dev_name_helper): + for p in router_ports: + if netaddr.IPNetwork(p['subnet']['cidr']).version == 6: + break + else: + disable_ipv6_ra(router_id) + return + LOG.debug("enabling ndpd for router %s", router_id) + ndpd_conf = _generate_ndpd_conf(router_id, router_ports, dev_name_helper) + _refresh_ndpd(ndpd_conf) + + +def disable_ipv6_ra(router_id): + LOG.debug("disabling ndpd for router %s", router_id) + utils.remove_conf_files(cfg.CONF.ra_confs, router_id) + _refresh_ndpd("") diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/dhcp_agent.ini --- a/components/openstack/neutron/files/dhcp_agent.ini Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/dhcp_agent.ini Mon Apr 20 12:35:51 2015 -0700 @@ -48,8 +48,9 @@ # Override the default dnsmasq settings with this file # dnsmasq_config_file = -# Use another DNS server before any in /etc/resolv.conf. -# dnsmasq_dns_server = +# Comma-separated list of DNS servers which will be used by dnsmasq +# as forwarders. +# dnsmasq_dns_servers = # Limit number of leases to prevent a denial-of-service. # dnsmasq_lease_max = 16777216 @@ -60,6 +61,14 @@ # Location of Metadata Proxy UNIX domain socket # metadata_proxy_socket = $state_path/metadata_proxy +# dhcp_delete_namespaces, which is false by default, can be set to True if +# namespaces can be deleted cleanly on the host running the dhcp agent. +# Do not enable this until you understand the problem with the Linux iproute +# utility mentioned in https://bugs.launchpad.net/neutron/+bug/1052535 and +# you are sure that your version of iproute does not suffer from the problem. +# If True, namespaces will be deleted when a dhcp server is disabled. +# dhcp_delete_namespaces = False + # DeviceManager provides methods to setup/destroy dhcp ports on the # host running DHCP agent devicemanager = neutron.agent.solaris.device.DeviceManager diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/evs/db/api.py --- a/components/openstack/neutron/files/evs/db/api.py Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# -# @author: Girish Moodalbail, Oracle, Inc. -# - -import sqlalchemy as sa -from sqlalchemy.ext import declarative -from sqlalchemy import orm - -from oslo.config import cfg - -from neutron.context import ContextBase -from neutron.db import model_base - - -EVS_DB_BASE = declarative.declarative_base(cls=model_base.NeutronBaseV2) -EVS_DB_ENGINE = None -EVS_DB_MAKER = None - - -class EVSContext(ContextBase): - @property - def session(self): - return self._session - - @session.setter - def session(self, session): - self._session = session - - -def configure_db(): - global EVS_DB_ENGINE - if not EVS_DB_ENGINE: - sql_connection = cfg.CONF.DATABASE.sql_connection - EVS_DB_ENGINE = sa.create_engine(sql_connection, echo=False) - EVS_DB_BASE.metadata.create_all(EVS_DB_ENGINE) - - -def get_session(autocommit=True, expire_on_commit=False): - global EVS_DB_ENGINE, EVS_DB_MAKER - assert EVS_DB_ENGINE - if not EVS_DB_MAKER: - EVS_DB_MAKER = orm.sessionmaker(bind=EVS_DB_ENGINE, - autocommit=autocommit, - expire_on_commit=expire_on_commit) - return EVS_DB_MAKER() - - -def get_evs_context(context): - """Overrides the Neutron DB session with EVS DB session""" - - evs_context = EVSContext.from_dict(context.to_dict()) - evs_context.session = get_session() - - return evs_context diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/evs/db/l3nat.py --- a/components/openstack/neutron/files/evs/db/l3nat.py Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,281 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2012 Nicira Networks, Inc. All rights reserved. -# -# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# -# @author: Dan Wendlandt, Nicira, Inc -# @author: Girish Moodalbail, Oracle, Inc. -# - -""" -Based off generic l3_agent (neutron/agent/l3_agent) code -""" - -import sqlalchemy as sa - -from neutron.api.v2 import attributes -from neutron.common import constants as l3_constants -from neutron.common import exceptions as q_exc -from neutron.db import l3_db -from neutron.extensions import l3 -from neutron.extensions import external_net -from neutron.openstack.common import log as logging -from neutron.openstack.common import uuidutils -from neutron.plugins.evs.db import api as evs_db - - -LOG = logging.getLogger(__name__) - -DEVICE_OWNER_ROUTER_INTF = l3_constants.DEVICE_OWNER_ROUTER_INTF -DEVICE_OWNER_ROUTER_GW = l3_constants.DEVICE_OWNER_ROUTER_GW -DEVICE_OWNER_FLOATINGIP = l3_constants.DEVICE_OWNER_FLOATINGIP - - -class Router(evs_db.EVS_DB_BASE): - """Represents a v2 neutron router.""" - - id = sa.Column(sa.String(36), primary_key=True, - default=uuidutils.generate_uuid) - name = sa.Column(sa.String(255)) - status = sa.Column(sa.String(16)) - admin_state_up = sa.Column(sa.Boolean) - tenant_id = sa.Column(sa.String(255)) - gw_port_id = sa.Column(sa.String(36)) - gw_port_network_id = sa.Column(sa.String(36)) - - -class FloatingIP(evs_db.EVS_DB_BASE): - """Represents a floating IP address. - - This IP address may or may not be allocated to a tenant, and may or - may not be associated with an internal port/ip address/router. - """ - - id = sa.Column(sa.String(36), primary_key=True, - default=uuidutils.generate_uuid) - floating_ip_address = sa.Column(sa.String(64), nullable=False) - floating_network_id = sa.Column(sa.String(36), nullable=False) - floating_port_id = sa.Column(sa.String(36), nullable=False) - fixed_port_id = sa.Column(sa.String(36)) - fixed_ip_address = sa.Column(sa.String(64)) - router_id = sa.Column(sa.String(36), sa.ForeignKey('routers.id')) - tenant_id = sa.Column(sa.String(255)) - - -class EVS_L3_NAT_db_mixin(l3_db.L3_NAT_db_mixin): - """Mixin class to add L3/NAT router methods""" - - Router = Router - FloatingIP = FloatingIP - - def _make_router_dict(self, router, fields=None, - process_extensions=True): - res = {'id': router['id'], - 'name': router['name'], - 'tenant_id': router['tenant_id'], - 'admin_state_up': router['admin_state_up'], - 'status': router['status'], - 'external_gateway_info': None, - 'gw_port_id': router['gw_port_id']} - if router['gw_port_id']: - nw_id = router['gw_port_network_id'] - res['external_gateway_info'] = {'network_id': nw_id} - if process_extensions: - self._apply_dict_extend_functions( - l3.ROUTERS, res, router) - return self._fields(res, fields) - - def create_router(self, context, router): - return super(EVS_L3_NAT_db_mixin, self).\ - create_router(evs_db.get_evs_context(context), router) - - def update_router(self, context, id, router): - return super(EVS_L3_NAT_db_mixin, self).\ - update_router(evs_db.get_evs_context(context), id, router) - - def _update_router_gw_info(self, context, router_id, info, router=None): - """This method overrides the base class method and it's contents - are exactly same as the base class method except that the Router - DB columns are different for EVS and OVS""" - - router = router or self._get_router(context, router_id) - gw_port_id = router['gw_port_id'] - # network_id attribute is required by API, so it must be present - gw_port_network_id = router['gw_port_network_id'] - - network_id = info.get('network_id', None) if info else None - if network_id: - self._get_network(context, network_id) - if not self._network_is_external(context, network_id): - msg = _("Network %s is not a valid external " - "network") % network_id - raise q_exc.BadRequest(resource='router', msg=msg) - - # figure out if we need to delete existing port - if gw_port_id and gw_port_network_id != network_id: - fip_count = self.get_floatingips_count(context.elevated(), - {'router_id': [router_id]}) - if fip_count: - raise l3.RouterExternalGatewayInUseByFloatingIp( - router_id=router_id, net_id=gw_port_network_id) - with context.session.begin(subtransactions=True): - router['gw_port_id'] = None - router['gw_port_network_id'] = None - context.session.add(router) - self.delete_port(context.elevated(), gw_port_id, - l3_port_check=False) - - if network_id is not None and (gw_port_id is None or - gw_port_network_id != network_id): - subnets = self._get_subnets_by_network(context, - network_id) - for subnet in subnets: - self._check_for_dup_router_subnet(context, router_id, - network_id, subnet['id'], - subnet['cidr']) - - # Port has no 'tenant-id', as it is hidden from user - gw_port = self._core_plugin.create_port(context.elevated(), { - 'port': - {'tenant_id': '', # intentionally not set - 'network_id': network_id, - 'mac_address': attributes.ATTR_NOT_SPECIFIED, - 'fixed_ips': attributes.ATTR_NOT_SPECIFIED, - 'device_id': router_id, - 'device_owner': DEVICE_OWNER_ROUTER_GW, - 'admin_state_up': True, - 'name': ''}}) - - if not gw_port['fixed_ips']: - self._core_plugin.delete_port(context.elevated(), - gw_port['id'], - l3_port_check=False) - msg = (_('No IPs available for external network %s') % - network_id) - raise q_exc.BadRequest(resource='router', msg=msg) - - with context.session.begin(subtransactions=True): - router['gw_port_id'] = gw_port['id'] - router['gw_port_network_id'] = gw_port['network_id'] - context.session.add(router) - - def delete_router(self, context, id): - super(EVS_L3_NAT_db_mixin, self).\ - delete_router(evs_db.get_evs_context(context), id) - - def get_router(self, context, id, fields=None): - return super(EVS_L3_NAT_db_mixin, self).\ - get_router(evs_db.get_evs_context(context), id, fields) - - def get_routers(self, context, filters=None, fields=None, - sorts=None, limit=None, marker=None, page_reverse=False): - - query = evs_db.get_session().query(self.Router) - if filters is not None: - for key, value in filters.iteritems(): - column = getattr(self.Router, key, None) - if column: - query = query.filter(column.in_(value)) - - routers = query.all() - retlist = [] - for router in routers: - retlist.append(self._make_router_dict(router, fields)) - return retlist - - def get_routers_count(self, context, filters=None): - return len(self.get_routers(context, filters)) - - def add_router_interface(self, context, router_id, interface_info): - return super(EVS_L3_NAT_db_mixin, self).\ - add_router_interface(evs_db.get_evs_context(context), - router_id, interface_info) - - def remove_router_interface(self, context, router_id, interface_info): - return super(EVS_L3_NAT_db_mixin, self).\ - remove_router_interface(evs_db.get_evs_context(context), - router_id, interface_info) - - def create_floatingip(self, context, floatingip): - return super(EVS_L3_NAT_db_mixin, self).\ - create_floatingip(evs_db.get_evs_context(context), floatingip) - - def update_floatingip(self, context, id, floatingip): - return super(EVS_L3_NAT_db_mixin, self).\ - update_floatingip(evs_db.get_evs_context(context), id, floatingip) - - def delete_floatingip(self, context, id): - super(EVS_L3_NAT_db_mixin, self).\ - delete_floatingip(evs_db.get_evs_context(context), id) - - def get_floatingip(self, context, id, fields=None): - return super(EVS_L3_NAT_db_mixin, self).\ - get_floatingip(evs_db.get_evs_context(context), id, fields) - - def get_floatingips(self, context, filters=None, fields=None, - sorts=None, limit=None, marker=None, - page_reverse=False): - - query = evs_db.get_session().query(self.FloatingIP) - if filters: - for key, value in filters.iteritems(): - column = getattr(self.FloatingIP, key, None) - if column: - query = query.filter(column.in_(value)) - - floatingips = query.all() - retlist = [] - for floatingip in floatingips: - retlist.append(self._make_floatingip_dict(floatingip, fields)) - return retlist - - def get_floatingips_count(self, context, filters=None): - return len(self.get_floatingips(context, filters)) - - def prevent_l3_port_deletion(self, context, port_id): - """ Checks to make sure a port is allowed to be deleted, raising - an exception if this is not the case. This should be called by - any plugin when the API requests the deletion of a port, since - some ports for L3 are not intended to be deleted directly via a - DELETE to /ports, but rather via other API calls that perform the - proper deletion checks. - """ - port = self.get_port(context, port_id) - if not port: - return - if port['device_owner'] in [DEVICE_OWNER_ROUTER_INTF, - DEVICE_OWNER_ROUTER_GW, - DEVICE_OWNER_FLOATINGIP]: - raise l3.L3PortInUse(port_id=port_id, - device_owner=port['device_owner']) - - def disassociate_floatingips(self, context, port_id): - super(EVS_L3_NAT_db_mixin, self).\ - disassociate_floatingips(evs_db.get_evs_context(context), port_id) - - def get_sync_data(self, context, router_ids=None, active=None): - return super(EVS_L3_NAT_db_mixin, self).\ - get_sync_data(evs_db.get_evs_context(context), router_ids, active) - - def _get_by_id(self, context, model, id): - return context.session.query(model).\ - filter(model.id == id).one() - - def allow_l3_port_deletion(self, context, port_id): - """ If an L3 agent is using this port, then we need to send - a notification to L3 agent to release the port before we can - delete the port""" - pass diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/evs/db/quotas_db.py --- a/components/openstack/neutron/files/evs/db/quotas_db.py Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,123 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2011 OpenStack Foundation. -# All Rights Reserved. -# -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# -# @author: Girish Moodalbail, Oracle, Inc. -# - -import sqlalchemy as sa - -from neutron.db import quota_db -from neutron.openstack.common import uuidutils -from neutron.plugins.evs.db import api as evs_db - - -class Quota(evs_db.EVS_DB_BASE): - """Represent a single quota override for a tenant. - - If there is no row for a given tenant id and resource, then the - default for the quota class is used. - """ - - id = sa.Column(sa.String(36), primary_key=True, - default=uuidutils.generate_uuid) - tenant_id = sa.Column(sa.String(255), index=True) - resource = sa.Column(sa.String(255)) - limit = sa.Column(sa.Integer) - - -class EVSDbQuotaDriver(quota_db.DbQuotaDriver): - """ - Driver to perform necessary checks to enforce quotas and obtain - quota information. The default driver utilizes the local - database. - """ - - @staticmethod - def get_tenant_quotas(context, resources, tenant_id): - """ - Given a list of resources, retrieve the quotas for the given - tenant. - - :param context: The request context, for access checks. - :param resources: A dictionary of the registered resource keys. - :param tenant_id: The ID of the tenant to return quotas for. - :return dict: from resource name to dict of name and limit - """ - - return quota_db.DbQuotaDriver().\ - get_tenant_quotas(evs_db.get_evs_context(context), resources, - tenant_id) - - @staticmethod - def delete_tenant_quota(context, tenant_id): - """Delete the quota entries for a given tenant_id. - - Atfer deletion, this tenant will use default quota values in conf. - """ - - quota_db.DbQuotaDriver().\ - delete_tenant_quota(evs_db.get_evs_context(context), tenant_id) - - @staticmethod - def get_all_quotas(context, resources): - """ - Given a list of resources, retrieve the quotas for the all - tenants. - - :param context: The request context, for access checks. - :param resources: A dictionary of the registered resource keys. - :return quotas: list of dict of tenant_id:, resourcekey1: - resourcekey2: ... - """ - - return quota_db.DbQuotaDriver().\ - get_all_quotas(evs_db.get_evs_context(context), resources) - - @staticmethod - def update_quota_limit(context, tenant_id, resource, limit): - quota_db.DbQuotaDriver().\ - update_quota_limit(evs_db.get_evs_context(context), tenant_id, - resource, limit) - - def limit_check(self, context, tenant_id, resources, values): - """Check simple quota limits. - - For limits--those quotas for which there is no usage - synchronization function--this method checks that a set of - proposed values are permitted by the limit restriction. - - This method will raise a QuotaResourceUnknown exception if a - given resource is unknown or if it is not a simple limit - resource. - - If any of the proposed values is over the defined quota, an - OverQuota exception will be raised with the sorted list of the - resources which are too high. Otherwise, the method returns - nothing. - - :param context: The request context, for access checks. - :param tenant_id: The tenant_id to check the quota. - :param resources: A dictionary of the registered resources. - :param values: A dictionary of the values to check against the - quota. - """ - - super(EVSDbQuotaDriver, self).\ - limit_check(evs_db.get_evs_context(context), tenant_id, resources, - values) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/evs/migrate/__init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/neutron/files/evs/migrate/__init__.py Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,13 @@ +# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/evs/migrate/evs-neutron-migration.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/neutron/files/evs/migrate/evs-neutron-migration.py Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,420 @@ +#!/usr/bin/python2.6 +# +# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +# +# This script migrates the network, subnet and port information from EVS DB to +# neutron-server DB. It also re-creates routers and floatingips tables with +# Neutron's l3 schema. This script needs to be run for the proper upgrade of +# Neutron from Havana to Juno release. +# + +import ConfigParser +import rad.connect as radcon +import rad.bindings.com.oracle.solaris.rad.evscntl as evsc + +from neutron import context as ctx +from neutron.db import common_db_mixin +from neutron.db import api as db +from neutron.db import model_base +from neutron.plugins.evs.migrate import havana_api + +import sqlalchemy as sa +from sqlalchemy import MetaData +from sqlalchemy.orm import sessionmaker +from sqlalchemy.schema import DropConstraint +from sqlalchemy import sql + +from oslo.config import cfg +from oslo.db import options as db_options +from oslo.db import exception as excp + + +def create_db_network(nw, engine, ext_ro): + ''' Method for creating networks table in the neutron-server DB + Input params: + @nw - Dictionary with values from EVS DB + @engine - SQL engine + @ext_ro - External router + ''' + # Importing locally because these modules end up importing neutron.wsgi + # which causes RAD to hang + from neutron.db import db_base_plugin_v2 + from neutron.db import external_net_db as ext_net + model_base.BASEV2.metadata.bind = engine + model_base.BASEV2.metadata.create_all(engine) + ctxt = ctx.get_admin_context() + inst = db_base_plugin_v2.NeutronDbPluginV2() + dup = False + try: + db_base_plugin_v2.NeutronDbPluginV2.create_network(inst, ctxt, nw) + print "\nnetwork=%s added" % nw['network']['name'] + if ext_ro: + ext_nw = ext_net.ExternalNetwork(network_id=nw['network']['id']) + session = sessionmaker() + session.configure(bind=engine) + s = session() + s.add(ext_nw) + s.commit() + except excp.DBDuplicateEntry: + print "\nnetwork '%s' already exists" % nw['network']['name'] + dup = True + return dup + + +def create_db_subnet(sub): + ''' Method for creating subnets table in the neutron-server DB + Input params: + @sub - Dictionary with values from EVS DB + ''' + # Importing locally because this module ends up importing neutron.wsgi + # which causes RAD to hang + from neutron.db import db_base_plugin_v2 + ctxt = ctx.get_admin_context() + inst = db_base_plugin_v2.NeutronDbPluginV2() + try: + db_base_plugin_v2.NeutronDbPluginV2.create_subnet(inst, ctxt, sub) + print "\nsubnet=%s added" % sub['subnet']['id'] + except excp.DBDuplicateEntry: + print "\nsubnet '%s' already exists" % sub['subnet']['id'] + + +def create_db_port(port): + ''' Method for creating ports table in the neutron-server DB + Input params: + @port - Dictionary with values from EVS DB + ''' + # Importing locally because this module ends up importing neutron.wsgi + # which causes RAD to hang + from neutron.db import db_base_plugin_v2 + ctxt = ctx.get_admin_context() + inst = db_base_plugin_v2.NeutronDbPluginV2() + try: + db_base_plugin_v2.NeutronDbPluginV2.create_port(inst, ctxt, port) + print "\nport=%s added" % port['port']['id'] + except excp.DBDuplicateEntry: + print "\nport '%s' already exists" % port['port']['id'] + + +def main(): + print "Start Migration." + + # Connect to EVS controller + config = ConfigParser.RawConfigParser() + config.readfp(open("/etc/neutron/plugins/evs/evs_plugin.ini")) + if config.has_option("EVS", 'evs_controller'): + config_suh = config.get("EVS", 'evs_controller') + else: + config_suh = 'ssh://evsuser@localhost' + suh = config_suh.split('://') + if len(suh) != 2 or suh[0] != 'ssh' or not suh[1].strip(): + raise SystemExit(_("Specified evs_controller is invalid")) + uh = suh[1].split('@') + if len(uh) != 2 or not uh[0].strip() or not uh[1].strip(): + raise SystemExit(_("'user' and 'hostname' need to be specified " + "for evs_controller")) + try: + rc = radcon.connect_ssh(uh[1], user=uh[0]) + except: + raise SystemExit(_("Cannot connect to EVS Controller")) + try: + evs_contr = rc.get_object(evsc.EVSController()) + except: + raise SystemExit(_("Could not retrieve EVS info from EVS Controller")) + evsinfo = evs_contr.getEVSInfo() + if not evsinfo: + raise SystemExit(_("No data to migrate")) + + config.readfp(open("/etc/neutron/neutron.conf")) + if config.has_option("database", 'connection'): + SQL_CONNECTION = config.get("database", 'connection') + else: + SQL_CONNECTION = 'sqlite:////var/lib/neutron/neutron.sqlite' + + conf = cfg.CONF + db_options.set_defaults(cfg.CONF, + connection=SQL_CONNECTION, + sqlite_db='', max_pool_size=10, + max_overflow=20, pool_timeout=10) + + neutron_engine = sa.create_engine(SQL_CONNECTION) + router_port_ids = {} + + for e in evsinfo: + ext_ro = False + for p in e.props: + if p.name == 'OpenStack:router:external' and p.value == 'True': + ext_ro = True + # Populate networks table + n = { + 'tenant_id': e.tenantname, + 'id': e.uuid, + 'name': e.name, + 'status': 'ACTIVE', + 'admin_state_up': True, + 'shared': False + } + nw = {'network': n} + dup = create_db_network(nw, neutron_engine, ext_ro) + if dup: + continue # No need to iterate over subnets and ports + + # Populate subnets table + for i in e.ipnets: + cidr = None + gateway_ip = None + enable_dhcp = None + dns = [] + host = [] + start = [] + for p in i.props: + if p.name == 'subnet': + cidr = p.value + elif p.name == 'defrouter': + gateway_ip = p.value + elif p.name == 'OpenStack:enable_dhcp': + enable_dhcp = p.value == 'True' + elif p.name == 'OpenStack:dns_nameservers': + dns = p.value.split(',') + elif p.name == 'OpenStack:host_routes': + hh = p.value.split(',') + for h in range(0, len(hh), 2): + d = {hh[h]: hh[h+1]} + host.append(d) + elif p.name == 'pool': + ss = p.value.split(',') + for s in ss: + if '-' in s: + d = {'start': s.split('-')[0], + 'end': s.split('-')[1]} + start.append(d) + else: + d = {'start': s, 'end': s} + start.append(d) + ip_version = 4 if i.ipvers == evsc.IPVersion.IPV4 else 6 + + if i.name.startswith(i.uuid[:8]): + # Skip autogenerated names + name = None + else: + name = i.name + s = { + 'tenant_id': i.tenantname, + 'id': i.uuid, + 'name': name, + 'network_id': e.uuid, + 'ip_version': ip_version, + 'cidr': cidr, + 'gateway_ip': gateway_ip, + 'enable_dhcp': enable_dhcp, + 'shared': False, + 'allocation_pools': start, + 'dns_nameservers': dns, + 'host_routes': host + } + + sub = {'subnet': s} + create_db_subnet(sub) + + # Populate ports table + for j in e.vports: + device_owner = '' + device_id = '' + mac_address = None + ipaddr = None + for v in j.props: + if v.name == 'OpenStack:device_owner': + device_owner = v.value + if v.value in ('network:router_interface', + 'network:router_gateway'): + router_port_ids[j.uuid] = v.value + elif v.name == 'OpenStack:device_id': + device_id = v.value + elif v.name == 'macaddr': + mac_address = v.value + elif v.name == 'ipaddr': + ipaddr = v.value.split('/')[0] + if j.name.startswith(j.uuid[:8]): + # Skip autogenerated names + name = None + else: + name = j.name + + p = { + 'tenant_id': j.tenantname, + 'id': j.uuid, + 'name': name, + 'network_id': e.uuid, + 'mac_address': mac_address, + 'admin_state_up': True, + 'status': 'ACTIVE', + 'device_id': device_id, + 'device_owner': device_owner, + 'fixed_ips': [{'subnet_id': e.ipnets[0].uuid, + 'ip_address': ipaddr}] + } + port = {'port': p} + create_db_port(port) + + # Change the schema of the floatingips and routers tables by doing + # the following: + # Fetch the floatingip, router entry using EVS API, + # Temporarily store the information, + # Delete floatingip, router entry, + # Remove floatingip, router as a constraint from existing tables, + # Drop the routers, floatingips table, + # Add router, floatingip entry using Neutron API + + # Importing locally because this module ends up importing neutron.wsgi + # which causes RAD to hang + from neutron.db import l3_db + havana_api.configure_db() + session = havana_api.get_session() + + # Fetch the floatingip entry using EVS API + query = session.query(havana_api.FloatingIP) + floatingips = query.all() + fl = [] + if floatingips: + for f in floatingips: + fi = { + 'id': f['id'], + 'floating_ip_address': f['floating_ip_address'], + 'floating_network_id': f['floating_network_id'], + 'floating_port_id': f['floating_port_id'], + 'fixed_port_id': f['fixed_port_id'], + 'fixed_ip_address': f['fixed_ip_address'], + 'tenant_id': f['tenant_id'], + 'router_id': f['router_id'], + } + fl.append(fi) + + # Delete floatingip entry + ctxt = ctx.get_admin_context() + ctxt = havana_api.get_evs_context(ctxt) + with ctxt.session.begin(subtransactions=True): + cm_db_inst = common_db_mixin.CommonDbMixin() + query = common_db_mixin.CommonDbMixin._model_query(cm_db_inst, + ctxt, + havana_api. + FloatingIP) + for fip in query: + ctxt.session.delete(fip) + + # Fetch the router entry using EVS API + query = session.query(havana_api.Router) + routers = [] + try: + routers = query.all() + except sa.exc.OperationalError: + pass + if routers: + for r in routers: + router_id = r['id'] + rt = { + 'tenant_id': r['tenant_id'], + 'id': r['id'], + 'name': r['name'], + 'admin_state_up': r['admin_state_up'], + 'gw_port_id': r['gw_port_id'], + 'status': 'ACTIVE' + } + + # Delete router entry + ctxt = ctx.get_admin_context() + ctxt = havana_api.get_evs_context(ctxt) + with ctxt.session.begin(subtransactions=True): + cm_db_inst = common_db_mixin.CommonDbMixin() + query = common_db_mixin.CommonDbMixin._model_query(cm_db_inst, + ctxt, + havana_api. + Router) + router = query.filter(havana_api.Router.id == router_id).one() + ctxt.session.delete(router) + + engine = sa.create_engine(SQL_CONNECTION) + meta = MetaData() + conn = engine.connect() + trans = conn.begin() + meta.reflect(engine) + + # Remove router as a constraint from existing tables, + # Drop the routers table to remove old schema + for t in meta.tables.values(): + for fk in t.foreign_keys: + if fk.column.table.name == "routers": + engine.execute(DropConstraint(fk.constraint)) + for t in meta.tables.values(): + if t.name == "routers": + t.drop(bind=conn) + + # Remove floatingip as a constraint from existing tables, + # Drop the floatingip table to remove old schema + for t in meta.tables.values(): + for fk in t.foreign_keys: + if fk.column.table.name == "floatingips": + engine.execute(DropConstraint(fk.constraint)) + for t in meta.tables.values(): + if t.name == "floatingips": + t.drop(bind=conn) + conn.close() + + # Add the routers and floatingips using the schema in l3_db.py + + setattr(l3_db.Router, 'enable_snat', sa.Column(sa.Boolean, + default=True, server_default=sql.true(), nullable=False)) + neutron_engine = sa.create_engine(SQL_CONNECTION) + model_base.BASEV2.metadata.bind = neutron_engine + model_base.BASEV2.metadata.create_all(neutron_engine) + if routers: + ctxt = ctx.get_admin_context() + with ctxt.session.begin(subtransactions=True): + router_db = l3_db.Router(id=router_id, + tenant_id=r['tenant_id'], + name=rt['name'], + admin_state_up=rt['admin_state_up'], + gw_port_id=rt['gw_port_id'], + status="ACTIVE") + ctxt.session.add(router_db) + print "\nrouter=%s updated" % rt['name'] + with ctxt.session.begin(subtransactions=True): + for i, j in router_port_ids.iteritems(): + router_port = l3_db.RouterPort( + port_id=i, + router_id=router_id, + port_type=j) + ctxt.session.add(router_port) + + if floatingips: + ctxt = ctx.get_admin_context() + with ctxt.session.begin(subtransactions=True): + for i in fl: + fl_db = l3_db.FloatingIP( + id=i['id'], + floating_ip_address=i['floating_ip_address'], + floating_network_id=i['floating_network_id'], + floating_port_id=i['floating_port_id'], + fixed_port_id=i['fixed_port_id'], + fixed_ip_address=i['fixed_ip_address'], + router_id=i['router_id'], + tenant_id=i['tenant_id']) + ctxt.session.add(fl_db) + print "\nfloatingip=%s updated" % i['floating_ip_address'] + + print "\nEnd Migration." + + +if __name__ == '__main__': + main() diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/evs/migrate/havana_api.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/neutron/files/evs/migrate/havana_api.py Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,102 @@ +# +# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# + +import ConfigParser + +from sqlalchemy.ext import declarative +from sqlalchemy import orm +import sqlalchemy as sa + +from neutron.context import ContextBase +from neutron.db import model_base +from neutron.openstack.common import uuidutils + +EVS_DB_BASE = declarative.declarative_base(cls=model_base.NeutronBaseV2) +EVS_DB_ENGINE = None +EVS_DB_MAKER = None + + +class EVSContext(ContextBase): + @property + def session(self): + return self._session + + @session.setter + def session(self, session): + self._session = session + + +def configure_db(): + global EVS_DB_ENGINE + if not EVS_DB_ENGINE: + config = ConfigParser.RawConfigParser() + config.readfp(open("/etc/neutron/neutron.conf")) + if config.has_option("database", 'connection'): + sql_connection = config.get("database", 'connection') + else: + sql_connection = 'sqlite:////var/lib/neutron/neutron.sqlite' + EVS_DB_ENGINE = sa.create_engine(sql_connection, echo=False) + EVS_DB_BASE.metadata.create_all(EVS_DB_ENGINE) + + +def get_session(autocommit=True, expire_on_commit=False): + global EVS_DB_ENGINE, EVS_DB_MAKER + assert EVS_DB_ENGINE + if not EVS_DB_MAKER: + EVS_DB_MAKER = orm.sessionmaker(bind=EVS_DB_ENGINE, + autocommit=autocommit, + expire_on_commit=expire_on_commit) + return EVS_DB_MAKER() + + +def get_evs_context(context): + """Overrides the Neutron DB session with EVS DB session""" + + evs_context = EVSContext.from_dict(context.to_dict()) + evs_context.session = get_session() + + return evs_context + + +class Router(EVS_DB_BASE): + """Represents a v2 neutron router.""" + + id = sa.Column(sa.String(36), primary_key=True, + default=uuidutils.generate_uuid) + name = sa.Column(sa.String(255)) + status = sa.Column(sa.String(16)) + admin_state_up = sa.Column(sa.Boolean) + tenant_id = sa.Column(sa.String(255)) + gw_port_id = sa.Column(sa.String(36)) + gw_port_network_id = sa.Column(sa.String(36)) + + +class FloatingIP(EVS_DB_BASE): + """Represents a floating IP address. + + This IP address may or may not be allocated to a tenant, and may or + may not be associated with an internal port/ip address/router. + """ + + id = sa.Column(sa.String(36), primary_key=True, + default=uuidutils.generate_uuid) + floating_ip_address = sa.Column(sa.String(64), nullable=False) + floating_network_id = sa.Column(sa.String(36), nullable=False) + floating_port_id = sa.Column(sa.String(36), nullable=False) + fixed_port_id = sa.Column(sa.String(36)) + fixed_ip_address = sa.Column(sa.String(64)) + router_id = sa.Column(sa.String(36), sa.ForeignKey('routers.id')) + tenant_id = sa.Column(sa.String(255)) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/evs/plugin.py --- a/components/openstack/neutron/files/evs/plugin.py Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/evs/plugin.py Mon Apr 20 12:35:51 2015 -0700 @@ -16,7 +16,6 @@ # # @author: Girish Moodalbail, Oracle, Inc. -import netaddr import rad.client as radcli import rad.connect as radcon import rad.bindings.com.oracle.solaris.rad.evscntl_1 as evsbind @@ -25,25 +24,27 @@ from neutron.api.rpc.agentnotifiers import dhcp_rpc_agent_api from neutron.api.rpc.agentnotifiers import l3_rpc_agent_api +from neutron.api.rpc.handlers import dhcp_rpc +from neutron.api.rpc.handlers import l3_rpc from neutron.api.v2 import attributes -from neutron.common import constants as l3_constants +from neutron.common import constants from neutron.common import exceptions -from neutron.common import rpc as q_rpc +from neutron.common import rpc as n_rpc from neutron.common import topics +from neutron.db import agents_db +from neutron.db import agentschedulers_db +from neutron.db import api as db from neutron.db import db_base_plugin_v2 -from neutron.db import dhcp_rpc_base from neutron.db import external_net_db -from neutron.db import l3_rpc_base +from neutron.db import l3_gwmode_db +from neutron.db import model_base +from neutron.db import quota_db from neutron.extensions import external_net from neutron.extensions import providernet +from neutron.openstack.common import importutils from neutron.openstack.common import lockutils from neutron.openstack.common import log as logging -from neutron.openstack.common import rpc from neutron.plugins.common import constants as svc_constants -from neutron.plugins.evs.db import api as evs_db -from neutron.plugins.evs.db import l3nat as evs_l3nat -from neutron.plugins.evs.db import quotas_db - LOG = logging.getLogger(__name__) @@ -52,44 +53,7 @@ help=_("An URI that specifies an EVS controller")) ] -evs_database_opts = [ - cfg.StrOpt('sql_connection', - default='sqlite:////var/lib/neutron/neutron.sqlite', - help=_("An URI that specifies SQL connectionr")), -] - cfg.CONF.register_opts(evs_controller_opts, "EVS") -cfg.CONF.register_opts(evs_database_opts, "DATABASE") - -# Maps OpenStack network resource attributes to EVS properties -NETWORK_EVS_ATTRIBUTE_MAP = { - 'tenant_id': 'tenant', - 'network_id': 'evs', - 'id': 'evs', - 'name': 'evs', - external_net.EXTERNAL: 'OpenStack:' + external_net.EXTERNAL, -} - -# Maps OpenStack subnet resource attributes to EVS' IPnet properties -SUBNET_IPNET_ATTRIBUTE_MAP = { - 'tenant_id': 'tenant', - 'network_id': 'evs', - 'id': 'ipnet', - 'name': 'ipnet', - 'enable_dhcp': 'OpenStack:enable_dhcp', - 'dns_nameservers': 'OpenStack:dns_nameservers', - 'host_routes': 'OpenStack:host_routes', -} - -# Maps OpenStack port resource attributes to EVS' VPort properties -PORT_VPORT_ATTRIBUTE_MAP = { - 'tenant_id': 'tenant', - 'network_id': 'evs', - 'id': 'vport', - 'name': 'vport', - 'device_id': 'OpenStack:device_id', - 'device_owner': 'OpenStack:device_owner', -} class EVSControllerError(exceptions.NeutronException): @@ -106,29 +70,14 @@ super(EVSOpNotSupported, self).__init__(opname=evs_errmsg) -class EVSRpcCallbacks(dhcp_rpc_base.DhcpRpcCallbackMixin, - l3_rpc_base.L3RpcCallbackMixin): - RPC_API_VERSION = '1.1' - - def create_rpc_dispatcher(self): - '''Get the rpc dispatcher for this manager. - - If a manager would like to set an rpc API version, or support more than - one class as the target of rpc messages, override this method. - ''' - return q_rpc.PluginRpcDispatcher([self]) - - def report_state(self, context, **kwargs): - # TODO(gmoodalb): This method is currently no-op and is included - # here to avoid Python traceback thrown every time Neutron L3/DHCP - # agent is restarted. When we support Network Agents Information, - # we will implement this function - pass +class EVSNotFound(exceptions.NeutronException): + message = _("Network %(net_id)s could not be found in EVS") class EVSNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2, + agentschedulers_db.DhcpAgentSchedulerDbMixin, external_net_db.External_net_db_mixin, - evs_l3nat.EVS_L3_NAT_db_mixin): + l3_gwmode_db.L3_NAT_db_mixin): """Implements v2 Neutron Plug-in API specification. All the neutron API calls to create/delete/retrieve Network/Subnet/Port @@ -190,23 +139,25 @@ |---------------------+------------------+------------------------------| """ - # These attribute specifies whether the plugin supports or not - # bulk/pagination/sorting operations. - __native_bulk_support = False - __native_pagination_support = False - __native_sorting_support = False - _supported_extension_aliases = ["provider", "external-net", "router", - "quotas"] + "ext-gw-mode", "quotas", "agent", + "dhcp_agent_scheduler"] def __init__(self): - # Since EVS Framework does not support router and floatingip - # resources, the plugin itself will maintain a DB for these - # two resources - evs_db.configure_db() + engine = db.get_engine() + model_base.BASEV2.metadata.create_all(engine) + + self.network_scheduler = importutils.import_object( + cfg.CONF.network_scheduler_driver + ) - # Since there is no connect_uri() yet, we need to do this ourselves - # parse ssh://user@hostname + self._setup_rpc() + self._rad_connection = None + + @property + def rad_connection(self): + # Since there is no connect_uri() yet, we need to do + # parsing of ssh://user@hostname ourselves suh = cfg.CONF.EVS.evs_controller.split('://') if len(suh) != 2 or suh[0] != 'ssh' or not suh[1].strip(): raise SystemExit(_("Specified evs_controller is invalid")) @@ -215,165 +166,89 @@ raise SystemExit(_("'user' and 'hostname' need to be specified " "for evs_controller")) - # TODO(gmoodalb): - try few times before you give up - self._rc = radcon.connect_ssh(uh[1], user=uh[0]) - self._evsc = self._rc.get_object(evsbind.EVSController()) - self._setup_rpc() + if (self._rad_connection is not None and + self._rad_connection._closed is None): + return self._rad_connection + + LOG.debug(_("Connecting to EVS Controller at %s as %s") % + (uh[1], uh[0])) + self._rad_connection = radcon.connect_ssh(uh[1], user=uh[0]) + return self._rad_connection def _setup_rpc(self): # RPC support self.service_topics = {svc_constants.CORE: topics.PLUGIN, svc_constants.L3_ROUTER_NAT: topics.L3PLUGIN} - self.conn = rpc.create_connection(new=True) - self.callbacks = EVSRpcCallbacks() - self.dispatcher = self.callbacks.create_rpc_dispatcher() + self.conn = n_rpc.create_connection(new=True) + self.endpoints = [dhcp_rpc.DhcpRpcCallback(), + l3_rpc.L3RpcCallback(), + agents_db.AgentExtRpcCallback()] for svc_topic in self.service_topics.values(): - self.conn.create_consumer(svc_topic, self.dispatcher, fanout=False) + self.conn.create_consumer(svc_topic, self.endpoints, fanout=False) # Consume from all consumers in a thread - self.conn.consume_in_thread() + self.conn.consume_in_threads() self.dhcp_agent_notifier = dhcp_rpc_agent_api.DhcpAgentNotifyAPI() + self.l3_agent_notifier = l3_rpc_agent_api.L3AgentNotifyAPI() + + # needed by AgentSchedulerDbMixin() + self.agent_notifiers[constants.AGENT_TYPE_DHCP] = \ + self.dhcp_agent_notifier + self.agent_notifiers[constants.AGENT_TYPE_L3] = \ + self.l3_agent_notifier @property def supported_extension_aliases(self): return self._supported_extension_aliases - def _convert_evs_to_network(self, evs): - """Converts an EVS structure into Neutron Network structure.""" - - networkdict = dict() - networkdict['name'] = evs.name - networkdict['id'] = evs.uuid - networkdict['subnets'] = ([ipnet.uuid for ipnet in evs.ipnets] - if evs.ipnets else []) - networkdict['tenant_id'] = evs.tenantname - networkdict[external_net.EXTERNAL] = False - for prop in evs.props: - if prop.name == 'l2-type': - networkdict[providernet.NETWORK_TYPE] = prop.value - elif prop.name == 'vlanid' or prop.name == 'vni': - networkdict[providernet.SEGMENTATION_ID] = int(prop.value) - elif prop.name == NETWORK_EVS_ATTRIBUTE_MAP[external_net.EXTERNAL]: - networkdict[external_net.EXTERNAL] = \ - (True if prop.value == 'True' else False) - # fixed values as EVS framework doesn't support this - networkdict['admin_state_up'] = True - networkdict['status'] = 'ACTIVE' - networkdict['shared'] = False - - return networkdict - - def _convert_ipnet_to_subnet(self, ipnet): - """Converts an EVS IPnet structure into Neutron Subnet structure.""" - - subnetdict = dict() - subnetdict['name'] = ipnet.name - subnetdict['network_id'] = ipnet.evsuuid - subnetdict['id'] = ipnet.uuid - subnetdict['tenant_id'] = ipnet.tenantname - subnetdict['ip_version'] = \ - (4 if ipnet.ipvers == evsbind.IPVersion.IPV4 else 6) - # assign default values to some subnet attributes - subnetdict['dns_nameservers'] = [] - subnetdict['host_routes'] = [] - subnetdict['enable_dhcp'] = False - for prop in ipnet.props: - if prop.name == 'defrouter': - subnetdict['gateway_ip'] = prop.value - elif prop.name == 'subnet': - subnetdict['cidr'] = prop.value - elif prop.name == SUBNET_IPNET_ATTRIBUTE_MAP['enable_dhcp']: - subnetdict['enable_dhcp'] = \ - (True if prop.value == 'True' else False) - elif prop.name == SUBNET_IPNET_ATTRIBUTE_MAP['dns_nameservers']: - subnetdict['dns_nameservers'] = prop.value.split(',') - elif prop.name == SUBNET_IPNET_ATTRIBUTE_MAP['host_routes']: - hrlist = [] - vlist = prop.value.split(',') - for i in range(0, len(vlist), 2): - hrlist.append({vlist[i]: vlist[i + 1]}) - subnetdict['host_routes'] = hrlist - elif prop.name == 'pool': - poollist = [] - for pool in prop.value.split(','): - if '-' not in pool: - start = end = pool - else: - start, end = pool.split('-') - poollist.append(dict(start=start, end=end)) - subnetdict['allocation_pools'] = poollist - subnetdict['shared'] = False + @lockutils.synchronized('evs-plugin', 'neutron-') + def _evs_controller_addIPnet(self, tenantname, evsname, ipnetname, + propstr): + LOG.debug(_("Adding IPnet: %s with properties: %s for tenant: %s " + "and for evs: %s") % + (ipnetname, propstr, tenantname, evsname)) - return subnetdict - - def _convert_vport_to_port(self, context, vport): - """Converts an EVS VPort structure into Neutron port structure.""" - - portdict = dict() - portdict['admin_state_up'] = True - portdict['id'] = vport.uuid - portdict['name'] = vport.name - portdict['network_id'] = vport.evsuuid - # TODO(gmoodalb): set to host/zonename/vnicname? - portdict['device_id'] = '' - portdict['device_owner'] = '' - for prop in vport.props: - if (prop.name == 'macaddr'): - portdict['mac_address'] = prop.value - elif (prop.name == 'ipaddr'): - evs = self.get_network(context, vport.evsuuid) - portdict['fixed_ips'] = \ - [{ - 'ip_address': prop.value.split('/')[0], - 'subnet_id': evs['subnets'][0], - }] - elif (prop.name == 'OpenStack:device_id'): - portdict['device_id'] = prop.value - elif (prop.name == 'OpenStack:device_owner'): - portdict['device_owner'] = prop.value - portdict['security_groups'] = [] - portdict['status'] = 'ACTIVE' - portdict['tenant_id'] = vport.tenantname - - return portdict - - def _apply_rsrc_props_filter(self, rsrclist, filters): - # if all of the filter values are None, then return - if all([value is None for value in filters.values()]): - return - - rsrc_to_remove = [] - for rsrc in rsrclist: - propdict = dict((prop.name, prop.value) for prop in rsrc.props) - for key, value in filters.iteritems(): - if value is None: - continue - if key not in propdict: - rsrc_to_remove.append(rsrc) - break - elif isinstance(value, list): - strlist = [str(v) for v in value] - if propdict[key] not in strlist: - rsrc_to_remove.append(rsrc) - break - # TODO(gmoodalb): - check if it's an instance of basestring? - elif propdict[key] != str(value): - rsrc_to_remove.append(rsrc) - break - - for rsrc in rsrc_to_remove: - rsrclist.remove(rsrc) - - @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_addIPnet(self, tenantname, evsname, ipnetname, propstr): + pat = radcli.ADRGlobPattern({'name': evsname, + 'tenant': tenantname}) try: - pat = radcli.ADRGlobPattern( - {'name': evsname, 'tenant': tenantname}) - evs = self._rc.get_object(evsbind.EVS(), pat) + evs = self.rad_connection.get_object(evsbind.EVS(), pat) ipnet = evs.addIPnet(propstr, ipnetname) except radcli.ObjectError as oe: raise EVSControllerError(oe.get_payload().errmsg) return ipnet + @lockutils.synchronized('evs-plugin', 'neutron-') + def _evs_controller_updateIPnet(self, ipnetuuid, propstr): + LOG.debug(_("Updating IPnet with id: %s with property string: %s") % + (ipnetuuid, propstr)) + pat = radcli.ADRGlobPattern({'uuid': ipnetuuid}) + try: + ipnetlist = self.rad_connection.list_objects(evsbind.IPnet(), pat) + if not ipnetlist: + return + assert len(ipnetlist) == 1 + ipnet = self.rad_connection.get_object(ipnetlist[0]) + ipnet.setProperty(propstr) + except radcli.ObjectError as oe: + raise EVSControllerError(oe.get_payload().errmsg) + + def _subnet_pool_to_evs_pool(self, subnet): + poolstr = "" + # obtain the optional allocation pool + pools = subnet.get('allocation_pools') + if not pools or pools is attributes.ATTR_NOT_SPECIFIED: + return poolstr + + for pool in pools: + if poolstr: + poolstr += "," + # if start and end address is same, EVS expects the address + # to be provided as-is instead of x.x.x.x-x.x.x.x + if pool['start'] == pool['end']: + poolstr += pool['start'] + else: + poolstr += "%s-%s" % (pool['start'], pool['end']) + return poolstr + def create_subnet(self, context, subnet): """Creates a subnet(IPnet) for a given network(EVS). @@ -383,93 +258,66 @@ connect to the EVS, through a VPort, will get an IP address from the IPnet associated with the EVS. """ - ipnetname = subnet['subnet']['name'] - if not ipnetname: - ipnetname = None - proplist = ['subnet=%s' % (subnet['subnet']['cidr'])] - - # obtain the optional default router - defrouter = subnet['subnet']['gateway_ip'] - if defrouter is None: - # user specified --no-gateway and we don't support it - raise EVSOpNotSupported(_("cannot use --no-gateway")) - - if defrouter is not attributes.ATTR_NOT_SPECIFIED: - proplist.append('defrouter=%s' % (defrouter)) + # TODO(gmoodalb): Take care of this now that we have pool. + # Even though EVS does not support allocation pools, it is OK for an + # user to specify --allocation-pool because allocation pool management + # is done by neutron-server and is transparent to EVS framework. - # obtain the optional allocation pool - pools = subnet['subnet']['allocation_pools'] - if pools is not attributes.ATTR_NOT_SPECIFIED: - poolstr = "" - for pool in pools: - if poolstr: - poolstr += "," - # if start and end address is same, EVS expects the address - # to be provided as-is instead of x.x.x.x-x.x.x.x - if pool['start'] == pool['end']: - poolstr += pool['start'] - else: - poolstr += "%s-%s" % (pool['start'], pool['end']) - proplist.append('pool=%s' % (poolstr)) + # user specified --no-gateway, and we don't support it + if subnet['subnet']['gateway_ip'] is None: + raise EVSOpNotSupported(_("setting --no-gateway for a subnet " + "not supported")) + if (subnet['subnet']['host_routes'] is not + attributes.ATTR_NOT_SPECIFIED): + raise EVSOpNotSupported(_("setting --host-route for a subnet " + "not supported")) + + poolstr = self._subnet_pool_to_evs_pool(subnet['subnet']) - # obtain the optional DNS nameservers - nameservers = subnet['subnet']['dns_nameservers'] - if attributes.is_attr_set(nameservers): - proplist.append('%s=%s' % - (SUBNET_IPNET_ATTRIBUTE_MAP['dns_nameservers'], - ','.join(nameservers))) - - # obtain the host routes - hostroutes = subnet['subnet']['host_routes'] - if attributes.is_attr_set(hostroutes): - hrlist = ['%s,%s' % (destination, nexthop) - for destination, nexthop in hostroutes] - proplist.append('%s=%s' % - (SUBNET_IPNET_ATTRIBUTE_MAP['host_routes'], - ",".join(hrlist))) - - enable_dhcp = subnet['subnet']['enable_dhcp'] - proplist.append('%s=%s' % - (SUBNET_IPNET_ATTRIBUTE_MAP['enable_dhcp'], - enable_dhcp)) - - propstr = None - if proplist: - propstr = ",".join(proplist) - - evsname = subnet['subnet']['network_id'] - tenantname = self._get_tenant_id_for_create(context, subnet['subnet']) - ipnet = self.evs_controller_addIPnet(tenantname, evsname, ipnetname, - propstr) - retval = self._convert_ipnet_to_subnet(ipnet) + with context.session.begin(subtransactions=True): + # create the subnet in the DB + db_subnet = super(EVSNeutronPluginV2, self).create_subnet(context, + subnet) + ipnetname = db_subnet['name'] + if not ipnetname: + ipnetname = None + evsname = db_subnet['network_id'] + tenantname = db_subnet['tenant_id'] + proplist = ['subnet=%s' % db_subnet['cidr']] + proplist.append('defrouter=%s' % db_subnet['gateway_ip']) + proplist.append('uuid=%s' % db_subnet['id']) + if poolstr: + proplist.append('pool=%s' % (poolstr)) + self._evs_controller_addIPnet(tenantname, evsname, ipnetname, + ",".join(proplist)) # notify dhcp agent of subnet creation - self.dhcp_agent_notifier.notify(context, {'subnet': retval}, + self.dhcp_agent_notifier.notify(context, {'subnet': db_subnet}, 'subnet.create.end') - return retval - - @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_updateIPnet(self, ipnetuuid, propstr): - try: - pat = radcli.ADRGlobPattern({'uuid': ipnetuuid}) - ipnetlist = self._rc.list_objects(evsbind.IPnet(), pat) - assert len(ipnetlist) == 1 - ipnet = self._rc.get_object(ipnetlist[0]) - ipnet.setProperty(propstr) - except radcli.ObjectError as oe: - raise EVSControllerError(oe.get_payload().errmsg) + return db_subnet def update_subnet(self, context, id, subnet): + LOG.debug(_("Updating Subnet: %s with %s") % (id, subnet)) evs_rpccall_sync = subnet.pop('evs_rpccall_sync', False) - if not (set(subnet['subnet'].keys()) == set(('enable_dhcp',))): - raise EVSOpNotSupported(_("only subnets with enable_dhcp " - "set can be updated")) + if (set(subnet['subnet'].keys()) - set(('enable_dhcp', + 'allocation_pools', + 'ipv6_address_mode', + 'ipv6_ra_mode'))): + raise EVSOpNotSupported(_("only following subnet attributes " + "enable-dhcp, allocation-pool, " + "ipv6-address-mode, and " + "ipv6-ra-mode can be updated")) - propstr = "%s=%s" % (SUBNET_IPNET_ATTRIBUTE_MAP['enable_dhcp'], - subnet['subnet']['enable_dhcp']) - self.evs_controller_updateIPnet(id, propstr) - retval = self.get_subnet(context, id) + poolstr = self._subnet_pool_to_evs_pool(subnet['subnet']) + + with context.session.begin(subtransactions=True): + # update subnet in DB + retval = super(EVSNeutronPluginV2, self).\ + update_subnet(context, id, subnet) + # update EVS IPnet with allocation pool info + if poolstr: + self._evs_controller_updateIPnet(id, "pool=%s" % poolstr) # notify dhcp agent of subnet update methodname = 'subnet.update.end' @@ -483,77 +331,21 @@ topic=topics.DHCP_AGENT) return retval - @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_getIPnet(self, ipnetuuid): - try: - ipnetlist = self._evsc.getIPnetInfo('ipnet=%s' % (ipnetuuid)) - except radcli.ObjectError as oe: - raise EVSControllerError(oe.get_payload().errmsg) - return (ipnetlist[0] if ipnetlist else None) - def get_subnet(self, context, id, fields=None): - ipnet = self.evs_controller_getIPnet(id) - if not ipnet: - return {} - subnetdict = self._convert_ipnet_to_subnet(ipnet) - return self._fields(subnetdict, fields) - - @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_getIPnetList(self, filterstr): - try: - ipnetlist = self._evsc.getIPnetInfo(filterstr) - except radcli.ObjectError as oe: - raise EVSControllerError(oe.get_payload().errmsg) - return ipnetlist + LOG.debug(_("Getting subnet: %s"), id) + subnet = super(EVSNeutronPluginV2, self).get_subnet(context, id, None) + return self._fields(subnet, fields) def get_subnets(self, context, filters=None, fields=None, sorts=None, limit=None, marker=None, page_reverse=False): - - filterstr = None - # EVS desn't support filtering of resource based on - # properties, so we will have to filter ourselves - ipnet_props = {'OpenStack:enable_dhcp': None} - if filters is not None: - filterlist = [] - for key, value in filters.items(): - if key == 'shared': - if any(value): - return [] - continue - if key == 'verbose': - continue - if key == 'enable_dhcp': - ipnet_props[SUBNET_IPNET_ATTRIBUTE_MAP[key]] = value - continue - key = SUBNET_IPNET_ATTRIBUTE_MAP.get(key, key) - if isinstance(value, list): - value = ",".join(map(str, set(value))) - if not value: - continue - filterlist.append("%s=%s" % (key, value)) - - if filterlist: - filterstr = ",".join(filterlist) - - LOG.debug(_("calling ListIPnet from get_subnets() filterstr: '%s'") - % (filterstr)) - - ipnetlist = self.evs_controller_getIPnetList(filterstr) - self._apply_rsrc_props_filter(ipnetlist, ipnet_props) - - retme = [] - for ipnet in ipnetlist: - subnetdict = self._convert_ipnet_to_subnet(ipnet) - retme.append(self._fields(subnetdict, fields)) - - return retme - - def get_subnets_count(self, context, filters=None): - return len(self.get_subnets(context, filters)) + subnets = super(EVSNeutronPluginV2, self).\ + get_subnets(context, filters, None, sorts, limit, marker, + page_reverse) + return [self._fields(subnet, fields) for subnet in subnets] def _release_subnet_dhcp_port(self, context, subnet, delete_network): """Release any dhcp port associated with the subnet""" - filters = dict(evs=subnet['network_id']) + filters = dict(network_id=[subnet['network_id']]) portlist = self.get_ports(context, filters) if delete_network: @@ -567,6 +359,16 @@ # port happens to be a DHCP port. update_subnet = len(portlist) == 1 if update_subnet: + # For IPv6 we need to first reset the IPv6 attributes + if subnet['ip_version'] == 6: + if (attributes.is_attr_set(subnet.get('ipv6_address_mode'))): + subnet_update = {'subnet': + {'ipv6_address_mode': None, + 'ipv6_ra_mode': None + }, + 'evs_rpccall_sync': True + } + self.update_subnet(context, subnet['id'], subnet_update) # the lone port is a dhcp port created by dhcp agent # it must be released before we can delete the subnet subnet_update = {'subnet': {'enable_dhcp': False}, @@ -574,12 +376,20 @@ self.update_subnet(context, subnet['id'], subnet_update) @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_removeIPnet(self, tenantname, evsname, ipnetuuid): + def _evs_controller_removeIPnet(self, tenantname, evsname, ipnetuuid): + LOG.debug(_("Removing IPnet with id: %s for tenant: %s for evs: %s") % + (ipnetuuid, tenantname, evsname)) pat = radcli.ADRGlobPattern({'name': evsname, 'tenant': tenantname}) try: - evs = self._rc.get_object(evsbind.EVS(), pat) + evs = self.rad_connection.get_object(evsbind.EVS(), pat) evs.removeIPnet(ipnetuuid) except radcli.ObjectError as oe: + # '42' corresponds to EVS' EVS_ENOENT_IPNET error code + if oe.get_payload().err == 42: + # EVS doesn't have that IPnet, return success to delete + # the IPnet from Neutron DB. + LOG.debug(_("IPnet could not be found in EVS.")) + return raise EVSControllerError(oe.get_payload().errmsg) def delete_subnet(self, context, id): @@ -596,8 +406,11 @@ # results in DHCP agent releasing the port. if subnet['enable_dhcp']: self._release_subnet_dhcp_port(context, subnet, False) - self.evs_controller_removeIPnet(subnet['tenant_id'], - subnet['network_id'], id) + with context.session.begin(subtransactions=True): + # delete subnet in DB + super(EVSNeutronPluginV2, self).delete_subnet(context, id) + self._evs_controller_removeIPnet(subnet['tenant_id'], + subnet['network_id'], id) # notify dhcp agent payload = { @@ -609,13 +422,24 @@ self.dhcp_agent_notifier.notify(context, payload, 'subnet.delete.end') @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_createEVS(self, tenantname, evsname, propstr): + def _evs_controller_createEVS(self, tenantname, evsname, propstr): + LOG.debug(_("Adding EVS: %s with properties: %s for tenant: %s") % + (evsname, propstr, tenantname)) try: - evs = self._evsc.createEVS(propstr, tenantname, evsname) + evs = self.rad_connection.\ + get_object(evsbind.EVSController()).\ + createEVS(propstr, tenantname, evsname) except radcli.ObjectError as oe: raise EVSControllerError(oe.get_payload().errmsg) return evs + def _extend_network_dict(self, network, evs): + for prop in evs.props: + if prop.name == 'l2-type': + network[providernet.NETWORK_TYPE] = prop.value + elif prop.name == 'vlanid' or prop.name == 'vni': + network[providernet.SEGMENTATION_ID] = int(prop.value) + def create_network(self, context, network): """Creates a network(EVS) for a given tenant. @@ -626,6 +450,15 @@ Machines connected to it. There are two main resources associated with an EVS: IPnet and VPort. """ + + if network['network']['admin_state_up'] is False: + raise EVSOpNotSupported(_("setting admin_state_up=False for a " + "network not supported")) + + if network['network']['shared'] is True: + raise EVSOpNotSupported(_("setting shared=True for a " + "network not supported")) + evsname = network['network']['name'] if not evsname: evsname = None @@ -654,125 +487,125 @@ "provider:network_type '%s' not " "supported") % network_type) - router_external = network['network'][external_net.EXTERNAL] - if attributes.is_attr_set(router_external): - proplist.append("%s=%s" % - (NETWORK_EVS_ATTRIBUTE_MAP[external_net.EXTERNAL], - router_external)) - propstr = None if proplist: propstr = ",".join(proplist) - evs = self.evs_controller_createEVS(tenantname, evsname, propstr) - return self._convert_evs_to_network(evs) + with context.session.begin(subtransactions=True): + # create the network in DB + net = super(EVSNeutronPluginV2, self).create_network(context, + network) + self._process_l3_create(context, net, network['network']) + # if --router:external is not set, the above function does + # not update net with router:external set to False + if net.get(external_net.EXTERNAL) is None: + net[external_net.EXTERNAL] = False + + # create EVS on the EVS controller + if propstr: + propstr += ",uuid=%s" % net['id'] + else: + propstr = "uuid=%s" % net['id'] + evs = self._evs_controller_createEVS(tenantname, evsname, propstr) + + # add provider information into net + self._extend_network_dict(net, evs) + + return net def update_network(self, context, id, network): raise EVSOpNotSupported(_("net-update")) @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_getEVS(self, evsuuid): + def _evs_controller_getEVS(self, evsuuid): + LOG.debug(_("Getting EVS: %s"), evsuuid) try: - evslist = self._evsc.getEVSInfo('evs=%s' % evsuuid) + evslist = self.rad_connection.\ + get_object(evsbind.EVSController()).\ + getEVSInfo('evs=%s' % evsuuid) except radcli.ObjectError as oe: raise EVSControllerError(oe.getpayload().errmsg) - return (evslist[0] if evslist else None) + if not evslist: + LOG.error(_("EVS framework does not have Neutron network " + "'%s' defined"), evsuuid) + return None + return evslist[0] def get_network(self, context, id, fields=None): - evs = self.evs_controller_getEVS(id) - if not evs: - return {} - networkdict = self._convert_evs_to_network(evs) - return self._fields(networkdict, fields) - - @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_getEVSList(self, filterstr): - try: - evslist = self._evsc.getEVSInfo(filterstr) - except radcli.ObjectError as oe: - raise EVSControllerError(oe.get_payload().errmsg) - return evslist + with context.session.begin(subtransactions=True): + net = super(EVSNeutronPluginV2, self).get_network(context, + id, None) + # call EVS controller to get provider network information + evs = self._evs_controller_getEVS(net['id']) + if evs: + self._extend_network_dict(net, evs) + return self._fields(net, fields) def get_networks(self, context, filters=None, fields=None, sorts=None, limit=None, marker=None, page_reverse=False): - filterstr = None - # EVS desn't support filtering of resource based on - # properties, so we will have to filter ourselves - evs_props = {'OpenStack:router:external': None} - if filters is not None: - filterlist = [] - for key, value in filters.items(): - if key == 'shared': - if any(value): - # EVS doesn't support shared networks - return [] - continue - if key in ('admin_state_up', 'verbose'): - continue - if key == 'router:external': - evs_props[NETWORK_EVS_ATTRIBUTE_MAP[key]] = value - continue - key = NETWORK_EVS_ATTRIBUTE_MAP.get(key, key) - if isinstance(value, list): - value = ",".join(map(str, set(value))) - if not value: - continue - filterlist.append("%s=%s" % (key, value)) - - if filterlist: - filterstr = ",".join(filterlist) - - LOG.debug(_("calling ListEVswitch from get_networks(): '%s'") - % (filterstr)) - evslist = self.evs_controller_getEVSList(filterstr) - self._apply_rsrc_props_filter(evslist, evs_props) - - retme = [] - for evs in evslist: - networkdict = self._convert_evs_to_network(evs) - retme.append(self._fields(networkdict, fields)) - - return retme - - def get_networks_count(self, context, filters=None): - return len(self.get_networks(context, filters)) + with context.session.begin(subtransactions=True): + nets = super(EVSNeutronPluginV2, self).\ + get_networks(context, filters, None, sorts, limit, marker, + page_reverse) + for net in nets: + evs = self._evs_controller_getEVS(net['id']) + if evs: + self._extend_network_dict(net, evs) + return [self._fields(net, fields) for net in nets] @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_deleteEVS(self, tenantname, evsuuid): + def _evs_controller_deleteEVS(self, tenantname, evsuuid): + LOG.debug(_("Removing EVS with id: %s for tenant: %s") % + (evsuuid, tenantname)) try: - self._evsc.deleteEVS(evsuuid, tenantname) + self.rad_connection.\ + get_object(evsbind.EVSController()).\ + deleteEVS(evsuuid, tenantname) except radcli.ObjectError as oe: + # '41' corresponds to EVS' EVS_ENOENT_EVS error code + if oe.get_payload().err == 41: + # EVS doesn't have that EVS, return success to delete + # the EVS from Neutron DB. + LOG.debug(_("EVS could not be found in EVS backend.")) + return raise EVSControllerError(oe.get_payload().errmsg) def delete_network(self, context, id): # Check if it is an external network and whether addresses in that # network are being used for floating ips - evs = self.get_network(context, id) - if evs[external_net.EXTERNAL]: - filters = dict(evs=id) + net = self.get_network(context, id) + if net[external_net.EXTERNAL]: + filters = dict(network_id=[id]) portlist = self.get_ports(context, filters) ports_with_deviceid = [port for port in portlist if port['device_id'] != ''] if ports_with_deviceid: raise exceptions.NetworkInUse(net_id=id) - filters = dict(network_id=id) + filters = dict(network_id=[id]) subnets = self.get_subnets(context, filters=filters) dhcp_subnets = [s for s in subnets if s['enable_dhcp']] for subnet in dhcp_subnets: self._release_subnet_dhcp_port(context, subnet, True) - self.evs_controller_deleteEVS(context.tenant_id, id) + with context.session.begin(subtransactions=True): + super(EVSNeutronPluginV2, self).delete_network(context, id) + self._evs_controller_deleteEVS(net['tenant_id'], id) # notify dhcp agent of network deletion self.dhcp_agent_notifier.notify(context, {'network': {'id': id}}, 'network.delete.end') @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_addVPort(self, tenantname, evsname, vportname, propstr): + def _evs_controller_addVPort(self, tenantname, evsname, vportname, + propstr): + LOG.debug(_("Adding VPort: %s with properties: %s for tenant: %s " + "and for evs: %s") % + (vportname, propstr, tenantname, evsname)) + try: pat = radcli.ADRGlobPattern({'name': evsname, 'tenant': tenantname}) - evs = self._rc.get_object(evsbind.EVS(), pat) + evs = self.rad_connection.get_object(evsbind.EVS(), pat) vport = evs.addVPort(propstr, vportname) except radcli.ObjectError as oe: raise EVSControllerError(oe.get_payload().errmsg) @@ -789,179 +622,93 @@ This configuration is inherited by the VNIC when it connects to the VPort. """ - vportname = port['port']['name'] - if not vportname: - vportname = None - - proplist = [] - macaddr = port['port']['mac_address'] - if attributes.is_attr_set(macaddr): - proplist.append('macaddr=%s' % (macaddr)) - - fixed_ips = port['port']['fixed_ips'] - if attributes.is_attr_set(fixed_ips): - # we only support one subnet - ipaddr = fixed_ips[0].get('ip_address') - if ipaddr is not None: - proplist.append('ipaddr=%s' % ipaddr) + if port['port']['admin_state_up'] is False: + raise EVSOpNotSupported(_("setting admin_state_up=False for a " + "port not supported")) - # retrieve device_id and device_owner - device_id = port['port']['device_id'] - if attributes.is_attr_set(device_id) and device_id: - proplist.append("%s=%s" % - (PORT_VPORT_ATTRIBUTE_MAP['device_id'], device_id)) - - device_owner = port['port']['device_owner'] - if attributes.is_attr_set(device_owner) and device_owner: - proplist.append("%s=%s" % - (PORT_VPORT_ATTRIBUTE_MAP['device_owner'], - device_owner)) + with context.session.begin(subtransactions=True): + # for external gateway ports and floating ips, tenant_id + # is not set, but EVS does not like it. + tenant_id = self._get_tenant_id_for_create(context, port['port']) + if not tenant_id: + network = self.get_network(context, port['port']['network_id']) + port['port']['tenant_id'] = network['tenant_id'] + # create the port in the DB + db_port = super(EVSNeutronPluginV2, self).create_port(context, + port) - propstr = None - if proplist: - propstr = ",".join(proplist) + tenantname = db_port['tenant_id'] + vportname = db_port['name'] + if not vportname: + vportname = None + evs_id = db_port['network_id'] + proplist = ['macaddr=%s' % db_port['mac_address']] + proplist.append('ipaddr=%s' % + db_port['fixed_ips'][0].get('ip_address')) + proplist.append('uuid=%s' % db_port['id']) - evsname = port['port']['network_id'] - tenantname = self._get_tenant_id_for_create(context, port['port']) - if not tenantname: - network = self.get_network(context, evsname) - tenantname = network['tenant_id'] - vport = self.evs_controller_addVPort(tenantname, evsname, vportname, - propstr) - retval = self._convert_vport_to_port(context, vport) + self._evs_controller_addVPort(tenantname, evs_id, vportname, + ",".join(proplist)) # notify dhcp agent of port creation - self.dhcp_agent_notifier.notify(context, {'port': retval}, + self.dhcp_agent_notifier.notify(context, {'port': db_port}, 'port.create.end') - return retval - - @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_updateVPort(self, vportuuid, proplist): - try: - pat = radcli.ADRGlobPattern({'uuid': vportuuid}) - vportlist = self._rc.list_objects(evsbind.VPort(), pat) - assert len(vportlist) == 1 - vport = self._rc.get_object(vportlist[0]) - for prop in proplist: - vport.setProperty(prop) - except radcli.ObjectError as oe: - raise EVSControllerError(oe.get_payload().errmsg) + return db_port def update_port(self, context, id, port): - # EVS does not allow updating certain attributes - if not (set(port['port'].keys()) <= - set(('device_id', 'device_owner'))): - raise EVSOpNotSupported(_("only device_id and " - "device_owner supported")) + # EVS does not allow updating certain attributes, so check for it + state = port['port'].get('admin_state_up') + if state and state is False: + raise EVSOpNotSupported(_("updating port's admin_state_up to " + "False is not supported")) - proplist = [] - device_id = port['port'].get('device_id') - if device_id is not None: - # EVS expects property values to be non-zero length - if len(device_id) == 0: - device_id = " " - proplist.append("%s=%s" % - (PORT_VPORT_ATTRIBUTE_MAP['device_id'], device_id)) - - device_owner = port['port'].get('device_owner') - if device_owner is not None: - if len(device_owner) == 0: - device_owner = " " - proplist.append("%s=%s" % - (PORT_VPORT_ATTRIBUTE_MAP['device_owner'], - device_owner)) - - if not proplist: - return dict() - - self.evs_controller_updateVPort(id, proplist) - retval = self.get_port(context, id) + # Get the original port and fail if any attempt is being made + # to change fixed_ips of the port since EVS doesn't support it + original_port = super(EVSNeutronPluginV2, self).get_port(context, id) + original_ips = original_port['fixed_ips'] + update_ips = port['port'].get('fixed_ips') + if (update_ips and + (len(update_ips) != 1 or + update_ips[0]['subnet_id'] != original_ips[0]['subnet_id'] or + update_ips[0]['ip_address'] != original_ips[0]['ip_address'])): + raise EVSOpNotSupported(_("updating port's fixed_ips " + "is not supported")) + LOG.debug(_("Updating port %s with %s") % (id, port)) + db_port = super(EVSNeutronPluginV2, self).update_port(context, + id, port) # notify dhcp agent of port update - self.dhcp_agent_notifier.notify(context, {'port': retval}, + self.dhcp_agent_notifier.notify(context, {'port': db_port}, 'port.update.end') - return retval - - @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_getVPort(self, vportuuid): - try: - vportlist = self._evsc.getVPortInfo('vport=%s' % (vportuuid)) - except radcli.ObjectError as oe: - raise EVSControllerError(oe.get_payload().errmsg) - return (vportlist[0] if vportlist else None) + return db_port def get_port(self, context, id, fields=None): - vport = self.evs_controller_getVPort(id) - if not vport: - return {} - portdict = self._convert_vport_to_port(context, vport) - return self._fields(portdict, fields) - - @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_getVPortList(self, filterstr): - try: - vportlist = self._evsc.getVPortInfo(filterstr) - except radcli.ObjectError as oe: - raise EVSControllerError(oe.get_payload().errmsg) - return vportlist + LOG.debug(_("Getting port: %s"), id) + port = super(EVSNeutronPluginV2, self).get_port(context, id, None) + return self._fields(port, fields) def get_ports(self, context, filters=None, fields=None, sorts=None, limit=None, marker=None, page_reverse=False): - LOG.debug(_("inside the get_ports() method: filters: '%s'") % - str(filters)) + ports = super(EVSNeutronPluginV2, self).\ + get_ports(context, filters, None, sorts, limit, marker, + page_reverse) + return [self._fields(port, fields) for port in ports] - filterstr = None - # EVS desn't support filtering of resource based on - # properties, so we will have to filter ourselves - vport_props = {'OpenStack:device_id': None, - 'OpenStack:device_owner': None} - if filters is not None: - filterlist = [] - for key, value in filters.items(): - if key == 'shared': - if any(value): - return [] - continue - if key == 'admin_state_up': - continue - if key in ('device_id', 'device_owner'): - vport_props[PORT_VPORT_ATTRIBUTE_MAP[key]] = value - continue - key = PORT_VPORT_ATTRIBUTE_MAP.get(key, key) - if isinstance(value, list): - value = ",".join(map(str, set(value))) - if not value: - continue - filterlist.append("%s=%s" % (key, value)) + def notify_l3agent(self, context, port): + """ If an L3 agent is using this port, then we need to send + a notification to the L3 agent so that it can remove the EVS VPort + associated with the Neutron Port. In that case, the EVS Plugin will + only remove the Neutron port from the DB, so return False. - if filterlist: - filterstr = ",".join(filterlist) - - LOG.debug(_("calling getVPortInfo from get_ports(): '%s'") % - (filterstr)) - vportlist = self.evs_controller_getVPortList(filterstr) - self._apply_rsrc_props_filter(vportlist, vport_props) - - retme = [] - for vport in vportlist: - portdict = self._convert_vport_to_port(context, vport) - retme.append(self._fields(portdict, fields)) - - return retme - - def get_ports_count(self, context, filters=None): - return len(self.get_ports(context, filters)) - - def _release_l3agent_internal_port(self, context, port): - """ If an L3 agent is using this port, then we need to send - a notification to L3 agent to release the port before we can - delete the port""" + If the port is not used by the L3 agent, then the EVS plugin + will remove both the Neutron port and EVS VPort, so return True. + """ device_owner = port['device_owner'] - if device_owner not in [l3_constants.DEVICE_OWNER_ROUTER_INTF, - l3_constants.DEVICE_OWNER_ROUTER_GW, - l3_constants.DEVICE_OWNER_FLOATINGIP]: - return + if device_owner not in [constants.DEVICE_OWNER_ROUTER_INTF, + constants.DEVICE_OWNER_ROUTER_GW, + constants.DEVICE_OWNER_FLOATINGIP]: + return True router_id = port['device_id'] port_update = { 'port': { @@ -970,20 +717,20 @@ } } self.update_port(context, port['id'], port_update) - if device_owner in [l3_constants.DEVICE_OWNER_ROUTER_INTF, - l3_constants.DEVICE_OWNER_ROUTER_GW]: - msg = l3_rpc_agent_api.L3AgentNotify.make_msg("routers_updated", - routers=[router_id]) - l3_rpc_agent_api.L3AgentNotify.call(context, msg, - topic=topics.L3_AGENT) + if device_owner in [constants.DEVICE_OWNER_ROUTER_INTF, + constants.DEVICE_OWNER_ROUTER_GW]: + self.l3_agent_notifier.routers_updated(context, [router_id]) + return False + return True @lockutils.synchronized('evs-plugin', 'neutron-') - def evs_controller_removeVPort(self, tenantname, evsname, vportuuid, - vportname): + def _evs_controller_removeVPort(self, tenantname, evsname, vportuuid): + LOG.debug(_("Removing VPort with id: %s for tenant: %s for evs: %s") % + (vportuuid, tenantname, evsname)) pat = radcli.ADRGlobPattern({'name': evsname, 'tenant': tenantname}) try: - evs = self._rc.get_object(evsbind.EVS(), pat) + evs = self.rad_connection.get_object(evsbind.EVS(), pat) evs.removeVPort(vportuuid) except radcli.ObjectError as oe: # '7' corresponds to EVS' EVS_EBUSY_VPORT error code @@ -991,8 +738,10 @@ # It is possible that the VM is destroyed, but EVS is unaware # of it. So, try to reset the vport. If it succeeds, then call # removeVPort() again. + LOG.debug(_("EVS VPort is busy. We will need to reset " + "and then remove")) try: - evs.resetVPort(vportname) + evs.resetVPort(vportuuid) evs.removeVPort(vportuuid) except: # we failed one of the above operations, just return @@ -1001,6 +750,12 @@ else: # the reset and remove succeeded, just return. return + # '43' corresponds to EVS' EVS_ENOENT_VPORT error code + elif oe.get_payload().err == 43: + # EVS doesn't have that VPort, return success to delete + # the VPort from Neutron DB. + LOG.debug(_("VPort could not be found in EVS.")) + return raise EVSControllerError(oe.get_payload().errmsg) def delete_port(self, context, id, l3_port_check=True): @@ -1010,10 +765,13 @@ port = self.get_port(context, id) if not port: return - if not l3_port_check: - self._release_l3agent_internal_port(context, port) - self.evs_controller_removeVPort(port['tenant_id'], port['network_id'], - id, port['name']) + del_vport = l3_port_check or self.notify_l3agent(context, port) + with context.session.begin(subtransactions=True): + super(EVSNeutronPluginV2, self).delete_port(context, id) + if del_vport: + self._evs_controller_removeVPort(port['tenant_id'], + port['network_id'], + port['id']) # notify dhcp agent of port deletion payload = { @@ -1023,31 +781,3 @@ } } self.dhcp_agent_notifier.notify(context, payload, 'port.delete.end') - - # needed for DHCP agent support - def update_fixed_ip_lease_expiration(self, context, network_id, - ip_address, lease_remaining): - pass - - # needed for L3 agent support - def _get_network(self, context, network_id): - return self.get_network(context, network_id) - - def _get_subnet(self, context, subnet_id): - return self.get_subnet(context, subnet_id) - - def _get_port(self, context, port_id): - return self.get_port(context, port_id) - - def _delete_port(self, context, port_id): - return self.delete_port(context, port_id) - - def _get_subnets_by_network(self, context, network_id): - return self.get_subnets(context, filters={'network_id': network_id}) - - def _network_is_external(self, context, net_id): - try: - evs = self.get_network(context, net_id) - return evs[external_net.EXTERNAL] - except: - return False diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/evs_plugin.ini --- a/components/openstack/neutron/files/evs_plugin.ini Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/evs_plugin.ini Mon Apr 20 12:35:51 2015 -0700 @@ -4,8 +4,3 @@ # to EVS controller specified by hostname. By default it's set to # ssh://evsuser@localhost. # evs_controller = ssh://evsuser@localhost - -[DATABASE] -# The SQLAlchemy connection string used to connect to the -# database (string value). By default set to: -# sql_connection = sqlite:////var/lib/neutron/neutron.sqlite diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/l3_agent.ini --- a/components/openstack/neutron/files/l3_agent.ini Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/l3_agent.ini Mon Apr 20 12:35:51 2015 -0700 @@ -13,14 +13,14 @@ # If use_namespaces is set as False then the agent can only configure one # router. - # This is done by setting the specific router_id. # router_id = -# Each L3 agent can be associated with at most one external network. This -# value should be set to the UUID of that external network. If empty, -# the agent will enforce that only a single external networks exists and -# use that external network id +# When external_network_bridge is set, each L3 agent can be associated +# with no more than one external network. This value should be set to the UUID +# of that external network. To allow L3 agent support multiple external +# networks, both the external_network_bridge and gateway_external_network_id +# must be left empty. # gateway_external_network_id = # Indicates that this L3 agent should also handle routers that do not have @@ -30,9 +30,17 @@ # handle_internal_only_routers = True # Name of bridge used for external network traffic. This should be set to -# empty value for the linux bridge +# empty value for the linux bridge. when this parameter is set, each L3 agent +# can be associated with no more than one external network. external_network_bridge = +# TCP Port used by Neutron metadata server +# metadata_port = 9697 + +# Send this many gratuitous ARPs for HA setup. Set it below or equal to 0 +# to disable this feature. +# send_arp_for_ha = 3 + # seconds between re-sync routers' data if needed # periodic_interval = 40 @@ -42,7 +50,41 @@ # enable_metadata_proxy, which is true by default, can be set to False # if the Nova metadata server is not available -enable_metadata_proxy = False +enable_metadata_proxy = True + +# Location of Metadata Proxy UNIX domain socket +# metadata_proxy_socket = $state_path/metadata_proxy + +# router_delete_namespaces, which is false by default, can be set to True if +# namespaces can be deleted cleanly on the host running the L3 agent. +# Do not enable this until you understand the problem with the Linux iproute +# utility mentioned in https://bugs.launchpad.net/neutron/+bug/1052535 and +# you are sure that your version of iproute does not suffer from the problem. +# If True, namespaces will be deleted when a router is destroyed. +# router_delete_namespaces = False + +# The working mode for the agent. Allowed values are: +# - legacy: this preserves the existing behavior where the L3 agent is +# deployed on a centralized networking node to provide L3 services +# like DNAT, and SNAT. Use this mode if you do not want to adopt DVR. +# - dvr: this mode enables DVR functionality, and must be used for an L3 +# agent that runs on a compute host. +# - dvr_snat: this enables centralized SNAT support in conjunction with +# DVR. This mode must be used for an L3 agent running on a centralized +# node (or in single-host deployments, e.g. devstack). +# agent_mode = legacy + +# Location to store keepalived and all HA configurations +# ha_confs_path = $state_path/ha_confs + +# VRRP authentication type AH/PASS +# ha_vrrp_auth_type = PASS + +# VRRP authentication password +# ha_vrrp_auth_password = + +# The advertisement interval in seconds +# ha_vrrp_advert_int = 2 # Name of the datalink that connects to an external network. By default it's # set to net0. diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/metadata_agent.ini --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/neutron/files/metadata_agent.ini Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,59 @@ +[DEFAULT] +# Show debugging output in log (sets DEBUG log level output) +# debug = True + +# The Neutron user information for accessing the Neutron API. +auth_url = http://localhost:5000/v2.0 +auth_region = RegionOne +# Turn off verification of the certificate for ssl +# auth_insecure = False +# Certificate Authority public key (CA cert) file for ssl +# auth_ca_cert = +admin_tenant_name = %SERVICE_TENANT_NAME% +admin_user = %SERVICE_USER% +admin_password = %SERVICE_PASSWORD% + +# Network service endpoint type to pull from the keystone catalog +# endpoint_type = adminURL + +# IP address used by Nova metadata server +# nova_metadata_ip = 127.0.0.1 + +# TCP Port used by Nova metadata server +# nova_metadata_port = 8775 + +# Which protocol to use for requests to Nova metadata server, http or https +# nova_metadata_protocol = http + +# Whether insecure SSL connection should be accepted for Nova metadata server +# requests +# nova_metadata_insecure = False + +# Client certificate for nova api, needed when nova api requires client +# certificates +# nova_client_cert = + +# Private key for nova client certificate +# nova_client_priv_key = + +# When proxying metadata requests, Neutron signs the Instance-ID header with a +# shared secret to prevent spoofing. You may select any string for a secret, +# but it must match here and in the configuration used by the Nova Metadata +# Server. NOTE: Nova uses a different key: neutron_metadata_proxy_shared_secret +# metadata_proxy_shared_secret = + +# Location of Metadata Proxy UNIX domain socket +# metadata_proxy_socket = $state_path/metadata_proxy + +# Number of separate worker processes for metadata server. Defaults to +# half the number of CPU cores +metadata_workers = 1 + +# Number of backlog requests to configure the metadata server socket with +# metadata_backlog = 4096 + +# URL to connect to the cache backend. +# default_ttl=0 parameter will cause cache entries to never expire. +# Otherwise default_ttl specifies time in seconds a cache entry is valid for. +# No cache is used in case no value is passed. +# cache_url = memory://?default_ttl=5 diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/neutron-dhcp-agent --- a/components/openstack/neutron/files/neutron-dhcp-agent Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/neutron-dhcp-agent Mon Apr 20 12:35:51 2015 -0700 @@ -23,6 +23,26 @@ from subprocess import CalledProcessError, Popen, PIPE, check_call +def set_hostmodel(value): + cmd = ["/usr/sbin/ipadm", "show-prop", "-p", "hostmodel", + "-co", "current", "ipv4"] + p = Popen(cmd, stdout=PIPE, stderr=PIPE) + output, error = p.communicate() + if p.returncode != 0: + print "failed to retrieve hostmodel ipadm property" + return False + if output.strip() == value: + return True + cmd = ["/usr/sbin/ipadm", "set-prop", "-t", "-p", "hostmodel=%s" % value, + "ipv4"] + p = Popen(cmd, stdout=PIPE, stderr=PIPE) + output, error = p.communicate() + if p.returncode != 0: + print "failed to set ipadm hostmodel property to %s" % value + return False + return True + + def start(): # verify paths are valid for f in sys.argv[2:4]: @@ -30,6 +50,10 @@ print '%s does not exist or is not readable' % f return smf_include.SMF_EXIT_ERR_CONFIG + # set the hostmodel property if necessary + if not set_hostmodel("src-priority"): + return smf_include.SMF_EXIT_ERR_FATAL + cmd = "/usr/lib/neutron/neutron-dhcp-agent --config-file %s " \ "--config-file %s" % tuple(sys.argv[2:4]) smf_include.smf_subprocess(cmd) @@ -52,8 +76,8 @@ ifnames = output.splitlines() # DHCP agent datalinks are always 15 characters in length. They start with - # 'evs', end with '_0', and in between they are hexadecimal digits. - prog = re.compile('evs[0-9A-Fa-f\_]{10}_0') + # 'dh', end with '_0', and in between they are hexadecimal digits. + prog = re.compile('dh[0-9A-Fa-f\_]{11}_0') for ifname in ifnames: if not prog.search(ifname): continue @@ -62,25 +86,16 @@ # first remove the IP check_call(["/usr/bin/pfexec", "/usr/sbin/ipadm", "delete-ip", ifname]) - # get the tenant, evs, and vport name for the VNIC - cmd = ["/usr/sbin/dladm", "show-vnic", "-po", - "tenant,evs,vport", ifname] - p = Popen(cmd, stdout=PIPE, stderr=PIPE) - output, error = p.communicate() - if p.returncode != 0: - print "failed to retrieve Tenant, EVS," \ - " and VPort info for a VNIC" - return smf_include.SMF_EXIT_ERR_FATAL - tenant, evs, vport = output.strip().split(':') # next remove the VNIC check_call(["/usr/bin/pfexec", "/usr/sbin/dladm", "delete-vnic", ifname]) - # remove the EVS VPort - check_call(["/usr/sbin/evsadm", "remove-vport", "-T", tenant, - "%s/%s" % (evs, vport)]) except CalledProcessError as err: print "failed to remove datalinks used by DHCP agent: %s" % err return smf_include.SMF_EXIT_ERR_FATAL + + # finally reset the hostmodel property + if not set_hostmodel("weak"): + return smf_include.SMF_EXIT_ERR_FATAL return smf_include.SMF_EXIT_OK if __name__ == "__main__": diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/neutron-dhcp-agent.xml --- a/components/openstack/neutron/files/neutron-dhcp-agent.xml Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/neutron-dhcp-agent.xml Mon Apr 20 12:35:51 2015 -0700 @@ -1,7 +1,7 @@ + + + + - + + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/neutron-l3-agent --- a/components/openstack/neutron/files/neutron-l3-agent Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/neutron-l3-agent Mon Apr 20 12:35:51 2015 -0700 @@ -1,6 +1,6 @@ #!/usr/bin/python2.6 -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain @@ -24,6 +24,26 @@ from subprocess import CalledProcessError, Popen, PIPE, check_call +def set_hostmodel(value): + cmd = ["/usr/sbin/ipadm", "show-prop", "-p", "hostmodel", + "-co", "current", "ipv4"] + p = Popen(cmd, stdout=PIPE, stderr=PIPE) + output, error = p.communicate() + if p.returncode != 0: + print "failed to retrieve hostmodel ipadm property" + return False + if output.strip() == value: + return True + cmd = ["/usr/sbin/ipadm", "set-prop", "-t", "-p", "hostmodel=%s" % value, + "ipv4"] + p = Popen(cmd, stdout=PIPE, stderr=PIPE) + output, error = p.communicate() + if p.returncode != 0: + print "failed to set ipadm hostmodel property to %s" % value + return False + return True + + def start(): # verify paths are valid for f in sys.argv[2:4]: @@ -56,6 +76,10 @@ "enabled before enabling neutron-l3-agent" return smf_include.SMF_EXIT_ERR_CONFIG + # set the hostmodel property if necessary + if not set_hostmodel("src-priority"): + return smf_include.SMF_EXIT_ERR_FATAL + cmd = "/usr/lib/neutron/neutron-l3-agent --config-file %s " \ "--config-file %s" % tuple(sys.argv[2:4]) smf_include.smf_subprocess(cmd) @@ -137,8 +161,9 @@ ipnat_rules = output.splitlines() # L3 agent IP NAT rules are of the form - # bimap l3e64ccc496_a_0 192.168.1.3/32 -> 172.16.10.3/32 - prog = re.compile('l3e[0-9A-Fa-f\_]{10}_0') + # bimap l3e64ccc496_a_0 .... OR + # rdr l3iedf345cc96_a_0 .... + prog = re.compile('l3[ie][0-9A-Fa-f\_]{10}_0') for ipnat_rule in ipnat_rules: if not prog.search(ipnat_rule): continue @@ -178,6 +203,9 @@ print "failed to remove datalinks used by L3 agent: %s" % (err) return smf_include.SMF_EXIT_ERR_FATAL + # finally reset the hostmodel property + if not set_hostmodel("weak"): + return smf_include.SMF_EXIT_ERR_FATAL return smf_include.SMF_EXIT_OK if __name__ == "__main__": diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/neutron-l3-agent.xml --- a/components/openstack/neutron/files/neutron-l3-agent.xml Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/neutron-l3-agent.xml Mon Apr 20 12:35:51 2015 -0700 @@ -1,7 +1,7 @@ + - + + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/neutron-metadata-agent --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/neutron/files/neutron-metadata-agent Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,36 @@ +#!/usr/bin/python2.6 + +# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import os +import sys + +import smf_include + + +def start(): + # verify paths are valid + for f in sys.argv[2:4]: + if not os.path.exists(f) or not os.access(f, os.R_OK): + print '%s does not exist or is not readable' % f + return smf_include.SMF_EXIT_ERR_CONFIG + + cmd = "/usr/lib/neutron/neutron-metadata-agent --config-file %s " \ + "--config-file %s" % tuple(sys.argv[2:4]) + smf_include.smf_subprocess(cmd) + +if __name__ == "__main__": + os.putenv("LC_ALL", "C") + smf_include.smf_main() diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/neutron-metadata-agent.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/neutron/files/neutron-metadata-agent.xml Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/neutron-server.xml --- a/components/openstack/neutron/files/neutron-server.xml Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/neutron-server.xml Mon Apr 20 12:35:51 2015 -0700 @@ -1,7 +1,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/neutron.conf --- a/components/openstack/neutron/files/neutron.conf Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/neutron.conf Mon Apr 20 12:35:51 2015 -0700 @@ -1,9 +1,19 @@ [DEFAULT] -# Default log level is INFO -# verbose and debug has the same result. -# One of them will set DEBUG log level output +# Print more verbose output (set logging level to INFO instead of default WARNING level). +# verbose = False + +# =========Start Global Config Option for Distributed L3 Router=============== +# Setting the "router_distributed" flag to "True" will default to the creation +# of distributed tenant routers. The admin can override this flag by specifying +# the type of the router on the create request (admin-only attribute). Default +# value is "False" to support legacy mode (centralized) routers. +# +# router_distributed = False +# +# ===========End Global Config Option for Distributed L3 Router=============== + +# Print debugging output (set logging level to DEBUG instead of default WARNING level). # debug = False -# verbose = False # Where to store Neutron state files. This directory must be writable by the # user executing the agent. @@ -31,7 +41,7 @@ # publish_errors = False -# Address to bind the API server +# Address to bind the API server to # bind_host = 0.0.0.0 # Port the bind the API server to @@ -44,14 +54,28 @@ # extensions are in there you don't need to specify them here # api_extensions_path = -# Neutron plugin provider module +# (StrOpt) Neutron core plugin entrypoint to be loaded from the +# neutron.core_plugins namespace. See setup.cfg for the entrypoint names of the +# plugins included in the neutron source distribution. For compatibility with +# previous versions, the class name of a plugin can be specified instead of its +# entrypoint name. +# +# core_plugin = +# Example: core_plugin = ml2 +# # The EVSNeutronPluginV2 Neutron plugin connects to the Solaris Elastic # Virtual Switch framework to provide virtual networking between Solaris # Zones. core_plugin = neutron.plugins.evs.plugin.EVSNeutronPluginV2 -# Advanced service modules +# (ListOpt) List of service plugin entrypoints to be loaded from the +# neutron.service_plugins namespace. See setup.cfg for the entrypoint names of +# the plugins included in the neutron source distribution. For compatibility +# with previous versions, the class name of a plugin can be specified instead +# of its entrypoint name. +# # service_plugins = +# Example: service_plugins = router,firewall,lbaas,vpnaas,metering # Paste configuration file # api_paste_config = api-paste.ini @@ -61,17 +85,26 @@ # auth_strategy = keystone # Base MAC address. The first 3 octets will remain unchanged. If the -# 4h octet is not 00, it will also used. The others will be +# 4h octet is not 00, it will also be used. The others will be # randomly generated. # 3 octet # base_mac = fa:16:3e:00:00:00 # 4 octet # base_mac = fa:16:3e:4f:00:00 +# DVR Base MAC address. The first 3 octets will remain unchanged. If the +# 4th octet is not 00, it will also be used. The others will be randomly +# generated. The 'dvr_base_mac' *must* be different from 'base_mac' to +# avoid mixing them up with MAC's allocated for tenant ports. +# A 4 octet example would be dvr_base_mac = fa:16:3f:4f:00:00 +# The default is 3 octet +# dvr_base_mac = fa:16:3f:00:00:00 + # Maximum amount of retries to generate a unique MAC address # mac_generation_retries = 16 -# DHCP Lease duration (in seconds) +# DHCP Lease duration (in seconds). Use -1 to +# tell dnsmasq to use infinite lease times. # dhcp_lease_duration = 86400 # Allow sending resource operation notification to DHCP agent @@ -87,119 +120,14 @@ # Attention: the following parameter MUST be set to False if Neutron is # being used in conjunction with nova security groups # allow_overlapping_ips = False -# Ensure that configured gateway is on subnet -# force_gateway_on_subnet = False - - -# RPC configuration options. Defined in rpc __init__ -# The messaging module to use, defaults to kombu. -# rpc_backend = neutron.openstack.common.rpc.impl_kombu -# Size of RPC thread pool -# rpc_thread_pool_size = 64 -# Size of RPC connection pool -# rpc_conn_pool_size = 30 -# Seconds to wait for a response from call or multicall -# rpc_response_timeout = 60 -# Seconds to wait before a cast expires (TTL). Only supported by impl_zmq. -# rpc_cast_timeout = 30 -# Modules of exceptions that are permitted to be recreated -# upon receiving exception data from an rpc call. -# allowed_rpc_exception_modules = neutron.openstack.common.exception, nova.exception -# AMQP exchange to connect to if using RabbitMQ or QPID -# control_exchange = neutron - -# If passed, use a fake RabbitMQ provider -# fake_rabbit = False - -# Configuration options if sending notifications via kombu rpc (these are -# the defaults) -# SSL version to use (valid only if SSL enabled) -# kombu_ssl_version = -# SSL key file (valid only if SSL enabled) -# kombu_ssl_keyfile = -# SSL cert file (valid only if SSL enabled) -# kombu_ssl_certfile = -# SSL certification authority file (valid only if SSL enabled)' -# kombu_ssl_ca_certs = -# IP address of the RabbitMQ installation -# rabbit_host = localhost -# Password of the RabbitMQ server -# rabbit_password = guest -# Port where RabbitMQ server is running/listening -# rabbit_port = 5672 -# RabbitMQ single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) -# rabbit_hosts is defaulted to '$rabbit_host:$rabbit_port' -# rabbit_hosts = localhost:5672 -# User ID used for RabbitMQ connections -# rabbit_userid = guest -# Location of a virtual RabbitMQ installation. -# rabbit_virtual_host = / -# Maximum retries with trying to connect to RabbitMQ -# (the default of 0 implies an infinite retry count) -# rabbit_max_retries = 0 -# RabbitMQ connection retry interval -# rabbit_retry_interval = 1 -# Use HA queues in RabbitMQ (x-ha-policy: all).You need to -# wipe RabbitMQ database when changing this option. (boolean value) -# rabbit_ha_queues = false - -# QPID -# rpc_backend=neutron.openstack.common.rpc.impl_qpid -# Qpid broker hostname -# qpid_hostname = localhost -# Qpid broker port -# qpid_port = 5672 -# Qpid single or HA cluster (host:port pairs i.e: host1:5672, host2:5672) -# qpid_hosts is defaulted to '$qpid_hostname:$qpid_port' -# qpid_hosts = localhost:5672 -# Username for qpid connection -# qpid_username = '' -# Password for qpid connection -# qpid_password = '' -# Space separated list of SASL mechanisms to use for auth -# qpid_sasl_mechanisms = '' -# Seconds between connection keepalive heartbeats -# qpid_heartbeat = 60 -# Transport to use, either 'tcp' or 'ssl' -# qpid_protocol = tcp -# Disable Nagle algorithm -# qpid_tcp_nodelay = True - -# ZMQ -# rpc_backend=neutron.openstack.common.rpc.impl_zmq -# ZeroMQ bind address. Should be a wildcard (*), an ethernet interface, or IP. -# The "host" option should point or resolve to this address. -# rpc_zmq_bind_address = * - -# ============ Notification System Options ===================== - -# Notifications can be sent when network/subnet/port are create, updated or deleted. -# There are three methods of sending notifications: logging (via the -# log_file directive), rpc (via a message queue) and -# noop (no notifications sent, the default) - -# Notification_driver can be defined multiple times -# Do nothing driver -# notification_driver = neutron.openstack.common.notifier.no_op_notifier -# Logging driver -# notification_driver = neutron.openstack.common.notifier.log_notifier -# RPC driver. DHCP agents needs it. -notification_driver = neutron.openstack.common.notifier.rpc_notifier - -# default_notification_level is used to form actual topic name(s) or to set logging level -# default_notification_level = INFO - -# default_publisher_id is a part of the notification payload -# host = myhost.com -# default_publisher_id = $host - -# Defined in rpc_notifier, can be comma separated values. -# The actual topic names will be %s.%(default_notification_level)s -# notification_topics = notifications +# Ensure that configured gateway is on subnet. For IPv6, validate only if +# gateway is not a link local address. Deprecated, to be removed during the +# K release, at which point the check will be mandatory. +# force_gateway_on_subnet = True # Default maximum number of items returned in a single response, # value == infinite and value < 0 means no max limit, and value must -# greater than 0. If the number of items requested is greater than +# be greater than 0. If the number of items requested is greater than # pagination_max_limit, server will just return pagination_max_limit # of number of items. # pagination_max_limit = -1 @@ -213,10 +141,13 @@ # Maximum number of fixed ips per port # max_fixed_ips_per_port = 5 +# Maximum number of routes per router +# max_routes = 30 + # =========== items for agent management extension ============= # Seconds to regard the agent as down; should be at least twice # report_interval, to be sure the agent is down for good -# agent_down_time = 9 +# agent_down_time = 75 # =========== end of items for agent management extension ===== # =========== items for agent scheduler extension ============= @@ -236,17 +167,57 @@ # routers to first L3 agent which sends sync_routers message to neutron server # router_auto_schedule = True +# Allow automatic rescheduling of routers from dead L3 agents with +# admin_state_up set to True to alive agents. +# allow_automatic_l3agent_failover = False + # Number of DHCP agents scheduled to host a network. This enables redundant # DHCP agents for configured networks. # dhcp_agents_per_network = 1 # =========== end of items for agent scheduler extension ===== +# =========== items for l3 extension ============== +# Enable high availability for virtual routers. +# l3_ha = False +# +# Maximum number of l3 agents which a HA router will be scheduled on. If it +# is set to 0 the router will be scheduled on every agent. +# max_l3_agents_per_router = 3 +# +# Minimum number of l3 agents which a HA router will be scheduled on. The +# default value is 2. +# min_l3_agents_per_router = 2 +# +# CIDR of the administrative network if HA mode is enabled +# l3_ha_net_cidr = 169.254.192.0/18 +# =========== end of items for l3 extension ======= + # =========== WSGI parameters related to the API server ============== # Number of separate worker processes to spawn. The default, 0, runs the # worker thread in the current process. Greater than 0 launches that number of # child processes as workers. The parent process manages them. # api_workers = 0 + +# Number of separate RPC worker processes to spawn. The default, 0, runs the +# worker thread in the current process. Greater than 0 launches that number of +# child processes as RPC workers. The parent process manages them. +# This feature is experimental until issues are addressed and testing has been +# enabled for various plugins for compatibility. +# rpc_workers = 0 + +# Timeout for client connections socket operations. If an +# incoming connection is idle for this number of seconds it +# will be closed. A value of '0' means wait forever. (integer +# value) +# client_socket_timeout = 900 + +# wsgi keepalive option. Determines if connections are allowed to be held open +# by clients after a request is fulfilled. A value of False will ensure that +# the socket connection will be explicitly closed once a response has been +# sent to the client. +# wsgi_keep_alive = True + # Sets the value of TCP_KEEPIDLE in seconds to use for each server socket when # starting API server. Not supported on OS X. # tcp_keepidle = 600 @@ -257,6 +228,9 @@ # Number of backlog requests to configure the socket with. # backlog = 4096 +# Max header line to accommodate large tokens +# max_header_line = 16384 + # Enable SSL on the API server # use_ssl = False @@ -273,35 +247,314 @@ # ssl_ca_file = /path/to/cafile # ======== end of WSGI parameters related to the API server ========== + +# ======== neutron nova interactions ========== +# Send notification to nova when port status is active. +# notify_nova_on_port_status_changes = True + +# Send notifications to nova when port data (fixed_ips/floatingips) change +# so nova can update it's cache. +# notify_nova_on_port_data_changes = True + +# URL for connection to nova (Only supports one nova region currently). +# nova_url = http://127.0.0.1:8774/v2 + +# Name of nova region to use. Useful if keystone manages more than one region +# nova_region_name = + +# Username for connection to nova in admin context +# nova_admin_username = + +# The uuid of the admin nova tenant +# nova_admin_tenant_id = + +# Password for connection to nova in admin context. +# nova_admin_password = + +# Authorization URL for connection to nova in admin context. +# nova_admin_auth_url = + +# CA file for novaclient to verify server certificates +# nova_ca_certificates_file = + +# Boolean to control ignoring SSL errors on the nova url +# nova_api_insecure = False + +# Number of seconds between sending events to nova if there are any events to send +# send_events_interval = 2 + +# ======== end of neutron nova interactions ========== + +# +# Options defined in oslo.messaging +# + +# Use durable queues in amqp. (boolean value) +# Deprecated group/name - [DEFAULT]/rabbit_durable_queues +#amqp_durable_queues=false + +# Auto-delete queues in amqp. (boolean value) +#amqp_auto_delete=false + +# Size of RPC connection pool. (integer value) +#rpc_conn_pool_size=30 + +# Qpid broker hostname. (string value) +#qpid_hostname=localhost + +# Qpid broker port. (integer value) +#qpid_port=5672 + +# Qpid HA cluster host:port pairs. (list value) +#qpid_hosts=$qpid_hostname:$qpid_port + +# Username for Qpid connection. (string value) +#qpid_username= + +# Password for Qpid connection. (string value) +#qpid_password= + +# Space separated list of SASL mechanisms to use for auth. +# (string value) +#qpid_sasl_mechanisms= + +# Seconds between connection keepalive heartbeats. (integer +# value) +#qpid_heartbeat=60 + +# Transport to use, either 'tcp' or 'ssl'. (string value) +#qpid_protocol=tcp + +# Whether to disable the Nagle algorithm. (boolean value) +#qpid_tcp_nodelay=true + +# The qpid topology version to use. Version 1 is what was +# originally used by impl_qpid. Version 2 includes some +# backwards-incompatible changes that allow broker federation +# to work. Users should update to version 2 when they are +# able to take everything down, as it requires a clean break. +# (integer value) +#qpid_topology_version=1 + +# SSL version to use (valid only if SSL enabled). valid values +# are TLSv1, SSLv23 and SSLv3. SSLv2 may be available on some +# distributions. (string value) +#kombu_ssl_version= + +# SSL key file (valid only if SSL enabled). (string value) +#kombu_ssl_keyfile= + +# SSL cert file (valid only if SSL enabled). (string value) +#kombu_ssl_certfile= + +# SSL certification authority file (valid only if SSL +# enabled). (string value) +#kombu_ssl_ca_certs= + +# How long to wait before reconnecting in response to an AMQP +# consumer cancel notification. (floating point value) +#kombu_reconnect_delay=1.0 + +# The RabbitMQ broker address where a single node is used. +# (string value) +#rabbit_host=localhost + +# The RabbitMQ broker port where a single node is used. +# (integer value) +#rabbit_port=5672 + +# RabbitMQ HA cluster host:port pairs. (list value) +#rabbit_hosts=$rabbit_host:$rabbit_port + +# Connect over SSL for RabbitMQ. (boolean value) +#rabbit_use_ssl=false + +# The RabbitMQ userid. (string value) +#rabbit_userid=guest + +# The RabbitMQ password. (string value) +#rabbit_password=guest + +# the RabbitMQ login method (string value) +#rabbit_login_method=AMQPLAIN + +# The RabbitMQ virtual host. (string value) +#rabbit_virtual_host=/ + +# How frequently to retry connecting with RabbitMQ. (integer +# value) +#rabbit_retry_interval=1 + +# How long to backoff for between retries when connecting to +# RabbitMQ. (integer value) +#rabbit_retry_backoff=2 + +# Maximum number of RabbitMQ connection retries. Default is 0 +# (infinite retry count). (integer value) +#rabbit_max_retries=0 + +# Use HA queues in RabbitMQ (x-ha-policy: all). If you change +# this option, you must wipe the RabbitMQ database. (boolean +# value) +#rabbit_ha_queues=false + +# If passed, use a fake RabbitMQ provider. (boolean value) +#fake_rabbit=false + +# ZeroMQ bind address. Should be a wildcard (*), an ethernet +# interface, or IP. The "host" option should point or resolve +# to this address. (string value) +#rpc_zmq_bind_address=* + +# MatchMaker driver. (string value) +#rpc_zmq_matchmaker=oslo.messaging._drivers.matchmaker.MatchMakerLocalhost + +# ZeroMQ receiver listening port. (integer value) +#rpc_zmq_port=9501 + +# Number of ZeroMQ contexts, defaults to 1. (integer value) +#rpc_zmq_contexts=1 + +# Maximum number of ingress messages to locally buffer per +# topic. Default is unlimited. (integer value) +#rpc_zmq_topic_backlog= + +# Directory for holding IPC sockets. (string value) +#rpc_zmq_ipc_dir=/var/run/openstack + +# Name of this node. Must be a valid hostname, FQDN, or IP +# address. Must match "host" option, if running Nova. (string +# value) +#rpc_zmq_host=oslo + +# Seconds to wait before a cast expires (TTL). Only supported +# by impl_zmq. (integer value) +#rpc_cast_timeout=30 + +# Heartbeat frequency. (integer value) +#matchmaker_heartbeat_freq=300 + +# Heartbeat time-to-live. (integer value) +#matchmaker_heartbeat_ttl=600 + +# Size of RPC greenthread pool. (integer value) +#rpc_thread_pool_size=64 + +# Driver or drivers to handle sending notifications. (multi +# valued) +#notification_driver= + +# AMQP topic used for OpenStack notifications. (list value) +# Deprecated group/name - [rpc_notifier2]/topics +#notification_topics=notifications + +# Seconds to wait for a response from a call. (integer value) +#rpc_response_timeout=60 + +# A URL representing the messaging driver to use and its full +# configuration. If not set, we fall back to the rpc_backend +# option and driver specific configuration. (string value) +#transport_url= + +# The messaging driver to use, defaults to rabbit. Other +# drivers include qpid and zmq. (string value) +#rpc_backend=rabbit + +# The default exchange under which topics are scoped. May be +# overridden by an exchange name specified in the +# transport_url option. (string value) +#control_exchange=openstack + + +[matchmaker_redis] + +# +# Options defined in oslo.messaging +# + +# Host to locate redis. (string value) +#host=127.0.0.1 + +# Use this port to connect to redis host. (integer value) +#port=6379 + +# Password for Redis server (optional). (string value) +#password= + + +[matchmaker_ring] + +# +# Options defined in oslo.messaging +# + +# Matchmaker ring file (JSON). (string value) +# Deprecated group/name - [DEFAULT]/matchmaker_ringfile +#ringfile=/etc/oslo/matchmaker_ring.json + [quotas] -# resource name(s) that are supported in quota features +# Default driver to use for quota checks +# quota_driver = neutron.db.quota_db.DbQuotaDriver + +# Resource name(s) that are supported in quota features # quota_items = network,subnet,port -# default number of resource allowed per tenant, minus for unlimited +# Default number of resource allowed per tenant. A negative value means +# unlimited. # default_quota = -1 -# number of networks allowed per tenant, and minus means unlimited +# Number of networks allowed per tenant. A negative value means unlimited. # quota_network = 10 -# number of subnets allowed per tenant, and minus means unlimited +# Number of subnets allowed per tenant. A negative value means unlimited. # quota_subnet = 10 -# number of ports allowed per tenant, and minus means unlimited +# Number of ports allowed per tenant. A negative value means unlimited. # quota_port = 50 -# number of security groups allowed per tenant, and minus means unlimited +# Number of security groups allowed per tenant. A negative value means +# unlimited. # quota_security_group = 10 -# number of security group rules allowed per tenant, and minus means unlimited +# Number of security group rules allowed per tenant. A negative value means +# unlimited. # quota_security_group_rule = 100 -# default driver to use for quota checks -# The default quota driver, neutron.db.quota_db.DbQuotaDriver, supports -# static quotas defined in the [quotas] section. The Elastic Virtual -# Switch plugin supports per-tenant quota limits via the quota extension -# API. To enable per-tenant quotas, the quota_driver should be set to -# neutron.plugins.evs.db.quotas_db.EVSDbQuotaDriver. -quota_driver = neutron.plugins.evs.db.quotas_db.EVSDbQuotaDriver +# Number of vips allowed per tenant. A negative value means unlimited. +# quota_vip = 10 + +# Number of pools allowed per tenant. A negative value means unlimited. +# quota_pool = 10 + +# Number of pool members allowed per tenant. A negative value means unlimited. +# The default is unlimited because a member is not a real resource consumer +# on Openstack. However, on back-end, a member is a resource consumer +# and that is the reason why quota is possible. +# quota_member = -1 + +# Number of health monitors allowed per tenant. A negative value means +# unlimited. +# The default is unlimited because a health monitor is not a real resource +# consumer on Openstack. However, on back-end, a member is a resource consumer +# and that is the reason why quota is possible. +# quota_health_monitor = -1 + +# Number of routers allowed per tenant. A negative value means unlimited. +# quota_router = 10 + +# Number of floating IPs allowed per tenant. A negative value means unlimited. +# quota_floatingip = 50 + +# Number of firewalls allowed per tenant. A negative value means unlimited. +# quota_firewall = 1 + +# Number of firewall policies allowed per tenant. A negative value means +# unlimited. +# quota_firewall_policy = 1 + +# Number of firewall rules allowed per tenant. A negative value means +# unlimited. +# quota_firewall_rule = 100 [agent] # Use "sudo neutron-rootwrap /etc/neutron/rootwrap.conf" to use the real @@ -312,13 +565,13 @@ # =========== items for agent management extension ============= # seconds between nodes reporting state to server; should be less than # agent_down_time, best if it is half or less than agent_down_time -# report_interval = 4 +# report_interval = 30 # =========== end of items for agent management extension ===== [keystone_authtoken] -auth_uri = http://127.0.0.1:5000/v2.0 -identity_uri = http://127.0.0.1:35357 +auth_uri = http://127.0.0.1:5000/v2.0/ +identity_uri = http://127.0.0.1:35357/ admin_tenant_name = %SERVICE_TENANT_NAME% admin_user = %SERVICE_USER% admin_password = %SERVICE_PASSWORD% @@ -330,7 +583,15 @@ # connection = mysql://root:pass@127.0.0.1:3306/neutron # Replace 127.0.0.1 above with the IP address of the database used by the # main neutron server. (Leave it as is if the database runs on this host.) -# connection = sqlite:// +# NOTE: In deployment the [database] section and its connection attribute may +# be set in the corresponding core plugin '.ini' file. However, it is suggested +# to put the [database] section and its connection attribute in this +# configuration file. +connection = mysql://%SERVICE_USER%:%SERVICE_PASSWORD%@localhost/neutron + +# Database engine for which script will be generated when using offline +# migration +# engine = # The SQLAlchemy connection string used to connect to the slave database # slave_connection = @@ -368,11 +629,26 @@ # Specify service providers (drivers) for advanced services like loadbalancer, VPN, Firewall. # Must be in form: # service_provider=::[:default] -# List of allowed service type include LOADBALANCER, FIREWALL, VPN +# List of allowed service types includes LOADBALANCER, FIREWALL, VPN # Combination of and must be unique; must also be unique -# this is multiline option, example for default provider: +# This is multiline option, example for default provider: # service_provider=LOADBALANCER:name:lbaas_plugin_driver_path:default # example of non-default provider: # service_provider=FIREWALL:name2:firewall_driver_path # --- Reference implementations --- service_provider=LOADBALANCER:Haproxy:neutron.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default +service_provider=VPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default +# In order to activate Radware's lbaas driver you need to uncomment the next line. +# If you want to keep the HA Proxy as the default lbaas driver, remove the attribute default from the line below. +# Otherwise comment the HA Proxy line +# service_provider = LOADBALANCER:Radware:neutron.services.loadbalancer.drivers.radware.driver.LoadBalancerDriver:default +# uncomment the following line to make the 'netscaler' LBaaS provider available. +# service_provider=LOADBALANCER:NetScaler:neutron.services.loadbalancer.drivers.netscaler.netscaler_driver.NetScalerPluginDriver +# Uncomment the following line (and comment out the OpenSwan VPN line) to enable Cisco's VPN driver. +# service_provider=VPN:cisco:neutron.services.vpn.service_drivers.cisco_ipsec.CiscoCsrIPsecVPNDriver:default +# Uncomment the line below to use Embrane heleos as Load Balancer service provider. +# service_provider=LOADBALANCER:Embrane:neutron.services.loadbalancer.drivers.embrane.driver.EmbraneLbaas:default +# Uncomment the line below to use the A10 Networks LBaaS driver. Requires 'pip install a10-neutron-lbaas'. +#service_provider = LOADBALANCER:A10Networks:neutron.services.loadbalancer.drivers.a10networks.driver_v1.ThunderDriver:default +# Uncomment the following line to test the LBaaS v2 API _WITHOUT_ a real backend +# service_provider = LOADBALANCER:LoggingNoop:neutron.services.loadbalancer.drivers.logging_noop.driver.LoggingNoopLoadBalancerDriver:default diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/neutron.exec_attr --- a/components/openstack/neutron/files/neutron.exec_attr Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/neutron.exec_attr Mon Apr 20 12:35:51 2015 -0700 @@ -1,3 +1,6 @@ +OpenStack Network Management:solaris:cmd:RO::/usr/bin/neutron-db-manage:\ +uid=neutron;gid=neutron + neutron-agent:solaris:cmd:RO::/usr/sbin/dladm:\ privs=net_icmpaccess,net_privaddr,net_rawaccess,proc_audit,sys_dl_config diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/neutron.prof_attr --- a/components/openstack/neutron/files/neutron.prof_attr Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/neutron.prof_attr Mon Apr 20 12:35:51 2015 -0700 @@ -1,12 +1,9 @@ OpenStack Network Management:RO::\ Manage OpenStack Neutron:\ -auths=solaris.admin.edit/etc/neutron/api-paste.ini,\ -solaris.admin.edit/etc/neutron/dhcp_agent.ini,\ -solaris.admin.edit/etc/neutron/l3_agent.ini,\ -solaris.admin.edit/etc/neutron/logging.conf,\ -solaris.admin.edit/etc/neutron/neutron.conf,\ -solaris.admin.edit/etc/neutron/plugins/evs/evs_plugin.ini,\ -solaris.admin.edit/etc/neutron/policy.json,\ +auths=solaris.admin.edit/etc/neutron/*.conf,\ +solaris.admin.edit/etc/neutron/*.ini,\ +solaris.admin.edit/etc/neutron/*.json,\ +solaris.admin.edit/etc/neutron/plugins/*/*.ini,\ solaris.smf.manage.neutron,\ solaris.smf.value.neutron;\ defaultpriv={file_dac_read}\:/var/svc/log/application-openstack-* @@ -16,5 +13,7 @@ neutron-agent:RO::\ Do not assign to users. \ Commands required for application/openstack/neutron agents:\ -auths=solaris.network.interface.config;\ +auths=solaris.network.interface.config,\ +solaris.smf.manage.routing,\ +solaris.smf.value.routing;\ profiles=Elastic Virtual Switch Administration,IP Filter Management diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/files/neutron.user_attr --- a/components/openstack/neutron/files/neutron.user_attr Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/files/neutron.user_attr Mon Apr 20 12:35:51 2015 -0700 @@ -1,1 +1,1 @@ -neutron::RO::profiles=neutron-agent +neutron::RO::profiles=OpenStack Network Management,neutron-agent diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/neutron.p5m --- a/components/openstack/neutron/neutron.p5m Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/neutron.p5m Mon Apr 20 12:35:51 2015 -0700 @@ -20,7 +20,7 @@ # # -# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. # set name=pkg.fmri \ @@ -28,10 +28,10 @@ set name=pkg.summary value="OpenStack Neutron (Networking Service)" set name=pkg.description \ value="Neutron provides an API to dynamically request and configure virtual networks. These networks connect 'interfaces' from other OpenStack services (e.g., VNICs from Nova VMs). The Neutron API supports extensions to provide advanced network capabilities (e.g., QoS, ACLs, network monitoring, etc)." -set name=pkg.human-version value="Havana $(COMPONENT_VERSION)" +set name=pkg.human-version value="Juno $(COMPONENT_VERSION)" set name=com.oracle.info.description \ value="Neutron, the OpenStack virtual network service" -set name=com.oracle.info.tpno value=17716 +set name=com.oracle.info.tpno value=$(TPNO) set name=info.classification \ value="org.opensolaris.category.2008:System/Administration and Configuration" \ value="org.opensolaris.category.2008:System/Enterprise Management" \ @@ -40,8 +40,11 @@ set name=info.source-url value=$(COMPONENT_ARCHIVE_URL) set name=info.upstream value="OpenStack " set name=info.upstream-url value=$(COMPONENT_PROJECT_URL) -set name=org.opensolaris.arc-caseid value=PSARC/2013/350 value=PSARC/2014/059 +set name=openstack.upgrade-id reboot-needed=true value=$(COMPONENT_BE_VERSION) +set name=org.opensolaris.arc-caseid value=PSARC/2013/350 value=PSARC/2014/059 \ + value=PSARC/2015/110 set name=org.opensolaris.consolidation value=$(CONSOLIDATION) +# dir path=etc/neutron owner=neutron group=neutron mode=0700 file etc/api-paste.ini path=etc/neutron/api-paste.ini owner=neutron \ group=neutron mode=0644 overlay=allow preserve=renamenew @@ -49,14 +52,40 @@ group=neutron mode=0644 overlay=allow preserve=renamenew file files/l3_agent.ini path=etc/neutron/l3_agent.ini owner=neutron \ group=neutron mode=0644 overlay=allow preserve=renamenew +file files/metadata_agent.ini path=etc/neutron/metadata_agent.ini \ + owner=neutron group=neutron mode=0644 overlay=allow preserve=renamenew file files/neutron.conf path=etc/neutron/neutron.conf owner=neutron \ group=neutron mode=0644 \ original_name=cloud/openstack/neutron:etc/neutron/quantum.conf \ overlay=allow preserve=renamenew -dir path=etc/neutron/plugins owner=neutron group=neutron -dir path=etc/neutron/plugins/evs owner=neutron group=neutron file files/evs_plugin.ini path=etc/neutron/plugins/evs/evs_plugin.ini \ owner=neutron group=neutron mode=0644 overlay=allow preserve=renamenew +file path=etc/neutron/plugins/ml2/ml2_conf.ini owner=neutron group=neutron \ + mode=0644 overlay=allow preserve=renamenew +file path=etc/neutron/plugins/ml2/ml2_conf_arista.ini owner=neutron \ + group=neutron mode=0644 overlay=allow preserve=renamenew +file path=etc/neutron/plugins/ml2/ml2_conf_brocade.ini owner=neutron \ + group=neutron mode=0644 overlay=allow preserve=renamenew +file path=etc/neutron/plugins/ml2/ml2_conf_cisco.ini owner=neutron \ + group=neutron mode=0644 overlay=allow preserve=renamenew +file path=etc/neutron/plugins/ml2/ml2_conf_fslsdn.ini owner=neutron \ + group=neutron mode=0644 overlay=allow preserve=renamenew +file path=etc/neutron/plugins/ml2/ml2_conf_mlnx.ini owner=neutron \ + group=neutron mode=0644 overlay=allow preserve=renamenew +file path=etc/neutron/plugins/ml2/ml2_conf_ncs.ini owner=neutron group=neutron \ + mode=0644 overlay=allow preserve=renamenew +file path=etc/neutron/plugins/ml2/ml2_conf_odl.ini owner=neutron group=neutron \ + mode=0644 overlay=allow preserve=renamenew +file path=etc/neutron/plugins/ml2/ml2_conf_ofa.ini owner=neutron group=neutron \ + mode=0644 overlay=allow preserve=renamenew +file path=etc/neutron/plugins/ml2/ml2_conf_sriov.ini owner=neutron \ + group=neutron mode=0644 overlay=allow preserve=renamenew +file etc/neutron/plugins/nuage/nuage_plugin.ini \ + path=etc/neutron/plugins/ml2/nuage_plugin.ini owner=neutron group=neutron \ + mode=0644 overlay=allow preserve=renamenew +file etc/neutron/plugins/bigswitch/restproxy.ini \ + path=etc/neutron/plugins/ml2/restproxy.ini owner=neutron group=neutron \ + mode=0644 overlay=allow preserve=renamenew file etc/policy.json path=etc/neutron/policy.json owner=neutron group=neutron \ mode=0644 overlay=allow preserve=renamenew link path=etc/quantum target=./neutron @@ -68,24 +97,34 @@ path=etc/security/prof_attr.d/cloud:openstack:neutron group=sys file files/neutron.user_attr path=etc/user_attr.d/cloud:openstack:neutron \ group=sys -file files/neutron-dhcp-agent.xml \ - path=lib/svc/manifest/application/openstack/neutron-dhcp-agent.xml -file files/neutron-l3-agent.xml \ - path=lib/svc/manifest/application/openstack/neutron-l3-agent.xml -file files/neutron-server.xml \ - path=lib/svc/manifest/application/openstack/neutron-server.xml +file path=lib/svc/manifest/application/openstack/neutron-dhcp-agent.xml +file path=lib/svc/manifest/application/openstack/neutron-l3-agent.xml +file path=lib/svc/manifest/application/openstack/neutron-metadata-agent.xml +file path=lib/svc/manifest/application/openstack/neutron-server.xml +file path=lib/svc/manifest/application/openstack/neutron-upgrade.xml file files/neutron-dhcp-agent path=lib/svc/method/neutron-dhcp-agent file files/neutron-l3-agent path=lib/svc/method/neutron-l3-agent +file files/neutron-metadata-agent path=lib/svc/method/neutron-metadata-agent file files/neutron-server path=lib/svc/method/neutron-server +file files/neutron-upgrade path=lib/svc/method/neutron-upgrade +file path=usr/bin/neutron-db-manage +file path=usr/lib/neutron/evs-neutron-migration mode=0555 file usr/bin/neutron-dhcp-agent path=usr/lib/neutron/neutron-dhcp-agent \ mode=0555 file usr/bin/neutron-l3-agent path=usr/lib/neutron/neutron-l3-agent mode=0555 +file usr/bin/neutron-metadata-agent \ + path=usr/lib/neutron/neutron-metadata-agent mode=0555 +file usr/bin/neutron-ns-metadata-proxy \ + path=usr/lib/neutron/neutron-ns-metadata-proxy mode=0555 file usr/bin/neutron-server path=usr/lib/neutron/neutron-server mode=0555 +file usr/bin/neutron-usage-audit path=usr/lib/neutron/neutron-usage-audit \ + mode=0555 file path=usr/lib/python$(PYVER)/vendor-packages/neutron-$(COMPONENT_VERSION)-py$(PYVER).egg-info/PKG-INFO file path=usr/lib/python$(PYVER)/vendor-packages/neutron-$(COMPONENT_VERSION)-py$(PYVER).egg-info/SOURCES.txt file path=usr/lib/python$(PYVER)/vendor-packages/neutron-$(COMPONENT_VERSION)-py$(PYVER).egg-info/dependency_links.txt file path=usr/lib/python$(PYVER)/vendor-packages/neutron-$(COMPONENT_VERSION)-py$(PYVER).egg-info/entry_points.txt file path=usr/lib/python$(PYVER)/vendor-packages/neutron-$(COMPONENT_VERSION)-py$(PYVER).egg-info/not-zip-safe +file path=usr/lib/python$(PYVER)/vendor-packages/neutron-$(COMPONENT_VERSION)-py$(PYVER).egg-info/pbr.json file path=usr/lib/python$(PYVER)/vendor-packages/neutron-$(COMPONENT_VERSION)-py$(PYVER).egg-info/requires.txt file path=usr/lib/python$(PYVER)/vendor-packages/neutron-$(COMPONENT_VERSION)-py$(PYVER).egg-info/top_level.txt file path=usr/lib/python$(PYVER)/vendor-packages/neutron/__init__.py @@ -97,6 +136,7 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/firewall.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/l2population_rpc.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/l3_agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/l3_ha_agent.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/async_process.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/daemon.py @@ -104,9 +144,14 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/external_process.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/interface.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/ip_lib.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/ipset_manager.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/iptables_firewall.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/iptables_manager.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/keepalived.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/ovs_lib.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/ovsdb_monitor.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/polling.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/ra.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/linux/utils.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/metadata/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/metadata/agent.py @@ -120,6 +165,7 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/solaris/interface.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/solaris/ipfilters_manager.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/solaris/net_lib.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/agent/solaris/ra.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/api_common.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/extensions.py @@ -128,22 +174,31 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/rpc/agentnotifiers/dhcp_rpc_agent_api.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/rpc/agentnotifiers/metering_rpc_agent_api.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/rpc/handlers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/rpc/handlers/dhcp_rpc.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/rpc/handlers/dvr_rpc.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/rpc/handlers/l3_rpc.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/rpc/handlers/securitygroups_rpc.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/v2/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/v2/attributes.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/v2/base.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/v2/resource.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/v2/resource_helper.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/v2/router.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/versions.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/views/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/api/views/versions.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/auth.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/cmd/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/cmd/sanity/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/cmd/sanity/checks.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/cmd/sanity_check.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/cmd/usage_audit.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/common/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/common/config.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/common/constants.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/common/exceptions.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/common/legacy.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/common/ipv6_utils.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/common/log.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/common/rpc.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/common/test_lib.py @@ -155,96 +210,117 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/agentschedulers_db.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/allowedaddresspairs_db.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/api.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/common_db_mixin.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/db_base_plugin_v2.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/dhcp_rpc_base.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/dvr_mac_db.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/external_net_db.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/extradhcpopt_db.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/extraroute_db.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/firewall/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/firewall/firewall_db.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/l3_agentschedulers_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/l3_attrs_db.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/l3_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/l3_dvr_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/l3_dvrscheduler_db.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/l3_gwmode_db.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/l3_rpc_base.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/l3_hamode_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/l3_hascheduler_db.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/loadbalancer/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/loadbalancer/loadbalancer_db.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/metering/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/metering/metering_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/metering/metering_rpc.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/README file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic.ini file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/common_ext_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/agent_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/brocade_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/cisco_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/core_init_ops.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/env.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/firewall_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/heal_script.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/l3_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/lb_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/loadbalancer_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/metering_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/ml2_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/mlnx_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/nec_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/other_extensions_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/other_plugins_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/ovs_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/portsec_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/ryu_init_ops.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/script.py.mako -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1064e98b7917_nec_pf_port_del.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1149d7de0cfa_port_security.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/11c6e18605c8_pool_monitor_status_.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/128e042a2b68_ext_gw_mode.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1341ed32cc1e_nvp_netbinding_update.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/13de305df56e_add_nec_pf_name.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/14f24494ca31_arista_ml2.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/176a85fc7d79_add_portbindings_db.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1b693c095aa3_quota_ext_db_grizzly.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1c33fa3cd1a1_extra_route_config.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1d76643bcec4_nvp_netbinding.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1efb85914233_allowedaddresspairs.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/2032abe8edac_lbaas_add_status_des.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/20ae61555e95_ml2_gre_type_driver.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/2528ceb28230_nec_pf_netid_fix.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/263772d65691_cisco_db_cleanup_2.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/27ef74513d33_quota_in_plumgrid_pl.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/2a3bae1ceb8_nec_port_binding.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/2a6d0b51f4bb_cisco_plugin_cleanup.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/2c4af419145b_l3_support.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/32a65f71af51_ml2_portbinding.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/32b517556ec9_remove_tunnelip_mode.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/338d7508968c_vpnaas_peer_address_.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/35c7c198ddea_lbaas_healthmon_del_status.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/363468ac592c_nvp_network_gw.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/38335592a0dc_nvp_portmap.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/38fc1f6789f8_cisco_n1kv_overlay.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/39cf3f799352_fwaas_havana_2_model.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/3a520dd165d0_cisco_nexus_multi_switch.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/3b54bf9e29f7_nec_plugin_sharednet.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/3c6e57a23db4_add_multiprovider.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/3cabb850f4a5_table_to_track_port_.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/3cb5d900c5de_security_groups.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/3cbf70257c28_nvp_mac_learning.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/3d6fae8b70b0_nvp_lbaas_plugin.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/3ed8f075e38a_nvp_fwaas_plugin.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/40dffbf4b549_nvp_dist_router.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/45680af419f9_nvp_qos.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/4692d074d587_agent_scheduler.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/46a0efbd8f0_cisco_n1kv_multisegm.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/477a4488d3f4_ml2_vxlan_type_driver.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/48b6f43f7471_service_type.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/49332180ca96_ryu_plugin_update.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/4a666eb208c2_service_router.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/511471cc46b_agent_ext_model_supp.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/51b4de912379_cisco_nexus_ml2_mech.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/52c5e4a18807_lbaas_pool_scheduler.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/52ff27f7567a_support_for_vpnaas.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/53bbd27ec841_extra_dhcp_opts_supp.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/54c2c487e913_lbaas.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/557edfc53098_new_service_types.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/569e98a8132b_metering.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/5918cbddab04_add_tables_for_route.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/5a875d0e5c_ryu.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/5ac71e65402c_ml2_initial.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/63afba73813_ovs_tunnelendpoints_id_unique.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/66a59a7f516_nec_openflow_router.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/86cf4d88bd3_remove_bigswitch_por.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/secgroup_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/10cd28e692e9_nuage_extraroute.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/117643811bca_nec_delete_ofc_mapping.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1421183d533f_nsx_dhcp_metadata.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/157a5d299379_ml2_binding_profile.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1680e1f0c4dc_remove_cisco_nexus_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/16a27a58e093_ext_l3_ha_mode.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/19180cf98af6_nsx_gw_devices.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1b2580001654_nsx_sec_group_mappin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1b837a7125a9_cisco_apic_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1d6ee1ae5da5_db_healing.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1e5dd1d09b22_set_not_null_fields_lb_stats.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/1fcfc149aca4_agents_unique_by_type_and_host.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/2026156eab2f_l2_dvr_models.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/236b90af57ab_ml2_refactor_for_dynamic_segments.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/2447ad0e9585_add_ipv6_mode_props.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/24c7ea5160d7_cisco_csr_vpnaas.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/27cc183af192_ml2_vnic_type.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/2db5203cb7a9_nuage_floatingip.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/2eeaf963a447_floatingip_status.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/31d7f831a591_add_constraint_for_routerid.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/327ee5fde2c7_set_innodb_engine.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/32f3915891fd_cisco_apic_driver_update.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/33c3db036fe4_set_length_of_description_field_metering.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/33dd0a9fa487_embrane_lbaas_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/37f322991f59_nuage_removing_mapping_tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/3927f7f7c456_l3_extension_distributed_mode.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/3b85b693a95f_remove_service_tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/3c346828361e_metering_label_shared.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/3d2585038b95_vmware_nsx.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/3d3cb89d84ee_nsx_switch_mappings.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/492a106273f8_brocade_ml2_mech_dri.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/4ca36cfc898c_nsx_router_mappings.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/4eba2f05c2f4_correct_vxlan_endpoint_primary_key.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/4eca4a84f08a_remove_ml2_cisco_cred_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/50d5ba354c23_ml2_binding_vif_details.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/50e86cb2637a_nsx_mappings.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/538732fa21e1_nec_rename_quantum_id_to_neutron_id.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/544673ac99ab_add_router_port_table.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/5446f2a45467_set_server_default.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/54f7549a0e5f_set_not_null_peer_address.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/5589aa32bf80_l3_dvr_scheduler.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/58fe87a01143_cisco_csr_routing.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/5ac1c354a051_n1kv_segment_alloc.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/6be312499f9_set_not_null_vlan_id_cisco.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/81c553f3776c_bsn_consistencyhashes.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/86d6d9776e2b_cisco_apic_driver_update_l3.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/884573acbf1c_unify_nsx_router_extra_attributes.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/HEAD file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/README -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/b7a8863760e_rm_cisco_vlan_bindin.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/c88b6b5fea3_cisco_n1kv_tables.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/e6b16a30d97_cisco_provider_nets.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/f489cf14a79c_lbaas_havana.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/f9263d6df56_remove_dhcp_lease.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/folsom_initial.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/grizzly_release.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/havana_release.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/aae5706a396_nuage_provider_networks.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/abc88c33f74f_lb_stats_needs_bigint.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/b65aa907aec_set_length_of_protocol_field.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/d06e871c0d5_set_admin_state_up_not_null_ml2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/e197124d4b9_add_unique_constrain.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/e766b19a3bb_nuage_initial.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/havana_initial.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/icehouse_release.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/versions/juno_release.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/vmware_init_ops.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/alembic_migrations/vpn_init_ops.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/cli.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/migrate_to_ml2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/models/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/models/frozen.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/migration/models/head.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/model_base.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/models_v2.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/portbindings_base.py @@ -259,6 +335,7 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/sqlalchemyutils.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/vpn/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/vpn/vpn_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/db/vpn/vpn_validator.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/debug/README file path=usr/lib/python$(PYVER)/vendor-packages/neutron/debug/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/debug/commands.py @@ -268,6 +345,7 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/agent.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/allowedaddresspairs.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/dhcpagentscheduler.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/dvr.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/external_net.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/extra_dhcp_opt.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/extraroute.py @@ -275,6 +353,7 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/flavor.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/l3.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/l3_ext_gw_mode.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/l3_ext_ha_mode.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/l3agentscheduler.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/lbaas_agentscheduler.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/loadbalancer.py @@ -289,69 +368,29 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/securitygroup.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/servicetype.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/extensions/vpnaas.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/hacking/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/hacking/checks.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/hooks.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/ar/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/bg_BG/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/bs/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/ca/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/cs/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/da/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/de/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/en_AU/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/en_GB/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/en_US/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/es/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/es_MX/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/fi_FI/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/fil/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/fr/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/hi/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/hr/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/hu/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/id/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/it/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/it_IT/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/ja/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/ka_GE/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/kn/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/ko/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/ko_KR/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/ms/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/nb/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/ne/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/nl_NL/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/pl_PL/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/pt/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/pt_BR/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/ro/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/ru/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/ru_RU/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/sk/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/sl_SI/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/sw_KE/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/tl/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/tl_PH/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/tr_TR/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/uk/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/vi_VN/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/zh_CN/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/zh_HK/LC_MESSAGES/neutron.po -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/locale/zh_TW/LC_MESSAGES/neutron.po file path=usr/lib/python$(PYVER)/vendor-packages/neutron/manager.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/neutron_plugin_base_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/notifiers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/notifiers/nova.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/cache/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/cache/_backends/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/cache/_backends/memory.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/cache/backends.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/cache/cache.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/context.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/db/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/db/api.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/db/exception.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/db/sqlalchemy/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/db/sqlalchemy/models.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/db/sqlalchemy/session.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/db/sqlalchemy/utils.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/eventlet_backdoor.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/excutils.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/fileutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/fixture/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/fixture/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/fixture/lockutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/fixture/mockpatch.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/fixture/moxstubout.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/gettextutils.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/importutils.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/jsonutils.py @@ -359,51 +398,177 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/lockutils.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/log.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/loopingcall.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/middleware/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/middleware/base.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/middleware/catch_errors.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/middleware/correlation_id.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/middleware/debug.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/middleware/request_id.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/middleware/sizelimit.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/network_utils.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/notifier/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/notifier/api.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/notifier/log_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/notifier/no_op_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/notifier/rabbit_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/notifier/rpc_notifier.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/notifier/rpc_notifier2.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/notifier/test_notifier.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/periodic_task.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/policy.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/processutils.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rootwrap/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rootwrap/cmd.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rootwrap/filters.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rootwrap/wrapper.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/amqp.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/common.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/dispatcher.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/impl_fake.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/impl_kombu.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/impl_qpid.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/impl_zmq.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/matchmaker.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/matchmaker_redis.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/matchmaker_ring.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/proxy.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/serializer.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/service.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/rpc/zmq_receiver.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/service.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/sslutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/strutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/systemd.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/threadgroup.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/timeutils.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/uuidutils.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/openstack/common/versionutils.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/agent/restproxy_agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/db/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/db/consistency_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/db/porttracker_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/extensions/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/extensions/routerrule.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/l3_router_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/routerrule_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/servermanager.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/vcsversion.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/bigswitch/version.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/brocade/NeutronPlugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/brocade/README.md +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/brocade/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/brocade/db/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/brocade/db/models.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/brocade/nos/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/brocade/nos/fake_nosdriver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/brocade/nos/nctemplates.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/brocade/nos/nosdriver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/brocade/vlanbm.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/cfg_agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/cfg_agent/cfg_agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/cfg_agent/cfg_exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/cfg_agent/device_drivers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/cisco_csr1kv_snippets.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/cfg_agent/device_drivers/devicedriver_api.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/cfg_agent/device_drivers/driver_mgr.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/cfg_agent/device_drivers/dummy_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/cfg_agent/device_status.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/cfg_agent/service_helpers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/common/cisco_constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/common/cisco_credentials_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/common/cisco_exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/common/cisco_faults.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/common/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/db/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/db/l3/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/db/l3/device_handling_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/db/l3/l3_models.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/db/l3/l3_router_appliance_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/db/n1kv_db_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/db/n1kv_models_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/db/network_db_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/db/network_models_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/extensions/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/extensions/_credential_view.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/extensions/_qos_view.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/extensions/credential.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/extensions/n1kv.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/extensions/network_profile.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/extensions/policy_profile.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/extensions/qos.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/l2device_plugin_base.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/l3/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/l3/configdrive_templates/csr1kv_cfg_template +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/l3/hosting_device_drivers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/l3/hosting_device_drivers/csr1kv_hd_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/l3/plugging_drivers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/l3/plugging_drivers/n1kv_plugging_constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/l3/rpc/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/l3/rpc/devices_cfgagent_rpc_cb.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/l3/rpc/l3_router_cfgagent_rpc_cb.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/l3/rpc/l3_router_rpc_joint_agent_api.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/l3/service_vm_lib.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/models/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/models/virt_phy_sw_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/n1kv/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/n1kv/n1kv_client.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/network_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/service_plugins/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/cisco/service_plugins/cisco_router_plugin.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/common/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/common/constants.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/common/utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/agent/dispatcher.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/agent/operations/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/agent/operations/router_operations.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/base_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/common/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/common/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/common/contexts.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/common/exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/common/operation.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/common/utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/l2base/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/l2base/fake/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/l2base/fake/fake_l2_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/l2base/fake/fakeplugin_support.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/l2base/ml2/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/l2base/ml2/ml2_support.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/l2base/support_base.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/l2base/support_exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/plugins/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/plugins/embrane_fake_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/embrane/plugins/embrane_ml2_plugin.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/evs/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/evs/db/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/evs/db/api.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/evs/db/l3nat.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/evs/db/quotas_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/evs/migrate/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/evs/migrate/havana_api.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/evs/plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/agent/hyperv_neutron_agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/agent/security_groups_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/agent/utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/agent/utilsfactory.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/agent/utilsv2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/agent_notifier_api.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/common/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/hyperv_neutron_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/model.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/hyperv/rpc_callbacks.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ibm/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ibm/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ibm/agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ibm/agent/sdnve_neutron_agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ibm/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ibm/common/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ibm/common/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ibm/common/exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ibm/sdnve_api.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ibm/sdnve_api_fake.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ibm/sdnve_neutron_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/linuxbridge/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/linuxbridge/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/linuxbridge/agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/linuxbridge/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/linuxbridge/common/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/linuxbridge/common/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/linuxbridge/db/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/linuxbridge/db/l2network_models_v2.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/metaplugin/README file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/metaplugin/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/metaplugin/common/__init__.py @@ -412,6 +577,14 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/metaplugin/meta_models_v2.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/metaplugin/meta_neutron_plugin.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/metaplugin/proxy_neutron_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/midonet/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/midonet/agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/midonet/agent/midonet_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/midonet/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/midonet/common/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/midonet/common/net_util.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/midonet/midonet_lib.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/midonet/plugin.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/README file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/common/__init__.py @@ -420,20 +593,46 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/db.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/driver_api.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/driver_context.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/README.odl file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/arista/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/arista/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/arista/arista_l3_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/arista/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/arista/db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/arista/exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/arista/mechanism_arista.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/brocade/README.md +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/brocade/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/brocade/db/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/brocade/db/models.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/brocade/nos/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/brocade/nos/nctemplates.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/config.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/constants.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/credentials_v2.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/exceptions.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/mech_cisco_nexus.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/network_db_v2.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/network_models_v2.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus_db_v2.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus_models_v2.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus_network_driver.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus_snippets.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/apic/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/apic/apic_model.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/apic/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/apic/mechanism_apic.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus/mech_cisco_nexus.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus/nexus_models_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus/nexus_network_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/cisco/nexus/nexus_snippets.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/freescale/README.fslsdn +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/freescale/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/freescale/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/freescale/mechanism_fslsdn.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/helpers.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/l2pop/README file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/l2pop/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/l2pop/config.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/l2pop/constants.py @@ -441,16 +640,21 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/l2pop/mech_driver.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/l2pop/rpc.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_agent.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_arista/README -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_arista/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_arista/config.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_arista/db.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_arista/exceptions.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_arista/mechanism_arista.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_bigswitch/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_bigswitch/driver.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_hyperv.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_linuxbridge.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_nuage/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_nuage/driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_ofagent.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_openvswitch.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_sriov/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mechanism_ncs.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mechanism_odl.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mlnx/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mlnx/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/mlnx/mech_mlnx.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/type_flat.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/type_gre.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/drivers/type_local.py @@ -461,9 +665,207 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/models.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/plugin.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ml2/rpc.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/agent/eswitch_neutron_agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/agent/utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/agent_notify_api.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/common/comm_utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/common/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/common/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/common/exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/db/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/db/mlnx_db_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/db/mlnx_models_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/mlnx_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/mlnx/rpc_callbacks.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/agent/nec_neutron_agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/common/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/common/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/common/exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/common/ofc_client.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/common/utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/db/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/db/api.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/db/models.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/db/packetfilter.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/db/router.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/drivers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/drivers/pfc.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/drivers/trema.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/extensions/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/extensions/packetfilter.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/extensions/router_provider.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/nec_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/nec_router.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/ofc_driver_base.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/ofc_manager.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/packet_filter.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nec/router_drivers.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nuage/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nuage/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nuage/common/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nuage/common/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nuage/common/exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nuage/extensions/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nuage/extensions/netpartition.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nuage/extensions/nuage_router.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nuage/extensions/nuage_subnet.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nuage/nuage_models.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nuage/nuagedb.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nuage/plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/nuage/syncmanager.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/agent/arp_lib.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/agent/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/agent/flows.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/agent/main.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/agent/metadata.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/agent/ofa_neutron_agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/agent/ofswitch.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/agent/ports.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/agent/tables.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ofagent/common/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/oneconvergence/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/oneconvergence/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/oneconvergence/agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/oneconvergence/lib/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/oneconvergence/lib/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/oneconvergence/lib/exception.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/oneconvergence/lib/nvsd_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/oneconvergence/lib/nvsdlib.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/oneconvergence/lib/plugin_helper.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/oneconvergence/plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/opencontrail/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/opencontrail/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/opencontrail/common/exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/opencontrail/contrail_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/openvswitch/README file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/openvswitch/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/openvswitch/agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/openvswitch/agent/xenapi/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/openvswitch/agent/xenapi/contrib/build-rpm.sh +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/openvswitch/agent/xenapi/contrib/rpmbuild/SPECS/openstack-quantum-xen-plugins.spec +file \ + path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/openvswitch/agent/xenapi/etc/xapi.d/plugins/netwrap \ + pkg.depend.bypass-generate=.*/XenAPIPlugin.* file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/openvswitch/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/openvswitch/common/config.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/openvswitch/common/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/openvswitch/ovs_models_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/plumgrid/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/plumgrid/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/plumgrid/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/plumgrid/common/exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/plumgrid/drivers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/plumgrid/drivers/fake_plumlib.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/plumgrid/drivers/plumlib.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/plumgrid/plumgrid_plugin/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/plumgrid/plumgrid_plugin/plugin_ver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ryu/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ryu/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ryu/agent/__init__.py +file \ + path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ryu/agent/ryu_neutron_agent.py \ + pkg.depend.bypass-generate=.*/ryu.* +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ryu/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ryu/common/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ryu/db/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ryu/db/api_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ryu/db/models_v2.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/ryu/ryu_neutron_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/sriovnicagent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/sriovnicagent/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/sriovnicagent/common/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/sriovnicagent/common/exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/sriovnicagent/eswitch_manager.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/sriovnicagent/pci_lib.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/sriovnicagent/sriov_nic_agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/api_client/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/api_client/base.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/api_client/client.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/api_client/eventlet_client.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/api_client/eventlet_request.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/api_client/exception.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/api_client/request.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/api_client/version.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/check_nsx_config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/common/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/common/exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/common/nsx_utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/common/securitygroups.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/common/sync.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/common/utils.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dbexts/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dbexts/db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dbexts/lsn_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dbexts/maclearning.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dbexts/models.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dbexts/networkgw_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dbexts/qos_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dbexts/servicerouter.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dbexts/vcns_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dbexts/vcns_models.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dhcp_meta/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dhcp_meta/combined.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dhcp_meta/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dhcp_meta/lsnmanager.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dhcp_meta/migration.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dhcp_meta/nsx.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dhcp_meta/rpc.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/dhcpmeta_modes.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/extensions/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/extensions/distributedrouter.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/extensions/lsn.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/extensions/maclearning.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/extensions/networkgw.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/extensions/nvp_qos.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/extensions/qos.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/extensions/servicerouter.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/nsx_cluster.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/nsxlib/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/nsxlib/l2gateway.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/nsxlib/lsn.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/nsxlib/queue.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/nsxlib/router.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/nsxlib/secgroup.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/nsxlib/switch.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/nsxlib/versioning.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/plugins/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/plugins/base.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/plugins/service.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/shell/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/shell/commands.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/common/VcnsApiClient.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/common/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/common/exceptions.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/edge_appliance_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/edge_firewall_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/tasks/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/tasks/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/tasks/tasks.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/vcns.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/plugins/vmware/vshield/vcns_driver.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/policy.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/quota.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/scheduler/__init__.py @@ -490,21 +892,51 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/firewall/fwaas_plugin.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/l3_router/README file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/l3_router/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/l3_router/brocade/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/l3_router/brocade/l3_router_plugin.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/l3_router/l3_apic.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/l3_router/l3_arista.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/l3_router/l3_router_plugin.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/agent/agent.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/agent/agent_api.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/agent/agent_device_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/agent/agent_manager.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/agent_scheduler.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/constants.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/a10networks/README.txt +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/a10networks/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/a10networks/driver_v1.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/abstract_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/common/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/common/agent_driver_base.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/driver_base.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/driver_mixins.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/embrane/README +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/embrane/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/embrane/agent/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/embrane/agent/dispatcher.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/embrane/agent/lb_operations.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/embrane/config.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/embrane/constants.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/embrane/db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/embrane/driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/embrane/models.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/embrane/poller.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/haproxy/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/haproxy/agent.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/haproxy/agent_api.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/haproxy/agent_manager.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/haproxy/cfg.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/haproxy/plugin_driver.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/noop/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/noop/noop_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/logging_noop/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/logging_noop/driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/netscaler/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/netscaler/ncc_client.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/radware/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/radware/driver.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/drivers/radware/exceptions.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/loadbalancer/plugin.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/metering/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/metering/agents/__init__.py @@ -523,27 +955,32 @@ file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/common/__init__.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/common/topics.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/device_drivers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/device_drivers/cisco_csr_rest_client.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/device_drivers/cisco_ipsec.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/device_drivers/ipsec.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/device_drivers/template/openswan/ipsec.conf.template file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/device_drivers/template/openswan/ipsec.secret.template file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/plugin.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/service_drivers/__init__.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/service_drivers/cisco_cfg_loader.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/service_drivers/cisco_csr_db.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/service_drivers/cisco_ipsec.py +file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/service_drivers/cisco_validator.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/services/vpn/service_drivers/ipsec.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/version.py file path=usr/lib/python$(PYVER)/vendor-packages/neutron/wsgi.py -file path=usr/lib/python$(PYVER)/vendor-packages/quantum/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/quantum/api/__init__.py -file path=usr/lib/python$(PYVER)/vendor-packages/quantum/auth.py dir path=var/lib/neutron owner=neutron group=neutron mode=0700 link path=var/lib/quantum target=neutron +# group groupname=neutron gid=84 user username=neutron ftpuser=false gcos-field="OpenStack Neutron" \ group=neutron home-dir=/var/lib/neutron uid=84 +# license neutron.license license="Apache v2.0" # force a group dependency on the optional anyjson; pkgdepend work is needed to # flush this out. -depend type=group fmri=library/python-2/anyjson-26 +depend type=group fmri=library/python-2/anyjson-$(PYV) # force a dependency on package delivering dnsmasq(8) depend type=require fmri=__TBD pkg.debug.depend.file=usr/lib/inet/dnsmasq @@ -570,66 +1007,68 @@ depend type=require fmri=__TBD pkg.debug.depend.file=usr/sbin/ippool # force a dependency on alembic; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/alembic-26 +depend type=require fmri=library/python-2/alembic-$(PYV) + +# force a dependency on argparse; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python-2/argparse-$(PYV) # force a dependency on babel; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/babel-26 +depend type=require fmri=library/python-2/babel-$(PYV) # force a dependency on cliff; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/cliff-26 +depend type=require fmri=library/python-2/cliff-$(PYV) # force a dependency on greenlet; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/greenlet-26 +depend type=require fmri=library/python-2/greenlet-$(PYV) # force a dependency on httplib2; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/httplib2-26 +depend type=require fmri=library/python-2/httplib2-$(PYV) + +# force a dependency on iso8601; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/iso8601-$(PYV) + +# force a dependency on jinja2; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/jinja2-$(PYV) # force a dependency on jsonrpclib; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/jsonrpclib-26 +depend type=require fmri=library/python-2/jsonrpclib-$(PYV) + +# force a dependency on keystoneclient; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/keystoneclient-$(PYV) + +# force a dependency on keystonemiddleware; used via a paste.deploy filter +depend type=require fmri=library/python/keystonemiddleware-$(PYV) -# force a dependency on kombu; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/kombu-26 +# force a dependency on neutronclient; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/neutronclient-$(PYV) -# force a dependency on mako; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/mako-26 +# force a dependency on novaclient; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/novaclient-$(PYV) + +# force a dependency on oslo.messaging; pkgdepend work is needed to flush this +# out. +depend type=require fmri=library/python/oslo.messaging-$(PYV) # force a dependency on paste.deploy; pkgdepend work is needed to flush this # out. -depend type=require fmri=library/python-2/paste.deploy-26 +depend type=require fmri=library/python-2/paste.deploy-$(PYV) + +# force a dependency on pbr; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python/pbr-$(PYV) # force a dependency on requests; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/requests-26 +depend type=require fmri=library/python-2/requests-$(PYV) # force a dependency on routes; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/routes-26 +depend type=require fmri=library/python-2/routes-$(PYV) -# force a dependency on sqlalchemy; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/sqlalchemy-26 +# force a dependency on setuptools; pkgdepend work is needed to flush this out. +depend type=require fmri=library/python-2/setuptools-$(PYV) # force a dependency on stevedore; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/stevedore-26 +depend type=require fmri=library/python-2/stevedore-$(PYV) # force a dependency on webob; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python-2/webob-26 - -# force a dependency on iso8601; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/iso8601-26 - -# force a dependency on jinja2; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/jinja2-26 - -# force a dependency on keystoneclient; used via a paste.deploy filter -depend type=require fmri=library/python/keystoneclient-26 - -# force a dependency on neutronclient; pkgdepend work is needed to flush this -# out. -depend type=require fmri=library/python/neutronclient-26 - -# force a dependency on pbr; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/pbr-26 - -# force a dependency on six; pkgdepend work is needed to flush this out. -depend type=require fmri=library/python/six-26 - -# force a dependency on rad-python; pkgdepend work is needed to flush this out -depend type=require fmri=system/management/rad/client/rad-python +depend type=require fmri=library/python-2/webob-$(PYV) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/patches/01-dhcp-agent-add-solaris.patch --- a/components/openstack/neutron/patches/01-dhcp-agent-add-solaris.patch Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/patches/01-dhcp-agent-add-solaris.patch Mon Apr 20 12:35:51 2015 -0700 @@ -1,32 +1,27 @@ ---- neutron-2013.2.3/neutron/agent/dhcp_agent.py.orig 2014-04-03 11:49:01.000000000 -0700 -+++ neutron-2013.2.3/neutron/agent/dhcp_agent.py 2014-05-29 14:07:12.811163548 -0700 -@@ -3,6 +3,8 @@ - # Copyright 2012 OpenStack Foundation - # All Rights Reserved. - # -+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. -+# - # Licensed under the Apache License, Version 2.0 (the "License"); you may - # not use this file except in compliance with the License. You may obtain - # a copy of the License at -@@ -16,15 +18,14 @@ +Changes to the Neutron DHCP agent to port it to Solaris. These changes +will eventually be proposed upstream. + +--- neutron-2014.2.2/neutron/agent/dhcp_agent.py.~1~ 2015-02-05 07:45:33.000000000 -0800 ++++ neutron-2014.2.2/neutron/agent/dhcp_agent.py 2015-02-25 00:44:00.464466509 -0800 +@@ -14,6 +14,7 @@ # under the License. import os +import platform + import sys import eventlet - import netaddr +@@ -22,9 +23,7 @@ eventlet.monkey_patch() from oslo.config import cfg from neutron.agent.common import config -from neutron.agent.linux import dhcp from neutron.agent.linux import external_process -from neutron.agent.linux import interface + from neutron.agent.linux import ovs_lib # noqa from neutron.agent import rpc as agent_rpc - from neutron.common import constants - from neutron.common import exceptions -@@ -42,6 +43,9 @@ + from neutron.common import config as common_config +@@ -42,6 +41,9 @@ from neutron.openstack.common import ser from neutron import service as neutron_service LOG = logging.getLogger(__name__) @@ -36,8 +31,8 @@ class DhcpAgent(manager.Manager): -@@ -602,6 +606,16 @@ - cfg.CONF.register_opts(DhcpAgent.OPTS) +@@ -609,6 +611,16 @@ def register_options(): + config.register_use_namespaces_opts_helper(cfg.CONF) config.register_agent_state_opts_helper(cfg.CONF) config.register_root_helper(cfg.CONF) + global dhcp @@ -53,9 +48,9 @@ cfg.CONF.register_opts(dhcp.OPTS) cfg.CONF.register_opts(interface.OPTS) ---- neutron-2013.2.3/neutron/db/dhcp_rpc_base.py.orig 2014-04-03 11:49:01.000000000 -0700 -+++ neutron-2013.2.3/neutron/db/dhcp_rpc_base.py 2014-05-29 14:07:45.666828914 -0700 -@@ -131,11 +131,13 @@ +--- neutron-2014.2.2/neutron/api/rpc/handlers/dhcp_rpc.py.~1~ 2015-02-05 07:45:33.000000000 -0800 ++++ neutron-2014.2.2/neutron/api/rpc/handlers/dhcp_rpc.py 2015-02-25 00:44:00.464738154 -0800 +@@ -168,11 +168,13 @@ class DhcpRpcCallback(n_rpc.RpcCallback) for fixed_ip in port['fixed_ips']: if fixed_ip['subnet_id'] in dhcp_enabled_subnet_ids: dhcp_enabled_subnet_ids.remove(fixed_ip['subnet_id']) diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/patches/02-l3-agent-add-solaris.patch --- a/components/openstack/neutron/patches/02-l3-agent-add-solaris.patch Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/patches/02-l3-agent-add-solaris.patch Mon Apr 20 12:35:51 2015 -0700 @@ -1,384 +1,70 @@ ---- neutron-2013.2.3/neutron/agent/l3_agent.py.orig 2014-04-03 11:49:01.000000000 -0700 -+++ neutron-2013.2.3/neutron/agent/l3_agent.py 2014-06-02 02:31:42.660207857 -0700 -@@ -2,6 +2,8 @@ - # - # Copyright 2012 Nicira Networks, Inc. All rights reserved. - # -+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. -+# - # Licensed under the Apache License, Version 2.0 (the "License"); you may - # not use this file except in compliance with the License. You may obtain - # a copy of the License at -@@ -15,8 +17,11 @@ - # under the License. - # - # @author: Dan Wendlandt, Nicira, Inc -+# @author: Girish Moodalbail, Oracle, Inc - # - -+import platform -+ - import eventlet - import netaddr - from oslo.config import cfg -@@ -28,6 +33,8 @@ - from neutron.agent.linux import iptables_manager - from neutron.agent.linux import utils - from neutron.agent import rpc as agent_rpc -+from neutron.agent.solaris import ipfilters_manager -+from neutron.agent.solaris import net_lib - from neutron.common import constants as l3_constants - from neutron.common import legacy - from neutron.common import topics -@@ -150,6 +157,7 @@ - Per rpc versioning rules, it is backwards compatible. - """ - RPC_API_VERSION = '1.1' -+ RouterInfo = RouterInfo - - OPTS = [ - cfg.StrOpt('external_network_bridge', default='br-ex', -@@ -292,8 +300,8 @@ - raise - - def _router_added(self, router_id, router): -- ri = RouterInfo(router_id, self.root_helper, -- self.conf.use_namespaces, router) -+ ri = self.RouterInfo(router_id, self.root_helper, -+ self.conf.use_namespaces, router) - self.router_info[router_id] = ri - if self.conf.use_namespaces: - self._create_router_namespace(ri) -@@ -380,12 +388,11 @@ - for p in new_ports: - self._set_subnet_info(p) - ri.internal_ports.append(p) -- self.internal_network_added(ri, p['network_id'], p['id'], -- p['ip_cidr'], p['mac_address']) -+ self.internal_network_added(ri, p) - - for p in old_ports: - ri.internal_ports.remove(p) -- self.internal_network_removed(ri, p['id'], p['ip_cidr']) -+ self.internal_network_removed(ri, p) - - internal_cidrs = [p['ip_cidr'] for p in ri.internal_ports] - # TODO(salv-orlando): RouterInfo would be a better place for -@@ -572,23 +579,24 @@ - rules.extend(self.internal_network_nat_rules(ex_gw_ip, cidr)) - return rules - -- def internal_network_added(self, ri, network_id, port_id, -- internal_cidr, mac_address): -- interface_name = self.get_internal_device_name(port_id) -+ def internal_network_added(self, ri, port): -+ interface_name = self.get_internal_device_name(port['id']) - if not ip_lib.device_exists(interface_name, - root_helper=self.root_helper, - namespace=ri.ns_name()): -- self.driver.plug(network_id, port_id, interface_name, mac_address, -+ self.driver.plug(port['network_id'], port['id'], interface_name, -+ port['mac_address'], - namespace=ri.ns_name(), - prefix=INTERNAL_DEV_PREFIX) -+ internal_cidr = port['ip_cidr'] - - self.driver.init_l3(interface_name, [internal_cidr], - namespace=ri.ns_name()) - ip_address = internal_cidr.split('/')[0] - self._send_gratuitous_arp_packet(ri, interface_name, ip_address) - -- def internal_network_removed(self, ri, port_id, internal_cidr): -- interface_name = self.get_internal_device_name(port_id) -+ def internal_network_removed(self, ri, port): -+ interface_name = self.get_internal_device_name(port['id']) - if ip_lib.device_exists(interface_name, - root_helper=self.root_helper, - namespace=ri.ns_name()): -@@ -839,6 +847,8 @@ - config.register_root_helper(conf) - conf.register_opts(interface.OPTS) - conf.register_opts(external_process.OPTS) -+ if platform.system() == "SunOS": -+ manager = 'neutron.agent.evs_l3_agent.EVSL3NATAgent' - conf(project='neutron') - config.setup_logging(conf) - legacy.modernize_quantum_config(conf) ---- neutron-2013.2.3/neutron/db/l3_db.py.~1~ 2014-04-03 11:49:01.000000000 -0700 -+++ neutron-2013.2.3/neutron/db/l3_db.py 2014-06-02 23:20:58.933635798 -0700 -@@ -2,6 +2,8 @@ - - # Copyright 2012 Nicira Networks, Inc. All rights reserved. - # -+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. -+# - # Licensed under the Apache License, Version 2.0 (the "License"); you may - # not use this file except in compliance with the License. You may obtain - # a copy of the License at -@@ -15,6 +17,7 @@ - # under the License. - # - # @author: Dan Wendlandt, Nicira, Inc -+# @author: Girish Moodalbail, Oracle, Inc - # - - import netaddr -@@ -56,7 +59,7 @@ - status = sa.Column(sa.String(16)) - admin_state_up = sa.Column(sa.Boolean) - gw_port_id = sa.Column(sa.String(36), sa.ForeignKey('ports.id')) -- gw_port = orm.relationship(models_v2.Port) -+ gw_port = orm.relationship(models_v2.Port, lazy='joined') - - - class FloatingIP(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant): -@@ -79,6 +82,8 @@ - """Mixin class to add L3/NAT router methods to db_plugin_base_v2.""" - - l3_rpc_notifier = l3_rpc_agent_api.L3AgentNotify -+ Router = Router -+ FloatingIP = FloatingIP - - @property - def _core_plugin(self): -@@ -86,7 +91,7 @@ - - def _get_router(self, context, id): - try: -- router = self._get_by_id(context, Router, id) -+ router = self._get_by_id(context, self.Router, id) - except exc.NoResultFound: - raise l3.RouterNotFound(router_id=id) - return router -@@ -122,11 +127,11 @@ - with context.session.begin(subtransactions=True): - # pre-generate id so it will be available when - # configuring external gw port -- router_db = Router(id=uuidutils.generate_uuid(), -- tenant_id=tenant_id, -- name=r['name'], -- admin_state_up=r['admin_state_up'], -- status="ACTIVE") -+ router_db = self.Router(id=uuidutils.generate_uuid(), -+ tenant_id=tenant_id, -+ name=r['name'], -+ admin_state_up=r['admin_state_up'], -+ status="ACTIVE") - context.session.add(router_db) - if has_gw_info: - self._update_router_gw_info(context, router_db['id'], gw_info) -@@ -237,7 +242,10 @@ - if vpnservice: - vpnservice.check_router_in_use(context, id) - -- # delete any gw port -+ context.session.delete(router) -+ -+ # Delete the gw port after the router has been removed to -+ # avoid a constraint violation. - device_filter = {'device_id': [id], - 'device_owner': [DEVICE_OWNER_ROUTER_GW]} - ports = self._core_plugin.get_ports(context.elevated(), -@@ -246,7 +254,6 @@ - self._core_plugin._delete_port(context.elevated(), - ports[0]['id']) - -- context.session.delete(router) - self.l3_rpc_notifier.router_deleted(context, id) - - def get_router(self, context, id, fields=None): -@@ -257,7 +264,7 @@ - sorts=None, limit=None, marker=None, - page_reverse=False): - marker_obj = self._get_marker_obj(context, 'router', limit, marker) -- return self._get_collection(context, Router, -+ return self._get_collection(context, self.Router, - self._make_router_dict, - filters=filters, fields=fields, - sorts=sorts, -@@ -266,14 +273,14 @@ - page_reverse=page_reverse) - - def get_routers_count(self, context, filters=None): -- return self._get_collection_count(context, Router, -+ return self._get_collection_count(context, self.Router, - filters=filters) - - def _check_for_dup_router_subnet(self, context, router_id, - network_id, subnet_id, subnet_cidr): - try: -- rport_qry = context.session.query(models_v2.Port) -- rports = rport_qry.filter_by(device_id=router_id) -+ filters = {'device_id': [router_id]} -+ rports = self._core_plugin.get_ports(context, filters) - # It's possible these ports are on the same network, but - # different subnets. - new_ipnet = netaddr.IPNetwork(subnet_cidr) -@@ -329,8 +336,11 @@ - port['network_id'], - subnet['id'], - subnet['cidr']) -- port.update({'device_id': router_id, -- 'device_owner': DEVICE_OWNER_ROUTER_INTF}) -+ self._core_plugin.update_port(context, -+ interface_info['port_id'], -+ {'device_id': router_id, -+ 'device_owner': -+ DEVICE_OWNER_ROUTER_INTF}) - elif 'subnet_id' in interface_info: - subnet_id = interface_info['subnet_id'] - subnet = self._core_plugin._get_subnet(context, subnet_id) -@@ -372,7 +382,7 @@ - subnet_id): - subnet_db = self._core_plugin._get_subnet(context, subnet_id) - subnet_cidr = netaddr.IPNetwork(subnet_db['cidr']) -- fip_qry = context.session.query(FloatingIP) -+ fip_qry = context.session.query(self.FloatingIP) - for fip_db in fip_qry.filter_by(router_id=router_id): - if netaddr.IPAddress(fip_db['fixed_ip_address']) in subnet_cidr: - raise l3.RouterInterfaceInUseByFloatingIP( -@@ -409,22 +419,21 @@ - subnet = self._core_plugin._get_subnet(context, subnet_id) - found = False - -- try: -- rport_qry = context.session.query(models_v2.Port) -- ports = rport_qry.filter_by( -- device_id=router_id, -- device_owner=DEVICE_OWNER_ROUTER_INTF, -- network_id=subnet['network_id']) -- -- for p in ports: -- if p['fixed_ips'][0]['subnet_id'] == subnet_id: -- port_id = p['id'] -- self._core_plugin.delete_port(context, p['id'], -- l3_port_check=False) -- found = True -- break -- except exc.NoResultFound: -+ filters = { -+ 'device_id': router_id, -+ 'device_owner': DEVICE_OWNER_ROUTER_INTF, -+ 'network_id': subnet['network_id'] -+ } -+ ports = self._core_plugin.get_ports(context, filters) -+ if not ports: - pass -+ for p in ports: -+ if p['fixed_ips'][0]['subnet_id'] == subnet_id: -+ port_id = p['id'] -+ self._core_plugin.delete_port(context, p['id'], -+ l3_port_check=False) -+ found = True -+ break - - if not found: - raise l3.RouterInterfaceNotFoundForSubnet(router_id=router_id, -@@ -444,7 +453,7 @@ - - def _get_floatingip(self, context, id): - try: -- floatingip = self._get_by_id(context, FloatingIP, id) -+ floatingip = self._get_by_id(context, self.FloatingIP, id) - except exc.NoResultFound: - raise l3.FloatingIPNotFound(floatingip_id=id) - return floatingip -@@ -470,19 +479,22 @@ - raise q_exc.BadRequest(resource='floatingip', msg=msg) - - # find router interface ports on this network -- router_intf_qry = context.session.query(models_v2.Port) -- router_intf_ports = router_intf_qry.filter_by( -- network_id=internal_port['network_id'], -- device_owner=DEVICE_OWNER_ROUTER_INTF) -- -+ router_intf_filter = { -+ 'network_id': internal_port['network_id'], -+ 'device_owner': DEVICE_OWNER_ROUTER_INTF -+ } -+ router_intf_ports = self._core_plugin.get_ports( -+ context, filters=router_intf_filter) - for intf_p in router_intf_ports: - if intf_p['fixed_ips'][0]['subnet_id'] == internal_subnet_id: - router_id = intf_p['device_id'] -- router_gw_qry = context.session.query(models_v2.Port) -- has_gw_port = router_gw_qry.filter_by( -- network_id=external_network_id, -- device_id=router_id, -- device_owner=DEVICE_OWNER_ROUTER_GW).count() -+ filters = { -+ 'network_id': external_network_id, -+ 'device_id': router_id, -+ 'device_owner': DEVICE_OWNER_ROUTER_GW -+ } -+ has_gw_port = self._core_plugin.get_ports_count( -+ context, filters) - if has_gw_port: - return router_id - -@@ -556,13 +568,13 @@ - floating_network_id) - # confirm that this router has a floating - # ip enabled gateway with support for this floating IP network -- try: -- port_qry = context.elevated().session.query(models_v2.Port) -- port_qry.filter_by( -- network_id=floating_network_id, -- device_id=router_id, -- device_owner=DEVICE_OWNER_ROUTER_GW).one() -- except exc.NoResultFound: -+ filters = { -+ 'network_id': floating_network_id, -+ 'device_id': router_id, -+ 'device_owner': DEVICE_OWNER_ROUTER_GW -+ } -+ ports = self._core_plugin.get_ports(context.elevated(), filters) -+ if not ports: - raise l3.ExternalGatewayForFloatingIPNotFound( - subnet_id=internal_subnet_id, - port_id=internal_port['id']) -@@ -580,7 +592,7 @@ - context, - fip, - floatingip_db['floating_network_id']) -- fip_qry = context.session.query(FloatingIP) -+ fip_qry = context.session.query(self.FloatingIP) - try: - fip_qry.filter_by( - fixed_port_id=fip['port_id'], -@@ -628,7 +640,7 @@ - - floating_fixed_ip = external_port['fixed_ips'][0] - floating_ip_address = floating_fixed_ip['ip_address'] -- floatingip_db = FloatingIP( -+ floatingip_db = self.FloatingIP( - id=fip_id, - tenant_id=tenant_id, - floating_network_id=fip['floating_network_id'], -@@ -697,7 +709,7 @@ - if key in filters: - filters[val] = filters.pop(key) - -- return self._get_collection(context, FloatingIP, -+ return self._get_collection(context, self.FloatingIP, - self._make_floatingip_dict, - filters=filters, fields=fields, - sorts=sorts, -@@ -706,7 +718,7 @@ - page_reverse=page_reverse) - - def get_floatingips_count(self, context, filters=None): -- return self._get_collection_count(context, FloatingIP, -+ return self._get_collection_count(context, self.FloatingIP, - filters=filters) - - def prevent_l3_port_deletion(self, context, port_id): -@@ -737,7 +749,7 @@ - def disassociate_floatingips(self, context, port_id): - with context.session.begin(subtransactions=True): - try: -- fip_qry = context.session.query(FloatingIP) -+ fip_qry = context.session.query(self.FloatingIP) - floating_ip = fip_qry.filter_by(fixed_port_id=port_id).one() - router_id = floating_ip['router_id'] - floating_ip.update({'fixed_port_id': None, +*** neutron-2014.2.2/neutron/agent/l3_agent.py 2015-02-05 07:45:33.000000000 -0800 +--- NEW/neutron/agent/l3_agent.py 2015-02-06 11:10:53.164349168 -0800 +*************** +*** 1,5 **** +--- 1,7 ---- + # Copyright 2012 VMware, Inc. All rights reserved. + # ++ # Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. ++ # + # Licensed under the Apache License, Version 2.0 (the "License"); you may + # not use this file except in compliance with the License. You may obtain + # a copy of the License at +*************** +*** 13,18 **** +--- 15,21 ---- + # under the License. + # + ++ import platform + import sys + + import datetime +*************** +*** 33,38 **** +--- 36,42 ---- + from neutron.agent.linux import iptables_manager + from neutron.agent.linux import ra + from neutron.agent import rpc as agent_rpc ++ from neutron.agent.solaris import ipfilters_manager + from neutron.common import config as common_config + from neutron.common import constants as l3_constants + from neutron.common import ipv6_utils +*************** +*** 257,266 **** + # Invoke the setter for establishing initial SNAT action + self.router = router + self.ns_name = NS_PREFIX + router_id if use_namespaces else None +! self.iptables_manager = iptables_manager.IptablesManager( +! root_helper=root_helper, +! use_ipv6=use_ipv6, +! namespace=self.ns_name) + self.snat_iptables_manager = None + self.routes = [] + # DVR Data +--- 261,274 ---- + # Invoke the setter for establishing initial SNAT action + self.router = router + self.ns_name = NS_PREFIX + router_id if use_namespaces else None +! if platform.system() == "SunOS": +! self.ipfilters_manager = ipfilters_manager.IPfiltersManager() +! self.iptables_manager = None +! else: +! self.iptables_manager = iptables_manager.IptablesManager( +! root_helper=root_helper, +! use_ipv6=use_ipv6, +! namespace=self.ns_name) + self.snat_iptables_manager = None + self.routes = [] + # DVR Data +*************** +*** 2049,2054 **** +--- 2057,2064 ---- + _register_opts(cfg.CONF) + common_config.init(sys.argv[1:]) + config.setup_logging() ++ if platform.system() == "SunOS": ++ manager = 'neutron.agent.evs_l3_agent.EVSL3NATAgent' + server = neutron_service.Service.create( + binary='neutron-l3-agent', + topic=topics.L3_AGENT, diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/patches/03-CVE-2014-0187.patch --- a/components/openstack/neutron/patches/03-CVE-2014-0187.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,253 +0,0 @@ -This upstream patch addresses CVE-2014-0187 and is tracked under -Launchpad bug 1300785. It is addressed in Icehouse 2014.1.2 and Havana -2013.2.4. - -commit 03eed8cd34cd4fb043c11fc99f6bb0b4fbd5728d -Author: marios -Date: Fri Nov 29 18:23:54 2013 +0200 - - Validate CIDR given as ip-prefix in security-group-rule-create - - There was no validation for the provided ip prefix. This just adds - a simple parse using netaddr and explodes with appropriate message. - Also makes sure ip prefix _is_ cidr (192.168.1.1-->192.168.1.1/32). - - Validation occurs at the attribute level (API model) as well as at - the db level, where the ethertype is validated against the ip_prefix - address type. - - Unit test cases added - bad prefix, unmasked prefix and incorrect - ethertype. Also adds attribute test cases for the added - convert_ip_prefix_to_cidr method - - Closes-Bug: 1255338 - - Conflicts: - neutron/tests/unit/test_security_groups_rpc.py - neutron/tests/unit/test_extension_security_group.py - - Change-Id: I71fb8c887963a122a5bd8cfdda800026c1cd3954 - (cherry picked from commit 65aa92b0348b7ab8413f359b00825610cdf66607) - -diff --git a/neutron/common/exceptions.py b/neutron/common/exceptions.py -index 88fa6e4..80a75d1 100644 ---- a/neutron/common/exceptions.py -+++ b/neutron/common/exceptions.py -@@ -306,3 +306,7 @@ class NetworkVxlanPortRangeError(object): - class DeviceIDNotOwnedByTenant(Conflict): - message = _("The following device_id %(device_id)s is not owned by your " - "tenant or matches another tenants router.") -+ -+ -+class InvalidCIDR(BadRequest): -+ message = _("Invalid CIDR %(input)s given as IP prefix") -diff --git a/neutron/db/securitygroups_db.py b/neutron/db/securitygroups_db.py -index 2a7d2ef..8868546 100644 ---- a/neutron/db/securitygroups_db.py -+++ b/neutron/db/securitygroups_db.py -@@ -16,6 +16,7 @@ - # - # @author: Aaron Rosen, Nicira, Inc - -+import netaddr - import sqlalchemy as sa - from sqlalchemy import orm - from sqlalchemy.orm import exc -@@ -331,6 +332,7 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase): - new_rules.add(rule['security_group_id']) - - self._validate_port_range(rule) -+ self._validate_ip_prefix(rule) - - if rule['remote_ip_prefix'] and rule['remote_group_id']: - raise ext_sg.SecurityGroupRemoteGroupAndRemoteIpPrefix() -@@ -411,6 +413,24 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase): - if (i['security_group_rule'] == db_rule): - raise ext_sg.SecurityGroupRuleExists(id=id) - -+ def _validate_ip_prefix(self, rule): -+ """Check that a valid cidr was specified as remote_ip_prefix -+ -+ No need to check that it is in fact an IP address as this is already -+ validated by attribute validators. -+ Check that rule ethertype is consistent with remote_ip_prefix ip type. -+ Add mask to ip_prefix if absent (192.168.1.10 -> 192.168.1.10/32). -+ """ -+ input_prefix = rule['remote_ip_prefix'] -+ if input_prefix: -+ addr = netaddr.IPNetwork(input_prefix) -+ # set input_prefix to always include the netmask: -+ rule['remote_ip_prefix'] = str(addr) -+ # check consistency of ethertype with addr version -+ if rule['ethertype'] != "IPv%d" % (addr.version): -+ raise ext_sg.SecurityGroupRuleParameterConflict( -+ ethertype=rule['ethertype'], cidr=input_prefix) -+ - def get_security_group_rules(self, context, filters=None, fields=None, - sorts=None, limit=None, marker=None, - page_reverse=False): -diff --git a/neutron/extensions/securitygroup.py b/neutron/extensions/securitygroup.py -index 85d499a..3d10b5a 100644 ---- a/neutron/extensions/securitygroup.py -+++ b/neutron/extensions/securitygroup.py -@@ -17,6 +17,7 @@ - - from abc import ABCMeta - from abc import abstractmethod -+import netaddr - - from oslo.config import cfg - -@@ -102,6 +103,10 @@ class SecurityGroupRuleExists(qexception.InUse): - message = _("Security group rule already exists. Group id is %(id)s.") - - -+class SecurityGroupRuleParameterConflict(qexception.InvalidInput): -+ message = _("Conflicting value ethertype %(ethertype)s for CIDR %(cidr)s") -+ -+ - def convert_protocol(value): - if value is None: - return -@@ -152,6 +157,16 @@ def convert_to_uuid_list_or_none(value_list): - return value_list - - -+def convert_ip_prefix_to_cidr(ip_prefix): -+ if not ip_prefix: -+ return -+ try: -+ cidr = netaddr.IPNetwork(ip_prefix) -+ return str(cidr) -+ except (TypeError, netaddr.AddrFormatError): -+ raise qexception.InvalidCIDR(input=ip_prefix) -+ -+ - def _validate_name_not_default(data, valid_values=None): - if data == "default": - raise SecurityGroupDefaultAlreadyExists() -@@ -207,7 +222,8 @@ RESOURCE_ATTRIBUTE_MAP = { - 'convert_to': convert_ethertype_to_case_insensitive, - 'validate': {'type:values': sg_supported_ethertypes}}, - 'remote_ip_prefix': {'allow_post': True, 'allow_put': False, -- 'default': None, 'is_visible': True}, -+ 'default': None, 'is_visible': True, -+ 'convert_to': convert_ip_prefix_to_cidr}, - 'tenant_id': {'allow_post': True, 'allow_put': False, - 'required_by_policy': True, - 'is_visible': True}, -diff --git a/neutron/tests/unit/test_extension_security_group.py b/neutron/tests/unit/test_extension_security_group.py -index d53e140..f0b1636 100644 ---- a/neutron/tests/unit/test_extension_security_group.py -+++ b/neutron/tests/unit/test_extension_security_group.py -@@ -21,11 +21,13 @@ import webob.exc - - from neutron.api.v2 import attributes as attr - from neutron.common import constants as const -+from neutron.common import exceptions as n_exc - from neutron.common.test_lib import test_config - from neutron import context - from neutron.db import db_base_plugin_v2 - from neutron.db import securitygroups_db - from neutron.extensions import securitygroup as ext_sg -+from neutron.tests import base - from neutron.tests.unit import test_db_plugin - - DB_PLUGIN_KLASS = ('neutron.tests.unit.test_extension_security_group.' -@@ -413,6 +415,70 @@ class TestSecurityGroups(SecurityGroupDBTestCase): - self.deserialize(self.fmt, res) - self.assertEqual(res.status_int, webob.exc.HTTPBadRequest.code) - -+ def test_create_security_group_rule_invalid_ip_prefix(self): -+ name = 'webservers' -+ description = 'my webservers' -+ for bad_prefix in ['bad_ip', 256, "2001:db8:a::123/129", '172.30./24']: -+ with self.security_group(name, description) as sg: -+ sg_id = sg['security_group']['id'] -+ remote_ip_prefix = bad_prefix -+ rule = self._build_security_group_rule( -+ sg_id, -+ 'ingress', -+ const.PROTO_NAME_TCP, -+ '22', '22', -+ remote_ip_prefix) -+ res = self._create_security_group_rule(self.fmt, rule) -+ self.assertEqual(res.status_int, webob.exc.HTTPBadRequest.code) -+ -+ def test_create_security_group_rule_invalid_ethertype_for_prefix(self): -+ name = 'webservers' -+ description = 'my webservers' -+ test_addr = {'192.168.1.1/24': 'ipv4', '192.168.1.1/24': 'IPv6', -+ '2001:db8:1234::/48': 'ipv6', -+ '2001:db8:1234::/48': 'IPv4'} -+ for prefix, ether in test_addr.iteritems(): -+ with self.security_group(name, description) as sg: -+ sg_id = sg['security_group']['id'] -+ ethertype = ether -+ remote_ip_prefix = prefix -+ rule = self._build_security_group_rule( -+ sg_id, -+ 'ingress', -+ const.PROTO_NAME_TCP, -+ '22', '22', -+ remote_ip_prefix, -+ None, -+ None, -+ ethertype) -+ res = self._create_security_group_rule(self.fmt, rule) -+ self.assertEqual(res.status_int, webob.exc.HTTPBadRequest.code) -+ -+ def test_create_security_group_rule_with_unmasked_prefix(self): -+ name = 'webservers' -+ description = 'my webservers' -+ addr = {'10.1.2.3': {'mask': '32', 'ethertype': 'IPv4'}, -+ 'fe80::2677:3ff:fe7d:4c': {'mask': '128', 'ethertype': 'IPv6'}} -+ for ip in addr: -+ with self.security_group(name, description) as sg: -+ sg_id = sg['security_group']['id'] -+ ethertype = addr[ip]['ethertype'] -+ remote_ip_prefix = ip -+ rule = self._build_security_group_rule( -+ sg_id, -+ 'ingress', -+ const.PROTO_NAME_TCP, -+ '22', '22', -+ remote_ip_prefix, -+ None, -+ None, -+ ethertype) -+ res = self._create_security_group_rule(self.fmt, rule) -+ self.assertEqual(res.status_int, 201) -+ res_sg = self.deserialize(self.fmt, res) -+ prefix = res_sg['security_group_rule']['remote_ip_prefix'] -+ self.assertEqual(prefix, '%s/%s' % (ip, addr[ip]['mask'])) -+ - def test_create_security_group_rule_tcp_protocol_as_number(self): - name = 'webservers' - description = 'my webservers' -@@ -1348,5 +1414,25 @@ class TestSecurityGroups(SecurityGroupDBTestCase): - self.assertEqual(res.status_int, webob.exc.HTTPBadRequest.code) - - -+class TestConvertIPPrefixToCIDR(base.BaseTestCase): -+ -+ def test_convert_bad_ip_prefix_to_cidr(self): -+ for val in ['bad_ip', 256, "2001:db8:a::123/129"]: -+ self.assertRaises(n_exc.InvalidCIDR, -+ ext_sg.convert_ip_prefix_to_cidr, val) -+ self.assertIsNone(ext_sg.convert_ip_prefix_to_cidr(None)) -+ -+ def test_convert_ip_prefix_no_netmask_to_cidr(self): -+ addr = {'10.1.2.3': '32', 'fe80::2677:3ff:fe7d:4c': '128'} -+ for k, v in addr.iteritems(): -+ self.assertEqual(ext_sg.convert_ip_prefix_to_cidr(k), -+ '%s/%s' % (k, v)) -+ -+ def test_convert_ip_prefix_with_netmask_to_cidr(self): -+ addresses = ['10.1.0.0/16', '10.1.2.3/32', '2001:db8:1234::/48'] -+ for addr in addresses: -+ self.assertEqual(ext_sg.convert_ip_prefix_to_cidr(addr), addr) -+ -+ - class TestSecurityGroupsXML(TestSecurityGroups): - fmt = 'xml' diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/patches/03-metadata-agent-add-solaris.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/openstack/neutron/patches/03-metadata-agent-add-solaris.patch Mon Apr 20 12:35:51 2015 -0700 @@ -0,0 +1,93 @@ +Generalizes the dameon.py and external_process.py to work on Solaris. These +changes will eventually be proposed upstream. + +*** neutron-2014.2.2/neutron/agent/linux/daemon.py 2015-02-05 07:45:33.000000000 -0800 +--- NEW/neutron/agent/linux/daemon.py 2015-02-16 12:37:23.181739275 -0800 +*************** +*** 15,23 **** +--- 15,25 ---- + import atexit + import fcntl + import os ++ import platform + import signal + import sys + ++ from neutron.agent.linux import utils + from neutron.openstack.common import log as logging + + LOG = logging.getLogger(__name__) +*************** +*** 60,65 **** +--- 62,76 ---- + if not pid: + return False + ++ if platform.system() == "SunOS": ++ cmd = ['/usr/bin/pargs', pid] ++ try: ++ exec_out = utils.execute(cmd) ++ return self.procname in exec_out and (not self.uuid or ++ self.uuid in exec_out) ++ except RuntimeError: ++ return False ++ + cmdline = '/proc/%s/cmdline' % pid + try: + with open(cmdline, "r") as f: +*** neutron-2014.2.2/neutron/agent/linux/external_process.py 2015-02-05 07:45:33.000000000 -0800 +--- NEW/neutron/agent/linux/external_process.py 2015-02-16 12:37:39.202659518 -0800 +*************** +*** 13,18 **** +--- 13,19 ---- + # under the License. + + import collections ++ import platform + + import eventlet + from oslo.config import cfg +*************** +*** 75,82 **** + cmd_callback = self.default_cmd_callback + cmd = cmd_callback(self.get_pid_file_name(ensure_pids_dir=True)) + +! ip_wrapper = ip_lib.IPWrapper(self.root_helper, self.namespace) +! ip_wrapper.netns.execute(cmd, addl_env=self.cmd_addl_env) + elif reload_cfg: + self.reload_cfg() + +--- 76,91 ---- + cmd_callback = self.default_cmd_callback + cmd = cmd_callback(self.get_pid_file_name(ensure_pids_dir=True)) + +! if self.namespace: +! ip_wrapper = ip_lib.IPWrapper(self.root_helper, self.namespace) +! ip_wrapper.netns.execute(cmd, addl_env=self.cmd_addl_env) +! else: +! env_params = [] +! if self.cmd_addl_env: +! env_params = (['/usr/bin/env'] + +! ['%s=%s' % pair for pair in +! self.cmd_addl_env.items()]) +! utils.execute(env_params + list(cmd)) + elif reload_cfg: + self.reload_cfg() + +*************** +*** 122,127 **** +--- 131,144 ---- + if pid is None: + return False + ++ if platform.system() == "SunOS": ++ cmd = ['/usr/bin/pargs', pid] ++ try: ++ exec_out = utils.execute(cmd) ++ return self.uuid in exec_out ++ except RuntimeError: ++ return False ++ + cmdline = '/proc/%s/cmdline' % pid + try: + with open(cmdline, "r") as f: diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/patches/04-requirements.patch --- a/components/openstack/neutron/patches/04-requirements.patch Thu Apr 16 01:36:32 2015 -0700 +++ b/components/openstack/neutron/patches/04-requirements.patch Mon Apr 20 12:35:51 2015 -0700 @@ -1,48 +1,40 @@ In-house patch to remove unnecessary dependencies from Neutron's requirements files. The specific reasons are as follows: -amqplib No longer applicable - (upstream commit 39ffcb0dd75d9dc5d8a249f2974a67f0def5204b) +oslo.rootwrap Not applicable to Solaris -argparse Not applicable to Solaris (Brocade specific) - -novaclient No longer applicable - -pyudev Not applicable to Solaris (Linux bridging specific) +paste Not applicable ---- neutron-2013.2.3/neutron.egg-info/requires.txt.orig 2014-04-03 11:49:53.000000000 -0700 -+++ neutron-2013.2.3/neutron.egg-info/requires.txt 2014-05-24 23:12:26.486505631 -0700 -@@ -1,9 +1,7 @@ --pyudev - pbr>=0.5.21,<1.0 - Paste +--- neutron-2014.2.2/neutron.egg-info/requires.txt.~1~ 2015-02-05 07:46:25.000000000 -0800 ++++ neutron-2014.2.2/neutron.egg-info/requires.txt 2015-02-25 00:20:01.378154156 -0800 +@@ -1,5 +1,4 @@ + pbr>=0.6,!=0.7,<1.0 +-Paste PasteDeploy>=1.5.0 - Routes>=1.12.3 --amqplib>=0.6.1 + Routes>=1.12.3,!=2.0 anyjson>=0.3.3 - Babel>=1.3 - eventlet>=0.13.0 -@@ -23,4 +21,3 @@ - six>=1.4.1 - stevedore>=0.10 - oslo.config>=1.2.0 --python-novaclient>=2.15.0 +@@ -24,5 +23,4 @@ stevedore>=1.0.0 # Apache-2.0 + oslo.config>=1.4.0 # Apache-2.0 + oslo.db>=1.0.0,<1.1 # Apache-2.0 + oslo.messaging>=1.4.0,!=1.5.0,<1.6.0 +-oslo.rootwrap>=1.3.0 +-python-novaclient>=2.18.0 ++python-novaclient>=2.18.0 \ No newline at end of file - ---- neutron-2013.2.3/requirements.txt.orig 2014-04-03 11:49:01.000000000 -0700 -+++ neutron-2013.2.3/requirements.txt 2014-05-24 23:12:57.116696613 -0700 -@@ -3,9 +3,7 @@ - Paste +--- neutron-2014.2.2/requirements.txt.~1~ 2015-02-05 07:45:33.000000000 -0800 ++++ neutron-2014.2.2/requirements.txt 2015-02-25 00:19:55.500774949 -0800 +@@ -3,7 +3,6 @@ + # process, which may cause wedges in the gate later. + pbr>=0.6,!=0.7,<1.0 + +-Paste PasteDeploy>=1.5.0 - Routes>=1.12.3 --amqplib>=0.6.1 + Routes>=1.12.3,!=2.0 anyjson>=0.3.3 --argparse - Babel>=1.3 - eventlet>=0.13.0 - greenlet>=0.3.2 -@@ -25,4 +23,3 @@ - stevedore>=0.10 - oslo.config>=1.2.0 +@@ -28,6 +27,5 @@ stevedore>=1.0.0 # Apache-2.0 + oslo.config>=1.4.0 # Apache-2.0 + oslo.db>=1.0.0,<1.1 # Apache-2.0 + oslo.messaging>=1.4.0,!=1.5.0,<1.6.0 +-oslo.rootwrap>=1.3.0 --python-novaclient>=2.15.0 + python-novaclient>=2.18.0 diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/patches/05-launchpad-1210121.patch --- a/components/openstack/neutron/patches/05-launchpad-1210121.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,102 +0,0 @@ -This proposed upstream patch addresses Launchpad bug 1210121. Although -it's been addressed in Icehouse 2014.1, the patch below is still not -yet released for Havana. - -From dbbc8338770d2c340903e006dcb3c90c4aad7b29 Mon Sep 17 00:00:00 2001 -From: armando-migliaccio -Date: Thu, 13 Mar 2014 12:40:01 -0700 -Subject: [PATCH] Kill 'Skipping unknown group key: firewall_driver' log trace - -This is done by trying to import the option first. If this -does not work, emit a warning instead as in most cases this is -harmless for a number of reasons: a) the service might not -even need the opt; b) if things do break down the line, we'll -see bigger traces; c) it's not gonna be long for this legacy -quantum/neutron stuff to be removed altogether. - -Closes-bug: 1210121 - -Change-Id: I34917da9cb6117ee1d42140621c742f503279b6b -(cherry picked from commit b5ee49623982530bfb3c3fe2eefb9d8ddb6353bc) ---- - neutron/common/legacy.py | 20 ++++++++++++++++---- - neutron/quota.py | 2 +- - neutron/tests/unit/test_legacy.py | 2 +- - 3 files changed, 18 insertions(+), 6 deletions(-) - -diff --git a/neutron/common/legacy.py b/neutron/common/legacy.py -index cf37281..d387aa2 100644 ---- a/neutron/common/legacy.py -+++ b/neutron/common/legacy.py -@@ -17,6 +17,8 @@ - - # @author Mark McClain (DreamHost) - -+from oslo.config import cfg -+ - from neutron.openstack.common import log as logging - - LOG = logging.getLogger(__name__) -@@ -45,11 +47,19 @@ def override_config(config, config_keys=None): - group = None - if not isinstance(key, basestring): - try: -- group, key = key -+ group, key, module_str = key - old_value = getattr(getattr(config, group), key, None) - except AttributeError: -- LOG.error(_('Skipping unknown group key: %s'), key) -- continue -+ try: -+ config.import_opt(key, module_str, group) -+ old_value = getattr(getattr(config, group), key, None) -+ except (cfg.NoSuchOptError, -+ cfg.NoSuchGroupError, -+ AttributeError): -+ LOG.warn(_('Key %(key)s in group %(group)s is unknown. ' -+ 'It may not be defined or needed by this ' -+ 'service.') % {'key': key, 'group': group}) -+ continue - else: - old_value = getattr(config, key, None) - if not old_value: -@@ -77,7 +87,9 @@ def modernize_quantum_config(config): - 'router_scheduler_driver', - 'rpc_backend', - 'service_plugins', -- ('SECURITYGROUP', 'firewall_driver'), -+ ('SECURITYGROUP', -+ 'firewall_driver', -+ 'neutron.agent.securitygroups_rpc'), - ] - - override_config(config, config_keys) -diff --git a/neutron/quota.py b/neutron/quota.py -index 4111078..105be06 100644 ---- a/neutron/quota.py -+++ b/neutron/quota.py -@@ -58,7 +58,7 @@ quota_opts = [ - ] - # Register the configuration options - cfg.CONF.register_opts(quota_opts, 'QUOTAS') --legacy.override_config(cfg.CONF, [('QUOTAS', 'quota_driver')]) -+legacy.override_config(cfg.CONF, [('QUOTAS', 'quota_driver', 'neutron.quota')]) - - - class ConfDriver(object): -diff --git a/neutron/tests/unit/test_legacy.py b/neutron/tests/unit/test_legacy.py -index 539f7de..6723d06 100644 ---- a/neutron/tests/unit/test_legacy.py -+++ b/neutron/tests/unit/test_legacy.py -@@ -71,7 +71,7 @@ class TestLegacyConfigOverride(base.BaseTestCase): - - def test_override_config_group_key(self): - self.cfg(args=['--bar-baz=quantum']) -- legacy.override_config(self.cfg, [('bar', 'baz')]) -+ legacy.override_config(self.cfg, [('bar', 'baz', 'mod')]) - self.assertEqual(self.cfg.bar.baz, 'neutron') - - def test_override_config_list_value(self): --- -1.7.9.2 - diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/patches/06-launchpad-1255441.patch --- a/components/openstack/neutron/patches/06-launchpad-1255441.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -Although the following patch has been addressed in Icehouse 2014.1, it -still has not yet been released for Havana. It has been modified to -apply cleanly into our current Havana implementation - -commit 5b61df1f539d78cf9d164a142d731e471aa18d4e -Author: Maru Newby -Date: Wed Nov 27 07:57:48 2013 +0000 - - Stop logging unnecessary warning on context create - - The context was previously logging at the 'warn' level when unknown - kwargs were being passed to its __init__(). Since the agents were - passing tenant=None with each rpc request, this was generating an - unreasonable amount of log chatter that would not be useful to an - operator. The fix is to log at the debug level instead so that - the operators don't see the output by default but developers can - still choose to. - - Change-Id: I5c328f628c597eb949c1fe67b23120d2b5d1c7da - Related-Bug: #1254530 - Partial-Bug: #1255441 - ---- neutron-2013.2.3/neutron/context.py.~1~ 2014-04-03 11:49:01.000000000 -0700 -+++ neutron-2013.2.3/neutron/context.py 2014-06-08 12:01:16.420520735 -0700 -@@ -46,8 +46,8 @@ - *only* deleted records are visible. - """ - if kwargs: -- LOG.warn(_('Arguments dropped when creating ' -- 'context: %s'), kwargs) -+ LOG.debug(_('Arguments dropped when creating ' -+ 'context: %s'), kwargs) - super(ContextBase, self).__init__(user=user_id, tenant=tenant_id, - is_admin=is_admin) - self.read_deleted = read_deleted ---- neutron-2013.2.3/neutron/tests/unit/test_neutron_context.py.~1~ 2014-04-03 11:49:01.000000000 -0700 -+++ neutron-2013.2.3/neutron/tests/unit/test_neutron_context.py 2014-06-08 12:10:04.483779074 -0700 -@@ -35,6 +35,11 @@ - self.assertEqual('user_id', cxt.user_id) - self.assertEqual('tenant_id', cxt.project_id) - -+ def test_neutron_context_create_logs_unknown_kwarg(self): -+ with mock.patch.object(context.LOG, 'debug') as mock_log: -+ context.Context('user_id', 'tenant_id', foo=None) -+ self.assertEqual(mock_log.call_count, 1) -+ - def test_neutron_context_to_dict(self): - cxt = context.Context('user_id', 'tenant_id') - cxt_dict = cxt.to_dict() diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/patches/07-CVE-2014-6414.patch --- a/components/openstack/neutron/patches/07-CVE-2014-6414.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,220 +0,0 @@ -This patch addresses CVE-2014-6414 and is tracked under Launchpad bug -1357379. It is addressed in the Juno trunk and Icehouse 2014.1.3. There -is no patch for Havana since it is EOL'ed by upstream. Therefore, this -patch is derived from the patch for Icehouse 2014.1.3 - -commit dd4b77ff53479389a5af8b45fd95ee2987562f29 -Author: Elena Ezhova -Date: Tue Aug 19 15:54:36 2014 +0400 - - Forbid regular users to reset admin-only attrs to default values - - A regular user can reset an admin-only attribute to its default - value due to the fact that a corresponding policy rule is - enforced only in the case when an attribute is present in the - target AND has a non-default value. - - Added a new attribute "attributes_to_update" which contains a list - of all to-be updated attributes to the body of the target that is - passed to policy.enforce. - - Changed a check for whether an attribute is explicitly set. - Now, in the case of update, the function should not pay attention - to a default value of an attribute, but check whether it was - explicitly marked as being updated. - - Added unit-tests. - - Conflicts: - neutron/common/constants.py - - Closes-Bug: #1357379 - Related-Bug: #1338880 - Change-Id: I6537bb1da5ef0d6899bc71e4e949f2c760c103c2 - (cherry picked from commit 74d10939903984d5f06c1749a8707fa3257e44ff) - ---- neutron-2013.2.3/neutron/api/v2/base.py 2014-04-03 11:49:01.000000000 -0700 -+++ NEW/neutron/api/v2/base.py 2014-09-30 10:03:51.003850651 -0700 -@@ -24,6 +24,7 @@ - from neutron.api.rpc.agentnotifiers import dhcp_rpc_agent_api - from neutron.api.v2 import attributes - from neutron.api.v2 import resource as wsgi_resource -+from neutron.common import constants as const - from neutron.common import exceptions - from neutron.openstack.common import log as logging - from neutron.openstack.common.notifier import api as notifier_api -@@ -469,6 +470,10 @@ - orig_obj = self._item(request, id, field_list=field_list, - parent_id=parent_id) - orig_obj.update(body[self._resource]) -+ # Make a list of attributes to be updated to inform the policy engine -+ # which attributes are set explicitly so that it can distinguish them -+ # from the ones that are set to their default values. -+ orig_obj[const.ATTRIBUTES_TO_UPDATE] = body[self._resource].keys() - try: - policy.enforce(request.context, - action, ---- neutron-2013.2.3/neutron/common/constants.py 2014-04-03 11:49:01.000000000 -0700 -+++ NEW/neutron/common/constants.py 2014-09-30 10:24:19.837488691 -0700 -@@ -92,3 +92,5 @@ - PROTO_NUM_ICMP = 1 - PROTO_NUM_ICMP_V6 = 58 - PROTO_NUM_UDP = 17 -+ -+ATTRIBUTES_TO_UPDATE = 'attributes_to_update' ---- neutron-2013.2.3/neutron/policy.py 2014-04-03 11:49:01.000000000 -0700 -+++ NEW/neutron/policy.py 2014-09-30 10:12:16.819335023 -0700 -@@ -18,12 +18,15 @@ - """ - Policy engine for neutron. Largely copied from nova. - """ -+ -+import collections - import itertools - import re - - from oslo.config import cfg - - from neutron.api.v2 import attributes -+from neutron.common import constants as const - from neutron.common import exceptions - import neutron.common.utils as utils - from neutron import manager -@@ -118,14 +121,28 @@ - policy.set_rules(policies) - - --def _is_attribute_explicitly_set(attribute_name, resource, target): -- """Verify that an attribute is present and has a non-default value.""" -+def _is_attribute_explicitly_set(attribute_name, resource, target, action): -+ """Verify that an attribute is present and is explicitly set.""" -+ if 'update' in action: -+ # In the case of update, the function should not pay attention to a -+ # default value of an attribute, but check whether it was explicitly -+ # marked as being updated instead. -+ return (attribute_name in target[const.ATTRIBUTES_TO_UPDATE] and -+ target[attribute_name] is not attributes.ATTR_NOT_SPECIFIED) - return ('default' in resource[attribute_name] and - attribute_name in target and - target[attribute_name] is not attributes.ATTR_NOT_SPECIFIED and - target[attribute_name] != resource[attribute_name]['default']) - - -+def _should_validate_sub_attributes(attribute, sub_attr): -+ """Verify that sub-attributes are iterable and should be validated.""" -+ validate = attribute.get('validate') -+ return (validate and isinstance(sub_attr, collections.Iterable) and -+ any([k.startswith('type:dict') and -+ v for (k, v) in validate.iteritems()])) -+ -+ - def _build_subattr_match_rule(attr_name, attr, action, target): - """Create the rule to match for sub-attribute policy checks.""" - # TODO(salv-orlando): Instead of relying on validator info, introduce -@@ -174,16 +191,14 @@ - for attribute_name in res_map[resource]: - if _is_attribute_explicitly_set(attribute_name, - res_map[resource], -- target): -+ target, action): - attribute = res_map[resource][attribute_name] - if 'enforce_policy' in attribute: - attr_rule = policy.RuleCheck('rule', '%s:%s' % - (action, attribute_name)) -- # Build match entries for sub-attributes, if present -- validate = attribute.get('validate') -- if (validate and any([k.startswith('type:dict') and v -- for (k, v) in -- validate.iteritems()])): -+ # Build match entries for sub-attributes -+ if _should_validate_sub_attributes( -+ attribute, target[attribute_name]): - attr_rule = policy.AndCheck( - [attr_rule, _build_subattr_match_rule( - attribute_name, attribute, ---- neutron-2013.2.3/neutron/tests/unit/test_api_v2.py 2014-04-03 11:49:01.000000000 -0700 -+++ NEW/neutron/tests/unit/test_api_v2.py 2014-09-30 10:06:01.484803124 -0700 -@@ -1210,6 +1210,18 @@ - network_id='id1', - dummy=body) - -+ def test_update_subresource_to_none(self): -+ instance = self.plugin.return_value -+ -+ dummy_id = _uuid() -+ body = {'dummy': {}} -+ self.api.put_json('/networks/id1' + _get_path('dummies', id=dummy_id), -+ body) -+ instance.update_network_dummy.assert_called_once_with(mock.ANY, -+ dummy_id, -+ network_id='id1', -+ dummy=body) -+ - def test_delete_sub_resource(self): - instance = self.plugin.return_value - ---- neutron-2013.2.3/neutron/tests/unit/test_policy.py 2014-04-03 11:49:01.000000000 -0700 -+++ NEW/neutron/tests/unit/test_policy.py 2014-09-30 10:09:03.707133011 -0700 -@@ -24,6 +24,7 @@ - - import neutron - from neutron.api.v2 import attributes -+from neutron.common import constants as const - from neutron.common import exceptions - from neutron import context - from neutron import manager -@@ -280,9 +281,11 @@ - self.addCleanup(self.manager_patcher.stop) - - def _test_action_on_attr(self, context, action, attr, value, -- exception=None): -+ exception=None, **kwargs): - action = "%s_network" % action - target = {'tenant_id': 'the_owner', attr: value} -+ if kwargs: -+ target.update(kwargs) - if exception: - self.assertRaises(exception, policy.enforce, - context, action, target) -@@ -291,10 +294,10 @@ - self.assertEqual(result, True) - - def _test_nonadmin_action_on_attr(self, action, attr, value, -- exception=None): -+ exception=None, **kwargs): - user_context = context.Context('', "user", roles=['user']) - self._test_action_on_attr(user_context, action, attr, -- value, exception) -+ value, exception, **kwargs) - - def test_nonadmin_write_on_private_fails(self): - self._test_nonadmin_action_on_attr('create', 'shared', False, -@@ -311,9 +314,11 @@ - def test_nonadmin_read_on_shared_succeeds(self): - self._test_nonadmin_action_on_attr('get', 'shared', True) - -- def _test_enforce_adminonly_attribute(self, action): -+ def _test_enforce_adminonly_attribute(self, action, **kwargs): - admin_context = context.get_admin_context() - target = {'shared': True} -+ if kwargs: -+ target.update(kwargs) - result = policy.enforce(admin_context, action, target) - self.assertEqual(result, True) - -@@ -321,7 +326,14 @@ - self._test_enforce_adminonly_attribute('create_network') - - def test_enforce_adminonly_attribute_update(self): -- self._test_enforce_adminonly_attribute('update_network') -+ kwargs = {const.ATTRIBUTES_TO_UPDATE: ['shared']} -+ self._test_enforce_adminonly_attribute('update_network', **kwargs) -+ -+ def test_reset_adminonly_attr_to_default_fails(self): -+ kwargs = {const.ATTRIBUTES_TO_UPDATE: ['shared']} -+ self._test_nonadmin_action_on_attr('update', 'shared', False, -+ exceptions.PolicyNotAuthorized, -+ **kwargs) - - def test_enforce_adminonly_attribute_no_context_is_admin_policy(self): - del self.rules[policy.ADMIN_CTX_POLICY] diff -r 097063f324c0 -r 4b1def16fe9b components/openstack/neutron/patches/08-CVE-2014-7821.patch --- a/components/openstack/neutron/patches/08-CVE-2014-7821.patch Thu Apr 16 01:36:32 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -This patch addresses CVE-2014-7821 and is tracked under Launchpad bug -1378450. It is addressed in the stable/Juno and stable/Icehouse. There -is no patch for Havana since it is EOL'ed by upstream. Therefore, this -patch is derived from the patch for stable/Icehouse - -commit ab7ea069de5cecf1c26af50996a26e1a7f86def4 -Author: John Perkins