Initial commit of TryMCP cookiecutter templates

Change-Id: I2d15c2b34e36179df395be72c231ccc1677bf7f7
diff --git a/cluster_product/openstack/cookiecutter.json b/cluster_product/openstack/cookiecutter.json
new file mode 100644
index 0000000..042cb89
--- /dev/null
+++ b/cluster_product/openstack/cookiecutter.json
@@ -0,0 +1,41 @@
+{
+  "cluster_name":                   "trymcp",
+  "cluster_domain":                 "try-mcp.local",
+  "openstack_version":              "pike",
+
+  "aio_node_hostname":              "aos01",
+
+  "designate_enabled":              "True",
+  "tempest_enabled":                "False",
+
+  "neutron_public_subnet_gateway":  "192.168.130.1",
+  "neutron_public_subnet_cidr":     "192.168.130.0/24",
+  "neutron_public_subnet_start":    "192.168.130.10",
+  "neutron_public_subnet_end":      "192.168.130.254",
+
+  "rabbitmq_admin_password":              "<<WILL_BE_GENERATED>>",
+  "rabbitmq_openstack_password":          "<<WILL_BE_GENERATED>>",
+  "galera_server_maintenance_password":   "<<WILL_BE_GENERATED>>",
+  "galera_server_admin_password":         "<<WILL_BE_GENERATED>>",
+  "keystone_admin_password":              "<<WILL_BE_GENERATED>>",
+  "keystone_ceilometer_password":         "<<WILL_BE_GENERATED>>",
+  "keystone_cinder_password":             "<<WILL_BE_GENERATED>>",
+  "keystone_glance_password":             "<<WILL_BE_GENERATED>>",
+  "keystone_heat_password":               "<<WILL_BE_GENERATED>>",
+  "keystone_neutron_password":            "<<WILL_BE_GENERATED>>",
+  "keystone_nova_password":               "<<WILL_BE_GENERATED>>",
+  "keystone_designate_password":          "<<WILL_BE_GENERATED>>",
+  "mysql_keystone_password":              "<<WILL_BE_GENERATED>>",
+  "mysql_glance_password":                "<<WILL_BE_GENERATED>>",
+  "mysql_nova_password":                  "<<WILL_BE_GENERATED>>",
+  "mysql_neutron_password":               "<<WILL_BE_GENERATED>>",
+  "mysql_cinder_password":                "<<WILL_BE_GENERATED>>",
+  "mysql_heat_password":                  "<<WILL_BE_GENERATED>>",
+  "mysql_designate_password":             "<<WILL_BE_GENERATED>>",
+  "metadata_password":                    "<<WILL_BE_GENERATED>>",
+  "heat_domain_admin_password":           "<<WILL_BE_GENERATED>>",
+  "artifactory_password":                 "<<WILL_BE_GENERATED>>",
+  "rabbitmq_secret_key":                  "<<WILL_BE_GENERATED>>",
+  "horizon_secret_key":                   "<<WILL_BE_GENERATED>>",
+  "keystone_service_token":               "<<WILL_BE_GENERATED>>"
+}
diff --git "a/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/aio.yml" "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/aio.yml"
new file mode 100755
index 0000000..15e7f2d
--- /dev/null
+++ "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/aio.yml"
@@ -0,0 +1,45 @@
+classes:
+- system.linux.system.lowmem
+- system.linux.system.repo.mcp.openstack
+- system.linux.system.repo.mcp.extra
+- system.linux.system.repo.mcp.salt
+- system.linux.system.repo.mcp.apt_mirantis.saltstack
+- system.linux.system.single.debian
+- system.linux.storage.loopback
+- cluster.{{ cookiecutter.cluster_name }}.openstack.control
+- cluster.{{ cookiecutter.cluster_name }}.openstack.control_init
+- cluster.{{ cookiecutter.cluster_name }}.openstack.secret
+- cluster.{{ cookiecutter.cluster_name }}.openstack.proxy
+- cluster.{{ cookiecutter.cluster_name }}.openstack.dashboard
+- cluster.{{ cookiecutter.cluster_name }}.openstack.gateway
+- cluster.{{ cookiecutter.cluster_name }}.openstack.message_queue
+- cluster.{{ cookiecutter.cluster_name }}.openstack.database
+- cluster.{{ cookiecutter.cluster_name }}.openstack.database_init
+- cluster.{{ cookiecutter.cluster_name }}.openstack.networking
+- cluster.{{ cookiecutter.cluster_name }}.openstack
+parameters:
+  linux:
+    system:
+      # user and group keystone must exist before Apache state
+      user:
+        keystone:
+          enabled: true
+          name: keystone
+          home: /var/lib/keystone
+          shell: /bin/bash
+          system: true
+          uid: 301
+          gid: 301
+      group:
+        keystone:
+          enabled: true
+          name: keystone
+          system: true
+          gid: 301
+    network:
+      host:
+        aio01:
+          address: ${_param:aio01_node_address}
+          names:
+          - ${_param:aio01_node_hostname}
+          - ${_param:aio01_node_hostname}.${_param:cluster_domain}
diff --git "a/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/control.yml" "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/control.yml"
new file mode 100644
index 0000000..a9d14d2
--- /dev/null
+++ "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/control.yml"
@@ -0,0 +1,221 @@
+classes:
+- system.keystone.server.wsgi
+- system.keystone.server.single
+- system.glance.control.single
+- system.nova.control.single
+- system.neutron.control.openvswitch.single
+- system.neutron.client.service.public
+- system.heat.server.single
+- system.nova.compute.single
+- system.cinder.control.single
+- system.cinder.control.backend.lvm
+- service.cinder.volume.single
+- system.cinder.volume.backend.lvm
+{%- if cookiecutter.designate_enabled == 'True' %}
+- system.bind.server.single
+- system.designate.server.single
+- system.designate.server.backend.bind
+{%- endif %}
+{%- if cookiecutter.tempest_enabled == 'True' %}
+- service.runtest.tempest
+{%- endif %}
+- service.git.client
+- system.openssh.client.lab
+- system.salt.minion.cert.mysql.server
+- system.salt.minion.cert.proxy
+- system.memcached.server.single
+- system.auditd.server.ciscat
+- cluster.{{ cookiecutter.cluster_name }}.openstack
+parameters:
+  neutron:
+    server:
+      role: ${_param:openstack_node_role} # TODO: move this param to system.neutron.control.openvswitch.single
+      pkgs:
+        - neutron-server
+        - python-neutron-lbaas
+        - gettext-base
+        - python-pycadf
+        - neutron-plugin-ml2
+      api_workers: 2
+      rpc_state_report_workers: 2
+      rpc_workers: 2
+      message_queue:
+        ~members:
+          - host: ${_param:single_address}
+        port: ${_param:rabbitmq_port}
+        ssl:
+          enabled: ${_param:rabbitmq_ssl_enabled}
+      database:
+        ssl:
+          enabled: ${_param:galera_ssl_enabled}
+  nova:
+    compute:
+      vncproxy_url: http://${_param:single_address}:6080
+      network:
+        user: neutron
+        password: ${_param:keystone_neutron_password}
+        tenant: service
+      cache:
+        ~members:
+        - host: ${_param:single_address}
+          port: 11211
+      message_queue:
+        port: ${_param:rabbitmq_port}
+        ssl:
+          enabled: ${_param:rabbitmq_ssl_enabled}
+      # Since in AIO by default option config_drive is false,
+      # due to nova controller and compute states rewrite
+      # configs each, we must set config_drive option
+      # explicitly for runtest formula to discover the correct settings
+      config_drive:
+        forced: false
+    controller:
+      vncproxy_url: http://${_param:single_address}:6080
+      database:
+        ssl:
+          enabled: ${_param:galera_ssl_enabled}
+      message_queue:
+        port: ${_param:rabbitmq_port}
+        ssl:
+          enabled: ${_param:rabbitmq_ssl_enabled}
+  cinder:
+    controller:
+      database:
+        ssl:
+          enabled: ${_param:galera_ssl_enabled}
+      message_queue:
+        port: ${_param:rabbitmq_port}
+        ssl:
+          enabled: ${_param:rabbitmq_ssl_enabled}
+    volume:
+      cache:
+        ~members:
+        - host: ${_param:single_address}
+          port: 11211
+      database:
+        ssl:
+          enabled: ${_param:galera_ssl_enabled}
+      message_queue:
+        port: ${_param:rabbitmq_port}
+        ssl:
+          enabled: ${_param:rabbitmq_ssl_enabled}
+{%- if cookiecutter.designate_enabled == 'True' %}
+  designate:
+    server:
+      quota:
+        zones: ${_param:designate_quota_zones}
+      database:
+        ssl:
+          enabled: ${_param:galera_ssl_enabled}
+      message_queue:
+        port: ${_param:rabbitmq_port}
+        ssl:
+          enabled: ${_param:rabbitmq_ssl_enabled}
+    worker:
+      enabled: ${_param:designate_worker_enabled}
+{%- endif %}
+  glance:
+    server:
+      database:
+        ssl:
+          enabled: ${_param:galera_ssl_enabled}
+      message_queue:
+        port: ${_param:rabbitmq_port}
+        ssl:
+          enabled: ${_param:rabbitmq_ssl_enabled}
+  keystone:
+    server:
+      database:
+        ssl:
+          enabled: ${_param:galera_ssl_enabled}
+      message_queue:
+        port: ${_param:rabbitmq_port}
+        ssl:
+          enabled: ${_param:rabbitmq_ssl_enabled}
+    client:
+      enabled: true
+      server:
+        identity:
+          admin:
+            api_version: 3
+  heat:
+    server:
+      database:
+        ssl:
+          enabled: ${_param:galera_ssl_enabled}
+      message_queue:
+        port: ${_param:rabbitmq_port}
+        ssl:
+          enabled: ${_param:rabbitmq_ssl_enabled}
+{%- if cookiecutter.tempest_enabled == 'True' %}
+  runtest:
+    enabled: True
+    salttest:
+      enabled: True
+    tempest:
+      enabled: True
+      cfg_dir: ${_param:runtest_tempest_cfg_dir}
+      cfg_name: ${_param:runtest_tempest_cfg_name}
+      convert_to_uuid:
+        network:
+          public_network_id: ${_param:runtest_tempest_public_net}
+      compute:
+        build_timeout: 600
+        min_microversion: 2.1
+        max_microversion: 2.53
+      orchestration:
+        max_template_size: 5440000
+        max_resources_per_stack: 20000
+      dns_feature_enabled:
+        # Switch this to designate_admin_api_enabled once [1] is promoted to stable packages
+        # [1] https://gerrit.mcp.mirantis.net/gitweb?p=salt-formulas/designate.git;a=commit;h=96a3f43f6cf1149559e54a00b5548bdf46333749
+        api_admin: false
+        api_v1: false
+        api_v2: true
+        api_v2_quotas: true
+        api_v2_root_recordsets: true
+        bug_1573141_fixed: true
+      volume-feature-enabled:
+        backup: false
+      network:
+        floating_network_name: ${_param:runtest_tempest_public_net}
+    artifact_collector:
+      enabled: true
+      artifactory:
+        enabled: true
+        user: ${_param:artifactory_user}
+        password: ${_param:artifactory_password}
+        host: artifactory.mcp.mirantis.net
+        port: 443
+        proto: https
+        endpoint: /oscore-local/${_param:cluster_domain}/${_param:infra_config_hostname}
+      artifacts:
+        sys_logs:
+          path: /var/log
+        etc:
+          path: /etc
+      cmds:
+        service_status:
+          cmd: "(. /root/keystonercv3; openstack compute service list; openstack volume service list; openstack catalog list)"
+          dst: /tmp/openstack_service_report.txt
+{%- endif %}
+  openssh:
+    server:
+      password_auth: true
+      permit_root_login: true
+  linux:
+    system:
+      user:
+        root:
+          enabled: true
+          # r00tme
+          password: $6$9ojWyyN.$26Vj46JtCUL6C7XBQ8RmQTZLwo8/8SkqTRElXh0X2YBLrt7E/aVe2AYQ5gguYUwUknZNOSn5q7M9M3Jyf2gof/
+      repo:
+        linux_system_repo:
+          source: ${_param:linux_system_repo}
+          architectures: amd64
+          clean_file: true
+          pin:
+            - pin: ${_param:linux_system_repo_pin}
+              priority: ${_param:linux_system_repo_priority}
+              package: "*"
diff --git "a/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/control_init.yml" "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/control_init.yml"
new file mode 100644
index 0000000..0a0552f
--- /dev/null
+++ "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/control_init.yml"
@@ -0,0 +1,11 @@
+classes:
+- system.keystone.client.single
+- system.keystone.client.service.cinder3
+- system.keystone.client.service.nova21
+- system.keystone.client.service.nova-placement
+- system.keystone.client.service.designate
+parameters:
+  _param:
+    keystone_public_path: "/"
+    keystone_internal_path: "/"
+    keystone_admin_path: "/"
diff --git "a/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/dashboard.yml" "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/dashboard.yml"
new file mode 100644
index 0000000..69653bd
--- /dev/null
+++ "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/dashboard.yml"
@@ -0,0 +1,12 @@
+classes:
+- system.horizon.server.single
+parameters:
+  _param:
+    horizon_identity_host: ${_param:single_address} # doesn't work from init ?
+  horizon:
+    server:
+      secure: False
+      identity:
+        encryption: ${_param:horizon_identity_encryption}
+      api_versions:
+        identity: 3
diff --git "a/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/database.yml" "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/database.yml"
new file mode 100644
index 0000000..6877946
--- /dev/null
+++ "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/database.yml"
@@ -0,0 +1,19 @@
+classes:
+- service.galera.ssl
+- service.galera.master.cluster
+- system.galera.server.database.cinder
+- system.galera.server.database.designate
+- system.galera.server.database.glance
+- system.galera.server.database.heat
+- system.galera.server.database.keystone
+- system.galera.server.database.nova
+parameters:
+  galera:
+    master:
+      ~members:
+      - host: ${_param:single_address}
+        port: 4567
+      innodb_buffer_pool_size: 1024M
+      max_connections: 1000
+    slave:
+      enabled: false
diff --git "a/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/database_init.yml" "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/database_init.yml"
new file mode 100644
index 0000000..831c0bf
--- /dev/null
+++ "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/database_init.yml"
@@ -0,0 +1,2 @@
+classes:
+- system.mysql.client
diff --git "a/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/gateway.yml" "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/gateway.yml"
new file mode 100644
index 0000000..9487e4f
--- /dev/null
+++ "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/gateway.yml"
@@ -0,0 +1,13 @@
+classes:
+- service.neutron.gateway.single
+parameters:
+  neutron:
+    gateway:
+      metadata:
+        workers: 2
+      agent_mode: dvr_snat
+      dvr: true
+      message_queue:
+        port: ${_param:rabbitmq_port}
+        ssl:
+          enabled: ${_param:rabbitmq_ssl_enabled}
diff --git "a/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/init.yml" "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/init.yml"
new file mode 100644
index 0000000..3ceb04e
--- /dev/null
+++ "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/init.yml"
@@ -0,0 +1,84 @@
+parameters:
+  _param:
+    mysql_admin_user: root
+    mysql_cluster_role: master
+    loopback_device_size: 20
+    salt_minion_ca_host: ${linux:network:fqdn}
+
+    cluster_name: {{ cookiecutter.cluster_name }}
+    cluster_domain: {{ cookiecutter.cluster_domain }}
+    openstack_version: {{ cookiecutter.openstack_version }}
+    openstack_node_role: primary
+    aio01_node_hostname: {{ cookiecutter.aio_node_hostname }}
+    aio01_node_address: ${_param:single_address}
+
+    cluster_public_host: ${_param:single_address}
+    cluster_public_protocol: http
+    openstack_region: CustomRegion
+    admin_email: root@localhost
+    galera_server_cluster_name: openstack_cluster
+    keystone_version: ${_param:openstack_version}
+    glance_version: ${_param:openstack_version}
+    nova_version: ${_param:openstack_version}
+    neutron_version: ${_param:openstack_version}
+    cinder_version: ${_param:openstack_version}
+    heat_version: ${_param:openstack_version}
+    horizon_version: ${_param:openstack_version}
+    designate_version: ${_param:openstack_version}
+    keystone_service_host: ${_param:single_address}
+    heat_service_host: ${_param:single_address}
+    neutron_service_host: ${_param:single_address}
+    glance_service_host: ${_param:single_address}
+    cinder_service_host: ${_param:single_address}
+    designate_service_host: ${_param:single_address}
+    nova_service_host: ${_param:single_address}
+    control_address: ${_param:single_address}
+    cluster_vip_address: ${_param:single_address}
+    cluster_local_address: ${_param:single_address}
+    openstack_database_address: ${_param:single_address}
+    tenant_address: ${_param:single_address}
+    horizon_identity_encryption: none
+    horizon_identity_version: 2
+{%- if cookiecutter.designate_enabled == 'True' %}
+    designate_admin_api_enabled: true
+    designate_bind9_rndc_key: 4pc+X4PDqb2q+5o72dISm72LM1Ds9X2EYZjqg+nmsS7FhdTwzFFY8l/iEDmHxnyjkA33EQC8H+z0fLLBunoitw==
+    designate_pool_target_type: bind9
+    designate_domain_id: 5186883b-91fb-4891-bd49-e6769234a8fc
+    designate_pool_ns_records:
+      - hostname: "ns1.example.org."
+        priority: 10
+    designate_pool_nameservers:
+      - host: ${_param:single_address}
+        port: 53
+    designate_pool_target_masters:
+      - host: ${_param:single_address}
+        port: 5354
+    designate_pool_target_options:
+      host: ${_param:single_address}
+      port: 53
+      rndc_host: 127.0.0.1
+      rndc_port: 953
+      rndc_key_file: /etc/designate/rndc.key
+    designate_quota_zones: 40
+    designate_worker_enabled: true
+{%- endif %}
+    linux_system_repo: deb [arch=amd64] http://mirror.fuel-infra.org/mcp-repos/${_param:openstack_version}/xenial ${_param:openstack_version} main
+    linux_system_repo_pin: release a=${_param:openstack_version}
+    linux_system_repo_priority: 1200
+    openstack_public_neutron_subnet_gateway: {{ cookiecutter.neutron_public_subnet_gateway }}
+    openstack_public_neutron_subnet_cidr: {{ cookiecutter.neutron_public_subnet_cidr }}
+    openstack_public_neutron_subnet_allocation_start: {{ cookiecutter.neutron_public_subnet_start }}
+    openstack_public_neutron_subnet_allocation_end: {{ cookiecutter.neutron_public_subnet_end }}
+    galera_ssl_enabled: false
+    rabbitmq_ssl_enabled: false # untill rabbitmq formula with https://gerrit.mcp.mirantis.net/#/c/15198/ promoted to stable
+    rabbitmq_port: 5672 # for non-ssl use 5672/for ssl 5671
+{%- if cookiecutter.tempest_enabled == 'True' %}
+    runtest_tempest_cfg_dir: /root/rally_reports/
+    runtest_tempest_cfg_name: tempest_generated.conf
+    runtest_tempest_log_file: /home/rally/rally_reports/tempest.log
+    runtest_tempest_public_net: public
+    artifactory_user: artifactory_user
+{%- endif %}
+    openstack_log_appender: true
+    openstack_fluentd_handler_enabled: true
+    openstack_ossyslog_handler_enabled: true
diff --git "a/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/message_queue.yml" "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/message_queue.yml"
new file mode 100644
index 0000000..7f1599a
--- /dev/null
+++ "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/message_queue.yml"
@@ -0,0 +1,10 @@
+classes:
+- service.rabbitmq.server.ssl
+- system.rabbitmq.server.vhost.openstack
+- system.rabbitmq.server.single
+- system.salt.minion.cert.rabbitmq_server
+parameters:
+  rabbitmq:
+    server:
+      ssl:
+        enabled: ${_param:rabbitmq_ssl_enabled}
diff --git "a/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/networking.yml" "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/networking.yml"
new file mode 100644
index 0000000..1cca1ed
--- /dev/null
+++ "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/networking.yml"
@@ -0,0 +1,25 @@
+parameters:
+  linux:
+    network:
+      bridge: openvswitch
+      interface:
+        br-floating:
+          enabled: true
+          type: ovs_bridge
+        phy-public:
+          enabled: true
+          type: ovs_port
+          bridge: br-floating
+          proto: static
+          address: ${_param:openstack_public_neutron_subnet_gateway}
+          netmask: 255.255.255.0
+        ens4:
+          enabled: true
+          type: eth
+          proto: static
+          address: ${_param:single_address}
+          netmask: 255.255.255.0
+        ens3:
+          enabled: true
+          type: eth
+          proto: dhcp
diff --git "a/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/proxy.yml" "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/proxy.yml"
new file mode 100644
index 0000000..9157b20
--- /dev/null
+++ "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/proxy.yml"
@@ -0,0 +1,38 @@
+classes:
+- system.nginx.server.single
+parameters:
+  _param:
+    nginx_proxy_openstack_web_host: ${_param:cluster_public_host}
+    nginx_proxy_openstack_web_proxy_host: ${_param:cluster_vip_address}
+    nginx_proxy_openstack_web_buffer_size:
+      number: 4
+      size: 256
+  nginx:
+    server:
+      enabled: true
+      site:
+        nginx_proxy_openstack_web:
+          enabled: true
+          type: nginx_proxy
+          name: openstack_web
+          proxy:
+            host: localhost
+            # TODO: port must be configurable, as some deployments might have HAproxy over prx nodes
+            port: 8078
+            size: 10000m
+            timeout: 43200
+            protocol: http
+            websocket: true
+            request_buffer: false
+            buffer:
+              ${_param:nginx_proxy_openstack_web_buffer_size}
+          host:
+            name: ${_param:nginx_proxy_openstack_web_host}
+            port: 80
+            protocol: 443
+          ssl:
+            enabled: false
+  apache:
+    server:
+      bind:
+        listen_default_ports: false
diff --git "a/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/secret.yml" "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/secret.yml"
new file mode 100644
index 0000000..541fffd
--- /dev/null
+++ "b/cluster_product/openstack/\173\173 cookiecutter.cluster_name \175\175/openstack/secret.yml"
@@ -0,0 +1,27 @@
+parameters:
+  _param:
+    rabbitmq_admin_password: {{ cookiecutter.rabbitmq_admin_password }}
+    rabbitmq_openstack_password: {{ cookiecutter.rabbitmq_openstack_password }}
+    rabbitmq_secret_key: {{ cookiecutter.rabbitmq_secret_key }}
+    galera_server_maintenance_password: {{ cookiecutter.galera_server_maintenance_password }}
+    galera_server_admin_password: {{ cookiecutter.galera_server_admin_password }}
+    keystone_admin_password: {{ cookiecutter.keystone_admin_password }}
+    keystone_ceilometer_password: {{ cookiecutter.keystone_ceilometer_password }}
+    keystone_cinder_password: {{ cookiecutter.keystone_cinder_password }}
+    keystone_glance_password: {{ cookiecutter.keystone_glance_password }}
+    keystone_heat_password: {{ cookiecutter.keystone_heat_password }}
+    keystone_neutron_password: {{ cookiecutter.keystone_neutron_password }}
+    keystone_nova_password: {{ cookiecutter.keystone_nova_password }}
+    keystone_designate_password: {{ cookiecutter.keystone_designate_password }}
+    mysql_keystone_password: {{ cookiecutter.mysql_keystone_password }}
+    mysql_glance_password: {{ cookiecutter.mysql_glance_password }}
+    mysql_nova_password: {{ cookiecutter.mysql_nova_password }}
+    mysql_neutron_password: {{ cookiecutter.mysql_neutron_password }}
+    mysql_cinder_password: {{ cookiecutter.mysql_cinder_password }}
+    mysql_heat_password: {{ cookiecutter.mysql_heat_password }}
+    mysql_designate_password: {{ cookiecutter.mysql_designate_password }}
+    metadata_password: {{ cookiecutter.metadata_password }}
+    heat_domain_admin_password: {{ cookiecutter.heat_domain_admin_password }}
+    artifactory_password: {{ cookiecutter.artifactory_password }}
+    horizon_secret_key: {{ cookiecutter.horizon_secret_key }}
+    keystone_service_token: {{ cookiecutter.keystone_service_token }}
diff --git a/generate.py b/generate.py
new file mode 100755
index 0000000..7d95ecf
--- /dev/null
+++ b/generate.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+from __future__ import print_function
+import argparse
+import io
+import sys
+import yaml
+
+from cookiecutter.main import cookiecutter
+
+
+def read_ctx_file(config_file):
+    with io.open(config_file, encoding='utf-8') as file_handle:
+        yaml_string = file_handle.read()
+        try:
+            yaml_dict = yaml.load(yaml_string)
+        except Exception as e:
+            msg = 'Error: Could not load config YAML file.\n%s' % e
+            print(msg, file=sys.stderr)
+            sys.exit(1)
+
+    return yaml_dict.get('default_context', {})
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--template',
+                        required=True,
+                        help='path to cookiecutter template')
+    parser.add_argument('--config-file',
+                        help='path to YAML config file')
+    parser.add_argument('--output-dir',
+                        help='path to output model')
+    args = parser.parse_args()
+    template = args.template
+    config_file = args.config_file
+    extra_context = read_ctx_file(config_file) if config_file else {}
+    output_dir = args.output_dir or '.'
+
+    cookiecutter(
+        template,
+        extra_context=extra_context,
+        output_dir=output_dir,
+        no_input=True,
+        overwrite_if_exists=True
+    )
diff --git a/workflow_definition.yml b/workflow_definition.yml
new file mode 100644
index 0000000..ee5b7f0
--- /dev/null
+++ b/workflow_definition.yml
@@ -0,0 +1,201 @@
+general_params_action:
+  - name: "base"
+    label: "Base"
+    doc: |
+      Base
+      ====
+
+      This section covers basic deployment parameters. Supported deployment type is all-in-one for OpenStack.
+
+    fields:
+      # REQUIRED BY COOKIECUTTER
+      - name: "cluster_name"
+        type: "TEXT"
+        help_text: "Name of the cluster, used as cluster/<cluster_name>/ in directory structure."
+        initial: "try-mcp"
+      - name: "cluster_domain"
+        type: "TEXT"
+        help_text: "Cluster domain"
+        initial: "try-mcp.local"
+      - name: "aio_node_hostname"
+        type: "TEXT"
+        help_text: "Hostname for OpenStack server"
+        initial: "aio01"
+      - name: "tempest_enabled"
+        type: "BOOL"
+        help_text: "Enable basic Tempest test"
+        initial: false
+      - name: "designate_enabled"
+        type: "BOOL"
+        help_text: "Enable Designate service"
+        initial: false
+      - name: "rabbitmq_openstack_password"
+        type: "TEXT"
+        help_text: "OpenStack password for RabbitMQ"
+        initial: "{{ 32|generate_password }}"
+      - name: "rabbitmq_admin_password"
+        type: "TEXT"
+        help_text: "Admin password for RabbitMQ"
+        initial: "{{ 32|generate_password }}"
+      - name: "galera_server_admin_password"
+        type: "TEXT"
+        help_text: "Galera server admin password"
+        initial: "{{ 32|generate_password }}"
+      - name: "galera_server_maintenance_password"
+        type: "TEXT"
+        help_text: "Galera server maintenance admin password"
+        initial: "{{ 32|generate_password }}"
+      - name: "keystone_admin_password"
+        type: "TEXT"
+        help_text: "Keystone admin password"
+        initial: "{{ 32|generate_password }}"
+      - name: "keystone_ceilometer_password"
+        type: "TEXT"
+        help_text: "Keystone Ceilometer password"
+        initial: "{{ 32|generate_password }}"
+      - name: "keystone_cinder_password"
+        type: "TEXT"
+        help_text: "Keystone Cinder password"
+        initial: "{{ 32|generate_password }}"
+      - name: "keystone_glance_password"
+        type: "TEXT"
+        help_text: "Keystone Glance password"
+        initial: "{{ 32|generate_password }}"
+      - name: "keystone_heat_password"
+        type: "TEXT"
+        help_text: "Keystone Heat password"
+        initial: "{{ 32|generate_password }}"
+      - name: "keystone_neutron_password"
+        type: "TEXT"
+        help_text: "Keystone Neutron password"
+        initial: "{{ 32|generate_password }}"
+      - name: "keystone_nova_password"
+        type: "TEXT"
+        help_text: "Keystone Nova password"
+        initial: "{{ 32|generate_password }}"
+      - name: "keystone_designate_password"
+        type: "TEXT"
+        help_text: "Keystone Designate password"
+        initial: "{{ 32|generate_password }}"
+      - name: "mysql_keystone_password"
+        type: "TEXT"
+        help_text: "MySQL Keystone password"
+        initial: "{{ 32|generate_password }}"
+      - name: "mysql_neutron_password"
+        type: "TEXT"
+        help_text: "MySQL Neutron password"
+        initial: "{{ 32|generate_password }}"
+      - name: "mysql_glance_password"
+        type: "TEXT"
+        help_text: "MySQL Glance password"
+        initial: "{{ 32|generate_password }}"
+      - name: "mysql_nova_password"
+        type: "TEXT"
+        help_text: "MySQL Nova password"
+        initial: "{{ 32|generate_password }}"
+      - name: "mysql_cinder_password"
+        type: "TEXT"
+        help_text: "MySQL Cinder password"
+        initial: "{{ 32|generate_password }}"
+      - name: "mysql_heat_password"
+        type: "TEXT"
+        help_text: "MySQL Heat password"
+        initial: "{{ 32|generate_password }}"
+      - name: "mysql_designate_password"
+        type: "TEXT"
+        help_text: "MySQL Designate password"
+        initial: "{{ 32|generate_password }}"
+      - name: "metadata_password"
+        type: "TEXT"
+        help_text: "Metadata password"
+        initial: "{{ 32|generate_password }}"
+      - name: "heat_domain_admin_password"
+        type: "TEXT"
+        help_text: "Heat domain admin password"
+        initial: "{{ 32|generate_password }}"
+      - name: "artifactory_password"
+        type: "TEXT"
+        help_text: "Artifactory password"
+        initial: "{{ 32|generate_password }}"
+      - name: "rabbitmq_secret_key"
+        type: "TEXT"
+        help_text: "RabbitMQ secret key"
+        initial: "{{ 32|generate_password }}"
+      - name: "horizon_secret_key"
+        type: "TEXT"
+        help_text: "Horizon secret key"
+        initial: "{{ 32|generate_password }}"
+      - name: "keystone_service_token"
+        type: "TEXT"
+        help_text: "Keystone service token"
+        initial: "{{ 32|generate_password }}"
+      # REQUIRED BY PIPELINE
+      - name: "aio_internal_address"
+        type: "IP"
+        help_text: "Internal IP address of AIO node"
+        width: "half"
+      - name: "aio_external_address"
+        type: "IP"
+        help_text: "External IP address of AIO node"
+        width: "half"
+      - name: "drivetrain_internal_address"
+        type: "IP"
+        help_text: "Internal IP address of Drivetrain node"
+        width: "half"
+      - name: "drivetrain_external_address"
+        type: "IP"
+        help_text: "External IP address of Drivetrain node"
+        width: "half"
+      # REQUIRED BY PIPELINE - HIDDEN WITH DEFAULT
+      - name: "mcp_common_scripts_repo"
+        type: "TEXT"
+        initial: "https://github.com/Mirantis/mcp-common-scripts"
+        hidden: True
+      - name: "mcp_version"
+        type: "TEXT"
+        initial: "2018.8.0"
+        hidden: True
+      - name: "shared_reclass_url"
+        type: "TEXT"
+        initial: "https://github.com/Mirantis/reclass-system-salt-model.git"
+        hidden: True
+      - name: "shared_reclass_branch"
+        type: "TEXT"
+        initial: "2018.8.0"
+        hidden: True
+      - name: "cookiecutter_template_url"
+        type: "TEXT"
+        initial: "https://github.com/lotharkatt/cookiecutter-trymcp.git"
+        hidden: true
+      - name: "cookiecutter_template_branch"
+        type: "TEXT"
+        initial: "master"
+        hidden: True
+      - name: "salt_master_hostname"
+        type: "TEXT"
+        initial: "cfg01"
+        hidden: True
+      - name: "openstack_enabled"
+        type: "BOOL"
+        initial: true
+        hidden: True
+      - name: "infra_enabled"
+        type: "BOOL"
+        initial: false
+        hidden: True
+      - name: "local_repositories"
+        type: "BOOL"
+        initial: false
+        hidden: True
+      - name: "offline_deployment"
+        type: "BOOL"
+        initial: false
+        hidden: True
+      - name: "docker_deployment"
+        type: "BOOL"
+        initial: true
+        hidden: True
+      - name: "test_model"
+        type: "BOOL"
+        initial: false
+        hidden: True