summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/source/conf.py175
-rw-r--r--doc/source/index.rst18
-rw-r--r--hot/autoscaling.yaml51
-rw-r--r--hot/condition.yaml102
-rw-r--r--hot/lb_server.yaml10
-rw-r--r--hot/neutron/instance_trunk_port.yaml168
-rwxr-xr-xhot/software-config/elements/heat-config-docker-cmd/install.d/hook-docker-cmd.py3
-rwxr-xr-xhot/software-config/elements/heat-config-docker-compose/install.d/hook-docker-compose.py3
-rwxr-xr-xhot/software-config/elements/heat-config/os-refresh-config/configure.d/55-heat-config3
-rwxr-xr-xhot/software-config/example-templates/cirros-example/init.d/heat-deploy-hook18
-rw-r--r--openshift-origin/F19/aws-template/openshift.template2
-rw-r--r--openshift-origin/F19/hot-template/openshift-scalable-cpu-nbgears/nodeinstance.yaml2
-rw-r--r--openshift-origin/F19/hot-template/openshift-scalable-cpu-nbgears/openshift.yaml2
-rw-r--r--openshift-origin/F19/hot-template/openshift-scalable-cpu/nodeinstance.yaml2
-rw-r--r--openshift-origin/F19/hot-template/openshift-scalable-cpu/openshift.yaml2
-rw-r--r--openshift-origin/F19/hot-template/openshift-scalable-nbgears/nodeinstance.yaml2
-rw-r--r--openshift-origin/F19/hot-template/openshift-scalable-nbgears/openshift.yaml2
-rw-r--r--openshift-origin/F19/hot-template/openshift/openshift.yaml2
-rw-r--r--setup.cfg8
-rw-r--r--test-requirements.txt2
-rw-r--r--tox.ini6
21 files changed, 537 insertions, 46 deletions
diff --git a/doc/source/conf.py b/doc/source/conf.py
new file mode 100644
index 0000000..4faf403
--- /dev/null
+++ b/doc/source/conf.py
@@ -0,0 +1,175 @@
+# -*- coding: utf-8 -*-
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# heat-templates documentation build configuration file, created by
+# sphinx-quickstart on Thu Jul 20 09:19:39 2017.
+#
+# This file is execfile()d with the current directory set to its
+# containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#
+# needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = ['sphinx.ext.autodoc',
+ 'openstackdocstheme']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+#
+# source_suffix = ['.rst', '.md']
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = 'heat-templates'
+copyright = 'OpenStack Foundation'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = ''
+# The full version, including alpha/beta/rc tags.
+release = ''
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This patterns also effect to html_static_path and html_extra_path
+exclude_patterns = []
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+# todo_include_todos = False
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'openstackdocs'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#
+# html_theme_options = {}
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+# html_static_path = ['_static']
+
+# Custom sidebar templates, must be a dictionary that maps document names
+# to template names.
+#
+# This is required for the alabaster theme
+# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
+# html_sidebars = {}
+
+# -- Options for openstackdocstheme --------------------------------------
+repository_name = 'openstack/heat-templates'
+bug_project = 'heat-templates'
+bug_tag = ''
+
+# -- Options for HTMLHelp output ------------------------------------------
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'heat-templatesdoc'
+
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+ # The paper size ('letterpaper' or 'a4paper').
+ #
+ # 'papersize': 'letterpaper',
+
+ # The font size ('10pt', '11pt' or '12pt').
+ #
+ # 'pointsize': '10pt',
+
+ # Additional stuff for the LaTeX preamble.
+ #
+ # 'preamble': '',
+
+ # Latex figure (float) alignment
+ #
+ # 'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+# author, documentclass [howto, manual, or own class]).
+latex_documents = [
+ (master_doc, 'heat-templates.tex', 'heat-templates Documentation',
+ 'OpenStack Foundation', 'manual'),
+]
+
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ (master_doc, 'heat-templates', 'heat-templates Documentation',
+ ['Heat Developers'], 1)
+]
+
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+# dir menu entry, description, category)
+texinfo_documents = [
+ (master_doc, 'heat-templates', 'heat-templates Documentation',
+ 'Heat Developers', 'heat-templates', 'One line description of project.',
+ 'Miscellaneous'),
+]
diff --git a/doc/source/index.rst b/doc/source/index.rst
new file mode 100644
index 0000000..a0afe0d
--- /dev/null
+++ b/doc/source/index.rst
@@ -0,0 +1,18 @@
+.. heat-templates documentation master file, created by
+ sphinx-quickstart on Thu Jul 20 09:19:39 2017.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Welcome to Heat Templates!
+==========================
+
+.. toctree::
+ :maxdepth: 1
+
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`search`
diff --git a/hot/autoscaling.yaml b/hot/autoscaling.yaml
index 3a8b3bb..d6d8991 100644
--- a/hot/autoscaling.yaml
+++ b/hot/autoscaling.yaml
@@ -1,4 +1,4 @@
-heat_template_version: 2013-05-23
+heat_template_version: 2016-10-14
description: AutoScaling Wordpress
parameters:
image:
@@ -75,6 +75,7 @@ resources:
image: {get_param: image}
key_name: {get_param: key}
network: {get_param: network}
+ subnet: {get_param: subnet_id}
pool_id: {get_resource: pool}
metadata: {"metering.server_group": {get_param: "OS::stack_id"}}
user_data:
@@ -128,7 +129,7 @@ resources:
- str_replace:
template: trust+url
params:
- url: {get_attr: [scaleup_policy, signal_url]}
+ url: {get_attr: [web_server_scaleup_policy, signal_url]}
query:
list_join:
- ''
@@ -148,40 +149,44 @@ resources:
- str_replace:
template: trust+url
params:
- url: {get_attr: [scaleup_policy, signal_url]}
+ url: {get_attr: [web_server_scaledown_policy, signal_url]}
query:
list_join:
- ''
- - {'=': {server_group: {get_param: "OS::stack_id"}}}
- monitor:
- type: OS::Neutron::HealthMonitor
+ lb:
+ type: OS::Neutron::LBaaS::LoadBalancer
properties:
- type: TCP
- delay: 5
- max_retries: 5
- timeout: 5
+ vip_subnet: {get_param: subnet_id}
+ listener:
+ type: OS::Neutron::LBaaS::Listener
+ properties:
+ loadbalancer: {get_resource: lb}
+ protocol: HTTP
+ protocol_port: 80
pool:
- type: OS::Neutron::Pool
+ type: OS::Neutron::LBaaS::Pool
properties:
+ listener: {get_resource: listener}
+ lb_algorithm: ROUND_ROBIN
protocol: HTTP
- monitors: [{get_resource: monitor}]
- subnet_id: {get_param: subnet_id}
- lb_method: ROUND_ROBIN
- vip:
- protocol_port: 80
- lb:
- type: OS::Neutron::LoadBalancer
+ session_persistence:
+ type: SOURCE_IP
+ lb_monitor:
+ type: OS::Neutron::LBaaS::HealthMonitor
properties:
- protocol_port: 80
- pool_id: {get_resource: pool}
-
+ pool: { get_resource: pool }
+ type: TCP
+ delay: 5
+ max_retries: 5
+ timeout: 5
# assign a floating ip address to the load balancer
# pool.
lb_floating:
type: OS::Neutron::FloatingIP
properties:
floating_network_id: {get_param: external_network_id}
- port_id: {get_attr: [pool, vip, port_id]}
+ port_id: {get_attr: [lb, vip_port_id]}
outputs:
scale_up_url:
@@ -197,7 +202,7 @@ outputs:
this URL; no body nor extra headers are needed.
value: {get_attr: [web_server_scaledown_policy, alarm_url]}
pool_ip_address:
- value: {get_attr: [pool, vip, address]}
+ value: {get_attr: [lb, vip_address]}
description: The IP address of the load balancing pool
website_url:
value:
@@ -214,7 +219,7 @@ outputs:
template: >
gnocchi measures aggregation --resource-type instance
--query 'server_group="stackval"'
- --granularity 300 --aggregation mean cpu_util
+ --granularity 300 --aggregation mean -m cpu_util
params:
stackval: { get_param: "OS::stack_id" }
description: >
diff --git a/hot/condition.yaml b/hot/condition.yaml
new file mode 100644
index 0000000..9f5e640
--- /dev/null
+++ b/hot/condition.yaml
@@ -0,0 +1,102 @@
+heat_template_version: 2017-02-24
+parameters:
+ env_type:
+ default: test
+ type: string
+ constraints:
+ - allowed_values: [prod, test]
+ zone:
+ type: string
+ default: beijing
+conditions:
+ prod: {equals: [{get_param: env_type}, "prod"]}
+ test:
+ not:
+ equals:
+ - get_param: env_type
+ - prod
+ beijing_prod:
+ and:
+ - equals:
+ - get_param: zone
+ - beijing
+ - equals:
+ - get_param: env_type
+ - prod
+ xian_zone:
+ equals:
+ - get_param: zone
+ - xian
+ xianyang_zone:
+ equals:
+ - get_param: zone
+ - xianyang
+ fujian_zone:
+ or:
+ - equals:
+ - get_param: zone
+ - fuzhou
+ - equals:
+ - get_param: zone
+ - xiamen
+ fujian_prod:
+ and:
+ - fujian_zone
+ - prod
+ shannxi_province:
+ or:
+ - xian_zone
+ - xianyang_zone
+resources:
+ test_res:
+ type: OS::Heat::TestResource
+ properties:
+ value: {if: ["prod", "env_is_prod", "env_is_test"]}
+ prod_res:
+ type: OS::Heat::TestResource
+ properties:
+ value: prod_res
+ condition: prod
+ test_res1:
+ type: OS::Heat::TestResource
+ properties:
+ value: just in test env
+ condition: test
+ beijing_prod_res:
+ type: OS::Heat::TestResource
+ properties:
+ value: beijing_prod_res
+ condition: beijing_prod
+ fujian_res:
+ type: OS::Heat::TestResource
+ condition: fujian_zone
+ properties:
+ value: fujian_res
+ fujian_prod_res:
+ type: OS::Heat::TestResource
+ condition: fujian_prod
+ properties:
+ value: fujian_prod_res
+ shannxi_res:
+ type: OS::Heat::TestResource
+ condition: shannxi_province
+ properties:
+ value: shannxi_res
+ not_shannxi_res:
+ type: OS::Heat::TestResource
+ condition: {not: shannxi_province}
+ properties:
+ value: not_shannxi_res
+outputs:
+ res_value:
+ value: {get_attr: [prod_res, output]}
+ condition: prod
+ test_res_value:
+ value: {get_attr: [test_res, output]}
+ prod_resource:
+ value: {if: [prod, {get_resource: prod_res}, 'no_prod_res']}
+ test_res1_value:
+ value: {if: [test, {get_attr: [test_res1, output]}, 'no_test_res1']}
+ beijing_prod_res:
+ value: {if: [beijing_prod, {get_resource: beijing_prod_res},
+ 'no_prod_res']}
diff --git a/hot/lb_server.yaml b/hot/lb_server.yaml
index 3cd907f..67762b6 100644
--- a/hot/lb_server.yaml
+++ b/hot/lb_server.yaml
@@ -1,4 +1,4 @@
-heat_template_version: 2013-05-23
+heat_template_version: 2016-10-14
description: A load-balancer server
parameters:
image:
@@ -21,6 +21,9 @@ parameters:
network:
type: string
description: Network used by the server
+ subnet:
+ type: string
+ description: Subnet used by the server
resources:
server:
@@ -34,11 +37,12 @@ resources:
user_data_format: RAW
networks: [{network: {get_param: network} }]
member:
- type: OS::Neutron::PoolMember
+ type: OS::Neutron::LBaaS::PoolMember
properties:
- pool_id: {get_param: pool_id}
+ pool: {get_param: pool_id}
address: {get_attr: [server, first_address]}
protocol_port: 80
+ subnet: {get_param: subnet}
outputs:
server_ip:
diff --git a/hot/neutron/instance_trunk_port.yaml b/hot/neutron/instance_trunk_port.yaml
new file mode 100644
index 0000000..584133e
--- /dev/null
+++ b/hot/neutron/instance_trunk_port.yaml
@@ -0,0 +1,168 @@
+heat_template_version: 2017-02-24
+
+description: How to boot an instance with networks trunked over a port
+
+# See also:
+# https://docs.openstack.org/heat/latest/template_guide/openstack.html#OS::Neutron::Trunk
+# https://docs.openstack.org/neutron/latest/admin/config-trunking.html
+# https://wiki.openstack.org/wiki/Neutron/TrunkPort
+
+parameters:
+ flavor:
+ type: string
+ default: ds512M
+ key:
+ type: string
+ default: key0
+ # Use an image with support for vlan interfaces. CirrOS will not cut it.
+ # eg: ip link add ... type vlan ...
+ image:
+ type: string
+ default: ubuntu1404
+
+resources:
+
+ net0:
+ type: OS::Neutron::Net
+ net1:
+ type: OS::Neutron::Net
+ net2:
+ type: OS::Neutron::Net
+
+ subnet0:
+ type: OS::Neutron::Subnet
+ properties:
+ network: { get_resource: net0 }
+ cidr: 10.0.4.0/24
+ subnet1:
+ type: OS::Neutron::Subnet
+ properties:
+ network: { get_resource: net1 }
+ cidr: 10.0.5.0/24
+ subnet2:
+ type: OS::Neutron::Subnet
+ properties:
+ network: { get_resource: net2 }
+ cidr: 10.0.6.0/24
+
+ parent_port:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_resource: net0 }
+ subport1:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_resource: net1 }
+ # NOTE Reuse parent port's MAC address on all subports.
+ #
+ # Analog to VLAN use on physical NICs you may set MAC addresses of
+ # subports to the MAC address of the parent port. This way bringing up
+ # the subport's VLAN subinterface inside the instance is simpler. You
+ # don't have to set a new MAC address for each VLAN subinterface.
+ # However before you do this be aware of a bug in Neutron's openvswitch
+ # firewall driver: https://launchpad.net/bugs/1626010
+ #
+ #mac_address: { get_attr: [parent_port, mac_address] }
+ subport2:
+ type: OS::Neutron::Port
+ properties:
+ network: { get_resource: net2 }
+ #mac_address: { get_attr: [parent_port, mac_address] }
+
+ trunk0:
+ type: OS::Neutron::Trunk
+ properties:
+ port: { get_resource: parent_port }
+ sub_ports:
+ - { port: { get_resource: subport1 },
+ segmentation_type: vlan,
+ segmentation_id: 101 }
+ - { port: { get_resource: subport2 },
+ segmentation_type: vlan,
+ segmentation_id: 102 }
+
+ instance0:
+ type: OS::Nova::Server
+ # NOTE Make the instance depend on the trunk.
+ #
+ # A simple direct reference to the parent port would be straightforward
+ # but in many (though not all) cases wrong. The trunk port spec says:
+ #
+ # "If the [neutron] backend does not implement the [trunk] extension
+ # any trunk operation will fail (with 404). If a [neutron] plugin
+ # does implement the [trunk] extension, trunk operations may return
+ # a conflict error if the [parent] port status is not compatible
+ # with the [trunk create] request."
+ #
+ # http://specs.openstack.org/openstack/neutron-specs
+ # /specs/newton/vlan-aware-vms.html
+ #
+ # In practice this means that the Open vSwitch plugin(s) of Neutron
+ # will reject trunk creation when the parent port was already used
+ # to boot an instance.
+ #
+ # This introduces a timing dependency (ie. the trunk must be created
+ # before the instance is booted). Of which Heat cannot know based
+ # on information present in the template unless we tell it.
+ #
+ # Though other Neutron plugins may not have this constraint as an
+ # OpenStack end user you don't want to write templates that depend
+ # on the plugin configuration of Neutron, therefore it's better to
+ # always add the dependency.
+ #
+ # You can add the dependency:
+ # * either implicitly via 'get_attr',
+ # * or explicitly via 'depends_on'.
+ #
+ # instance0:
+ # type: OS::Nova::Server
+ # properties:
+ # networks:
+ # - { port: { get_attr: [trunk0, port_id] } } # BEST
+ #
+ # instance0:
+ # type: OS::Nova::Server
+ # depends_on: trunk0 # ALSO GOOD, but easy to forget
+ # properties:
+ # networks:
+ # - { port: { get_resource: parent_port } }
+ #
+ # But if you encounter this error during trunk resource creation:
+ #
+ # CREATE_FAILED Conflict: resources.trunk0:
+ # Port [parent port id] is currently in use and
+ # is not eligible for use as a parent port.
+ #
+ # then remember that the likely cause was this:
+ #
+ # instance0:
+ # type: OS::Nova::Server
+ # # neither depends_on
+ # properties:
+ # networks:
+ # - { port: { get_resource: parent_port } } # nor get_attr, BAD
+ properties:
+ key_name: { get_param: key }
+ flavor: { get_param: flavor }
+ image: { get_param: image }
+ networks:
+ # NOTE Use the parent port only. Subports must not be directly added
+ # to the instance.
+ - { port: { get_attr: [trunk0, port_id] } }
+
+outputs:
+ # This output is here to help bringing up the subports' vlan subinterfaces, eg:
+ # ip link add link eth0 name eth0.101 address "$subport_mac" type vlan id 101
+ # dhclient eth0.101
+ parent_port/mac_adress:
+ value: { get_attr: [parent_port, mac_address] }
+ parent_port/name:
+ value: { get_attr: [parent_port, name] }
+ subport1/fixed_ips:
+ value: { get_attr: [subport1, fixed_ips] }
+ subport1/mac_address:
+ value: { get_attr: [subport1, mac_address] }
+ subport2/fixed_ips:
+ value: { get_attr: [subport2, fixed_ips] }
+ subport2/mac_address:
+ value: { get_attr: [subport2, mac_address] }
diff --git a/hot/software-config/elements/heat-config-docker-cmd/install.d/hook-docker-cmd.py b/hot/software-config/elements/heat-config-docker-cmd/install.d/hook-docker-cmd.py
index ae02887..8e9e89f 100755
--- a/hot/software-config/elements/heat-config-docker-cmd/install.d/hook-docker-cmd.py
+++ b/hot/software-config/elements/heat-config-docker-cmd/install.d/hook-docker-cmd.py
@@ -15,6 +15,7 @@
import json
import logging
import os
+import six
import subprocess
import sys
import yaml
@@ -99,7 +100,7 @@ def main(argv=sys.argv):
if key in ['environment', 'volumes', 'volumes_from']:
for value in config[container][key]:
# Somehow the lists get empty values sometimes
- if type(value) is unicode and not value.strip():
+ if type(value) is six.text_type and not value.strip():
continue
cmd.append(docker_arg_map(key, value))
elif key == 'image':
diff --git a/hot/software-config/elements/heat-config-docker-compose/install.d/hook-docker-compose.py b/hot/software-config/elements/heat-config-docker-compose/install.d/hook-docker-compose.py
index 41219ef..0ccd51a 100755
--- a/hot/software-config/elements/heat-config-docker-compose/install.d/hook-docker-compose.py
+++ b/hot/software-config/elements/heat-config-docker-compose/install.d/hook-docker-compose.py
@@ -17,6 +17,7 @@ import dpath
import json
import logging
import os
+import six
import subprocess
import sys
import yaml
@@ -87,7 +88,7 @@ def main(argv=sys.argv):
for value in dpath.util.values(config, '*/env_file'):
if isinstance(value, list):
compose_env_files.extend(value)
- elif isinstance(value, basestring):
+ elif isinstance(value, six.string_types):
compose_env_files.extend([value])
input_env_files = {}
diff --git a/hot/software-config/elements/heat-config/os-refresh-config/configure.d/55-heat-config b/hot/software-config/elements/heat-config/os-refresh-config/configure.d/55-heat-config
index 9cc0df1..cbb36ae 100755
--- a/hot/software-config/elements/heat-config/os-refresh-config/configure.d/55-heat-config
+++ b/hot/software-config/elements/heat-config/os-refresh-config/configure.d/55-heat-config
@@ -21,6 +21,7 @@ import subprocess
import sys
import requests
+import six
HOOKS_DIR_PATHS = (
os.environ.get('HEAT_CONFIG_HOOKS'),
@@ -93,7 +94,7 @@ def invoke_hook(c, log):
hot_inputs = c.get('inputs', [])
for hot_input in hot_inputs:
if hot_input.get('type', None) == 'String' and \
- not isinstance(hot_input['value'], basestring):
+ not isinstance(hot_input['value'], six.text_type):
hot_input['value'] = str(hot_input['value'])
iv = dict((i['name'], i['value']) for i in c['inputs'])
# The group property indicates whether it is softwarecomponent or
diff --git a/hot/software-config/example-templates/cirros-example/init.d/heat-deploy-hook b/hot/software-config/example-templates/cirros-example/init.d/heat-deploy-hook
index e063e09..daa592f 100755
--- a/hot/software-config/example-templates/cirros-example/init.d/heat-deploy-hook
+++ b/hot/software-config/example-templates/cirros-example/init.d/heat-deploy-hook
@@ -16,18 +16,18 @@ USER_ID=$(cat $OSC_DATA_PATH/user_id)
AUTH_URL=$(cat $OSC_DATA_PATH/auth_url)
PROJECT_ID=$(cat $OSC_DATA_PATH/project_id)
-# Get a token and de-jsonify the response
-# FIXME currently this only works with v2 keystone
-V2_JSON='{"auth": {"tenantId": "'$PROJECT_ID'", "passwordCredentials": {"userId": "'$USER_ID'", "password": "'$PASSWORD'"}}}'
-curl -i -d "$V2_JSON" -H "Content-type: application/json" $AUTH_URL/tokens | grep "^{" > ${TMPDIR}/token_json.json
+# Get a token and de-jsonify the response, only supports keystone v3
+V3_JSON='{"auth": {"identity": {"methods": ["password"], "password": {"user": {"id": "'$USER_ID'", "password": "'$PASSWORD'"}}}, "scope": {"project": {"id": "'$PROJECT_ID'"}}}}'
+curl -i -d "$V3_JSON" -H "Content-type: application/json" $AUTH_URL/auth/tokens > ${TMPDIR}/token.json
+TOKEN=$(grep 'X-Subject-Token' ${TMPDIR}/token.json | awk '{print $2}')
mkdir -p ${TMPDIR}/token_data_out
-json2fstree ${TMPDIR}/token_data_out ${TMPDIR}/token_json.json
-TOKEN=$(cat ${TMPDIR}/token_data_out/access/token/id)
+grep "^{" ${TMPDIR}/token.json > ${TMPDIR}/token_body.json
+json2fstree ${TMPDIR}/token_data_out ${TMPDIR}/token_body.json
# Locate the heat API endpoint from the token response
-SC_DIR=$(grep -r orchestration ${TMPDIR}/token_data_out/access/serviceCatalog/ | sed "s/\/type:orchestration//")
-SC_PUBURL=$(find $SC_DIR -name publicURL)
-SC_ENDPOINT=$(cat $SC_PUBURL)
+SC_DIR=$(grep -r orchestration ${TMPDIR}/token_data_out/token/catalog | sed "s/\/type:orchestration//")
+SC_PUBURL=$(grep -r public ${SC_DIR} | sed "s/\/interface:public//")
+SC_ENDPOINT=$(cat ${SC_PUBURL}/url)
# Get resource metadata and decode it with json2fstree
STACK_ID=$(cat $OSC_DATA_PATH/stack_id)
diff --git a/openshift-origin/F19/aws-template/openshift.template b/openshift-origin/F19/aws-template/openshift.template
index b253e83..edca844 100644
--- a/openshift-origin/F19/aws-template/openshift.template
+++ b/openshift-origin/F19/aws-template/openshift.template
@@ -63,7 +63,7 @@
"Type": "String"
},
"PrivateNetworkName": {
- "Description": "Name of the private network wich will be created",
+ "Description": "Name of the private network which will be created",
"Type": "String",
"Default": "OpenShift-Network"
},
diff --git a/openshift-origin/F19/hot-template/openshift-scalable-cpu-nbgears/nodeinstance.yaml b/openshift-origin/F19/hot-template/openshift-scalable-cpu-nbgears/nodeinstance.yaml
index a65e47f..32ce5ec 100644
--- a/openshift-origin/F19/hot-template/openshift-scalable-cpu-nbgears/nodeinstance.yaml
+++ b/openshift-origin/F19/hot-template/openshift-scalable-cpu-nbgears/nodeinstance.yaml
@@ -43,7 +43,7 @@ parameters:
description: External network ID
type: string
private_network_name:
- description: Name of the private network wich will be created
+ description: Name of the private network which will be created
type: string
default: OpenShift-Network
private_network_cidr:
diff --git a/openshift-origin/F19/hot-template/openshift-scalable-cpu-nbgears/openshift.yaml b/openshift-origin/F19/hot-template/openshift-scalable-cpu-nbgears/openshift.yaml
index 769669b..c84c6aa 100644
--- a/openshift-origin/F19/hot-template/openshift-scalable-cpu-nbgears/openshift.yaml
+++ b/openshift-origin/F19/hot-template/openshift-scalable-cpu-nbgears/openshift.yaml
@@ -43,7 +43,7 @@ parameters:
description: External network ID
type: string
private_network_name:
- description: Name of the private network wich will be created
+ description: Name of the private network which will be created
type: string
default: OpenShift-Network
private_network_cidr:
diff --git a/openshift-origin/F19/hot-template/openshift-scalable-cpu/nodeinstance.yaml b/openshift-origin/F19/hot-template/openshift-scalable-cpu/nodeinstance.yaml
index a65e47f..32ce5ec 100644
--- a/openshift-origin/F19/hot-template/openshift-scalable-cpu/nodeinstance.yaml
+++ b/openshift-origin/F19/hot-template/openshift-scalable-cpu/nodeinstance.yaml
@@ -43,7 +43,7 @@ parameters:
description: External network ID
type: string
private_network_name:
- description: Name of the private network wich will be created
+ description: Name of the private network which will be created
type: string
default: OpenShift-Network
private_network_cidr:
diff --git a/openshift-origin/F19/hot-template/openshift-scalable-cpu/openshift.yaml b/openshift-origin/F19/hot-template/openshift-scalable-cpu/openshift.yaml
index fef5b7c..d881b67 100644
--- a/openshift-origin/F19/hot-template/openshift-scalable-cpu/openshift.yaml
+++ b/openshift-origin/F19/hot-template/openshift-scalable-cpu/openshift.yaml
@@ -43,7 +43,7 @@ parameters:
description: External network ID
type: string
private_network_name:
- description: Name of the private network wich will be created
+ description: Name of the private network which will be created
type: string
default: OpenShift-Network
private_network_cidr:
diff --git a/openshift-origin/F19/hot-template/openshift-scalable-nbgears/nodeinstance.yaml b/openshift-origin/F19/hot-template/openshift-scalable-nbgears/nodeinstance.yaml
index e3fcd66..e4a68b1 100644
--- a/openshift-origin/F19/hot-template/openshift-scalable-nbgears/nodeinstance.yaml
+++ b/openshift-origin/F19/hot-template/openshift-scalable-nbgears/nodeinstance.yaml
@@ -43,7 +43,7 @@ parameters:
description: External network ID
type: string
private_network_name:
- description: Name of the private network wich will be created
+ description: Name of the private network which will be created
type: string
default: OpenShift-Network
private_network_cidr:
diff --git a/openshift-origin/F19/hot-template/openshift-scalable-nbgears/openshift.yaml b/openshift-origin/F19/hot-template/openshift-scalable-nbgears/openshift.yaml
index d015194..1229136 100644
--- a/openshift-origin/F19/hot-template/openshift-scalable-nbgears/openshift.yaml
+++ b/openshift-origin/F19/hot-template/openshift-scalable-nbgears/openshift.yaml
@@ -43,7 +43,7 @@ parameters:
description: External network ID
type: string
private_network_name:
- description: Name of the private network wich will be created
+ description: Name of the private network which will be created
type: string
default: OpenShift-Network
private_network_cidr:
diff --git a/openshift-origin/F19/hot-template/openshift/openshift.yaml b/openshift-origin/F19/hot-template/openshift/openshift.yaml
index e57838f..f1a9d5d 100644
--- a/openshift-origin/F19/hot-template/openshift/openshift.yaml
+++ b/openshift-origin/F19/hot-template/openshift/openshift.yaml
@@ -43,7 +43,7 @@ parameters:
description: External network ID
type: string
private_network_name:
- description: Name of the private network wich will be created
+ description: Name of the private network which will be created
type: string
default: OpenShift-Network
private_network_cidr:
diff --git a/setup.cfg b/setup.cfg
index e7187f2..39b28fe 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -17,3 +17,11 @@ classifier =
Programming Language :: Python :: 2.7
Programming Language :: Python :: 3
Programming Language :: Python :: 3.4
+
+[build_sphinx]
+source-dir = doc/source
+build-dir = doc/build
+all_files = 1
+
+[upload_sphinx]
+upload-dir = doc/build/html
diff --git a/test-requirements.txt b/test-requirements.txt
index 402c212..a855ea0 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -5,9 +5,11 @@ fixtures>=0.3.14
# Hacking already pins down pep8, pyflakes and flake8
hacking>=0.10.0,<0.11
mock>=1.0
+openstackdocstheme>=1.11.0 # Apache-2.0
requests>=1.2.1,!=2.4.0
requests-mock>=0.4.0 # Apache-2.0
salt
+sphinx>=1.6.2 # BSD
testrepository>=0.0.18
testscenarios>=0.4
testtools>=0.9.34
diff --git a/tox.ini b/tox.ini
index fbe8907..1ce04cf 100644
--- a/tox.ini
+++ b/tox.ini
@@ -17,6 +17,12 @@ commands = flake8
[testenv:venv]
commands = {posargs}
+[testenv:docs]
+deps = -r{toxinidir}/requirements.txt
+ -r{toxinidir}/test-requirements.txt
+ sphinxcontrib-httpdomain
+commands = python setup.py build_sphinx
+
[flake8]
show-source = True
builtins = _