diff --git a/.zuul.yaml b/.zuul.yaml
index d0f01dfa..82f1667f 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -122,13 +122,13 @@
XapfJuj7tAkFF+jeaWamB5CMiC+4M3zsrReB2/kqbxGFXC0nQ9q9AbVg48zCZFxNTVMLj
J5K79voMoMmFoP14trhneFDs1Ki8FOLU1fqU7KrBYrlixI4FJwJ6ljEM9C/OvU=
token: !encrypted/pkcs1-oaep
- - StrExdiOzIVLYO5xvvqXkIWXCWhdXREnl2VcgmPdfQnKgZ5KgDbtOnATMmowkijOtk3ov
- zH3O5arOdjawoqwWQ/9mHDfTLQZfphU6S3J2PrUoMOkWs0UoXVyS577ECSxbA9m4t6x+G
- Vfe2Uq8u12CUAomXGUlDBPgpTcKCFFLuQX9qF7FwEQ6I218QlzncVlwo2mGQ0PEGRzVWK
- l/KrZxrH8HzNPsB2+SqvYakj/7Ps3q3gedmk8Wq3q6xcdaXvKxmk4zcdvi03bzcmptDhE
- meRw/FZCHWEfclgWTDM+MbjqFXdhUTXO/JcjsofwrL3hOEV/3xm8+5XJhdfjUeFUbVw2t
- E/ZrJYscRzrTtSA4FAbS9XKO2YwixwvCsm7jSHkfQVf3P9bhczveOWllmTmWEzSvPxN+P
- 4oXPNnbxVRLgkISuh5kzBIcbXv8aWpcr9/EHTZCPLXqmY2x1sE1RbPOsNxDZqvllgM87k
- gHzCDPd39o2KnrNpS++f2hB7xv8DonnyAqFLsH3os/BbkIIdkRwF2p5I/1az47aheET8m
- QuZdGYtIzn0OeHfrKmUoF21D6G+zilwo9Gcy1qZQhWzvnIWgswCgzmnImVVT1DaEW97cW
- lgKmZ4uApQ6/TitoiFb4l3R/6iQqqHA+yLl3LvFkmGbGwt4fB9su0+r5BpASQ8=
+ - i6Js243rxTsL0V1l5UWsJalCiRh3kYs54nBz0M9KKrE5YYdAYkD59jKSPncUeG7V+VTkr
+ LuwGpI837r/oaYqD7g4ZZhsE/X+xSE1PSdtsSY3t5GZZAPdKG4oSLxl0buTd23JsS6cU4
+ 7IAh4Q28wtaIXg8fZ69KVkGm2f2nXPNKbUH/yPTjFW51yEXI55AClNKzv+mVKLd1PNdCN
+ USQkmF4fvgFreQym+NkZrUh78YMQI1uNT1e7rhD/jxYCjhZGAEr0Clxiu8UmLIRvxHgc2
+ 2SM99xT8s0/dRudePkSz3zXSagwWvdat8bHqpGHJrakjZvePtGeZrdk20v7JQHt8T3XBp
+ InfWRB8ad/gDvgpstXiag4EHsJ7tnFuwsFDh+KSYySBjtkbYqY8Rx8lQ5qW/Qgk96LagJ
+ yzpin6EquBcnnPNTGTYLRF9jtowzbI8G9ItRRWdvkIQSlMQDxROI4bVEnfLHgRMbAKVjF
+ 1oSaiEzMwMHj356qYBS06pBBF3Dr/OCIZNiBy3UU8J6OJt2XchMgy9TVhsGkj+HE092d+
+ mADSwkA5TpfWJCo8rqTDO8cCXIeiG8kBoxjph5m7YNWUcbuRDQdbga1FjV4lMe9bMyOo5
+ AJ6O8hl3q7CJElLw6Z7p9vW2wHUf/xr242pZnk70DiMkyXxzJFLLqvRsWctTDc=
diff --git a/Makefile b/Makefile
index d79f4e8a..efb3dd82 100644
--- a/Makefile
+++ b/Makefile
@@ -15,10 +15,10 @@
BUILD_DIR := $(shell mktemp -d)
DOCKER_REGISTRY ?= quay.io
IMAGE_NAME ?= drydock
-IMAGE_PREFIX ?= attcomdev
-IMAGE_TAG ?= latest
+IMAGE_PREFIX ?= airshipit
+IMAGE_TAG ?= dev
HELM := $(BUILD_DIR)/helm
-PROXY ?= http://one.proxy.att.com:8080
+PROXY ?= http://proxy.foo.com:8000
USE_PROXY ?= false
PUSH_IMAGE ?= false
LABEL ?= commit-id
@@ -108,9 +108,21 @@ security: external_dep
tox -e bandit
.PHONY: drydock_docs
-drydock_docs: external_dep
+drydock_docs: external_dep render_diagrams genpolicy genconfig
tox -e docs
+.PHONY: render_diagrams
+render_diagrams:
+ plantuml -v -tpng -o ../source/images docs/diagrams/*.uml
+
+.PHONY: genpolicy
+genpolicy:
+ tox -e genpolicy
+
+.PHONY: genconfig
+genconfig:
+ tox -e genconfig
+
.PHONY: clean
clean:
rm -rf $(BUILD_DIR)/*
diff --git a/docs/diagrams/architecture.uml b/docs/diagrams/architecture.uml
new file mode 100644
index 00000000..fa2a586a
--- /dev/null
+++ b/docs/diagrams/architecture.uml
@@ -0,0 +1,23 @@
+' PlantUML file to generate the architecture component diagram
+@startuml
+
+frame "Drydock" {
+ [Control] ..> [Statemgr]
+ [Orchestrator] ..> [Statemgr]
+ [Orchestrator] ..> [Ingester]
+ [Orchestrator] ..> [Driver]
+}
+
+database "Postgres" {
+ SQL - [drydock_db]
+}
+
+HTTP - [uWSGI]
+[uWSGI] --> [Keystone Middleware]
+[Keystone Middleware] --> WSGI
+WSGI - [Control]
+[Statemgr] --> [SQL]
+[Driver] --> [MAAS]
+
+
+@enduml
diff --git a/docs/diagrams/basic_task_sequence.uml b/docs/diagrams/basic_task_sequence.uml
new file mode 100644
index 00000000..8947992e
--- /dev/null
+++ b/docs/diagrams/basic_task_sequence.uml
@@ -0,0 +1,43 @@
+' PlantUML file describing the basic task execution
+' sequence diagram
+@startuml
+actor User
+
+== Task Creation ==
+
+User -> TasksAPI : POST task body
+TasksAPI -> oslo_policy : Enforce RBAC
+oslo_policy -> TasksAPI : Approved
+TasksAPI -> Statemgr : Insert Task as Queued
+Statemgr -> TasksAPI : Result
+TasksAPI -> User : Serialized Task
+
+== Task Execution ==
+
+Orchestrator -> Statemgr : Poll for Queued Tasks
+Statemgr -> Orchestrator : Task ID of Queued Task
+Orchestrator -> Statemgr : Update Task to Running
+Statemgr -> Orchestrator : Result
+Orchestrator -> Orchestrator : Execute task
+Orchestrator -> Ingester : Ingest Site Design
+Ingester -> Statemgr : Resolve Design Reference
+Statemgr -> Ingester : Raw Site Design
+Ingester -> Orchestrator : Parsed Site Design
+Orchestrator -> Orchestrator : Create Subtask
+Orchestrator ->> Driver : Execute Subtask
+par Threaded Task Execution
+ Driver -> Driver : Execute 1 or More Actions
+ Driver -> Statemgr : Update Subtask to Complete
+ Statemgr -> Driver : Result
+ loop Until Subtask Complete or Timeout
+ Orchestrator -> Statemgr : Poll Subtask Status
+ Statemgr -> Orchestrator : Subtask Status
+ end
+end
+Orchestrator -> Statemgr : Update Task to Complete
+
+== Task Query ==
+
+User -> TasksAPI : GET task
+
+@enduml
diff --git a/docs/requirements-doc.txt b/docs/requirements-doc.txt
new file mode 100644
index 00000000..17d655b1
--- /dev/null
+++ b/docs/requirements-doc.txt
@@ -0,0 +1,4 @@
+sphinx>=1.6.2
+sphinx_rtd_theme==0.2.4
+oslo.versionedobjects
+falcon
diff --git a/docs/source/conf.py b/docs/source/conf.py
index e1579ca6..16e1c81b 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -34,8 +34,6 @@ extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.todo',
'sphinx.ext.viewcode',
- 'oslo_config.sphinxconfiggen',
- 'oslo_policy.sphinxpolicygen'
]
# oslo_config.sphinxconfiggen options
diff --git a/docs/source/development.rst b/docs/source/development.rst
new file mode 100644
index 00000000..a179947d
--- /dev/null
+++ b/docs/source/development.rst
@@ -0,0 +1,148 @@
+..
+ Copyright 2018 AT&T Intellectual Property.
+ 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.
+
+=============================
+Developer Overview of Drydock
+=============================
+
+The core objective of Drydock is to fully deploy physical servers based on
+a declarative YAML topology. The actual provisioning work is completed by
+a downstream 3rd party tool managed by a pluggable driver. The initial use-case
+is Canonical MAAS.
+
+Architecture
+============
+
+.. image:: images/architecture.png
+ :alt: High level architecture of Drydock
+
+At a very high level Drydock is a very simple workflow engine fronted by a RESTful
+API and maintains state in a Postgres relational database. Clients create a task
+via the API that defines two main attributes of an action and a reference to a site design
+or topology. The Drydock orchestrator will asynchronously execute the task while
+the client polls the API for task status. Once execution is complete, the task status
+is updated with results and the orchestrator will move to the next queued task.
+
+.. image:: images/basic_task_sequence.png
+ :alt: Sequence diagram of basic task execution.
+
+Components
+==========
+
+Control
+-------
+
+The ``control`` module is simply the RESTful API. It is based on the
+`Falcon Framework `_ and utilizes oslo_policy
+for RBAC enforcement of the API endpoints. The normal deployment of Drydock
+uses `uWSGI `_ and PasteDeploy
+to build a pipeline that includes Keystone Middleware for authentication
+and role decoration of the request.
+
+Statemgr
+--------
+
+The ``statemgr`` module is the interface into all backing stores for Drydock.
+This is mainly a `Postgres `_, but Drydock
+also uses the state manager for accessing external URLs to ingest site designs.
+Interactions with Postgres use the core libraries of
+`SQLAlchemy `_ (not the ORM).
+
+Ingester
+--------
+
+The ``ingester`` module is basically a pluggable translator between external site definitions
+(currently supports YAML formats) and the internal object model. Most of the internal object
+model utilizes oslo_versionedobjects, much to my regret.
+
+Orchestrator
+------------
+
+The ``orchestrator`` module is the brain of the task execution. It requests queued tasks
+from the state manager and when one is available, it executes it. The orchestrator is
+single-threaded in that only a single user-created task is executed at once. However, that
+task can spawn many subtasks that may be executed concurrently depending on their synchronization
+requirements. For some actions, the orchestrator creates subtasks that are handed off to the
+driver for execution. A common question about this module is why Drydock doesn't use Celery
+as a task management engine. The simple answer is that it wasn't considered due to unfamiliarity
+at the time.
+
+Driver
+------
+
+The ``driver`` module is a framework that supports pluggable drivers to execute task actions. The
+subtle difference between the ``driver`` and ``orchestrator`` modules is the orchestrator manages
+a wide scope of task execution that may cross the boundaries of a single driver plugin. Each driver
+plugin is more focused on using a single downstream tool to accomplish the actions.
+
+Developer Workflow / Test Cycle
+===============================
+
+Because Airship is a container-centric platform, the developer workflow heavily utilizes containers
+for testing and publishing. It also requires Drydock to produce multiple artifacts that are related,
+but separate: the Python package, the Docker image and the Helm chart. The code is published via the
+Docker image artifact.
+
+Drydock strives to conform to the `Airship coding conventions `_.
+
+Python
+------
+
+The Drydock Python codebase is under ``/drydock_provisioner`` and the testing is under ``/tests``. The
+developer tools expect to run on Ubuntu 16.04 and you'll need GNU ``make`` available. With that you
+should be able to use make targets for testing code changes:
+
+ * ``make pep8`` - Lint the Python code against the PEP8 coding standard
+ * ``make unit_tests`` - Run the local unit tests
+ * ``make security`` - Scan the code with `Bandit `_
+ * ``make coverage_test`` - Run unit tests and Postgres integration tests
+
+Docker
+------
+
+The Drydock dockerfile is located in ``/images/drydock`` along with any artifacts built specifically
+to enable the container image. Again make targets are used for generating and testing the artifacts.
+
+ * ``make images`` - Build the Drydock Docker image. See :ref:`make-options` below.
+ * ``make run_images`` - Build the image and then run a rudimentary local test
+
+Helm
+----
+
+The Drydock helm chart is located in ``/charts/drydock``. Local testing currently only supports linting
+and previewing the rendered artifacts. Richer functional chart testing is a TODO.
+
+ * ``make helm_lint`` - Lint the Helm chart
+ * ``make dry-run`` - Render the chart and output the Kubernetes manifest YAML documents
+
+.. _make-options:
+
+Makefile Options
+----------------
+
+The Makefile supports a few options that override default values to allow use behind
+a proxy or for geneting the Docker image with custom tags.
+
+ * ``DOCKER_REGISTRY`` - Defaults to ``quay.io``, used as the Docker registry for tagging images
+ * ``IMAGE_NAME`` - Defaults to ``drydock``, the image name.
+ * ``IMAGE_PREFIX`` - Defaults to ``airshipit``, the registry organization to push images into
+ * ``IMAGE_TAG`` - Defaults to ``dev``, a tag to apply to the image
+ * ``PUSH_IMAGE`` - Defaults to ``false``, set to ``true`` if you want the build process to also
+ push the image. Likely will require you have previously run ``docker login``.
+ * ``PROXY`` - A HTTP/HTTPS proxy server to add to the image build environment. Required if you
+ are building the image behind a proxy.
+ * ``USE_PROXY`` - Defaults to ``false``, set to ``true`` to include the ``PROXY`` configuration
+ above in the build.
diff --git a/docs/source/getting_started.rst b/docs/source/getting_started.rst
index 73118693..dbb5e4ba 100644
--- a/docs/source/getting_started.rst
+++ b/docs/source/getting_started.rst
@@ -22,56 +22,43 @@ Bootstrap Kubernetes
--------------------
You can bootstrap your Helm-enabled Kubernetes cluster via the Openstack-Helm
-`AIO `_
-or the `Promenade `_ tools.
+`AIO `_
+or the `Promenade `_ tools.
Deploy Drydock and Dependencies
-------------------------------
Drydock is most easily deployed using Armada to deploy the Drydock
container into a Kubernetes cluster via Helm charts. The Drydock chart
-is in `aic-helm `_. It depends on
-the deployments of the `MaaS `_
-chart and the `Keystone `_ chart.
+is in the ``charts/drydock`` directory. It depends on
+the deployments of the `MaaS `_
+chart and the `Keystone `_ chart.
A integrated deployment of these charts can be accomplished using the
-`Armada `_ tool. An example integration
+`Armada `_ tool. An example integration
chart can be found in the
-`UCP-Integration `_ repo in the
-``./manifests/basic_ucp`` directory.
-
-.. code:: bash
-
- $ git clone https://github.com/att-comdev/ucp-integration
- $ sudo docker run -ti -v $(pwd):/target -v ~/.kube:/armaada/.kube quay.io/attcomdev/armada:master apply --tiller-host --tiller-port 44134 /target/manifests/basic_ucp/ucp-armada.yaml
- $ # wait for all pods in kubectl get pods -n ucp are 'Running'
- $ KS_POD=$(kubectl get pods -n ucp | grep keystone | cut -d' ' -f1)
- $ TOKEN=$(docker run --rm --net=host -e 'OS_AUTH_URL=http://keystone-api.ucp.svc.cluster.local:80/v3' -e 'OS_PASSWORD=password' -e 'OS_PROJECT_DOMAIN_NAME=default' -e 'OS_PROJECT_NAME=service' -e 'OS_REGION_NAME=RegionOne' -e 'OS_USERNAME=drydock' -e 'OS_USER_DOMAIN_NAME=default' -e 'OS_IDENTITY_API_VERSION=3' kolla/ubuntu-source-keystone:3.0.3 openstack token issue -f shell | grep ^id | cut -d'=' -f2 | tr -d '"')
- $ docker run --rm -ti --net=host -e "DD_TOKEN=$TOKEN" -e "DD_URL=http://drydock-api.ucp.svc.cluster.local:9000" -e "LC_ALL=C.UTF-8" -e "LANG=C.UTF-8" $DRYDOCK_IMAGE /bin/bash
-
+`Airship in a Bottle `_ repo in the
+``./manifests/dev_single_node`` directory.
Load Site
---------
To use Drydock for site configuration, you must craft and load a site topology
-YAML. An example of this is in ``./examples/designparts_v1.0.yaml``.
+YAML. An example of this is in ``./test/yaml_samples/deckhand_fullsite.yaml``.
Documentation on building your topology document is at :ref:`topology_label`.
-Use the Drydock CLI create a design and load the configuration
-
-.. code:: bash
-
- # drydock design create
- # drydock part create -d -f
+Drydock requires that the YAML topology be hosted somewhere, either the preferred
+method of using `Deckhand `_
+or through a simple HTTP server like Nginx or Apache.
Use the CLI to create tasks to deploy your site
.. code:: bash
- # drydock task create -d -a verify_site
- # drydock task create -d -a prepare_site
- # drydock task create -d -a prepare_node
- # drydock task create -d -a deploy_node
+ # drydock task create -d -a verify_site
+ # drydock task create -d -a prepare_site
+ # drydock task create -d -a prepare_nodes
+ # drydock task create -d -a deploy_nodes
A demo of this process is available at https://asciinema.org/a/133906
diff --git a/docs/source/images/architecture.png b/docs/source/images/architecture.png
new file mode 100644
index 00000000..00a6f936
Binary files /dev/null and b/docs/source/images/architecture.png differ
diff --git a/docs/source/images/basic_task_sequence.png b/docs/source/images/basic_task_sequence.png
new file mode 100644
index 00000000..a01ec0dd
Binary files /dev/null and b/docs/source/images/basic_task_sequence.png differ
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 7656dc82..ac1fef2e 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -37,7 +37,6 @@ Drydock Configuration Guide
policy-enforcement
exceptions/index
-
API Documentation
-----------------
.. toctree::
@@ -48,6 +47,13 @@ API Documentation
bootaction
validatedesign
+Developer Overview
+------------------
+.. toctree::
+ :maxdepth: 1
+
+ development
+
Client Documentation
--------------------
diff --git a/docs/source/policy-enforcement.rst b/docs/source/policy-enforcement.rst
index bb7d8525..83b33f0e 100644
--- a/docs/source/policy-enforcement.rst
+++ b/docs/source/policy-enforcement.rst
@@ -20,6 +20,6 @@ auto-generated from Drydock when this documentation is built, so
if you are having issues with an option, please compare your version of
Drydock with the version of this documentation.
-The sample policy file can also be viewed in `file form <_static/drydock.policy.yaml.sample>`_.
+The sample policy file can also be viewed in `file form <_static/policy.yaml.sample>`_.
-.. literalinclude:: _static/drydock.policy.yaml.sample
+.. literalinclude:: _static/policy.yaml.sample
diff --git a/drydock_provisioner/config.py b/drydock_provisioner/config.py
index f47074dd..51981a54 100644
--- a/drydock_provisioner/config.py
+++ b/drydock_provisioner/config.py
@@ -238,7 +238,6 @@ def _import_modules(module_names):
for module_name in module_names:
module = importlib.import_module(module_name)
if hasattr(module, 'list_opts'):
- print("Pulling options from module %s" % module.__name__)
imported_modules.append(module)
return imported_modules
diff --git a/drydock_provisioner/error.py b/drydock_provisioner/error.py
index 7d65a1d6..fe353f7a 100644
--- a/drydock_provisioner/error.py
+++ b/drydock_provisioner/error.py
@@ -187,7 +187,7 @@ class InvalidAssetLocation(BootactionError):
class BuildDataError(Exception):
"""
**Message:** *Error saving build data - data_element type
- could not be cast to string.
+ could not be cast to string*.
**Troubleshoot:**
diff --git a/etc/drydock/drydock-config-generator.conf b/etc/drydock/drydock-config-generator.conf
index f5c4cef9..097e92b8 100644
--- a/etc/drydock/drydock-config-generator.conf
+++ b/etc/drydock/drydock-config-generator.conf
@@ -1,5 +1,4 @@
[DEFAULT]
-output_file = etc/drydock/drydock.conf.sample
wrap_width = 80
namespace = drydock_provisioner
diff --git a/etc/drydock/drydock-policy-generator.conf b/etc/drydock/drydock-policy-generator.conf
index ec019203..71c08309 100644
--- a/etc/drydock/drydock-policy-generator.conf
+++ b/etc/drydock/drydock-policy-generator.conf
@@ -1,5 +1,4 @@
[DEFAULT]
-output_file = etc/drydock/policy.yaml.sample
wrap_width = 80
namespace = drydock_provisioner
diff --git a/etc/drydock/drydock.conf.sample b/etc/drydock/drydock.conf.sample
index 47772415..0ba497f2 100644
--- a/etc/drydock/drydock.conf.sample
+++ b/etc/drydock/drydock.conf.sample
@@ -8,15 +8,23 @@
# value)
#poll_interval = 10
+# How long a leader has to check-in before leadership can be usurped, in seconds
+# (integer value)
+#leader_grace_period = 300
-[bootdata]
+# How often will an instance attempt to claim leadership, in seconds (integer
+# value)
+#leadership_claim_interval = 30
+
+
+[database]
#
# From drydock_provisioner
#
-# Path to file to distribute for prom_init.sh (string value)
-#prom_init = /etc/drydock/bootdata/join.sh
+# The URI database connect string. (string value)
+#database_connect_string =
[keystone_authtoken]
@@ -218,6 +226,16 @@
#auth_section =
+[libvirt_driver]
+
+#
+# From drydock_provisioner
+#
+
+# Polling interval in seconds for querying libvirt status (integer value)
+#poll_interval = 10
+
+
[logging]
#
@@ -228,7 +246,7 @@
#log_level = INFO
# Logger name for the top-level logger (string value)
-#global_logger_name = drydock
+#global_logger_name = drydock_provisioner
# Logger name for OOB driver logging (string value)
#oobdriver_logger_name = ${global_logger_name}.oobdriver
@@ -285,10 +303,10 @@
# From drydock_provisioner
#
-# Module path string of a input ingester to enable (multi valued)
+# Module path string of a input ingester to enable (string value)
#ingester = drydock_provisioner.ingester.plugins.yaml.YamlIngester
-# Module path string of a OOB driver to enable (multi valued)
+# List of module path strings of OOB drivers to enable (list value)
#oob_driver = drydock_provisioner.drivers.oob.pyghmi_driver.PyghmiDriver
# Module path string of the Node driver to enable (string value)
@@ -298,6 +316,16 @@
#network_driver =
+[pyghmi_driver]
+
+#
+# From drydock_provisioner
+#
+
+# Polling interval in seconds for querying IPMI status (integer value)
+#poll_interval = 10
+
+
[timeouts]
#
@@ -331,3 +359,7 @@
# Timeout in minutes for deploying a node (integer value)
#deploy_node = 45
+
+# Timeout in minutes between deployment completion and the all boot actions
+# reporting status (integer value)
+#bootaction_final_status = 15
diff --git a/etc/drydock/policy.yaml.sample b/etc/drydock/policy.yaml.sample
index 33dd92a3..65706bf5 100644
--- a/etc/drydock/policy.yaml.sample
+++ b/etc/drydock/policy.yaml.sample
@@ -38,6 +38,10 @@
# POST /api/v1.0/tasks
#"physical_provisioner:destroy_nodes": "role:admin"
+# Read build data for a node
+# GET /api/v1.0/nodes/{nodename}/builddata
+#"physical_provisioner:read_build_data": "role:admin"
+
# Read loaded design data
# GET /api/v1.0/designs
# GET /api/v1.0/designs/{design_id}
@@ -48,11 +52,11 @@
# POST /api/v1.0/designs/{design_id}/parts
#"physical_provisioner:ingest_data": "role:admin"
+# et health status
+# GET /api/v1.0/health/extended
+#"physical_provisioner:health_data": "role:admin"
+
# Validate site design
# POST /api/v1.0/validatedesign
#"physical_provisioner:validate_site_design": "role:admin"
-# Get health status
-# GET /api/v1.0/health/extended
-#"physical_provisioner:health_data": "role:admin"
-
diff --git a/requirements-host.txt b/requirements-host.txt
index dde8818a..6b7b68ad 100644
--- a/requirements-host.txt
+++ b/requirements-host.txt
@@ -6,3 +6,4 @@ python3-dev
python-tox
docker.io
gcc
+plantuml
diff --git a/tools/gate/playbooks/doc-publish.yaml b/tools/gate/playbooks/doc-publish.yaml
index c174fd95..b444ac55 100644
--- a/tools/gate/playbooks/doc-publish.yaml
+++ b/tools/gate/playbooks/doc-publish.yaml
@@ -13,5 +13,5 @@
- hosts: primary
tasks:
- name: Publish current merged documents on readthedocs
- shell: 'set -x && curl -X POST -d "token={{ airship_drydock_readthedocs.token }}" "{{ airship_drydock_readthedocs.url }}"'
+ shell: 'set -x && curl -X POST -d "token={{ airship_drydock_readthedocs.token | trim }}" "{{ airship_drydock_readthedocs.url | trim }}"'
register: result
diff --git a/tools/gate/playbooks/zuul-linter.yaml b/tools/gate/playbooks/zuul-linter.yaml
index 7b6fb37f..3da76231 100644
--- a/tools/gate/playbooks/zuul-linter.yaml
+++ b/tools/gate/playbooks/zuul-linter.yaml
@@ -15,6 +15,6 @@
- hosts: primary
tasks:
- name: Execute a Whitespace Linter check
- command: find . -not -path "*/\.*" -not -path "*/doc/build/*" -not -name "*.tgz" -type f -exec egrep -l " +$" {} \;
+ command: find . -not -path "*/\.*" -not -path "*/docs/build/*" -not -path "*/docs/source/images/*" -not -name "*.tgz" -type f -exec egrep -l " +$" {} \;
register: result
- failed_when: result.stdout != ""
\ No newline at end of file
+ failed_when: result.stdout != ""
diff --git a/tox.ini b/tox.ini
index 35f63859..bce63ab0 100644
--- a/tox.ini
+++ b/tox.ini
@@ -56,10 +56,14 @@ commands=
{toxinidir}/tests/unit/ {toxinidir}/tests/integration/postgres
[testenv:genconfig]
-commands = oslo-config-generator --config-file=etc/drydock/drydock-config-generator.conf
+whitelist_externals=tee
+ sh
+commands = sh -c 'oslo-config-generator --config-file=etc/drydock/drydock-config-generator.conf | tee etc/drydock/drydock.conf.sample docs/source/_static/drydock.conf.sample'
[testenv:genpolicy]
-commands = oslopolicy-sample-generator --config-file etc/drydock/drydock-policy-generator.conf
+whitelist_externals=tee
+ sh
+commands = sh -c 'oslopolicy-sample-generator --config-file etc/drydock/drydock-policy-generator.conf | tee etc/drydock/policy.yaml.sample docs/source/_static/policy.yaml.sample'
[testenv:pep8]
commands = flake8 \
@@ -74,7 +78,10 @@ exclude= venv,.venv,.git,.idea,.tox,*.egg-info,*.eggs,bin,dist,./build/,alembic/
max-line-length=119
[testenv:docs]
+deps=
+ -rdocs/requirements-doc.txt
whitelist_externals=rm
+recreate=true
commands =
rm -rf docs/build
sphinx-build -b html docs/source docs/build