Added support for the schema output
* Restrictions:
Multi-lvl references for schemas not work.
Pattern references works partially(only for 1st pattern ref)
* Added possibility to use sphinx from venv
* mirantis theme support (require theme package)
Change-Id: Ia210f5b8245624a986a9280ed5ccbbf024c1c57c
diff --git a/sphinx/_git.sls b/sphinx/_git.sls
index 2f5c6f4..c7d25a4 100644
--- a/sphinx/_git.sls
+++ b/sphinx/_git.sls
@@ -8,11 +8,11 @@
- file: /srv/static/extern
- pkg: git_packages
- require_in:
- - cmd: generate_sphinx_doc_{{ doc_name }}
+ - cmd: generate_sphinx_doc_git_{{ doc_name }}
-generate_sphinx_doc_{{ doc_name }}:
+generate_sphinx_doc_git_{{ doc_name }}:
cmd.run:
- - name: sphinx-build -b {{ doc.builder }} /srv/static/extern/{{ doc_name }}{% if doc.path is defined %}/{{ doc.path }}{% endif %} /srv/static/sites/{{ doc_name }}
+ - name: {{ sphinx_build_bin }} -b {{ doc.builder }} /srv/static/extern/{{ doc_name }}{% if doc.path is defined %}/{{ doc.path }}{% endif %} /srv/static/sites/{{ doc_name }}
- require:
- git: sphinx_source_{{ doc_name }}
- file: /srv/static/sites/{{ doc_name }}
diff --git a/sphinx/_salt.sls b/sphinx/_salt.sls
index d69e411..5bc8645 100644
--- a/sphinx/_salt.sls
+++ b/sphinx/_salt.sls
@@ -77,6 +77,14 @@
- defaults:
doc_name: "{{ doc_name }}"
+/srv/static/extern/salt/source/services/schema.rst:
+ file.managed:
+ - source: salt://sphinx/files/salt/source/services/schema.rst
+ - template: jinja
+ - mode: 644
+ - require:
+ - file: salt_mine_doc_dirs
+
/srv/static/extern/salt/source/nodes/index.rst:
file.managed:
- source: salt://sphinx/files/salt/source/nodes/index.rst
@@ -107,7 +115,7 @@
{%- endif %}
-generate_sphinx_doc_{{ doc_name }}:
+generate_sphinx_doc_salt_{{ doc_name }}:
cmd.run:
- name: sphinx-build -b {{ doc.builder }} /srv/static/extern/salt/source /srv/static/sites/{{ doc_name }}
- require:
diff --git a/sphinx/_schema.sls b/sphinx/_schema.sls
new file mode 100644
index 0000000..9af5df6
--- /dev/null
+++ b/sphinx/_schema.sls
@@ -0,0 +1,104 @@
+
+salt_schema_doc_dirs:
+ file.directory:
+ - names:
+ - /srv/static/extern/salt-schema/source/_static
+ - /srv/static/extern/salt-schema/source/services
+ - /srv/static/extern/salt-schema/source/nodes
+ - user: root
+ - mode: 755
+ - makedirs: true
+
+/srv/static/extern/salt-schema/Makefile:
+ file.managed:
+ - source: salt://sphinx/files/schema/Makefile
+ - mode: 644
+ - require:
+ - file: salt_schema_doc_dirs
+
+/srv/static/extern/salt-schema/source/conf.py:
+ file.managed:
+ - source: salt://sphinx/files/schema/source/conf.py
+ - template: jinja
+ - mode: 644
+ - require:
+ - file: salt_schema_doc_dirs
+ - defaults:
+ doc: {{ doc|yaml }}
+
+/srv/static/extern/salt-schema/source/index.rst:
+ file.managed:
+ - source: salt://sphinx/files/schema/source/index.rst
+ - template: jinja
+ - mode: 644
+ - require:
+ - file: salt_schema_doc_dirs
+ - defaults:
+ doc_name: "{{ doc_name }}"
+
+/srv/static/extern/salt-schema/source/services/catalog.rst:
+ file.managed:
+ - source: salt://sphinx/files/schema/source/services/catalog.rst
+ - template: jinja
+ - mode: 644
+ - require:
+ - file: salt_schema_doc_dirs
+ - defaults:
+ doc_name: "{{ doc_name }}"
+
+{### render service-schemas #}
+{%- set schema_list = salt['modelschema.schema_list']() %}
+
+# Schema name should be filtered by uniq.
+# TBD with salt 2017+
+{%- for schema_name, schema_item in schema_list.items() %}
+{%- set schema = salt['modelschema.schema_get'](schema_item.service, schema_item.role)[schema_item.service+'-'+schema_item.role] %}
+
+schema_dir_{{schema_item.service}}_{{schema_item.role}}:
+ file.directory:
+ - names:
+ - /srv/static/extern/salt-schema/source/services/{{ schema_item.service }}
+ - user: root
+ - mode: 755
+ - makedirs: true
+
+schema_rst_{{schema_item.service}}_{{schema_item.role}}:
+ file.managed:
+ - source: salt://sphinx/files/schema/source/services/schema.rst
+ - name: /srv/static/extern/salt-schema/source/services/{{schema_item.service}}/{{schema_item.role}}.rst
+ - template: jinja
+ - context:
+ schema_item: {{ schema_item }}
+ schema: {{ schema }}
+ - mode: 644
+ - require:
+ - file: schema_dir_{{schema_item.service}}_{{schema_item.role}}
+
+{%- endfor %}
+{### end render service-schemas #}
+
+{%- set mine_nodes = salt['mine.get']('*', 'grains.items') %}
+{%- if mine_nodes is mapping %}
+
+{%- for node_name, node_grains in mine_nodes.iteritems() %}
+
+/srv/static/extern/salt-schema/source/nodes/{{ node_name }}.rst:
+ file.managed:
+ - source: salt://sphinx/files/schema/source/nodes/node.rst
+ - template: jinja
+ - mode: 644
+ - require:
+ - file: salt_schema_doc_dirs
+ - defaults:
+ node_name: {{ node_name }}
+ node_grains: {{ node_grains|yaml }}
+
+{%- endfor %}
+
+{%- endif %}
+
+generate_sphinx_doc_schema_{{ doc_name }}:
+ cmd.run:
+ - name: {{ sphinx_build_bin }} -b {{ doc.builder }} /srv/static/extern/salt-schema/source /srv/static/sites/{{ doc_name }}
+ - require:
+ - file: /srv/static/sites/{{ doc_name }}
diff --git a/sphinx/files/salt/source/index.rst b/sphinx/files/salt/source/index.rst
index 1d6e69e..59a7ee1 100644
--- a/sphinx/files/salt/source/index.rst
+++ b/sphinx/files/salt/source/index.rst
@@ -7,7 +7,7 @@
{%- if doc.description is defined %}
{{ doc.description }}
{%- else %}
-Model-driven documentation of SaltStack infrastructure deployment.
+Documentation generated from SaltStack infrastructure model.
{%- endif %}
.. toctree::
diff --git a/sphinx/files/schema/Makefile b/sphinx/files/schema/Makefile
new file mode 100644
index 0000000..3149b99
--- /dev/null
+++ b/sphinx/files/schema/Makefile
@@ -0,0 +1,181 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+PAPER =
+BUILDDIR = build
+
+# User-friendly check for sphinx-build
+ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
+$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
+endif
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
+
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " dirhtml to make HTML files named index.html in directories"
+ @echo " singlehtml to make a single large HTML file"
+ @echo " pickle to make pickle files"
+ @echo " json to make JSON files"
+ @echo " htmlhelp to make HTML files and a HTML help project"
+ @echo " qthelp to make HTML files and a qthelp project"
+ @echo " devhelp to make HTML files and a Devhelp project"
+ @echo " epub to make an epub"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
+ @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
+ @echo " text to make text files"
+ @echo " man to make manual pages"
+ @echo " texinfo to make Texinfo files"
+ @echo " info to make Texinfo files and run them through makeinfo"
+ @echo " gettext to make PO message catalogs"
+ @echo " changes to make an overview of all changed/added/deprecated items"
+ @echo " xml to make Docutils-native XML files"
+ @echo " pseudoxml to make pseudoxml-XML files for display purposes"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+ifeq ($(origin BUILDDIR), undefined)
+ @echo "Warning! empty BUILDDIR variable!"
+else
+ [ ! -d $(BUILDDIR) ] || rm -rf $(BUILDDIR)/
+endif
+
+html:
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+ @echo
+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+ @echo
+ @echo "Build finished; now you can process the pickle files."
+
+json:
+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+ @echo
+ @echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+ @echo
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
+ ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+ @echo
+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/reclass-doc.qhcp"
+ @echo "To view the help file:"
+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/reclass-doc.qhc"
+
+devhelp:
+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+ @echo
+ @echo "Build finished."
+ @echo "To view the help file:"
+ @echo "# mkdir -p $$HOME/.local/share/devhelp/reclass-doc"
+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/reclass-doc"
+ @echo "# devhelp"
+
+epub:
+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+ @echo
+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo
+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
+ "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through pdflatex..."
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+latexpdfja:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through platex and dvipdfmx..."
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+ @echo
+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+ @echo
+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+texinfo:
+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+ @echo
+ @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
+ @echo "Run \`make' in that directory to run these through makeinfo" \
+ "(use \`make info' here to do that automatically)."
+
+info:
+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
+ @echo "Running Texinfo files through makeinfo..."
+ make -C $(BUILDDIR)/texinfo info
+ @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+
+gettext:
+ $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
+ @echo
+ @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+
+changes:
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+ @echo
+ @echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+ @echo
+ @echo "Link check complete; look for any errors in the above output " \
+ "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+ @echo "Testing of doctests in the sources finished, look at the " \
+ "results in $(BUILDDIR)/doctest/output.txt."
+
+xml:
+ $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
+ @echo
+ @echo "Build finished. The XML files are in $(BUILDDIR)/xml."
+
+pseudoxml:
+ $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
+ @echo
+ @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
diff --git a/sphinx/files/schema/source/conf.py b/sphinx/files/schema/source/conf.py
new file mode 100644
index 0000000..a2370b5
--- /dev/null
+++ b/sphinx/files/schema/source/conf.py
@@ -0,0 +1,229 @@
+# -*- coding: utf-8 -*-
+#
+# Pillar Schema Specification build configuration file, created by
+# sphinx-quickstart on Thu Nov 26 15:14:56 2015.
+#
+# 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.
+
+import sys
+import os
+
+
+{%- if doc.theme is defined %}
+{%- if doc.theme == "mosdocstheme" %}
+import mosdocstheme
+execfile(mosdocstheme.get_common_conf_path() + '/common_conf.py')
+{%- else %}
+try:
+ from {{ doc.theme }}.theme_conf import *
+except:
+ pass
+{%- endif %}
+{%- endif %}
+
+
+# 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.
+#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 = []
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'pillar-schema'
+copyright = u'{{ doc.year }}, {{ doc.author }}'
+
+# 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 = '{{ doc.version }}'
+# The full version, including alpha/beta/rc tags.
+release = '{{ doc.version }}'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+# If true, keep warnings as "system message" paragraphs in the built documents.
+#keep_warnings = False
+
+
+# -- 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 = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+#html_extra_path = []
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'pillar-schema'
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+ 'papersize': 'a4paper',
+ 'pointsize': '10pt',
+# 'preamble': '',
+}
+
+# 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 = [
+ ('index', 'pillar-schema.tex', u'{{ doc.get('title', 'Pillar Schema Specification') }}',
+ u'{{ doc.author }}', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
diff --git a/sphinx/files/schema/source/index.rst b/sphinx/files/schema/source/index.rst
new file mode 100644
index 0000000..b64786f
--- /dev/null
+++ b/sphinx/files/schema/source/index.rst
@@ -0,0 +1,8 @@
+
+.. toctree::
+ :maxdepth: 3
+
+ services/catalog
+
+.. nodes/index
+
diff --git a/sphinx/files/schema/source/nodes/index.rst b/sphinx/files/schema/source/nodes/index.rst
new file mode 100644
index 0000000..c483b30
--- /dev/null
+++ b/sphinx/files/schema/source/nodes/index.rst
@@ -0,0 +1,41 @@
+{%- set mine_nodes = salt['mine.get']('*', 'grains.items') %}
+{%- if mine_nodes is mapping %}
+
+====================
+Infrastructure Nodes
+====================
+
+Definition of all nodes within current infrastructure.
+
+.. list-table::
+ :widths: 30 15 55
+ :header-rows: 1
+
+ * - **Node FQDN**
+ - **IP Addresses**
+ - **Assigned Services**
+{%- for node_name, node_grains in mine_nodes|dictsort %}
+ * - :ref:`{{ node_name }}`
+{%- if node_grains.sphinx is defined %}
+ - {% for ip in node_grains.ipv4 %}
+ {%- if ip != "127.0.0.1" %}
+ * {{ ip }}
+ {%- endif %}
+ {%- endfor %}
+ - {% for service_name, service in node_grains.get('sphinx', {}).get('doc', {})|dictsort %}{% if service.role is mapping %}{% for role_name, role in service.role|dictsort %}{{ service_name }}-{{ role_name }} {% endfor %}{% endif %}{% endfor %}
+{%- else %}
+ - N/A
+ - N/A
+{%- endif %}
+{%- endfor %}
+
+.. toctree::
+ :maxdepth: 3
+
+{% for node_name, node_grains in mine_nodes|dictsort %}
+{%- if node_grains.get('sphinx_doc', {}) != None %}
+ {{ node_name }}
+{%- endif %}
+{% endfor %}
+
+{%- endif %}
diff --git a/sphinx/files/schema/source/nodes/node.rst b/sphinx/files/schema/source/nodes/node.rst
new file mode 100644
index 0000000..7f88971
--- /dev/null
+++ b/sphinx/files/schema/source/nodes/node.rst
@@ -0,0 +1,66 @@
+{% macro render_list(param) %}
+{%- if param %}
+ {%- if param is mapping %}
+ {%- for key, value in param.iteritems() %}
+- {{ key }}: {{ value }}
+ {%- endfor %}
+ {%- elif param is string or param is number %}
+{{ param }}
+ {%- else %}
+ {%- for p in param %}
+- {{ p }}
+ {%- endfor %}
+ {%- endif %}
+{%- else %}
+None
+{%- endif %}
+{% endmacro %}
+
+.. _{{ node_name }}:
+
+===============================================
+{{ node_name }}
+===============================================
+
+{%- if node_grains.get('sphinx_doc', {}) is not none %}
+
+ {%- for service_name, service in node_grains.get('sphinx', {}).get('doc', {})|dictsort %}
+
+Service {{ service_name }}
+===============================================
+
+.. list-table::
+ :widths: 15 15 70
+ :header-rows: 1
+
+ * - **Service Role**
+ - **Parameter**
+ - **Value**
+ {%- if service.role is mapping %}
+ {%- for role_name, role in service.role|dictsort %}
+ {%- if role.get('param', {}) %}
+ {%- for param_name, param in role.get('param', {})|dictsort %}
+ * - {{ service_name }}-{{ role_name }}
+ {%- if param is mapping %}
+ - {{ param.get('name', param_name) }}
+ -
+{{ render_list(param.value)|indent(8, True) }}
+ {%- else %}
+ - {{ param_name }}
+ - {{ param }}
+ {%- endif %}
+ {%- endfor %}
+ {%- endif %}
+ {%- endfor %}
+ {%- endif %}
+
+ {%- endfor %}
+
+{%- else %}
+
+This node has no documentation configured.
+
+{%- endif %}
+{#-
+ vim: syntax=jinja
+#}
diff --git a/sphinx/files/schema/source/services/catalog.rst b/sphinx/files/schema/source/services/catalog.rst
new file mode 100644
index 0000000..cb6eaa0
--- /dev/null
+++ b/sphinx/files/schema/source/services/catalog.rst
@@ -0,0 +1,37 @@
+
+==============================
+Overview of Available Services
+==============================
+
+Simple oveview of all defined services and their description.
+
+{%- set services = {} %}
+{%- for node_name, node_grains in salt['mine.get']('*', 'grains.items')|dictsort %}
+ {%- if node_grains.get('sphinx_doc', {}) != None %}
+ {%- set _dummy = services.update(node_grains.get('sphinx', {}).get('doc', {})) %}
+ {%- endif %}
+{%- endfor %}
+
+.. list-table::
+ :widths: 20 80
+ :header-rows: 1
+
+ * - **Service**
+ - **Description**
+{%- for service_name, service in services|dictsort %}
+ * - {{ service.name }}
+ - {{ service.get('description', 'nodescr') }}
+{%- endfor %}
+
+
+
+.. toctree::
+ :maxdepth: 10
+
+{% set schema_list = salt['modelschema.schema_list']() -%}
+{%- for schema_name, schema_item in schema_list.iteritems() %}
+{%- set schema = salt['modelschema.schema_get'](schema_item.service, schema_item.role)[schema_item.service+'-'+schema_item.role] %}
+ {{schema_item.service}}/{{schema_item.role}}.rst
+{%- endfor %}
+
+
diff --git a/sphinx/files/schema/source/services/schema.rst b/sphinx/files/schema/source/services/schema.rst
new file mode 100644
index 0000000..bc2cc43
--- /dev/null
+++ b/sphinx/files/schema/source/services/schema.rst
@@ -0,0 +1,114 @@
+
+==============================
+Metadata Schema Specifications
+==============================
+
+Service {{ schema_item.service }} {{ schema_item.role }}
+========================================================
+
+Core Properties
+---------------
+
+{# Macro, process only one schema object #}
+{%- macro chunk_object(o_name,obj) %}
+{% set vars = {'is_ref': False, 'descr' : obj.get('description', 'description_notset'), 'type' : obj.get('type', 'ERROR') } %}
+{%- if "properties" in obj %}
+ {%- if vars.update({'is_ref': obj.get("properties",{}).get('$ref', {}) }) %} {% endif %}
+{%- elif 'patternProperties' in obj and obj.patternProperties.get('$ref', False) %}
+ {%- if vars.update({'is_ref': obj.patternProperties.get('$ref', False)}) %} {% endif %}
+{%- elif 'patternProperties' in obj and not obj.patternProperties.get('$ref', {}) %}
+ {%- for key, value in obj.patternProperties.iteritems() %}
+ {%- if '$ref' in value %}
+ {%- if vars.update({'is_ref': value.get('$ref',False) }) %} {% endif %}
+ {%- endif %}
+ {% endfor %}
+{%- elif '$ref' in obj %}
+ {%- if vars.update({'is_ref': obj.get('$ref', False) }) %} {% endif %}
+{%- endif %}
+ {%- if vars.is_ref %}
+ * - {{ o_name }}
+ - {{ vars.type }}
+ - {{ vars.descr }}
+ {{ 'For details, see: :ref:`' + vars.is_ref|replace('#/definitions/','') + '`'}}
+ {%- elif not vars.is_ref and "properties" in obj %}
+ {%- for prop_name, prop in obj.properties.items() %}
+ {{ chunk_object(prop_name, prop) }}
+ {%- endfor %}
+ {%- else %}
+ * - {{ o_name }}
+ - {{ vars.type }}
+ - {{ vars.descr }}
+ {%- endif %}
+{%- endmacro %}
+
+{# Macro, process only one schema array #}
+{%- macro chunk_array(i_name,item) %}
+{%- set is_ref = False %}
+{%- set _descr = item.get('description', 'description_notset') %}
+{%- set _type = item.get('type', 'ERROR') %}
+{%- if '$ref' in item.get("items",[])%}
+ {%- set is_ref = item.get("items",[]).get('$ref', False) %}
+{%- endif %}
+ * - {{ i_name }}
+ - {{ _type }}
+ {%- if is_ref %}
+ - {{ _descr }}
+ {{ 'For details, see: :ref:`' + is_ref|replace('#/definitions/','') + '`'}}
+ {%- else %}
+ - {{ '**NO REF** ' +_descr }}
+ {%- endif %}
+{%- endmacro %}
+{###############}
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 4
+
+ * - **Name**
+ - **Type**
+ - **Description**
+{%- for param_name, param in schema.properties.items() %}
+{%- set _descr = param.get('description', 'description_notset') %}
+{%- set _type = param.get('type', 'ERROR') %}
+ {%- if _type == 'object' -%}
+ {{ chunk_object(param_name, param) }}
+ {%- elif _type == 'array' -%}
+ {{ chunk_array(param_name, param) }}
+ {%- else %}
+ * - {{ param_name }}
+ - {{ _type }}
+ - {{ _descr }}
+ {%- endif %}
+{%- endfor %}
+
+
+{%- if schema.get('definitions', None) != None %} {#2#}
+
+{%- for def_name, param in schema.definitions.items() %} {#3#}
+
+{{ '.. _' + def_name|lower + ':' }}
+
+{{ def_name }} definition
+------------------------------------------
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 4
+
+ * - **Name**
+ - **Type**
+ - **Description**
+{%- set _descr = param.get('description', 'description_notset') %}
+{%- set _type = param.get('type', 'ERROR') %}
+ {%- if _type == 'object' -%}
+ {{ chunk_object(def_name, param) }}
+ {%- elif _type == 'array' -%}
+ {{ chunk_array(def_name, param) }}
+ {%- else %}
+ * - {{ def_name }}
+ - {{ _type }}
+ - {{ _descr }}
+ {%- endif %}
+{% endfor %} {#3#}
+
+{% endif %} {#2#}
diff --git a/sphinx/server.sls b/sphinx/server.sls
index 8d01129..f29eb80 100755
--- a/sphinx/server.sls
+++ b/sphinx/server.sls
@@ -28,24 +28,31 @@
- require:
- file: /srv/static/sites
+{%- if doc.get("prebuilded_venv", False) %}
+ {%- set sphinx_build_bin = doc.prebuilded_venv + "/sphinx-build" %}
+{% else %}
+ {%- set sphinx_build_bin = "sphinx-build" %}
+{%- endif %}
+
+{% with sphinx_build_bin=sphinx_build_bin %}
{%- if doc.source.engine in ['reclass', 'salt-mine'] %}
{%- include "sphinx/_salt.sls" %}
{%- endif -%}
+{%- if doc.source.engine in ['pillar-schema'] %}
+{%- include "sphinx/_schema.sls" %}
+{%- endif -%}
+
{%- if doc.source.engine == 'git' %}
{%- include "sphinx/_git.sls" %}
{%- endif -%}
-
-{%- if doc.source.engine == 'local' %}
+{% endwith %}
generate_sphinx_doc_{{ doc_name }}:
cmd.run:
- - name: sphinx-build -b {{ doc.builder }} {{ doc.source.path }} /srv/static/sites/{{ doc_name }}
+ - name: {{ sphinx_build_bin }} -b {{ doc.builder }} /srv/static/extern/salt-schema/source /srv/static/sites/{{ doc_name }}
- require:
- file: /srv/static/sites/{{ doc_name }}
-
-{%- endif %}
-
{%- endfor %}
-{%- endif %}
\ No newline at end of file
+{%- endif %}