Просмотр исходного кода

Merge pull request #878 from openshift/master

Master to prod
Kenny Woodson 9 лет назад
Родитель
Сommit
5ed4261296
100 измененных файлов с 5280 добавлено и 1365 удалено
  1. 1 0
      .gitignore
  2. 1 1
      .tito/packages/openshift-ansible
  3. 1 0
      README_vagrant.md
  4. 0 1
      bin/openshift_ansible/multi_ec2.py
  5. 1 0
      bin/openshift_ansible/multi_inventory.py
  6. 21 10
      filter_plugins/oo_filters.py
  7. 51 0
      filter_plugins/oo_zabbix_filters.py
  8. 43 9
      inventory/byo/hosts.example
  9. 187 1
      openshift-ansible.spec
  10. 12 1
      playbooks/adhoc/uninstall.yml
  11. 0 1
      playbooks/adhoc/upgrades/filter_plugins
  12. 0 1
      playbooks/adhoc/upgrades/lookup_plugins
  13. 0 1
      playbooks/adhoc/upgrades/roles
  14. 1 0
      playbooks/aws/openshift-cluster/config.yml
  15. 1 0
      playbooks/byo/openshift-cluster/config.yml
  16. 8 0
      playbooks/byo/openshift-cluster/upgrades/README.md
  17. 5 5
      playbooks/adhoc/upgrades/README.md
  18. 9 0
      playbooks/byo/openshift-cluster/upgrades/v3_0_minor/upgrade.yml
  19. 17 0
      playbooks/byo/openshift-cluster/upgrades/v3_0_to_v3_1/README.md
  20. 9 0
      playbooks/byo/openshift-cluster/upgrades/v3_0_to_v3_1/upgrade.yml
  21. 1 1
      playbooks/common/openshift-cluster/config.yml
  22. 15 3
      playbooks/common/openshift-cluster/evaluate_groups.yml
  23. 9 0
      playbooks/common/openshift-cluster/scaleup.yml
  24. 188 0
      playbooks/common/openshift-cluster/upgrades/files/pre-upgrade-check
  25. 10 0
      playbooks/common/openshift-cluster/upgrades/files/versions.sh
  26. 1 0
      playbooks/common/openshift-cluster/upgrades/filter_plugins
  27. 154 0
      playbooks/common/openshift-cluster/upgrades/library/openshift_upgrade_config.py
  28. 1 0
      playbooks/common/openshift-cluster/upgrades/lookup_plugins
  29. 1 0
      playbooks/common/openshift-cluster/upgrades/roles
  30. 1 0
      playbooks/common/openshift-cluster/upgrades/v3_0_minor/filter_plugins
  31. 1 0
      playbooks/common/openshift-cluster/upgrades/v3_0_minor/library
  32. 1 0
      playbooks/common/openshift-cluster/upgrades/v3_0_minor/lookup_plugins
  33. 1 0
      playbooks/common/openshift-cluster/upgrades/v3_0_minor/roles
  34. 5 31
      playbooks/adhoc/upgrades/upgrade.yml
  35. 1 0
      playbooks/common/openshift-cluster/upgrades/v3_0_to_v3_1/filter_plugins
  36. 1 0
      playbooks/common/openshift-cluster/upgrades/v3_0_to_v3_1/library
  37. 1 0
      playbooks/common/openshift-cluster/upgrades/v3_0_to_v3_1/lookup_plugins
  38. 1 0
      playbooks/common/openshift-cluster/upgrades/v3_0_to_v3_1/roles
  39. 429 0
      playbooks/common/openshift-cluster/upgrades/v3_0_to_v3_1/upgrade.yml
  40. 2 0
      playbooks/common/openshift-etcd/config.yml
  41. 96 3
      playbooks/common/openshift-master/config.yml
  42. 78 0
      playbooks/common/openshift-node/config.yml
  43. 1 0
      playbooks/gce/openshift-cluster/config.yml
  44. 1 1
      playbooks/gce/openshift-cluster/join_node.yml
  45. 1 0
      playbooks/libvirt/openshift-cluster/config.yml
  46. 1 0
      playbooks/openstack/openshift-cluster/config.yml
  47. 45 0
      roles/flannel/README.md
  48. 8 0
      roles/flannel/defaults/main.yaml
  49. 8 0
      roles/flannel/handlers/main.yml
  50. 16 0
      roles/flannel/meta/main.yml
  51. 43 0
      roles/flannel/tasks/main.yml
  52. 47 0
      roles/flannel_register/README.md
  53. 11 0
      roles/flannel_register/defaults/main.yaml
  54. 16 0
      roles/flannel_register/meta/main.yml
  55. 14 0
      roles/flannel_register/tasks/main.yml
  56. 8 0
      roles/flannel_register/templates/flannel-config.json
  57. 34 0
      roles/haproxy/README.md
  58. 21 0
      roles/haproxy/defaults/main.yml
  59. 5 0
      roles/haproxy/handlers/main.yml
  60. 14 0
      roles/haproxy/meta/main.yml
  61. 25 0
      roles/haproxy/tasks/main.yml
  62. 76 0
      roles/haproxy/templates/haproxy.cfg.j2
  63. 3 0
      roles/kube_nfs_volumes/README.md
  64. 6 0
      roles/kube_nfs_volumes/defaults/main.yml
  65. 7 6
      roles/kube_nfs_volumes/tasks/main.yml
  66. 1 0
      roles/kube_nfs_volumes/templates/v1/nfs.json.j2
  67. 0 0
      roles/kube_nfs_volumes/templates/v1beta3/nfs.json.j2
  68. 35 4
      roles/lib_zabbix/library/zbx_itemprototype.py
  69. 262 0
      roles/lib_zabbix/library/zbx_itservice.py
  70. 4 1
      roles/lib_zabbix/library/zbx_trigger.py
  71. 4 0
      roles/lib_zabbix/tasks/create_template.yml
  72. 5 0
      roles/openshift_common/tasks/main.yml
  73. 2 0
      roles/openshift_examples/defaults/main.yml
  74. 12 3
      roles/openshift_examples/examples-sync.sh
  75. 167 40
      roles/openshift_examples/files/examples/image-streams/image-streams-centos7.json
  76. 160 36
      roles/openshift_examples/files/examples/image-streams/image-streams-rhel7.json
  77. 151 0
      roles/openshift_examples/files/examples/infrastructure-templates/enterprise/logging-deployer.yaml
  78. 116 0
      roles/openshift_examples/files/examples/infrastructure-templates/enterprise/metrics-deployer.yaml
  79. 151 0
      roles/openshift_examples/files/examples/infrastructure-templates/origin/logging-deployer.yaml
  80. 116 0
      roles/openshift_examples/files/examples/infrastructure-templates/origin/metrics-deployer.yaml
  81. 35 28
      roles/openshift_examples/files/examples/xpaas-streams/jboss-image-streams.json
  82. 325 0
      roles/openshift_examples/files/examples/xpaas-templates/amq62-basic.json
  83. 121 39
      roles/openshift_examples/files/examples/xpaas-templates/amq6-persistent.json
  84. 343 0
      roles/openshift_examples/files/examples/xpaas-templates/amq62-persistent.json
  85. 134 37
      roles/openshift_examples/files/examples/xpaas-templates/amq6.json
  86. 118 105
      roles/openshift_examples/files/examples/xpaas-templates/eap6-amq-persistent-sti.json
  87. 113 103
      roles/openshift_examples/files/examples/xpaas-templates/eap6-amq-sti.json
  88. 67 66
      roles/openshift_examples/files/examples/xpaas-templates/eap6-basic-sti.json
  89. 79 74
      roles/openshift_examples/files/examples/xpaas-templates/eap6-https-sti.json
  90. 116 92
      roles/openshift_examples/files/examples/xpaas-templates/eap6-mongodb-persistent-sti.json
  91. 106 85
      roles/openshift_examples/files/examples/xpaas-templates/eap6-mongodb-sti.json
  92. 113 88
      roles/openshift_examples/files/examples/xpaas-templates/eap6-mysql-persistent-sti.json
  93. 108 86
      roles/openshift_examples/files/examples/xpaas-templates/eap6-mysql-sti.json
  94. 111 89
      roles/openshift_examples/files/examples/xpaas-templates/eap6-postgresql-persistent-sti.json
  95. 102 83
      roles/openshift_examples/files/examples/xpaas-templates/eap6-postgresql-sti.json
  96. 56 34
      roles/openshift_examples/files/examples/xpaas-templates/jws-tomcat8-basic-sti.json
  97. 68 42
      roles/openshift_examples/files/examples/xpaas-templates/jws-tomcat8-https-sti.json
  98. 106 62
      roles/openshift_examples/files/examples/xpaas-templates/jws-tomcat7-mongodb-persistent-sti.json
  99. 96 92
      roles/openshift_examples/files/examples/xpaas-templates/jws-tomcat8-mongodb-persistent-sti.json
  100. 0 0
      roles/openshift_examples/files/examples/xpaas-templates/jws-tomcat7-mysql-persistent-sti.json

+ 1 - 0
.gitignore

@@ -15,4 +15,5 @@
 .DS_Store
 gce.ini
 multi_ec2.yaml
+multi_inventory.yaml
 .vagrant

+ 1 - 1
.tito/packages/openshift-ansible

@@ -1 +1 @@
-3.0.7-1 ./
+3.0.12-1 ./

+ 1 - 0
README_vagrant.md

@@ -1,5 +1,6 @@
 Requirements
 ------------
+- ansible (the latest 1.9 release is preferred, but any version greater than 1.9.1 should be sufficient).
 - vagrant (tested against version 1.7.2)
 - vagrant-hostmanager plugin (tested against version 1.5.0)
 - vagrant-registration plugin (only required for enterprise deployment type)

+ 0 - 1
bin/openshift_ansible/multi_ec2.py

@@ -1 +0,0 @@
-../../inventory/multi_ec2.py

+ 1 - 0
bin/openshift_ansible/multi_inventory.py

@@ -0,0 +1 @@
+../../inventory/multi_inventory.py

+ 21 - 10
filter_plugins/oo_filters.py

@@ -243,6 +243,21 @@ class FilterModule(object):
         return string.split(separator)
 
     @staticmethod
+    def oo_haproxy_backend_masters(hosts):
+        ''' This takes an array of dicts and returns an array of dicts
+            to be used as a backend for the haproxy role
+        '''
+        servers = []
+        for idx, host_info in enumerate(hosts):
+            server = dict(name="master%s" % idx)
+            server_ip = host_info['openshift']['common']['ip']
+            server_port = host_info['openshift']['master']['api_port']
+            server['address'] = "%s:%s" % (server_ip, server_port)
+            server['opts'] = 'check'
+            servers.append(server)
+        return servers
+
+    @staticmethod
     def oo_filter_list(data, filter_attr=None):
         ''' This returns a list, which contains all items where filter_attr
             evaluates to true
@@ -260,7 +275,7 @@ class FilterModule(object):
             raise errors.AnsibleFilterError("|failed expects filter_attr is a str")
 
         # Gather up the values for the list of keys passed in
-        return [x for x in data if x[filter_attr]]
+        return [x for x in data if x.has_key(filter_attr) and x[filter_attr]]
 
     @staticmethod
     def oo_parse_heat_stack_outputs(data):
@@ -362,14 +377,9 @@ class FilterModule(object):
             else:
                 certificate['names'] = []
 
-            if not os.path.isfile(certificate['certfile']) and not os.path.isfile(certificate['keyfile']):
-                # Unable to find cert/key, try to prepend data_dir to paths
-                certificate['certfile'] = os.path.join(data_dir, certificate['certfile'])
-                certificate['keyfile'] = os.path.join(data_dir, certificate['keyfile'])
-                if not os.path.isfile(certificate['certfile']) and not os.path.isfile(certificate['keyfile']):
-                    # Unable to find cert/key in data_dir
-                    raise errors.AnsibleFilterError("|certificate and/or key does not exist '%s', '%s'" %
-                                                    (certificate['certfile'], certificate['keyfile']))
+            if not os.path.isfile(certificate['certfile']) or not os.path.isfile(certificate['keyfile']):
+                raise errors.AnsibleFilterError("|certificate and/or key does not exist '%s', '%s'" %
+                                                (certificate['certfile'], certificate['keyfile']))
 
             try:
                 st_cert = open(certificate['certfile'], 'rt').read()
@@ -407,5 +417,6 @@ class FilterModule(object):
             "oo_split": self.oo_split,
             "oo_filter_list": self.oo_filter_list,
             "oo_parse_heat_stack_outputs": self.oo_parse_heat_stack_outputs,
-            "oo_parse_certificate_names": self.oo_parse_certificate_names
+            "oo_parse_certificate_names": self.oo_parse_certificate_names,
+            "oo_haproxy_backend_masters": self.oo_haproxy_backend_masters
         }

+ 51 - 0
filter_plugins/oo_zabbix_filters.py

@@ -95,6 +95,54 @@ class FilterModule(object):
 
         return data
 
+    @staticmethod
+    def itservice_results_builder(data, clusters, keys):
+        '''Take a list of dict results,
+           loop through each results and create a hash
+           of:
+             [{clusterid:  cluster1, key: 111 }]
+        '''
+        r_list = []
+        for cluster in clusters:
+            for results in data:
+                if cluster == results['item'][0]:
+                    results = results['results']
+                    if results and len(results) > 0 and all([results[0].has_key(_key) for _key in keys]):
+                        tmp = {}
+                        tmp['clusterid'] = cluster
+                        for key in keys:
+                            tmp[key] = results[0][key]
+                        r_list.append(tmp)
+
+        return r_list
+
+    @staticmethod
+    def itservice_dependency_builder(data, cluster):
+        '''Take a list of dict results,
+           loop through each results and create a hash
+           of:
+             [{clusterid:  cluster1, key: 111 }]
+        '''
+        r_list = []
+        for dep in data:
+            if cluster == dep['clusterid']:
+                r_list.append({'name': '%s - %s' % (dep['clusterid'], dep['description']), 'dep_type': 'hard'})
+
+        return r_list
+
+    @staticmethod
+    def itservice_dep_builder_list(data):
+        '''Take a list of dict results,
+           loop through each results and create a hash
+           of:
+             [{clusterid:  cluster1, key: 111 }]
+        '''
+        r_list = []
+        for dep in data:
+            r_list.append({'name': '%s' % dep, 'dep_type': 'hard'})
+
+        return r_list
+
     def filters(self):
         ''' returns a mapping of filters to methods '''
         return {
@@ -105,4 +153,7 @@ class FilterModule(object):
             "create_data": self.create_data,
             "oo_build_zabbix_collect": self.oo_build_zabbix_collect,
             "oo_remove_attr_from_list_dict": self.oo_remove_attr_from_list_dict,
+            "itservice_results_builder": self.itservice_results_builder,
+            "itservice_dependency_builder": self.itservice_dependency_builder,
+            "itservice_dep_builder_list": self.itservice_dep_builder_list,
         }

+ 43 - 9
inventory/byo/hosts.example

@@ -5,6 +5,7 @@
 masters
 nodes
 etcd
+lb
 
 # Set variables common for all OSEv3 hosts
 [OSEv3:vars]
@@ -41,6 +42,9 @@ openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true',
 # Allow all auth
 #openshift_master_identity_providers=[{'name': 'allow_all', 'login': 'true', 'challenge': 'true', 'kind': 'AllowAllPasswordIdentityProvider'}]
 
+# LDAP auth
+#openshift_master_identity_providers=[{'name': 'my_ldap_provider', 'challenge': 'true', 'login': 'true', 'kind': 'LDAPPasswordIdentityProvider', 'attributes': {'id': ['dn'], 'email': ['mail'], 'name': ['cn'], 'preferredUsername': ['uid']}, 'bindDN': '', 'bindPassword': '', 'ca': '', 'insecure': 'false', 'url': 'ldap://ldap.example.com:389/ou=users,dc=example,dc=com?uid'}]
+
 # Project Configuration
 #osm_project_request_message=''
 #osm_project_request_template=''
@@ -57,21 +61,29 @@ openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true',
 # Set cockpit plugins
 #osm_cockpit_plugins=['cockpit-kubernetes']
 
-# master cluster ha variables using pacemaker or RHEL HA
+# Native high availbility cluster method with optional load balancer.
+# If no lb group is defined installer assumes that a load balancer has
+# been preconfigured. For installation the value of
+# openshift_master_cluster_hostname must resolve to the load balancer
+# or to one or all of the masters defined in the inventory if no load
+# balancer is present.
+#openshift_master_cluster_method=native
+#openshift_master_cluster_hostname=openshift-ansible.test.example.com
+#openshift_master_cluster_public_hostname=openshift-ansible.test.example.com
+
+# Pacemaker high availability cluster method.
+# Pacemaker HA environment must be able to self provision the
+# configured VIP. For installation openshift_master_cluster_hostname
+# must resolve to the configured VIP.
+#openshift_master_cluster_method=pacemaker
 #openshift_master_cluster_password=openshift_cluster
 #openshift_master_cluster_vip=192.168.133.25
 #openshift_master_cluster_public_vip=192.168.133.25
 #openshift_master_cluster_hostname=openshift-ansible.test.example.com
 #openshift_master_cluster_public_hostname=openshift-ansible.test.example.com
 
-# master cluster ha variables when using a different HA solution
-# For installation the value of openshift_master_cluster_hostname must resolve
-# to the first master defined in the inventory.
-# The HA solution must be manually configured after installation and must ensure
-# that the master is running on a single master host.
-#openshift_master_cluster_hostname=openshift-ansible.test.example.com
-#openshift_master_cluster_public_hostname=openshift-ansible.test.example.com
-#openshift_master_cluster_defer_ha=True
+# Override the default controller lease ttl
+#osm_controller_lease_ttl=30
 
 # default subdomain to use for exposed routes
 #osm_default_subdomain=apps.test.example.com
@@ -104,6 +116,25 @@ openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true',
 # Detected names may be overridden by specifying the "names" key
 #openshift_master_named_certificates=[{"certfile": "/path/to/custom1.crt", "keyfile": "/path/to/custom1.key", "names": ["public-master-host.com"]}]
 
+# Session options
+#openshift_master_session_name=ssn
+#openshift_master_session_max_seconds=3600
+
+# An authentication and encryption secret will be generated if secrets
+# are not provided. If provided, openshift_master_session_auth_secrets
+# and openshift_master_encryption_secrets must be equal length.
+#
+# Signing secrets, used to authenticate sessions using
+# HMAC. Recommended to use secrets with 32 or 64 bytes.
+#openshift_master_session_auth_secrets=['DONT+USE+THIS+SECRET+b4NV+pmZNSO']
+#
+# Encrypting secrets, used to encrypt sessions. Must be 16, 24, or 32
+# characters long, to select AES-128, AES-192, or AES-256.
+#openshift_master_session_encryption_secrets=['DONT+USE+THIS+SECRET+b4NV+pmZNSO']
+
+# configure how often node iptables rules are refreshed
+#openshift_node_iptables_sync_period=5s
+
 # host group for masters
 [masters]
 ose3-master[1:3]-ansible.test.example.com
@@ -111,6 +142,9 @@ ose3-master[1:3]-ansible.test.example.com
 [etcd]
 ose3-etcd[1:3]-ansible.test.example.com
 
+[lb]
+ose3-lb-ansible.test.example.com
+
 # NOTE: Currently we require that masters be part of the SDN which requires that they also be nodes
 # However, in order to ensure that your masters are not burdened with running pods you should
 # make them unschedulable by adding openshift_scheduleable=False any node that's also a master.

+ 187 - 1
openshift-ansible.spec

@@ -5,7 +5,7 @@
 }
 
 Name:           openshift-ansible
-Version:        3.0.7
+Version:        3.0.12
 Release:        1%{?dist}
 Summary:        Openshift and Atomic Enterprise Ansible
 License:        ASL 2.0
@@ -82,6 +82,8 @@ pushd utils
 %{__python} setup.py install --skip-build --root %{buildroot}
 # Remove this line once the name change has happened
 mv -f %{buildroot}%{_bindir}/oo-install %{buildroot}%{_bindir}/atomic-openshift-installer
+mkdir -p %{buildroot}%{_datadir}/atomic-openshift-utils/
+cp etc/ansible.cfg %{buildroot}%{_datadir}/atomic-openshift-utils/ansible.cfg
 popd
 
 # Base openshift-ansible files
@@ -104,6 +106,7 @@ Scripts to make it nicer when working with hosts that are defined only by metada
 
 %files bin
 %{_bindir}/*
+%exclude %{_bindir}/atomic-openshift-installer
 %{python_sitelib}/openshift_ansible/
 /etc/bash_completion.d/*
 %config(noreplace) /etc/openshift_ansible/
@@ -170,6 +173,9 @@ Ansible Inventories for GCE used with the openshift-ansible scripts and playbook
 %package playbooks
 Summary:       Openshift and Atomic Enterprise Ansible Playbooks
 Requires:      %{name}
+Requires:      %{name}-roles
+Requires:      %{name}-lookup-plugins
+Requires:      %{name}-filter-plugins
 BuildArch:     noarch
 
 %description playbooks
@@ -185,6 +191,8 @@ BuildArch:     noarch
 %package roles
 Summary:       Openshift and Atomic Enterprise Ansible roles
 Requires:      %{name}
+Requires:      %{name}-lookup-plugins
+Requires:      %{name}-filter-plugins
 BuildArch:     noarch
 
 %description roles
@@ -246,9 +254,187 @@ Atomic OpenShift Utilities includes
 %files -n atomic-openshift-utils
 %{python_sitelib}/ooinstall*
 %{_bindir}/atomic-openshift-installer
+%{_datadir}/atomic-openshift-utils/ansible.cfg
 
 
 %changelog
+* Wed Nov 11 2015 Brenton Leanhardt <bleanhar@redhat.com> 3.0.12-1
+- Sync with the latest image streams (sdodson@redhat.com)
+
+* Wed Nov 11 2015 Brenton Leanhardt <bleanhar@redhat.com> 3.0.11-1
+- Migrate xpaas content from pre v1.1.0 (sdodson@redhat.com)
+- Import latest xpaas templates and image streams (sdodson@redhat.com)
+
+* Wed Nov 11 2015 Brenton Leanhardt <bleanhar@redhat.com> 3.0.10-1
+- Fix update error for templates that didn't previously exist
+  (jdetiber@redhat.com)
+- General cleanup of v3_0_to_v3_1/upgrade.yml (jdetiber@redhat.com)
+- Add zabbix pieces to hold AWS S3 bucket stats (jdiaz@redhat.com)
+- add ansible dep to vagrant doc (jdetiber@redhat.com)
+- oo_filter: don't fail when attribute is not defined (tob@butter.sh)
+
+* Wed Nov 11 2015 Brenton Leanhardt <bleanhar@redhat.com> 3.0.9-1
+- Refactor upgrade playbook(s) (jdetiber@redhat.com)
+
+* Tue Nov 10 2015 Scott Dodson <sdodson@redhat.com> 3.0.8-1
+- Add origin-clients to uninstall playbook. (abutcher@redhat.com)
+- examples: include logging and metrics infrastructure (lmeyer@redhat.com)
+- Add separate step to enable services during upgrade. (dgoodwin@redhat.com)
+- Update tests now that cli is not asking for rpm/container install
+  (smunilla@redhat.com)
+- atomic-openshift-installer: Remove question for container install
+  (smunilla@redhat.com)
+- Remove references to multi_ec2.py (jdetiber@redhat.com)
+- 1279746: Fix leftover disabled features line in config template.
+  (dgoodwin@redhat.com)
+- 1279734: Ensure services are enabled after upgrade. (dgoodwin@redhat.com)
+- Fix missing etcd_data_dir bug. (dgoodwin@redhat.com)
+- Package the default ansible.cfg with atomic-openshift-utils.
+  (dgoodwin@redhat.com)
+- Add ldap auth identity provider to example inventory. (abutcher@redhat.com)
+- Read etcd data dir from appropriate config file. (dgoodwin@redhat.com)
+- atomic-openshift-installer: Generate inventory off hosts_to_run_on
+  (smunilla@redhat.com)
+- Various fixes related to connect_to (bleanhar@redhat.com)
+- Remove upgrade playbook restriction on 3.0.2. (dgoodwin@redhat.com)
+- Conditionals for flannel etcd client certs. (abutcher@redhat.com)
+- New `iptablesSyncPeriod` field in node configuration (abutcher@redhat.com)
+- Fix indentation on when (jdetiber@redhat.com)
+- Bug 1278863 - Error using openshift_pkg_version (jdetiber@redhat.com)
+- more cleanup of names (mwoodson@redhat.com)
+- Missing conditionals for api/controller sysconfig. (abutcher@redhat.com)
+- Updating the atomic-openshift-isntaller local connection logic for the
+  connect_to addition. (bleanhar@redhat.com)
+- cleaned up network checks (mwoodson@redhat.com)
+- Minor upgrade improvements. (dgoodwin@redhat.com)
+- Wait for cluster to recover after pcs resource restart. (abutcher@redhat.com)
+- Bug 1278245 - Failed to add node to existing env using atomic-openshift-
+  installer (bleanhar@redhat.com)
+- remove debug statement (jdetiber@redhat.com)
+- Fix removal of kubernetesMasterConfig.apiLevels (jdetiber@redhat.com)
+- atomic-openshift-installer: Better specification of ansible connection point
+  (smunilla@redhat.com)
+- Fix issues related to upgrade packages being unavailable
+  (jdetiber@redhat.com)
+- added network checks.  also updated item prototype code to support more
+  (mwoodson@redhat.com)
+- Fix data_dir for 3.0 deployments (jdetiber@redhat.com)
+- Fix apiLevels modifications (jdetiber@redhat.com)
+- Fix creation of origin symlink when dir already exists. (dgoodwin@redhat.com)
+- apiLevel changes (jdetiber@redhat.com)
+- Write new config to disk after successful upgrade. (dgoodwin@redhat.com)
+- Fix pylint errors with getting hosts to run on. (dgoodwin@redhat.com)
+- Remove v1beta3 by default for kube_nfs_volumes (jdetiber@redhat.com)
+- Add pre-upgrade script to be run on first master. (dgoodwin@redhat.com)
+- Start to handle pacemaker ha during upgrade (abutcher@redhat.com)
+- Fix lb group related errors (jdetiber@redhat.com)
+- Fix file check conditional. (abutcher@redhat.com)
+- Don't check for certs in data_dir just raise when they can't be found. Fix
+  typo. (abutcher@redhat.com)
+- exclude atomic-openshift-installer from bin subpackage (tdawson@redhat.com)
+- add master_hostnames definition for upgrade (jdetiber@redhat.com)
+- Additional upgrade enhancements (jdetiber@redhat.com)
+- Handle backups for separate etcd hosts if necessary. (dgoodwin@redhat.com)
+- Further upgrade improvements (jdetiber@redhat.com)
+- Upgrade improvements (dgoodwin@redhat.com)
+- Bug 1278243 - Confusing prompt from atomic-openshift-installer
+  (bleanhar@redhat.com)
+- Bug 1278244 - Previously there was no way to add a node in unattended mode
+  (bleanhar@redhat.com)
+- Revert to defaults (abutcher@redhat.com)
+- Bug 1278244 - Incorrect node information gathered by atomic-openshift-
+  installer (bleanhar@redhat.com)
+- atomic-openshift-installer's unattended mode wasn't work with --force for all
+  cases (bleanhar@redhat.com)
+- Making it easier to use pre-release content (bleanhar@redhat.com)
+- The uninstall playbook needs to remove /run/openshift-sdn
+  (bleanhar@redhat.com)
+- Various HA changes for pacemaker and native methods. (abutcher@redhat.com)
+- Bug 1274201 - Fixing non-root installations if using a local connection
+  (bleanhar@redhat.com)
+- Bug 1274201 - Fixing sudo non-interactive test (bleanhar@redhat.com)
+- Bug 1277592 - SDN MTU has hardcoded default (jdetiber@redhat.com)
+- Atomic Enterprise/OpenShift Enterprise merge update (jdetiber@redhat.com)
+- fix dueling controllers - without controllerLeaseTTL set in config, multiple
+  controllers will attempt to start (jdetiber@redhat.com)
+- default to source persistence for haproxy (jdetiber@redhat.com)
+- hardcode openshift binaries for now (jdetiber@redhat.com)
+- more tweaks (jdetiber@redhat.com)
+- more tweaks (jdetiber@redhat.com)
+- additional ha related updates (jdetiber@redhat.com)
+- additional native ha changes (abutcher@redhat.com)
+- Start of true master ha (jdetiber@redhat.com)
+- Atomic Enterprise related changes. (avagarwa@redhat.com)
+- Remove pacemaker bits. (abutcher@redhat.com)
+- Override hosts deployment_type fact for version we're upgrading to.
+  (dgoodwin@redhat.com)
+- Pylint fixes for config upgrade module. (dgoodwin@redhat.com)
+- Disable proxy cert config upgrade until certs being generated.
+  (dgoodwin@redhat.com)
+- remove debug line (florian.lambert@enovance.com)
+- [roles/openshift_master_certificates/tasks/main.yml] Fix variable
+  openshift.master.all_hostnames to openshift.common.all_hostnames
+  (florian.lambert@enovance.com)
+- Fix bug with not upgrading openshift-master to atomic-openshift-master.
+  (dgoodwin@redhat.com)
+- Adding aws and gce packages to ansible-inventory (kwoodson@redhat.com)
+- Fix subpackage dependencies (jdetiber@redhat.com)
+- Refactor common group evaluation to avoid duplication (jdetiber@redhat.com)
+- common/openshift-cluster: Scaleup playbook (smunilla@redhat.com)
+- Fix bug from module rename. (dgoodwin@redhat.com)
+- Fix bug with default ansible playbook dir. (dgoodwin@redhat.com)
+- Use the base package upgrade version so we can check things earlier.
+  (dgoodwin@redhat.com)
+- Skip fail if enterprise deployment type depending on version.
+  (dgoodwin@redhat.com)
+- Add debug output for location of etcd backup. (dgoodwin@redhat.com)
+- Filter internal hostnames from the list of parsed names.
+  (abutcher@redhat.com)
+- Move config upgrade to correct place, fix node facts. (dgoodwin@redhat.com)
+- Add custom certificates to serving info in master configuration.
+  (abutcher@redhat.com)
+- Add in proxyClientInfo if missing during config upgrade.
+  (dgoodwin@redhat.com)
+- Implement master-config.yaml upgrade for v1beta3 apiLevel removal.
+  (dgoodwin@redhat.com)
+- Fix installer upgrade bug following pylint fix. (dgoodwin@redhat.com)
+- Document the new version field for installer config. (dgoodwin@redhat.com)
+- Remove my username from some test data. (dgoodwin@redhat.com)
+- Add a simple version for the installer config file. (dgoodwin@redhat.com)
+- Pylint fix. (dgoodwin@redhat.com)
+- Fix issue with master.proxy-client.{crt,key} and omit. (abutcher@redhat.com)
+- initial module framework (jdetiber@redhat.com)
+- Better info prior to initiating upgrade. (dgoodwin@redhat.com)
+- Fix etcd backup bug with not-yet-created /var/lib/origin symlink
+  (dgoodwin@redhat.com)
+- Print info after upgrade completes. (dgoodwin@redhat.com)
+- Automatically upgrade legacy config files. (dgoodwin@redhat.com)
+- Remove devel fail and let upgrade proceed. (dgoodwin@redhat.com)
+- Add utils subpackage missing dep on openshift-ansible-roles.
+  (dgoodwin@redhat.com)
+- Generate timestamped etcd backups. (dgoodwin@redhat.com)
+- Add etcd_data_dir fact. (dgoodwin@redhat.com)
+- Functional disk space checking for etcd backup. (dgoodwin@redhat.com)
+- First cut at checking available disk space for etcd backup.
+  (dgoodwin@redhat.com)
+- Block upgrade if targetting enterprise deployment type. (dgoodwin@redhat.com)
+- Change flannel registration default values (sbaubeau@redhat.com)
+- Remove empty notify section (sbaubeau@redhat.com)
+- Check etcd certs exist for flannel when its support is enabled
+  (sbaubeau@redhat.com)
+- Fix when neither use_openshift_sdn nor use_flannel are specified
+  (sbaubeau@redhat.com)
+- Generate etcd certificats for flannel when is not embedded
+  (sbaubeau@redhat.com)
+- Add missing 2nd true parameters to default Jinja filter (sbaubeau@redhat.com)
+- Use 'command' module instead of 'shell' (sbaubeau@redhat.com)
+- Add flannel modules documentation (sbaubeau@redhat.com)
+- Only remove IPv4 address from docker bridge (sbaubeau@redhat.com)
+- Remove multiple use_flannel fact definition (sbaubeau@redhat.com)
+- Ensure openshift-sdn and flannel can't be used at the same time
+  (sbaubeau@redhat.com)
+- Add flannel support (sbaubeau@redhat.com)
+
 * Wed Nov 04 2015 Kenny Woodson <kwoodson@redhat.com> 3.0.7-1
 - added the %%util in zabbix (mwoodson@redhat.com)
 - atomic-openshift-installer: Correct default playbook directory

+ 12 - 1
playbooks/adhoc/uninstall.yml

@@ -45,6 +45,7 @@
         - origin-master-api
         - origin-master-controllers
         - origin-node
+        - pcsd
 
     - yum: name={{ item }} state=absent
       when: not is_atomic | bool
@@ -58,6 +59,7 @@
         - atomic-openshift-master
         - atomic-openshift-node
         - atomic-openshift-sdn-ovs
+        - corosync
         - etcd
         - openshift
         - openshift-master
@@ -66,9 +68,12 @@
         - openshift-sdn-ovs
         - openvswitch
         - origin
+        - origin-clients
         - origin-master
         - origin-node
         - origin-sdn-ovs
+        - pacemaker
+        - pcs
         - tuned-profiles-atomic-enterprise-node
         - tuned-profiles-atomic-openshift-node
         - tuned-profiles-openshift-node
@@ -136,8 +141,10 @@
 
     - file: path={{ item }} state=absent
       with_items:
+        - "~{{ ansible_ssh_user }}/.kube"
         - /etc/ansible/facts.d/openshift.fact
         - /etc/atomic-enterprise
+        - /etc/corosync
         - /etc/etcd
         - /etc/openshift
         - /etc/openshift-sdn
@@ -151,9 +158,13 @@
         - /etc/sysconfig/origin-master
         - /etc/sysconfig/origin-node
         - /root/.kube
-        - "~{{ ansible_ssh_user }}/.kube"
+        - /run/openshift-sdn
         - /usr/share/openshift/examples
         - /var/lib/atomic-enterprise
         - /var/lib/etcd
         - /var/lib/openshift
         - /var/lib/origin
+        - /var/lib/pacemaker
+
+    - name: restart docker
+      service: name=docker state=restarted

+ 0 - 1
playbooks/adhoc/upgrades/filter_plugins

@@ -1 +0,0 @@
-../../../filter_plugins/

+ 0 - 1
playbooks/adhoc/upgrades/lookup_plugins

@@ -1 +0,0 @@
-../../../lookup_plugins/

+ 0 - 1
playbooks/adhoc/upgrades/roles

@@ -1 +0,0 @@
-../../../roles/

+ 1 - 0
playbooks/aws/openshift-cluster/config.yml

@@ -11,6 +11,7 @@
 - include: ../../common/openshift-cluster/config.yml
   vars:
     g_etcd_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-etcd' }}"
+    g_lb_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-lb' }}"
     g_masters_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-master' }}"
     g_nodes_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-node' }}"
     g_ssh_user: "{{ hostvars.localhost.g_ssh_user_tmp }}"

+ 1 - 0
playbooks/byo/openshift-cluster/config.yml

@@ -4,6 +4,7 @@
     g_etcd_group: "{{ 'etcd' }}"
     g_masters_group: "{{ 'masters' }}"
     g_nodes_group: "{{ 'nodes' }}"
+    g_lb_group: "{{ 'lb' }}"
     openshift_cluster_id: "{{ cluster_id | default('default') }}"
     openshift_debug_level: 2
     openshift_deployment_type: "{{ deployment_type }}"

+ 8 - 0
playbooks/byo/openshift-cluster/upgrades/README.md

@@ -0,0 +1,8 @@
+# Upgrade playbooks
+The playbooks provided in this directory can be used for upgrading an existing
+environment. Additional notes for the associated upgrade playbooks are
+provided in their respective directories.
+
+# Upgrades available
+- [OpenShift Enterprise 3.0 to latest minor release](v3_0_minor/README.md)
+- [OpenShift Enterprise 3.0 to 3.1](v3_0_to_v3_1/README.md)

+ 5 - 5
playbooks/adhoc/upgrades/README.md

@@ -1,11 +1,11 @@
-# [NOTE]
-This playbook will re-run installation steps overwriting any local
+# v3.0 minor upgrade playbook
+**Note:** This playbook will re-run installation steps overwriting any local
 modifications. You should ensure that your inventory has been updated with any
 modifications you've made after your initial installation. If you find any items
 that cannot be configured via ansible please open an issue at
 https://github.com/openshift/openshift-ansible
 
-# Overview
+## Overview
 This playbook is available as a technical preview. It currently performs the
 following steps.
 
@@ -17,5 +17,5 @@ following steps.
  * Updates the default registry if one exists
  * Updates image streams and quickstarts
 
-# Usage
-ansible-playbook -i ~/ansible-inventory openshift-ansible/playbooks/adhoc/upgrades/upgrade.yml
+## Usage
+ansible-playbook -i ~/ansible-inventory openshift-ansible/playbooks/byo/openshift-cluster/upgrades/v3_0_minor/upgrade.yml

+ 9 - 0
playbooks/byo/openshift-cluster/upgrades/v3_0_minor/upgrade.yml

@@ -0,0 +1,9 @@
+---
+- include: ../../../../common/openshift-cluster/upgrades/v3_0_minor/upgrade.yml
+  vars:
+    g_etcd_group: "{{ 'etcd' }}"
+    g_masters_group: "{{ 'masters' }}"
+    g_nodes_group: "{{ 'nodes' }}"
+    g_lb_group: "{{ 'lb' }}"
+    openshift_cluster_id: "{{ cluster_id | default('default') }}"
+    openshift_deployment_type: "{{ deployment_type }}"

+ 17 - 0
playbooks/byo/openshift-cluster/upgrades/v3_0_to_v3_1/README.md

@@ -0,0 +1,17 @@
+# v3.0 to v3.1 upgrade playbook
+
+## Overview
+This playbook currently performs the
+following steps.
+
+**TODO: update for current steps**
+ * Upgrade and restart master services
+ * Upgrade and restart node services
+ * Modifies the subset of the configuration necessary
+ * Applies the latest cluster policies
+ * Updates the default router if one exists
+ * Updates the default registry if one exists
+ * Updates image streams and quickstarts
+
+## Usage
+ansible-playbook -i ~/ansible-inventory openshift-ansible/playbooks/byo/openshift-cluster/upgrades/v3_0_to_v3_1/upgrade.yml

+ 9 - 0
playbooks/byo/openshift-cluster/upgrades/v3_0_to_v3_1/upgrade.yml

@@ -0,0 +1,9 @@
+---
+- include: ../../../../common/openshift-cluster/upgrades/v3_0_to_v3_1/upgrade.yml
+  vars:
+    g_etcd_group: "{{ 'etcd' }}"
+    g_masters_group: "{{ 'masters' }}"
+    g_nodes_group: "{{ 'nodes' }}"
+    g_lb_group: "{{ 'lb' }}"
+    openshift_cluster_id: "{{ cluster_id | default('default') }}"
+    openshift_deployment_type: "{{ deployment_type }}"

+ 1 - 1
playbooks/common/openshift-cluster/config.yml

@@ -8,4 +8,4 @@
 - include: ../openshift-node/config.yml
   vars:
     osn_cluster_dns_domain: "{{ hostvars[groups.oo_first_master.0].openshift.dns.domain }}"
-    osn_cluster_dns_ip: "{{ hostvars[groups.oo_first_master.0].openshift.dns.ip }}"
+    osn_cluster_dns_ip: "{{ hostvars[groups.oo_first_master.0].cluster_dns_ip }}"

+ 15 - 3
playbooks/common/openshift-cluster/evaluate_groups.yml

@@ -4,17 +4,21 @@
   gather_facts: no
   tasks:
   - fail:
-      msg: This playbook rquires g_etcd_group to be set
+      msg: This playbook requires g_etcd_group to be set
     when: g_etcd_group is not defined
 
   - fail:
-      msg: This playbook rquires g_masters_group to be set
+      msg: This playbook requires g_masters_group to be set
     when: g_masters_group is not defined
 
   - fail:
-      msg: This playbook rquires g_nodes_group to be set
+      msg: This playbook requires g_nodes_group to be set
     when: g_nodes_group is not defined
 
+  - fail:
+      msg: This playbook requires g_lb_group to be set
+    when: g_lb_group is not defined
+
   - name: Evaluate oo_etcd_to_config
     add_host:
       name: "{{ item }}"
@@ -62,3 +66,11 @@
       ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
       ansible_sudo: "{{ g_sudo | default(omit) }}"
     when: g_masters_group in groups and (groups[g_masters_group] | length) > 0
+
+  - name: Evaluate oo_lb_to_config
+    add_host:
+      name: "{{ item }}"
+      groups: oo_lb_to_config
+      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}"
+      ansible_sudo: "{{ g_sudo | default(omit) }}"
+    with_items: groups[g_lb_group] | default([])

+ 9 - 0
playbooks/common/openshift-cluster/scaleup.yml

@@ -1,7 +1,16 @@
 ---
 - include: evaluate_groups.yml
+  vars:
+    g_etcd_group: "{{ 'etcd' }}"
+    g_masters_group: "{{ 'masters' }}"
+    g_nodes_group: "{{ 'nodes' }}"
+    g_lb_group: "{{ 'lb' }}"
+    openshift_cluster_id: "{{ cluster_id | default('default') }}"
+    openshift_debug_level: 2
+    openshift_deployment_type: "{{ deployment_type }}"
 
 - include: ../openshift-node/config.yml
   vars:
     osn_cluster_dns_domain: "{{ hostvars[groups.oo_first_master.0].openshift.dns.domain }}"
     osn_cluster_dns_ip: "{{ hostvars[groups.oo_first_master.0].openshift.dns.ip }}"
+    openshift_deployment_type: "{{ deployment_type }}"

+ 188 - 0
playbooks/common/openshift-cluster/upgrades/files/pre-upgrade-check

@@ -0,0 +1,188 @@
+#!/usr/bin/env python
+"""
+Pre-upgrade checks that must be run on a master before proceeding with upgrade.
+"""
+# This is a script not a python module:
+# pylint: disable=invalid-name
+
+# NOTE: This script should not require any python libs other than what is
+# in the standard library.
+
+__license__ = "ASL 2.0"
+
+import json
+import os
+import subprocess
+import re
+
+# The maximum length of container.ports.name
+ALLOWED_LENGTH = 15
+# The valid structure of container.ports.name
+ALLOWED_CHARS = re.compile('^[a-z0-9][a-z0-9\\-]*[a-z0-9]$')
+AT_LEAST_ONE_LETTER = re.compile('[a-z]')
+# look at OS_PATH for the full path. Default ot 'oc'
+OC_PATH = os.getenv('OC_PATH', 'oc')
+
+
+def validate(value):
+    """
+    validate verifies that value matches required conventions
+
+    Rules of container.ports.name validation:
+
+    * must be less that 16 chars
+    * at least one letter
+    * only a-z0-9-
+    * hyphens can not be leading or trailing or next to each other
+
+    :Parameters:
+       - `value`: Value to validate
+    """
+    if len(value) > ALLOWED_LENGTH:
+        return False
+
+    if '--' in value:
+        return False
+
+    # We search since it can be anywhere
+    if not AT_LEAST_ONE_LETTER.search(value):
+        return False
+
+    # We match because it must start at the beginning
+    if not ALLOWED_CHARS.match(value):
+        return False
+    return True
+
+
+def list_items(kind):
+    """
+    list_items returns a list of items from the api
+
+    :Parameters:
+       - `kind`: Kind of item to access
+    """
+    response = subprocess.check_output([OC_PATH, 'get', '--all-namespaces', '-o', 'json', kind])
+    items = json.loads(response)
+    return items.get("items", [])
+
+
+def get(obj, *paths):
+    """
+    Gets an object
+
+    :Parameters:
+       - `obj`: A dictionary structure
+       - `path`: All other non-keyword arguments
+    """
+    ret_obj = obj
+    for path in paths:
+        if ret_obj.get(path, None) is None:
+            return []
+        ret_obj = ret_obj[path]
+    return ret_obj
+
+
+# pylint: disable=too-many-arguments
+def pretty_print_errors(namespace, kind, item_name, container_name, port_name, valid):
+    """
+    Prints out results in human friendly way.
+
+    :Parameters:
+       - `namespace`: Namespace of the resource
+       - `kind`: Kind of the resource
+       - `item_name`: Name of the resource
+       - `container_name`: Name of the container. May be "" when kind=Service.
+       - `port_name`: Name of the port
+       - `valid`: True if the port is valid
+    """
+    if not valid:
+        if len(container_name) > 0:
+            print('%s/%s -n %s (Container="%s" Port="%s")' % (
+                kind, item_name, namespace, container_name, port_name))
+        else:
+            print('%s/%s -n %s (Port="%s")' % (
+                kind, item_name, namespace, port_name))
+
+
+def print_validation_header():
+    """
+    Prints the error header. Should run on the first error to avoid
+    overwhelming the user.
+    """
+    print """\
+At least one port name does not validate. Valid port names:
+
+    * must be less that 16 chars
+    * have at least one letter
+    * only a-z0-9-
+    * do not start or end with -
+    * Dashes may not be next to eachother ('--')
+"""
+
+
+def main():
+    """
+    main is the main entry point to this script
+    """
+    try:
+        # the comma at the end suppresses the newline
+        print "Checking for oc ...",
+        subprocess.check_output([OC_PATH, 'whoami'])
+        print "found"
+    except:
+        print(
+            'Unable to run "%s whoami"\n'
+            'Please ensure OpenShift is running, and "oc" is on your system '
+            'path.\n'
+            'You can override the path with the OC_PATH environment variable.'
+            % OC_PATH)
+        raise SystemExit(1)
+
+    # Where the magic happens
+    first_error = True
+    for kind, path in [
+            ('replicationcontrollers', ("spec", "template", "spec", "containers")),
+            ('pods', ("spec", "containers")),
+            ('deploymentconfigs', ("spec", "template", "spec", "containers"))]:
+        for item in list_items(kind):
+            namespace = item["metadata"]["namespace"]
+            item_name = item["metadata"]["name"]
+            for container in get(item, *path):
+                container_name = container["name"]
+                for port in get(container, "ports"):
+                    port_name = port.get("name", None)
+                    if not port_name:
+                        # Unnamed ports are OK
+                        continue
+                    valid = validate(port_name)
+                    if not valid and first_error:
+                        first_error = False
+                        print_validation_header()
+                    pretty_print_errors(
+                        namespace, kind, item_name,
+                        container_name, port_name, valid)
+
+    # Services follow a different flow
+    for item in list_items('services'):
+        namespace = item["metadata"]["namespace"]
+        item_name = item["metadata"]["name"]
+        for port in get(item, "spec", "ports"):
+            port_name = port.get("targetPort", None)
+            if isinstance(port_name, int) or port_name is None:
+                # Integer only or unnamed ports are OK
+                continue
+            valid = validate(port_name)
+            if not valid and first_error:
+                first_error = False
+                print_validation_header()
+            pretty_print_errors(
+                namespace, "services", item_name, "", port_name, valid)
+
+    # If we had at least 1 error then exit with 1
+    if not first_error:
+        raise SystemExit(1)
+
+
+if __name__ == '__main__':
+    main()
+

+ 10 - 0
playbooks/common/openshift-cluster/upgrades/files/versions.sh

@@ -0,0 +1,10 @@
+#!/bin/bash
+
+yum_installed=$(yum list installed "$@" 2>&1 | tail -n +2 | grep -v 'Installed Packages' | grep -v 'Red Hat Subscription Management' | grep -v 'Error:' | awk '{ print $2 }' | tr '\n' ' ')
+
+yum_available=$(yum list available "$@" 2>&1 | tail -n +2 | grep -v 'Available Packages' | grep -v 'Red Hat Subscription Management' | grep -v 'el7ose' | grep -v 'Error:' | awk '{ print $2 }' | tr '\n' ' ')
+
+
+echo "---"
+echo "curr_version: ${yum_installed}" 
+echo "avail_version: ${yum_available}"

+ 1 - 0
playbooks/common/openshift-cluster/upgrades/filter_plugins

@@ -0,0 +1 @@
+../../../../filter_plugins

+ 154 - 0
playbooks/common/openshift-cluster/upgrades/library/openshift_upgrade_config.py

@@ -0,0 +1,154 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# vim: expandtab:tabstop=4:shiftwidth=4
+
+"""Ansible module for modifying OpenShift configs during an upgrade"""
+
+import os
+import yaml
+
+DOCUMENTATION = '''
+---
+module: openshift_upgrade_config
+short_description: OpenShift Upgrade Config
+author: Jason DeTiberus
+requirements: [ ]
+'''
+EXAMPLES = '''
+'''
+
+def modify_api_levels(level_list, remove, ensure, msg_prepend='',
+                      msg_append=''):
+    """ modify_api_levels """
+    changed = False
+    changes = []
+
+    if not isinstance(remove, list):
+        remove = []
+
+    if not isinstance(ensure, list):
+        ensure = []
+
+    if not isinstance(level_list, list):
+        new_list = []
+        changed = True
+        changes.append("%s created missing %s" % (msg_prepend, msg_append))
+    else:
+        new_list = level_list
+        for level in remove:
+            if level in new_list:
+                new_list.remove(level)
+                changed = True
+                changes.append("%s removed %s %s" % (msg_prepend, level, msg_append))
+
+    for level in ensure:
+        if level not in new_list:
+            new_list.append(level)
+            changed = True
+            changes.append("%s added %s %s" % (msg_prepend, level, msg_append))
+
+    return {'new_list': new_list, 'changed': changed, 'changes': changes}
+
+
+def upgrade_master_3_0_to_3_1(ansible_module, config_base, backup):
+    """Main upgrade method for 3.0 to 3.1."""
+    changes = []
+
+    # Facts do not get transferred to the hosts where custom modules run,
+    # need to make some assumptions here.
+    master_config = os.path.join(config_base, 'master/master-config.yaml')
+
+    master_cfg_file = open(master_config, 'r')
+    config = yaml.safe_load(master_cfg_file.read())
+    master_cfg_file.close()
+
+
+    # Remove unsupported api versions and ensure supported api versions from
+    # master config
+    unsupported_levels = ['v1beta1', 'v1beta2', 'v1beta3']
+    supported_levels = ['v1']
+
+    result = modify_api_levels(config.get('apiLevels'), unsupported_levels,
+                               supported_levels, 'master-config.yaml:', 'from apiLevels')
+    if result['changed']:
+        config['apiLevels'] = result['new_list']
+        changes.append(result['changes'])
+
+    if 'kubernetesMasterConfig' in config and 'apiLevels' in config['kubernetesMasterConfig']:
+        config['kubernetesMasterConfig'].pop('apiLevels')
+        changes.append('master-config.yaml: removed kubernetesMasterConfig.apiLevels')
+
+    # Add proxyClientInfo to master-config
+    if 'proxyClientInfo' not in config['kubernetesMasterConfig']:
+        config['kubernetesMasterConfig']['proxyClientInfo'] = {
+            'certFile': 'master.proxy-client.crt',
+            'keyFile': 'master.proxy-client.key'
+        }
+        changes.append("master-config.yaml: added proxyClientInfo")
+
+    if len(changes) > 0:
+        if backup:
+            # TODO: Check success:
+            ansible_module.backup_local(master_config)
+
+        # Write the modified config:
+        out_file = open(master_config, 'w')
+        out_file.write(yaml.safe_dump(config, default_flow_style=False))
+        out_file.close()
+
+    return changes
+
+
+def upgrade_master(ansible_module, config_base, from_version, to_version, backup):
+    """Upgrade entry point."""
+    if from_version == '3.0':
+        if to_version == '3.1':
+            return upgrade_master_3_0_to_3_1(ansible_module, config_base, backup)
+
+
+def main():
+    """ main """
+    # disabling pylint errors for global-variable-undefined and invalid-name
+    # for 'global module' usage, since it is required to use ansible_facts
+    # pylint: disable=global-variable-undefined, invalid-name,
+    # redefined-outer-name
+    global module
+
+    module = AnsibleModule(
+        argument_spec=dict(
+            config_base=dict(required=True),
+            from_version=dict(required=True, choices=['3.0']),
+            to_version=dict(required=True, choices=['3.1']),
+            role=dict(required=True, choices=['master']),
+            backup=dict(required=False, default=True, type='bool')
+        ),
+        supports_check_mode=True,
+    )
+
+    from_version = module.params['from_version']
+    to_version = module.params['to_version']
+    role = module.params['role']
+    backup = module.params['backup']
+    config_base = module.params['config_base']
+
+    try:
+        changes = []
+        if role == 'master':
+            changes = upgrade_master(module, config_base, from_version,
+                                     to_version, backup)
+
+        changed = len(changes) > 0
+        return module.exit_json(changed=changed, changes=changes)
+
+    # ignore broad-except error to avoid stack trace to ansible user
+    # pylint: disable=broad-except
+    except Exception, e:
+        return module.fail_json(msg=str(e))
+
+# ignore pylint errors related to the module_utils import
+# pylint: disable=redefined-builtin, unused-wildcard-import, wildcard-import
+# import module snippets
+from ansible.module_utils.basic import *
+
+if __name__ == '__main__':
+    main()

+ 1 - 0
playbooks/common/openshift-cluster/upgrades/lookup_plugins

@@ -0,0 +1 @@
+../../../../lookup_plugins

+ 1 - 0
playbooks/common/openshift-cluster/upgrades/roles

@@ -0,0 +1 @@
+../../../../roles

+ 1 - 0
playbooks/common/openshift-cluster/upgrades/v3_0_minor/filter_plugins

@@ -0,0 +1 @@
+../../../../../filter_plugins

+ 1 - 0
playbooks/common/openshift-cluster/upgrades/v3_0_minor/library

@@ -0,0 +1 @@
+../library

+ 1 - 0
playbooks/common/openshift-cluster/upgrades/v3_0_minor/lookup_plugins

@@ -0,0 +1 @@
+../../../../../lookup_plugins

+ 1 - 0
playbooks/common/openshift-cluster/upgrades/v3_0_minor/roles

@@ -0,0 +1 @@
+../../../../../roles

+ 5 - 31
playbooks/adhoc/upgrades/upgrade.yml

@@ -1,25 +1,12 @@
 ---
-- name: Upgrade base package on masters
-  hosts: masters
-  roles:
-  - openshift_facts
-  vars:
-    openshift_version: "{{ openshift_pkg_version | default('') }}"
-  tasks:
-    - name: Upgrade base package
-      yum: pkg={{ openshift.common.service_type }}{{ openshift_version  }} state=latest
+- name: Evaluate groups
+  include: ../../evaluate_groups.yml
 
 - name: Re-Run cluster configuration to apply latest configuration changes
-  include: ../../common/openshift-cluster/config.yml
-  vars:
-    g_etcd_group: "{{ 'etcd' }}"
-    g_masters_group: "{{ 'masters' }}"
-    g_nodes_group: "{{ 'nodes' }}"
-    openshift_cluster_id: "{{ cluster_id | default('default') }}"
-    openshift_deployment_type: "{{ deployment_type }}"
+  include: ../../config.yml
 
 - name: Upgrade masters
-  hosts: masters
+  hosts: oo_masters_to_config
   vars:
     openshift_version: "{{ openshift_pkg_version | default('') }}"
   tasks:
@@ -29,7 +16,7 @@
       service: name="{{ openshift.common.service_type}}-master" state=restarted
 
 - name: Upgrade nodes
-  hosts: nodes
+  hosts: oo_nodes_to_config
   vars:
     openshift_version: "{{ openshift_pkg_version | default('') }}"
   tasks:
@@ -60,19 +47,6 @@
         {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig
         policy reconcile-cluster-roles --confirm
 
-- name: Update cluster policy bindings
-  hosts: oo_first_master
-  tasks:
-    - name: oadm policy reconcile-cluster-role-bindings --confirm
-      command: >
-        {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig
-        policy reconcile-cluster-role-bindings
-        --exclude-groups=system:authenticated
-        --exclude-groups=system:unauthenticated
-        --exclude-users=system:anonymous
-        --additive-only=true --confirm
-      when: ( _new_version.stdout | version_compare('1.0.6', '>') and _new_version.stdout | version_compare('3.0','<') ) or _new_version.stdout | version_compare('3.0.2','>')
-
 - name: Upgrade default router
   hosts: oo_first_master
   vars:

+ 1 - 0
playbooks/common/openshift-cluster/upgrades/v3_0_to_v3_1/filter_plugins

@@ -0,0 +1 @@
+../../../../../filter_plugins

+ 1 - 0
playbooks/common/openshift-cluster/upgrades/v3_0_to_v3_1/library

@@ -0,0 +1 @@
+../library

+ 1 - 0
playbooks/common/openshift-cluster/upgrades/v3_0_to_v3_1/lookup_plugins

@@ -0,0 +1 @@
+../../../../../lookup_plugins

+ 1 - 0
playbooks/common/openshift-cluster/upgrades/v3_0_to_v3_1/roles

@@ -0,0 +1 @@
+../../../../../roles

+ 429 - 0
playbooks/common/openshift-cluster/upgrades/v3_0_to_v3_1/upgrade.yml

@@ -0,0 +1,429 @@
+---
+###############################################################################
+# Evaluate host groups and gather facts
+###############################################################################
+- name: Evaluate host groups
+  include: ../../evaluate_groups.yml
+
+- name: Load openshift_facts
+  hosts: oo_masters_to_config:oo_nodes_to_config:oo_etcd_to_config:oo_lb_to_config
+  roles:
+  - openshift_facts
+
+- name: Evaluate etcd_hosts_to_backup
+  hosts: localhost
+  tasks:
+  - name: Evaluate etcd_hosts_to_backup
+    add_host:
+      name: "{{ item }}"
+      groups: etcd_hosts_to_backup
+    with_items: groups.oo_etcd_to_config if groups.oo_etcd_to_config is defined and groups.oo_etcd_to_config | length > 0 else groups.oo_first_master
+
+
+###############################################################################
+# Pre-upgrade checks
+###############################################################################
+- name: Verify upgrade can proceed
+  hosts: oo_first_master
+  vars:
+    openshift_master_ha: "{{ groups.oo_masters_to_config | length > 1 }}"
+  gather_facts: no
+  tasks:
+  # Pacemaker is currently the only supported upgrade path for multiple masters
+  - fail:
+      msg: "openshift_master_cluster_method must be set to 'pacemaker'"
+    when: openshift_master_ha | bool and ((openshift_master_cluster_method is not defined) or (openshift_master_cluster_method is defined and openshift_master_cluster_method != "pacemaker"))
+
+  - fail:
+      msg: >
+        This upgrade is only supported for origin and openshift-enterprise
+        deployment types
+    when: deployment_type not in ['origin','openshift-enterprise']
+
+  - fail:
+      msg: >
+        openshift_pkg_version is {{ openshift_pkg_version }} which is not a
+        valid version for a 3.1 upgrade
+    when: openshift_pkg_version is defined and openshift_pkg_version.split('-',1).1 | version_compare('3.0.2.900','<')
+
+  # If this script errors out ansible will show the default stdout/stderr
+  # which contains details for the user:
+  - script: ../files/pre-upgrade-check
+
+
+- name: Verify upgrade can proceed
+  hosts: masters:nodes
+  tasks:
+  - name: Clean yum cache
+    command: yum clean all
+
+  - set_fact:
+      g_new_service_name: "{{ 'origin' if deployment_type =='origin' else 'atomic-openshift' }}"
+
+  - name: Determine available versions
+    script: ../files/versions.sh {{ g_new_service_name }} openshift
+    register: g_versions_result
+
+  - set_fact:
+      g_aos_versions: "{{ g_versions_result.stdout | from_yaml }}"
+
+  - set_fact:
+      g_new_version: "{{ g_aos_versions.curr_version.split('-', 1).0 if g_aos_versions.avail_version is none else g_aos_versions.avail_version.split('-', 1).0 }}"
+
+  - fail:
+      msg: This playbook requires Origin 1.0.6 or later
+    when: deployment_type == 'origin' and g_aos_versions.curr_version | version_compare('1.0.6','<')
+
+  - fail:
+      msg: Atomic OpenShift 3.1 packages not found
+    when: g_aos_versions.curr_version | version_compare('3.0.2.900','<') and (g_aos_versions.avail_version is none or g_aos_versions.avail_version | version_compare('3.0.2.900','<'))
+
+
+###############################################################################
+# Backup etcd
+###############################################################################
+- name: Backup etcd
+  hosts: etcd_hosts_to_backup
+  vars:
+    embedded_etcd: "{{ openshift.master.embedded_etcd }}"
+    timestamp: "{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}"
+  roles:
+  - openshift_facts
+  tasks:
+  - openshift_facts:
+      role: etcd
+      local_facts: {}
+    when: "'etcd' not in openshift"
+
+  - stat: path=/var/lib/openshift
+    register: var_lib_openshift
+
+  - stat: path=/var/lib/origin
+    register: var_lib_origin
+
+  - name: Create origin symlink if necessary
+    file: src=/var/lib/openshift/ dest=/var/lib/origin state=link
+    when: var_lib_openshift.stat.exists == True and var_lib_origin.stat.exists == False
+
+  # TODO: replace shell module with command and update later checks
+  # We assume to be using the data dir for all backups.
+  - name: Check available disk space for etcd backup
+    shell: df --output=avail -k {{ openshift.common.data_dir }} | tail -n 1
+    register: avail_disk
+
+  # TODO: replace shell module with command and update later checks
+  - name: Check current embedded etcd disk usage
+    shell: du -k {{ openshift.etcd.etcd_data_dir }} | tail -n 1 | cut -f1
+    register: etcd_disk_usage
+    when: embedded_etcd | bool
+
+  - name: Abort if insufficient disk space for etcd backup
+    fail:
+      msg: >
+        {{ etcd_disk_usage.stdout }} Kb disk space required for etcd backup,
+        {{ avail_disk.stdout }} Kb available.
+    when: (embedded_etcd | bool) and (etcd_disk_usage.stdout|int > avail_disk.stdout|int)
+
+  - name: Install etcd (for etcdctl)
+    yum:
+      pkg: etcd
+      state: latest
+
+  - name: Generate etcd backup
+    command: >
+      etcdctl backup --data-dir={{ openshift.etcd.etcd_data_dir }}
+      --backup-dir={{ openshift.common.data_dir }}/etcd-backup-{{ timestamp }}
+
+  - name: Display location of etcd backup
+    debug:
+      msg: "Etcd backup created in {{ openshift.common.data_dir }}/etcd-backup-{{ timestamp }}"
+
+
+###############################################################################
+# Upgrade Masters
+###############################################################################
+- name: Create temp directory for syncing certs
+  hosts: localhost
+  gather_facts: no
+  tasks:
+  - name: Create local temp directory for syncing certs
+    local_action: command mktemp -d /tmp/openshift-ansible-XXXXXXX
+    register: g_master_mktemp
+    changed_when: False
+
+- name: Update deployment type
+  hosts: OSEv3
+  roles:
+  - openshift_facts
+  post_tasks:
+  - openshift_facts:
+      role: common
+      local_facts:
+        deployment_type: "{{ deployment_type }}"
+
+- name: Upgrade master packages and configuration
+  hosts: oo_masters_to_config
+  vars:
+    openshift_version: "{{ openshift_pkg_version | default('') }}"
+  tasks:
+  - name: Upgrade to latest available kernel
+    yum:
+      pkg: kernel
+      state: latest
+
+  - name: Upgrade master packages
+    command: yum update -y {{ openshift.common.service_type }}-master{{ openshift_version }}
+
+  - name: Ensure python-yaml present for config upgrade
+    yum:
+      pkg: PyYAML
+      state: installed
+
+  - name: Upgrade master configuration
+    openshift_upgrade_config:
+      from_version: '3.0'
+      to_version: '3.1'
+      role: master
+      config_base: "{{ hostvars[inventory_hostname].openshift.common.config_base }}"
+
+  - set_fact:
+      master_certs_missing: True
+      master_cert_subdir: master-{{ openshift.common.hostname }}
+      master_cert_config_dir: "{{ openshift.common.config_base }}/master"
+
+
+- name: Generate missing master certificates
+  hosts: oo_first_master
+  vars:
+    master_hostnames: "{{ hostvars
+                          | oo_select_keys(groups.oo_masters_to_config)
+                          | oo_collect('openshift.common.all_hostnames')
+                          | oo_flatten | unique }}"
+    master_generated_certs_dir: "{{ openshift.common.config_base }}/generated-configs"
+    masters_needing_certs: "{{ hostvars
+                               | oo_select_keys(groups.oo_masters_to_config)
+                               | difference([groups.oo_first_master.0]) }}"
+    sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"
+    openshift_deployment_type: "{{ deployment_type }}"
+  roles:
+  - openshift_master_certificates
+  post_tasks:
+  - name: Remove generated etcd client certs when using external etcd
+    file:
+      path: "{{ master_generated_certs_dir }}/{{ item.0.master_cert_subdir }}/{{ item.1 }}"
+      state: absent
+    when: groups.oo_etcd_to_config is defined and groups.oo_etcd_to_config
+    with_nested:
+    - masters_needing_certs
+    - - master.etcd-client.crt
+      - master.etcd-client.key
+
+  - name: Create a tarball of the master certs
+    command: >
+      tar -czvf {{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz
+        -C {{ master_generated_certs_dir }}/{{ item.master_cert_subdir }} .
+    with_items: masters_needing_certs
+
+  - name: Retrieve the master cert tarball from the master
+    fetch:
+      src: "{{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz"
+      dest: "{{ sync_tmpdir }}/"
+      flat: yes
+      fail_on_missing: yes
+      validate_checksum: yes
+    with_items: masters_needing_certs
+
+
+- name: Sync generated certs, update service config and restart master services
+  hosts: oo_masters_to_config
+  vars:
+    sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"
+    openshift_master_ha: "{{ groups.oo_masters_to_config | length > 1 }}"
+    openshift_deployment_type: "{{ deployment_type }}"
+  tasks:
+  - name: Unarchive the tarball on the master
+    unarchive:
+      src: "{{ sync_tmpdir }}/{{ master_cert_subdir }}.tgz"
+      dest: "{{ master_cert_config_dir }}"
+    when: inventory_hostname != groups.oo_first_master.0
+
+  - name: Restart master service
+    service: name="{{ openshift.common.service_type}}-master" state=restarted
+    when: not openshift_master_ha | bool
+
+  - name: Ensure the master service is enabled
+    service: name="{{ openshift.common.service_type}}-master" state=started enabled=yes
+    when: not openshift_master_ha | bool
+
+  - name: Check for configured cluster
+    stat:
+      path: /etc/corosync/corosync.conf
+    register: corosync_conf
+    when: openshift_master_ha | bool
+
+  - name: Destroy cluster
+    command: pcs cluster destroy --all
+    when: openshift_master_ha | bool and corosync_conf.stat.exists == true
+    run_once: true
+
+  - name: Start pcsd
+    service: name=pcsd enabled=yes state=started
+    when: openshift_master_ha | bool
+
+
+- name: Re-create cluster
+  hosts: oo_first_master
+  vars:
+    openshift_master_ha: "{{ groups.oo_masters_to_config | length > 1 }}"
+    openshift_deployment_type: "{{ deployment_type }}"
+    omc_cluster_hosts: "{{ groups.oo_masters_to_config | join(' ') }}"
+  roles:
+  - role: openshift_master_cluster
+    when: openshift_master_ha | bool
+
+
+- name: Delete temporary directory on localhost
+  hosts: localhost
+  gather_facts: no
+  tasks:
+  - file: name={{ g_master_mktemp.stdout }} state=absent
+    changed_when: False
+
+
+###############################################################################
+# Upgrade Nodes
+###############################################################################
+- name: Upgrade nodes
+  hosts: oo_nodes_to_config
+  vars:
+    openshift_version: "{{ openshift_pkg_version | default('') }}"
+  roles:
+  - openshift_facts
+  tasks:
+  - name: Upgrade node packages
+    command: yum update -y {{ openshift.common.service_type }}-node{{ openshift_version }}
+
+  - name: Restart node service
+    service: name="{{ openshift.common.service_type }}-node" state=restarted
+
+  - name: Ensure node service enabled
+    service: name="{{ openshift.common.service_type }}-node" state=started enabled=yes
+
+
+###############################################################################
+# Post upgrade - Reconcile Cluster Roles and Cluster Role Bindings
+###############################################################################
+- name: Reconcile Cluster Roles and Cluster Role Bindings
+  hosts: oo_masters_to_config
+  vars:
+    origin_reconcile_bindings: "{{ deployment_type == 'origin' and g_new_version | version_compare('1.0.6', '>') }}"
+    ent_reconcile_bindings: true
+    openshift_master_ha: "{{ groups.oo_masters_to_config | length > 1 }}"
+  tasks:
+  - name: Reconcile Cluster Roles
+    command: >
+      {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig
+      policy reconcile-cluster-roles --confirm
+    run_once: true
+
+  - name: Reconcile Cluster Role Bindings
+    command: >
+      {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig
+      policy reconcile-cluster-role-bindings
+      --exclude-groups=system:authenticated
+      --exclude-groups=system:unauthenticated
+      --exclude-users=system:anonymous
+      --additive-only=true --confirm
+    when: origin_reconcile_bindings | bool or ent_reconcile_bindings | bool
+    run_once: true
+
+  - name: Restart master services
+    service: name="{{ openshift.common.service_type}}-master" state=restarted
+    when: not openshift_master_ha | bool
+
+  - name: Restart master cluster
+    command: pcs resource restart master
+    when: openshift_master_ha | bool
+    run_once: true
+
+  - name: Wait for the clustered master service to be available
+    wait_for:
+      host: "{{ openshift_master_cluster_vip }}"
+      port: 8443
+      state: started
+      timeout: 180
+      delay: 90
+    when: openshift_master_ha | bool
+    run_once: true
+
+
+###############################################################################
+# Post upgrade - Upgrade default router, default registry and examples
+###############################################################################
+- name: Upgrade default router and default registry
+  hosts: oo_first_master
+  vars:
+    openshift_deployment_type: "{{ deployment_type }}"
+    registry_image: "{{  openshift.master.registry_url | replace( '${component}', 'docker-registry' )  | replace ( '${version}', 'v' + g_new_version  ) }}"
+    router_image: "{{ openshift.master.registry_url | replace( '${component}', 'haproxy-router' ) | replace ( '${version}', 'v' + g_new_version ) }}"
+    oc_cmd: "{{ openshift.common.client_binary }} --config={{ openshift.common.config_base }}/master/admin.kubeconfig"
+  roles:
+  # Create the new templates shipped in 3.1, existing templates are left
+  # unmodified. This prevents the subsequent role definition for
+  # openshift_examples from failing when trying to replace templates that do
+  # not already exist. We could have potentially done a replace --force to
+  # create and update in one step.
+  - openshift_examples
+  # Update the existing templates
+  - role: openshift_examples
+    openshift_examples_import_command: replace
+  pre_tasks:
+  - name: Check for default router
+    command: >
+      {{ oc_cmd }} get -n default dc/router
+    register: _default_router
+    failed_when: false
+    changed_when: false
+
+  - name: Check for allowHostNetwork and allowHostPorts
+    when: _default_router.rc == 0
+    shell: >
+      {{ oc_cmd }} get -o yaml scc/privileged | /usr/bin/grep -e allowHostPorts -e allowHostNetwork
+    register: _scc
+
+  - name: Grant allowHostNetwork and allowHostPorts
+    when:
+    - _default_router.rc == 0
+    - "'false' in _scc.stdout"
+    command: >
+      {{ oc_cmd }} patch scc/privileged -p '{"allowHostPorts":true,"allowHostNetwork":true}' --loglevel=9
+
+  - name: Update deployment config to 1.0.4/3.0.1 spec
+    when: _default_router.rc == 0
+    command: >
+      {{ oc_cmd }} patch dc/router -p
+      '{"spec":{"strategy":{"rollingParams":{"updatePercent":-10},"spec":{"serviceAccount":"router","serviceAccountName":"router"}}}}'
+
+  - name: Switch to hostNetwork=true
+    when: _default_router.rc == 0
+    command: >
+      {{ oc_cmd }} patch dc/router -p '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'
+
+  - name: Update router image to current version
+    when: _default_router.rc == 0
+    command: >
+      {{ oc_cmd }} patch dc/router -p
+      '{"spec":{"template":{"spec":{"containers":[{"name":"router","image":"{{ router_image }}"}]}}}}'
+
+  - name: Check for default registry
+    command: >
+      {{ oc_cmd }} get -n default dc/docker-registry
+    register: _default_registry
+    failed_when: false
+    changed_when: false
+
+  - name: Update registry image to current version
+    when: _default_registry.rc == 0
+    command: >
+      {{ oc_cmd }} patch dc/docker-registry -p
+      '{"spec":{"template":{"spec":{"containers":[{"name":"registry","image":"{{ registry_image }}"}]}}}}'

+ 2 - 0
playbooks/common/openshift-etcd/config.yml

@@ -13,6 +13,8 @@
           hostname: "{{ openshift_hostname | default(None) }}"
           public_hostname: "{{ openshift_public_hostname | default(None) }}"
           deployment_type: "{{ openshift_deployment_type }}"
+      - role: etcd
+        local_facts: {}
   - name: Check status of etcd certificates
     stat:
       path: "{{ item }}"

+ 96 - 3
playbooks/common/openshift-master/config.yml

@@ -34,7 +34,9 @@
       - role: common
         local_facts:
           hostname: "{{ openshift_hostname | default(None) }}"
+          ip: "{{ openshift_ip | default(None) }}"
           public_hostname: "{{ openshift_public_hostname | default(None) }}"
+          public_ip: "{{ openshift_public_ip | default(None) }}"
           deployment_type: "{{ openshift_deployment_type }}"
       - role: master
         local_facts:
@@ -44,12 +46,14 @@
           public_api_url: "{{ openshift_master_public_api_url | default(None) }}"
           cluster_hostname: "{{ openshift_master_cluster_hostname | default(None) }}"
           cluster_public_hostname: "{{ openshift_master_cluster_public_hostname | default(None) }}"
-          cluster_defer_ha: "{{ openshift_master_cluster_defer_ha | default(None) }}"
           console_path: "{{ openshift_master_console_path | default(None) }}"
           console_port: "{{ openshift_master_console_port | default(None) }}"
           console_url: "{{ openshift_master_console_url | default(None) }}"
           console_use_ssl: "{{ openshift_master_console_use_ssl | default(None) }}"
           public_console_url: "{{ openshift_master_public_console_url | default(None) }}"
+      - role: etcd
+        local_facts: {}
+        when: openshift.master.embedded_etcd | bool
   - name: Check status of external etcd certificatees
     stat:
       path: "{{ openshift.common.config_base }}/master/{{ item }}"
@@ -168,6 +172,10 @@
     masters_needing_certs: "{{ hostvars
                                | oo_select_keys(groups['oo_masters_to_config'] | difference(groups['oo_first_master']))
                                | oo_filter_list(filter_attr='master_certs_missing') }}"
+    master_hostnames: "{{ hostvars
+                               | oo_select_keys(groups['oo_masters_to_config'])
+                               | oo_collect('openshift.common.all_hostnames')
+                               | oo_flatten | unique }}"
     sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"
   roles:
   - openshift_master_certificates
@@ -207,13 +215,76 @@
       parsed_named_certificates: "{{ openshift_master_named_certificates | oo_parse_certificate_names(master_cert_config_dir, openshift.common.internal_hostnames) }}"
     when: openshift_master_named_certificates is defined
 
+- name: Compute haproxy_backend_servers
+  hosts: localhost
+  connection: local
+  sudo: false
+  gather_facts: no
+  tasks:
+  - set_fact:
+      haproxy_backend_servers: "{{ hostvars | oo_select_keys(groups['oo_masters_to_config']) | oo_haproxy_backend_masters }}"
+
+- name: Configure load balancers
+  hosts: oo_lb_to_config
+  vars:
+    sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"
+    haproxy_frontends:
+    - name: atomic-openshift-api
+      mode: tcp
+      options:
+      - tcplog
+      binds:
+      - "*:{{ hostvars[groups.oo_first_master.0].openshift.master.api_port }}"
+      default_backend: atomic-openshift-api
+    haproxy_backends:
+    - name: atomic-openshift-api
+      mode: tcp
+      option: tcplog
+      balance: source
+      servers: "{{ hostvars.localhost.haproxy_backend_servers }}"
+  roles:
+  - role: haproxy
+    when: groups.oo_masters_to_config | length > 1
+
+- name: Generate master session keys
+  hosts: oo_first_master
+  tasks:
+  - fail:
+      msg: "Both openshift_master_session_auth_secrets and openshift_master_session_encryption_secrets must be provided if either variable is set"
+    when: (openshift_master_session_auth_secrets is defined and openshift_master_session_encryption_secrets is not defined) or (openshift_master_session_encryption_secrets is defined and openshift_master_session_auth_secrets is not defined)
+  - fail:
+      msg: "openshift_master_session_auth_secrets and openshift_master_encryption_secrets must be equal length"
+    when: (openshift_master_session_auth_secrets is defined and openshift_master_session_encryption_secrets is defined) and (openshift_master_session_auth_secrets | length != openshift_master_session_encryption_secrets | length)
+  - name: Generate session authentication key
+    command: /usr/bin/openssl rand -base64 24
+    register: session_auth_output
+    with_sequence: count=1
+    when: openshift_master_session_auth_secrets is undefined
+  - name: Generate session encryption key
+    command: /usr/bin/openssl rand -base64 24
+    register: session_encryption_output
+    with_sequence: count=1
+    when: openshift_master_session_encryption_secrets is undefined
+  - set_fact:
+      session_auth_secret: "{{ openshift_master_session_auth_secrets
+                                | default(session_auth_output.results
+                                | map(attribute='stdout')
+                                | list) }}"
+      session_encryption_secret: "{{ openshift_master_session_encryption_secrets
+                                      | default(session_encryption_output.results
+                                      | map(attribute='stdout')
+                                      | list) }}"
+
 - name: Configure master instances
   hosts: oo_masters_to_config
+  serial: 1
   vars:
     named_certificates: "{{ hostvars[groups['oo_first_master'][0]]['parsed_named_certificates'] | default([])}}"
     sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"
     openshift_master_ha: "{{ groups.oo_masters_to_config | length > 1 }}"
-    embedded_etcd: "{{ openshift.master.embedded_etcd }}"
+    openshift_master_count: "{{ groups.oo_masters_to_config | length }}"
+    openshift_master_session_auth_secrets: "{{ hostvars[groups['oo_first_master'][0]]['session_auth_secret'] }}"
+    openshift_master_session_encryption_secrets: "{{ hostvars[groups['oo_first_master'][0]]['session_encryption_secret'] }}"
   pre_tasks:
   - name: Ensure certificate directory exists
     file:
@@ -242,11 +313,25 @@
     omc_cluster_hosts: "{{ groups.oo_masters_to_config | join(' ')}}"
   roles:
   - role: openshift_master_cluster
-    when: openshift_master_ha | bool
+    when: openshift_master_ha | bool and openshift.master.cluster_method == "pacemaker"
   - openshift_examples
   - role: openshift_cluster_metrics
     when: openshift.common.use_cluster_metrics | bool
 
+- name: Determine cluster dns ip
+  hosts: oo_first_master
+  tasks:
+  - name: Get master service ip
+    command: "{{ openshift.common.client_binary }} get -o template svc kubernetes --template=\\{\\{.spec.clusterIP\\}\\}"
+    register: master_service_ip_output
+    when: openshift.common.version_greater_than_3_1_or_1_1 | bool
+  - set_fact:
+      cluster_dns_ip: "{{ hostvars[groups.oo_first_master.0].openshift.dns.ip }}"
+    when: not openshift.common.version_greater_than_3_1_or_1_1 | bool
+  - set_fact:
+      cluster_dns_ip: "{{ master_service_ip_output.stdout }}"
+    when: openshift.common.version_greater_than_3_1_or_1_1 | bool
+
 - name: Enable cockpit
   hosts: oo_first_master
   vars:
@@ -256,6 +341,14 @@
     when: ( deployment_type in ['atomic-enterprise','openshift-enterprise'] ) and
       (osm_use_cockpit | bool or osm_use_cockpit is undefined )
 
+- name: Configure flannel
+  hosts: oo_first_master
+  vars:
+    etcd_urls: "{{ openshift.master.etcd_urls }}"
+  roles:
+  - role: flannel_register
+    when: openshift.common.use_flannel | bool
+
 # Additional instance config for online deployments
 - name: Additional instance config
   hosts: oo_masters_deployment_type_online

+ 78 - 0
playbooks/common/openshift-node/config.yml

@@ -38,6 +38,22 @@
       node_subdir: node-{{ openshift.common.hostname }}
       config_dir: "{{ openshift.common.config_base }}/generated-configs/node-{{ openshift.common.hostname }}"
       node_cert_dir: "{{ openshift.common.config_base }}/node"
+  - name: Check status of flannel external etcd certificates
+    stat:
+      path: "{{ openshift.common.config_base }}/node/{{ item }}"
+    with_items:
+    - node.etcd-client.crt
+    - node.etcd-ca.crt
+    register: g_external_etcd_flannel_cert_stat_result
+    when: groups.oo_etcd_to_config is defined and groups.oo_etcd_to_config and (openshift.common.use_flannel | bool)
+  - set_fact:
+      etcd_client_flannel_certs_missing: "{{ g_external_etcd_flannel_cert_stat_result.results
+                                             | map(attribute='stat.exists')
+                                             | list | intersect([false])}}"
+      etcd_cert_subdir: openshift-node-{{ openshift.common.hostname }}
+      etcd_cert_config_dir: "{{ openshift.common.config_base }}/node"
+      etcd_cert_prefix: node.etcd-
+    when: groups.oo_etcd_to_config is defined and groups.oo_etcd_to_config and (openshift.common.use_flannel | bool)
 
 - name: Create temp directory for syncing certs
   hosts: localhost
@@ -50,6 +66,64 @@
     register: mktemp
     changed_when: False
 
+- name: Configure flannel etcd certificates
+  hosts: oo_first_etcd
+  vars:
+    etcd_generated_certs_dir: /etc/etcd/generated_certs
+    sync_tmpdir: "{{ hostvars.localhost.mktemp.stdout }}"
+  pre_tasks:
+  - set_fact:
+      etcd_needing_client_certs: "{{ hostvars
+                                   | oo_select_keys(groups['oo_nodes_to_config'])
+                                   | oo_filter_list(filter_attr='etcd_client_flannel_certs_missing') | default([]) }}"
+    when: etcd_client_flannel_certs_missing is defined and etcd_client_flannel_certs_missing
+  roles:
+  - role: etcd_certificates
+  post_tasks:
+  - name: Create a tarball of the etcd flannel certs
+    command: >
+      tar -czvf {{ etcd_generated_certs_dir }}/{{ item.etcd_cert_subdir }}.tgz
+        -C {{ etcd_generated_certs_dir }}/{{ item.etcd_cert_subdir }} .
+    args:
+      creates: "{{ etcd_generated_certs_dir }}/{{ item.etcd_cert_subdir }}.tgz"
+    with_items: etcd_needing_client_certs
+    when: etcd_client_flannel_certs_missing is defined and etcd_client_flannel_certs_missing
+  - name: Retrieve the etcd cert tarballs
+    fetch:
+      src: "{{ etcd_generated_certs_dir }}/{{ item.etcd_cert_subdir }}.tgz"
+      dest: "{{ sync_tmpdir }}/"
+      flat: yes
+      fail_on_missing: yes
+      validate_checksum: yes
+    with_items: etcd_needing_client_certs
+    when: etcd_client_flannel_certs_missing is defined and etcd_client_flannel_certs_missing
+
+- name: Copy the external etcd flannel certs to the nodes
+  hosts: oo_nodes_to_config
+  vars:
+    sync_tmpdir: "{{ hostvars.localhost.mktemp.stdout }}"
+  tasks:
+  - name: Ensure certificate directory exists
+    file:
+      path: "{{ openshift.common.config_base }}/node"
+      state: directory
+    when: etcd_client_flannel_certs_missing is defined and etcd_client_flannel_certs_missing
+  - name: Unarchive the tarball on the master
+    unarchive:
+      src: "{{ sync_tmpdir }}/{{ etcd_cert_subdir }}.tgz"
+      dest: "{{ etcd_cert_config_dir }}"
+    when: etcd_client_flannel_certs_missing is defined and etcd_client_flannel_certs_missing
+  - file:
+      path: "{{ etcd_cert_config_dir }}/{{ item }}"
+      owner: root
+      group: root
+      mode: 0600
+    with_items:
+    - node.etcd-client.crt
+    - node.etcd-client.key
+    - node.etcd-ca.crt
+    when: etcd_client_flannel_certs_missing is defined and etcd_client_flannel_certs_missing
+
 - name: Create node certificates
   hosts: oo_first_master
   vars:
@@ -84,6 +158,8 @@
   vars:
     sync_tmpdir: "{{ hostvars.localhost.mktemp.stdout }}"
     openshift_node_master_api_url: "{{ hostvars[groups.oo_first_master.0].openshift.master.api_url }}"
+    etcd_urls: "{{ hostvars[groups.oo_first_master.0].openshift.master.etcd_urls }}"
+    embedded_etcd: "{{ hostvars[groups.oo_first_master.0].openshift.master.embedded_etcd }}"
   pre_tasks:
   - name: Ensure certificate directory exists
     file:
@@ -100,6 +176,8 @@
     when: certs_missing
   roles:
   - openshift_node
+  - role: flannel
+    when: openshift.common.use_flannel | bool
   - role: nickhammond.logrotate
   - role: fluentd_node
     when: openshift.common.use_fluentd | bool

+ 1 - 0
playbooks/gce/openshift-cluster/config.yml

@@ -16,6 +16,7 @@
 - include: ../../common/openshift-cluster/config.yml
   vars:
     g_etcd_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-etcd' }}"
+    g_lb_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-lb' }}"
     g_masters_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-master' }}"
     g_nodes_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-node' }}"
     g_ssh_user: "{{ hostvars.localhost.g_ssh_user_tmp }}"

+ 1 - 1
playbooks/gce/openshift-cluster/join_node.yml

@@ -46,4 +46,4 @@
     openshift_node_labels: "{{ lookup('oo_option', 'openshift_node_labels') }} "
     os_sdn_network_plugin_name: "redhat/openshift-ovs-subnet"
     osn_cluster_dns_domain: "{{ hostvars[groups.oo_first_master.0].openshift.dns.domain }}"
-    osn_cluster_dns_ip: "{{ hostvars[groups.oo_first_master.0].openshift.dns.ip }}"
+    osn_cluster_dns_ip: "{{ hostvars[groups.oo_first_master.0].cluster_dns_ip }}"

+ 1 - 0
playbooks/libvirt/openshift-cluster/config.yml

@@ -15,6 +15,7 @@
 - include: ../../common/openshift-cluster/config.yml
   vars:
     g_etcd_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-etcd' }}"
+    g_lb_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-lb' }}"
     g_masters_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-master' }}"
     g_nodes_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-node' }}"
     g_ssh_user: "{{ hostvars.localhost.g_ssh_user_tmp }}"

+ 1 - 0
playbooks/openstack/openshift-cluster/config.yml

@@ -10,6 +10,7 @@
 - include: ../../common/openshift-cluster/config.yml
   vars:
     g_etcd_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-etcd' }}"
+    g_lb_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-lb' }}"
     g_masters_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-master' }}"
     g_nodes_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-node' }}"
     g_ssh_user: "{{ hostvars.localhost.g_ssh_user_tmp }}"

+ 45 - 0
roles/flannel/README.md

@@ -0,0 +1,45 @@
+Role Name
+=========
+
+Configure flannel on openshift nodes
+
+Requirements
+------------
+
+This role assumes it's being deployed on a RHEL/Fedora based host with package
+named 'flannel' available via yum, in version superior to 0.3.
+
+Role Variables
+--------------
+
+| Name                | Default value                           | Description                                   |
+|---------------------|-----------------------------------------|-----------------------------------------------|
+| flannel_interface   | ansible_default_ipv4.interface          | interface to use for inter-host communication |
+| flannel_etcd_key    | /openshift.com/network                  | etcd prefix                                   |
+| etcd_hosts          | etcd_urls                               | a list of etcd endpoints                      |
+| etcd_conf_dir       | {{ openshift.common.config_base }}/node | SSL certificates directory                    |
+| etcd_peer_ca_file   | {{ etcd_conf_dir }}/ca.crt              | SSL CA to use for etcd                        |
+| etcd_peer_cert_file | Openshift SSL cert                      | SSL cert to use for etcd                      |
+| etcd_peer_key_file  | Openshift SSL key                       | SSL key to use for etcd                       |
+
+Dependencies
+------------
+
+openshift_facts
+
+Example Playbook
+----------------
+
+    - hosts: openshift_node
+      roles:
+        - { role: flannel, etcd_urls: ['https://127.0.0.1:2379'] }
+
+License
+-------
+
+Apache License, Version 2.0
+
+Author Information
+------------------
+
+Sylvain Baubeau <sbaubeau@redhat.com>

+ 8 - 0
roles/flannel/defaults/main.yaml

@@ -0,0 +1,8 @@
+---
+flannel_interface: "{{ ansible_default_ipv4.interface }}"
+flannel_etcd_key: /openshift.com/network
+etcd_hosts: "{{ etcd_urls }}"
+etcd_conf_dir: "{{ openshift.common.config_base }}/node"
+etcd_peer_ca_file: "{{ etcd_conf_dir }}/{{ 'ca' if (embedded_etcd | bool) else 'node.etcd-ca' }}.crt"
+etcd_peer_cert_file: "{{ etcd_conf_dir }}/{{ 'system:node:' + openshift.common.hostname if (embedded_etcd | bool) else 'node.etcd-client' }}.crt"
+etcd_peer_key_file: "{{ etcd_conf_dir }}/{{ 'system:node:' + openshift.common.hostname if (embedded_etcd | bool) else 'node.etcd-client' }}.key"

+ 8 - 0
roles/flannel/handlers/main.yml

@@ -0,0 +1,8 @@
+---
+- name: restart flanneld
+  sudo: true
+  service: name=flanneld state=restarted
+
+- name: restart docker
+  sudo: true
+  service: name=docker state=restarted

+ 16 - 0
roles/flannel/meta/main.yml

@@ -0,0 +1,16 @@
+---
+galaxy_info:
+  author: Sylvain
+  description: flannel management
+  company: Red Hat, Inc.
+  license: Apache License, Version 2.0
+  min_ansible_version: 1.2
+  platforms:
+  - name: EL
+    versions:
+    - 7
+  categories:
+  - cloud
+  - system
+dependencies:
+- { role: openshift_facts }

+ 43 - 0
roles/flannel/tasks/main.yml

@@ -0,0 +1,43 @@
+---
+- name: Install flannel
+  sudo: true
+  yum: pkg=flannel state=present
+
+- name: Set flannel etcd url
+  sudo: true
+  lineinfile:
+    dest: /etc/sysconfig/flanneld
+    backrefs: yes
+    regexp: "^(FLANNEL_ETCD=)"
+    line: '\1{{ etcd_hosts|join(",") }}'
+
+- name: Set flannel etcd key
+  sudo: true
+  lineinfile:
+    dest: /etc/sysconfig/flanneld
+    backrefs: yes
+    regexp: "^(FLANNEL_ETCD_KEY=)"
+    line: '\1{{ flannel_etcd_key }}'
+
+- name: Set flannel options
+  sudo: true
+  lineinfile:
+    dest: /etc/sysconfig/flanneld
+    backrefs: yes
+    regexp: "^#?(FLANNEL_OPTIONS=)"
+    line: '\1--iface {{ flannel_interface }} --etcd-cafile={{ etcd_peer_ca_file }} --etcd-keyfile={{ etcd_peer_key_file }} --etcd-certfile={{ etcd_peer_cert_file }}'
+
+- name: Enable flanneld
+  sudo: true
+  service:
+    name: flanneld
+    state: started
+    enabled: yes
+  register: start_result
+
+- name: Remove docker bridge ip
+  sudo: true
+  shell: ip a del `ip a show docker0 | grep "inet[[:space:]]" | awk '{print $2}'` dev docker0
+  notify:
+    - restart docker
+    - restart node

+ 47 - 0
roles/flannel_register/README.md

@@ -0,0 +1,47 @@
+Role Name
+=========
+
+Register flannel configuration into etcd
+
+Requirements
+------------
+
+This role assumes it's being deployed on a RHEL/Fedora based host with package
+named 'flannel' available via yum, in version superior to 0.3.
+
+Role Variables
+--------------
+
+| Name                | Default value                                      | Description                                     |
+|---------------------|----------------------------------------------------|-------------------------------------------------|
+| flannel_network     | {{ openshift.master.portal_net }} or 172.16.1.1/16 | interface to use for inter-host communication   |
+| flannel_min_network | {{ min_network }} or 172.16.5.0                    | beginning of IP range for the subnet allocation |
+| flannel_subnet_len  | /openshift.com/network                             | size of the subnet allocated to each host       |
+| flannel_etcd_key    | /openshift.com/network                             | etcd prefix                                     |
+| etcd_hosts          | etcd_urls                                          | a list of etcd endpoints                        |
+| etcd_conf_dir       | {{ openshift.common.config_base }}/master          | SSL certificates directory                      |
+| etcd_peer_ca_file   | {{ etcd_conf_dir }}/ca.crt                         | SSL CA to use for etcd                          |
+| etcd_peer_cert_file | {{ etcd_conf_dir }}/master.etcd-client.crt         | SSL cert to use for etcd                        |
+| etcd_peer_key_file  | {{ etcd_conf_dir }}/master.etcd-client.key         | SSL key to use for etcd                         |
+
+Dependencies
+------------
+
+openshift_facts
+
+Example Playbook
+----------------
+
+    - hosts: openshift_master
+      roles:
+         - { flannel_register }
+
+License
+-------
+
+Apache License, Version 2.0
+
+Author Information
+------------------
+
+Sylvain Baubeau <sbaubeau@redhat.com>

+ 11 - 0
roles/flannel_register/defaults/main.yaml

@@ -0,0 +1,11 @@
+---
+flannel_network: "{{ openshift.master.portal_net | default('172.30.0.0/16', true) }}"
+flannel_min_network: 172.30.5.0
+flannel_subnet_len: 24
+flannel_etcd_key: /openshift.com/network
+etcd_hosts: "{{ etcd_urls }}"
+etcd_conf_dir: "{{ openshift.common.config_base }}/master"
+etcd_peer_ca_file: "{{ etcd_conf_dir + '/ca.crt' if (openshift.master.embedded_etcd | bool) else etcd_conf_dir + '/master.etcd-ca.crt' }}"
+etcd_peer_cert_file: "{{ etcd_conf_dir }}/master.etcd-client.crt"
+etcd_peer_key_file: "{{ etcd_conf_dir }}/master.etcd-client.key"
+

+ 16 - 0
roles/flannel_register/meta/main.yml

@@ -0,0 +1,16 @@
+---
+galaxy_info:
+  author: Sylvain
+  description: register flannel configuration into etcd
+  company: Red Hat, Inc.
+  license: Apache License, Version 2.0
+  min_ansible_version: 1.2
+  platforms:
+  - name: EL
+    versions:
+    - 7
+  categories:
+  - cloud
+  - system
+dependencies:
+- { role: openshift_facts }

+ 14 - 0
roles/flannel_register/tasks/main.yml

@@ -0,0 +1,14 @@
+---
+- name: Assures /etc/flannel dir exists
+  sudo: true
+  file: path=/etc/flannel state=directory
+
+- name: Generate etcd configuration for etcd
+  sudo: true
+  template:
+    src: "flannel-config.json"
+    dest: "/etc/flannel/config.json"
+
+- name: Insert flannel configuration into etcd
+  sudo: true
+  command: 'curl -L --cacert "{{ etcd_peer_ca_file }}" --cert "{{ etcd_peer_cert_file }}" --key "{{ etcd_peer_key_file }}" "{{ etcd_hosts[0] }}/v2/keys{{ flannel_etcd_key }}/config" -XPUT --data-urlencode value@/etc/flannel/config.json'

+ 8 - 0
roles/flannel_register/templates/flannel-config.json

@@ -0,0 +1,8 @@
+{
+    "Network": "{{ flannel_network }}",
+    "SubnetLen": {{ flannel_subnet_len }},
+    "SubnetMin": "{{ flannel_min_network }}",
+    "Backend": {
+        "Type": "host-gw"
+     }
+}

+ 34 - 0
roles/haproxy/README.md

@@ -0,0 +1,34 @@
+HAProxy
+=======
+
+TODO
+
+Requirements
+------------
+
+TODO
+
+Role Variables
+--------------
+
+TODO
+
+Dependencies
+------------
+
+TODO
+
+Example Playbook
+----------------
+
+TODO
+
+License
+-------
+
+Apache License, Version 2.0
+
+Author Information
+------------------
+
+Jason DeTiberus (jdetiber@redhat.com)

+ 21 - 0
roles/haproxy/defaults/main.yml

@@ -0,0 +1,21 @@
+---
+haproxy_frontends:
+- name: main
+  binds:
+  - "*:80"
+  default_backend: default
+
+haproxy_backends:
+- name: default
+  balance: roundrobin
+  servers:
+  - name: web01
+    address: 127.0.0.1:9000
+    opts: check
+
+os_firewall_use_firewalld: False
+os_firewall_allow:
+- service: haproxy stats
+  port: "9000/tcp"
+- service: haproxy balance
+  port: "8443/tcp"

+ 5 - 0
roles/haproxy/handlers/main.yml

@@ -0,0 +1,5 @@
+---
+- name: restart haproxy
+  service:
+    name: haproxy
+    state: restarted

+ 14 - 0
roles/haproxy/meta/main.yml

@@ -0,0 +1,14 @@
+---
+galaxy_info:
+  author: Jason DeTiberus
+  description: HAProxy
+  company: Red Hat, Inc.
+  license: Apache License, Version 2.0
+  min_ansible_version: 1.9
+  platforms:
+  - name: EL
+    versions:
+    - 7
+dependencies:
+- { role: os_firewall }
+- { role: openshift_repos }

+ 25 - 0
roles/haproxy/tasks/main.yml

@@ -0,0 +1,25 @@
+---
+- name: Install haproxy
+  yum:
+    pkg: haproxy
+    state: present
+
+- name: Configure haproxy
+  template:
+    src: haproxy.cfg.j2
+    dest: /etc/haproxy/haproxy.cfg
+    owner: root
+    group: root
+    mode: 0644
+  notify: restart haproxy
+
+- name: Enable and start haproxy
+  service:
+    name: haproxy
+    state: started
+    enabled: yes
+  register: start_result
+
+- name: Pause 30 seconds if haproxy was just started
+  pause: seconds=30
+  when: start_result | changed

+ 76 - 0
roles/haproxy/templates/haproxy.cfg.j2

@@ -0,0 +1,76 @@
+# Global settings
+#---------------------------------------------------------------------
+global
+    chroot      /var/lib/haproxy
+    pidfile     /var/run/haproxy.pid
+    maxconn     4000
+    user        haproxy
+    group       haproxy
+    daemon
+
+    # turn on stats unix socket
+    stats socket /var/lib/haproxy/stats
+
+#---------------------------------------------------------------------
+# common defaults that all the 'listen' and 'backend' sections will
+# use if not designated in their block
+#---------------------------------------------------------------------
+defaults
+    mode                    http
+    log                     global
+    option                  httplog
+    option                  dontlognull
+    option http-server-close
+    option forwardfor       except 127.0.0.0/8
+    option                  redispatch
+    retries                 3
+    timeout http-request    10s
+    timeout queue           1m
+    timeout connect         10s
+    timeout client          300s
+    timeout server          300s
+    timeout http-keep-alive 10s
+    timeout check           10s
+    maxconn                 3000
+
+listen stats :9000
+    mode http
+    stats enable
+    stats uri /
+
+{% for frontend in haproxy_frontends %}
+frontend  {{ frontend.name }}
+{% for bind in frontend.binds %}
+    bind {{ bind }}
+{% endfor %}
+    default_backend {{ frontend.default_backend }}
+{% if 'mode' in frontend %}
+    mode {{ frontend.mode }}
+{% endif %}
+{% if 'options' in frontend %}
+{% for option in frontend.options %}
+    option {{ option }}
+{% endfor %}
+{% endif %}
+{% if 'redirects' in frontend %}
+{% for redirect in frontend.redirects %}
+    redirect {{ redirect }}
+{% endfor %}
+{% endif %}
+{% endfor %}
+
+{% for backend in haproxy_backends %}
+backend {{ backend.name }}
+    balance {{ backend.balance }}
+{% if 'mode' in backend %}
+    mode {{ backend.mode }}
+{% endif %}
+{% if 'options' in backend %}
+{% for option in backend.options %}
+    option {{ option }}
+{% endfor %}
+{% endif %}
+{% for server in backend.servers %}
+    server      {{ server.name }} {{ server.address }} {{ server.opts }}
+{% endfor %}
+{% endfor %}

+ 3 - 0
roles/kube_nfs_volumes/README.md

@@ -44,6 +44,9 @@ kubernetes_url: https://10.245.1.2:6443
 
 # Token to use for authentication to the API server
 kubernetes_token: tJdce6Fn3cL1112YoIJ5m2exzAbzcPZX
+
+# API Version to use for kubernetes
+kube_api_version: v1
 ```
 
 ## Dependencies

+ 6 - 0
roles/kube_nfs_volumes/defaults/main.yml

@@ -1,4 +1,10 @@
 ---
+kubernetes_url: https://172.30.0.1:443
+
+kube_api_version: v1
+
+kube_req_template: "../templates/{{ kube_api_version }}/nfs.json.j2"
+
 # Options of NFS exports.
 nfs_export_options: "*(rw,no_root_squash,insecure,no_subtree_check)"
 

+ 7 - 6
roles/kube_nfs_volumes/tasks/main.yml

@@ -16,10 +16,11 @@
 - include: nfs.yml
 
 - name: export physical volumes
-  uri: url={{ kubernetes_url }}/api/v1beta3/persistentvolumes
-       method=POST
-       body='{{ lookup("template", "../templates/nfs.json.j2") }}'
-       body_format=json
-       status_code=201
-       HEADER_Authorization="Bearer {{ kubernetes_token }}"
+  uri:
+    url: "{{ kubernetes_url }}/api/{{ kube_api_version }}/persistentvolumes"
+    method: POST
+    body: "{{ lookup('template', kube_req_template) }}"
+    body_format: json
+    status_code: 201
+    HEADER_Authorization: "Bearer {{ kubernetes_token }}"
   with_items: partition_pool

+ 1 - 0
roles/kube_nfs_volumes/templates/v1/nfs.json.j2

@@ -0,0 +1 @@
+../v1beta3/nfs.json.j2

roles/kube_nfs_volumes/templates/nfs.json.j2 → roles/kube_nfs_volumes/templates/v1beta3/nfs.json.j2


+ 35 - 4
roles/lib_zabbix/library/zbx_itemprototype.py

@@ -67,7 +67,24 @@ def get_template(zapi, template_name):
         return None
     return content['result'][0]
 
-def get_type(ztype):
+def get_multiplier(inval):
+    ''' Determine the multiplier
+    '''
+    if inval == None or inval == '':
+        return None, 0
+
+    rval = None
+    try:
+        rval = int(inval)
+    except ValueError:
+        pass
+
+    if rval:
+        return rval, 1
+
+    return rval, 0
+
+def get_zabbix_type(ztype):
     '''
     Determine which type of discoverrule this is
     '''
@@ -87,6 +104,7 @@ def get_type(ztype):
               'telnet': 14,
               'calculated': 15,
               'JMX': 16,
+              'SNMP trap': 17,
              }
 
     for typ in _types.keys():
@@ -153,16 +171,21 @@ def main():
             name=dict(default=None, type='str'),
             key=dict(default=None, type='str'),
             description=dict(default=None, type='str'),
+            template_name=dict(default=None, type='str'),
             interfaceid=dict(default=None, type='int'),
-            ztype=dict(default='trapper', type='str'),
+            zabbix_type=dict(default='trapper', type='str'),
             value_type=dict(default='float', type='str'),
             delay=dict(default=60, type='int'),
             lifetime=dict(default=30, type='int'),
             state=dict(default='present', type='str'),
             status=dict(default='enabled', type='str'),
             applications=dict(default=[], type='list'),
-            template_name=dict(default=None, type='str'),
             discoveryrule_key=dict(default=None, type='str'),
+            interval=dict(default=60, type='int'),
+            delta=dict(default=0, type='int'),
+            multiplier=dict(default=None, type='str'),
+            units=dict(default=None, type='str'),
+
         ),
         #supports_check_mode=True
     )
@@ -205,15 +228,23 @@ def main():
 
     # Create and Update
     if state == 'present':
+
+        formula, use_multiplier = get_multiplier(module.params['multiplier'])
+
         params = {'name': module.params['name'],
                   'key_':  module.params['key'],
                   'hostid':  template['templateid'],
                   'interfaceid': module.params['interfaceid'],
                   'ruleid': get_rule_id(zapi, module.params['discoveryrule_key'], template['templateid']),
-                  'type': get_type(module.params['ztype']),
+                  'type': get_zabbix_type(module.params['zabbix_type']),
                   'value_type': get_value_type(module.params['value_type']),
                   'applications': get_app_ids(zapi, module.params['applications'], template['templateid']),
+                  'formula': formula,
+                  'multiplier': use_multiplier,
                   'description': module.params['description'],
+                  'units': module.params['units'],
+                  'delay': module.params['interval'],
+                  'delta': module.params['delta'],
                  }
 
         if params['type'] in [2, 5, 7, 8, 11, 15]:

+ 262 - 0
roles/lib_zabbix/library/zbx_itservice.py

@@ -0,0 +1,262 @@
+#!/usr/bin/env python
+'''
+ Ansible module for zabbix itservices
+'''
+# vim: expandtab:tabstop=4:shiftwidth=4
+#
+#   Zabbix itservice ansible module
+#
+#
+#   Copyright 2015 Red Hat Inc.
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+#
+
+# This is in place because each module looks similar to each other.
+# These need duplicate code as their behavior is very similar
+# but different for each zabbix class.
+# pylint: disable=duplicate-code
+
+# pylint: disable=import-error
+from openshift_tools.monitoring.zbxapi import ZabbixAPI, ZabbixConnection
+
+def exists(content, key='result'):
+    ''' Check if key exists in content or the size of content[key] > 0
+    '''
+    if not content.has_key(key):
+        return False
+
+    if not content[key]:
+        return False
+
+    return True
+
+def get_parent(dependencies):
+    '''Put dependencies into the proper update format'''
+    rval = None
+    for dep in dependencies:
+        if dep['relationship'] == 'parent':
+            return dep
+    return rval
+
+def format_dependencies(dependencies):
+    '''Put dependencies into the proper update format'''
+    rval = []
+    for dep in dependencies:
+        rval.append({'dependsOnServiceid': dep['serviceid'],
+                     'soft': get_dependency_type(dep['dep_type']),
+                    })
+
+    return rval
+
+def get_dependency_type(dep_type):
+    '''Determine the dependency type'''
+    rval = 0
+    if 'soft' == dep_type:
+        rval = 1
+
+    return rval
+
+def get_service_id_by_name(zapi, dependencies):
+    '''Fetch the service id for an itservice'''
+    deps = []
+    for dep in dependencies:
+        if dep['name'] == 'root':
+            deps.append(dep)
+            continue
+
+        content = zapi.get_content('service',
+                                   'get',
+                                   {'filter': {'name': dep['name']},
+                                    'selectDependencies': 'extend',
+                                   })
+        if content.has_key('result') and content['result']:
+            dep['serviceid'] = content['result'][0]['serviceid']
+            deps.append(dep)
+
+    return deps
+
+def add_dependencies(zapi, service_name, dependencies):
+    '''Fetch the service id for an itservice
+
+       Add a dependency on the parent for this current service item.
+    '''
+
+    results = get_service_id_by_name(zapi, [{'name': service_name}])
+
+    content = {}
+    for dep in dependencies:
+        content = zapi.get_content('service',
+                                   'adddependencies',
+                                   {'serviceid': results[0]['serviceid'],
+                                    'dependsOnServiceid': dep['serviceid'],
+                                    'soft': get_dependency_type(dep['dep_type']),
+                                   })
+        if content.has_key('result') and content['result']:
+            continue
+        else:
+            break
+
+    return content
+
+def get_show_sla(inc_sla):
+    ''' Determine the showsla paramter
+    '''
+    rval = 1
+    if 'do not cacluate' in inc_sla:
+        rval = 0
+    return rval
+
+def get_algorithm(inc_algorithm_str):
+    '''
+    Determine which type algorithm
+    '''
+    rval = 0
+    if 'at least one' in inc_algorithm_str:
+        rval = 1
+    elif 'all' in inc_algorithm_str:
+        rval = 2
+
+    return rval
+
+# The branches are needed for CRUD and error handling
+# pylint: disable=too-many-branches
+def main():
+    '''
+    ansible zabbix module for zbx_itservice
+    '''
+
+    module = AnsibleModule(
+        argument_spec=dict(
+            zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
+            zbx_user=dict(default=os.environ.get('ZABBIX_USER', None), type='str'),
+            zbx_password=dict(default=os.environ.get('ZABBIX_PASSWORD', None), type='str'),
+            zbx_debug=dict(default=False, type='bool'),
+            name=dict(default=None, type='str'),
+            algorithm=dict(default='do not calculate', choices=['do not calculate', 'at least one', 'all'], type='str'),
+            show_sla=dict(default='calculate', choices=['do not calculate', 'calculate'], type='str'),
+            good_sla=dict(default='99.9', type='float'),
+            sort_order=dict(default=1, type='int'),
+            state=dict(default='present', type='str'),
+            trigger_id=dict(default=None, type='int'),
+            dependencies=dict(default=[], type='list'),
+            dep_type=dict(default='hard', choices=['hard', 'soft'], type='str'),
+        ),
+        #supports_check_mode=True
+    )
+
+    zapi = ZabbixAPI(ZabbixConnection(module.params['zbx_server'],
+                                      module.params['zbx_user'],
+                                      module.params['zbx_password'],
+                                      module.params['zbx_debug']))
+
+    #Set the instance and the template for the rest of the calls
+    zbx_class_name = 'service'
+    state = module.params['state']
+
+    content = zapi.get_content(zbx_class_name,
+                               'get',
+                               {'filter': {'name': module.params['name']},
+                                'selectDependencies': 'extend',
+                               })
+
+    #******#
+    # GET
+    #******#
+    if state == 'list':
+        module.exit_json(changed=False, results=content['result'], state="list")
+
+    #******#
+    # DELETE
+    #******#
+    if state == 'absent':
+        if not exists(content):
+            module.exit_json(changed=False, state="absent")
+
+        content = zapi.get_content(zbx_class_name, 'delete', [content['result'][0]['itemid']])
+        module.exit_json(changed=True, results=content['result'], state="absent")
+
+    # Create and Update
+    if state == 'present':
+
+        dependencies = get_service_id_by_name(zapi, module.params['dependencies'])
+        params = {'name': module.params['name'],
+                  'algorithm': get_algorithm(module.params['algorithm']),
+                  'showsla': get_show_sla(module.params['show_sla']),
+                  'goodsla': module.params['good_sla'],
+                  'sortorder': module.params['sort_order'],
+                  'triggerid': module.params['trigger_id']
+                 }
+
+        # Remove any None valued params
+        _ = [params.pop(key, None) for key in params.keys() if params[key] is None]
+
+        #******#
+        # CREATE
+        #******#
+        if not exists(content):
+            content = zapi.get_content(zbx_class_name, 'create', params)
+
+            if content.has_key('error'):
+                module.exit_json(failed=True, changed=True, results=content['error'], state="present")
+
+                content = add_dependencies(zapi, module.params['name'], dependencies)
+
+                if content.has_key('error'):
+                    module.exit_json(failed=True, changed=True, results=content['error'], state="present")
+
+            module.exit_json(changed=True, results=content['result'], state='present')
+
+
+        ########
+        # UPDATE
+        ########
+        params['dependencies'] = dependencies
+        differences = {}
+        zab_results = content['result'][0]
+        for key, value in params.items():
+
+            if key == 'goodsla':
+                if float(value) != float(zab_results[key]):
+                    differences[key] = value
+
+            elif key == 'dependencies':
+                zab_dep_ids = [item['serviceid'] for item in zab_results[key]]
+                user_dep_ids = [item['serviceid'] for item in dependencies]
+                if set(zab_dep_ids) != set(user_dep_ids):
+                    differences[key] = format_dependencies(dependencies)
+
+            elif zab_results[key] != value and zab_results[key] != str(value):
+                differences[key] = value
+
+        if not differences:
+            module.exit_json(changed=False, results=zab_results, state="present")
+
+        differences['serviceid'] = zab_results['serviceid']
+        content = zapi.get_content(zbx_class_name, 'update', differences)
+
+        if content.has_key('error'):
+            module.exit_json(failed=True, changed=False, results=content['error'], state="present")
+
+        module.exit_json(changed=True, results=content['result'], state="present")
+
+    module.exit_json(failed=True,
+                     changed=False,
+                     results='Unknown state passed. %s' % state,
+                     state="unknown")
+
+# pylint: disable=redefined-builtin, unused-wildcard-import, wildcard-import, locally-disabled
+# import module snippets.  This are required
+from ansible.module_utils.basic import *
+
+main()

+ 4 - 1
roles/lib_zabbix/library/zbx_trigger.py

@@ -136,6 +136,8 @@ def main():
             status=dict(default=None, type='str'),
             state=dict(default='present', type='str'),
             template_name=dict(default=None, type='str'),
+            hostgroup_name=dict(default=None, type='str'),
+            query_type=dict(default='filter', choices=['filter', 'search'], type='str'),
         ),
         #supports_check_mode=True
     )
@@ -157,10 +159,11 @@ def main():
 
     content = zapi.get_content(zbx_class_name,
                                'get',
-                               {'filter': {'description': tname},
+                               {module.params['query_type']: {'description': tname},
                                 'expandExpression': True,
                                 'selectDependencies': 'triggerid',
                                 'templateids': templateid,
+                                'group': module.params['hostgroup_name'],
                                })
 
     # Get

+ 4 - 0
roles/lib_zabbix/tasks/create_template.yml

@@ -84,6 +84,10 @@
     template_name: "{{ template.name }}"
     applications: "{{ item.applications }}"
     description: "{{ item.description | default('', True) }}"
+    multiplier: "{{ item.multiplier | default('', True) }}"
+    units: "{{ item.units | default('', True) }}"
+    interval: "{{ item.interval | default(60, True) }}"
+    delta: "{{ item.delta | default(0, True) }}"
   with_items: template.zitemprototypes
   when: template.zitemprototypes is defined
 

+ 5 - 0
roles/openshift_common/tasks/main.yml

@@ -1,4 +1,8 @@
 ---
+- fail:
+    msg: Flannel can not be used with openshift sdn
+  when: openshift_use_openshift_sdn | default(false) | bool and openshift_use_flannel | default(false) | bool
+
 - name: Set common Cluster facts
   openshift_facts:
     role: common
@@ -13,6 +17,7 @@
       sdn_network_plugin_name: "{{ os_sdn_network_plugin_name | default(None) }}"
       deployment_type: "{{ openshift_deployment_type }}"
       use_fluentd: "{{ openshift_use_fluentd | default(None) }}"
+      use_flannel: "{{ openshift_use_flannel | default(None) }}"
 
 - name: Set hostname
   hostname: name={{ openshift.common.hostname }}

+ 2 - 0
roles/openshift_examples/defaults/main.yml

@@ -14,5 +14,7 @@ db_templates_base: "{{ examples_base }}/db-templates"
 xpaas_image_streams: "{{ examples_base }}/xpaas-streams/jboss-image-streams.json"
 xpaas_templates_base: "{{ examples_base }}/xpaas-templates"
 quickstarts_base: "{{ examples_base }}/quickstart-templates"
+infrastructure_origin_base: "{{ examples_base }}/infrastructure-templates/origin"
+infrastructure_enterprise_base: "{{ examples_base }}/infrastructure-templates/enterprise"
 
 openshift_examples_import_command: "create"

+ 12 - 3
roles/openshift_examples/examples-sync.sh

@@ -5,17 +5,20 @@
 #
 # This script should be run from openshift-ansible/roles/openshift_examples
 
+XPAAS_VERSION=ose-v1.1.0
 EXAMPLES_BASE=$(pwd)/files/examples
 find files/examples -name '*.json' -delete
+find files/examples -name '*.yaml' -delete
 TEMP=`mktemp -d`
 pushd $TEMP
+
 wget https://github.com/openshift/origin/archive/master.zip -O origin-master.zip
 wget https://github.com/openshift/django-ex/archive/master.zip -O django-ex-master.zip
 wget https://github.com/openshift/rails-ex/archive/master.zip -O rails-ex-master.zip
 wget https://github.com/openshift/nodejs-ex/archive/master.zip -O nodejs-ex-master.zip
 wget https://github.com/openshift/dancer-ex/archive/master.zip -O dancer-ex-master.zip
 wget https://github.com/openshift/cakephp-ex/archive/master.zip -O cakephp-ex-master.zip
-wget https://github.com/jboss-openshift/application-templates/archive/ose-v1.0.2.zip -O application-templates-master.zip
+wget https://github.com/jboss-openshift/application-templates/archive/${XPAAS_VERSION}.zip -O application-templates-master.zip
 unzip origin-master.zip
 unzip django-ex-master.zip
 unzip rails-ex-master.zip
@@ -31,7 +34,13 @@ cp rails-ex-master/openshift/templates/* ${EXAMPLES_BASE}/quickstart-templates/
 cp nodejs-ex-master/openshift/templates/* ${EXAMPLES_BASE}/quickstart-templates/
 cp dancer-ex-master/openshift/templates/* ${EXAMPLES_BASE}/quickstart-templates/
 cp cakephp-ex-master/openshift/templates/* ${EXAMPLES_BASE}/quickstart-templates/
-mv application-templates-master/jboss-image-streams.json ${EXAMPLES_BASE}/xpaas-streams/
-find application-templates-master/ -name '*.json' ! -wholename '*secret*' -exec mv {} ${EXAMPLES_BASE}/xpaas-templates/ \;
+mv application-templates-${XPAAS_VERSION}/jboss-image-streams.json ${EXAMPLES_BASE}/xpaas-streams/
+find application-templates-${XPAAS_VERSION}/ -name '*.json' ! -wholename '*secret*' -exec mv {} ${EXAMPLES_BASE}/xpaas-templates/ \;
+
+wget https://raw.githubusercontent.com/openshift/origin-metrics/master/metrics.yaml                            -O ${EXAMPLES_BASE}/infrastructure-templates/origin/metrics-deployer.yaml
+cp ${EXAMPLES_BASE}/infrastructure-templates/origin/metrics-*.yaml                                                ${EXAMPLES_BASE}/infrastructure-templates/enterprise/
+wget https://raw.githubusercontent.com/openshift/origin-aggregated-logging/master/deployment/deployer.yaml     -O ${EXAMPLES_BASE}/infrastructure-templates/origin/logging-deployer.yaml
+wget https://raw.githubusercontent.com/openshift/origin-aggregated-logging/enterprise/deployment/deployer.yaml -O ${EXAMPLES_BASE}/infrastructure-templates/enterprise/logging-deployer.yaml
+
 popd
 git diff files/examples

+ 167 - 40
roles/openshift_examples/files/examples/image-streams/image-streams-centos7.json

@@ -11,10 +11,13 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "openshift/ruby-20-centos7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "2.0"
+            }
           },
           {
             "name": "2.0",
@@ -27,8 +30,23 @@
               "sampleRepo": "https://github.com/openshift/ruby-ex.git"
             },
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "openshift/ruby-20-centos7:latest"
+            }
+          },
+          {
+            "name": "2.2",
+            "annotations": {
+              "description": "Build and run Ruby 2.2 applications",
+              "iconClass": "icon-ruby",
+              "tags": "builder,ruby",
+              "supports": "ruby:2.2,ruby",
+              "version": "2.2",
+              "sampleRepo": "https://github.com/openshift/ruby-ex.git"
+            },
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "centos/ruby-22-centos7:latest"
             }
           }
         ]
@@ -42,10 +60,13 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "openshift/nodejs-010-centos7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "0.10"
+            }
           },
           {
             "name": "0.10",
@@ -58,8 +79,8 @@
               "sampleRepo": "https://github.com/openshift/nodejs-ex.git"
             },
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "openshift/nodejs-010-centos7:latest"
             }
           }
         ]
@@ -73,10 +94,13 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "openshift/perl-516-centos7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "5.16"
+            }
           },
           {
             "name": "5.16",
@@ -89,9 +113,25 @@
               "sampleRepo": "https://github.com/openshift/dancer-ex.git"
             },
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "openshift/perl-516-centos7:latest"
             }
+          },
+          {
+            "name": "5.20",
+            "annotations": {
+              "description": "Build and run Perl 5.20 applications",
+              "iconClass": "icon-perl",
+              "tags": "builder,perl",
+              "supports":"perl:5.20,perl",
+              "version": "5.20",
+              "sampleRepo": "https://github.com/openshift/dancer-ex.git"
+            },
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "centos/perl-520-centos7:latest"
+            }
+
           }
         ]
       }
@@ -104,10 +144,13 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "openshift/php-55-centos7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "5.5"
+            }
           },
           {
             "name": "5.5",
@@ -120,8 +163,23 @@
               "sampleRepo": "https://github.com/openshift/cakephp-ex.git"
             },
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "openshift/php-55-centos7:latest"
+            }
+          },
+          {
+            "name": "5.6",
+            "annotations": {
+              "description": "Build and run PHP 5.6 applications",
+              "iconClass": "icon-php",
+              "tags": "builder,php",
+              "supports":"php:5.6,php",
+              "version": "5.6",
+              "sampleRepo": "https://github.com/openshift/cakephp-ex.git"
+            },
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "centos/php-56-centos7:latest"
             }
           }
         ]
@@ -135,10 +193,13 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "openshift/python-33-centos7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "3.3"
+            }
           },
           {
             "name": "3.3",
@@ -151,8 +212,38 @@
               "sampleRepo": "https://github.com/openshift/django-ex.git"
             },
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "openshift/python-33-centos7:latest"
+            }
+          },
+          {
+            "name": "2.7",
+            "annotations": {
+              "description": "Build and run Python 2.7 applications",
+              "iconClass": "icon-python",
+              "tags": "builder,python",
+              "supports":"python:2.7,python",
+              "version": "2.7",
+              "sampleRepo": "https://github.com/openshift/django-ex.git"
+            },
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "centos/python-27-centos7:latest"
+            }
+          },
+          {
+            "name": "3.4",
+            "annotations": {
+              "description": "Build and run Python 3.4 applications",
+              "iconClass": "icon-python",
+              "tags": "builder,python",
+              "supports":"python:3.4,python",
+              "version": "3.4",
+              "sampleRepo": "https://github.com/openshift/django-ex.git"
+            },
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "centos/python-34-centos7:latest"
             }
           }
         ]
@@ -166,10 +257,13 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "openshift/wildfly-81-centos7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "8.1"
+            }
           },
           {
             "name": "8.1",
@@ -182,8 +276,8 @@
               "sampleRepo": "https://github.com/bparees/openshift-jee-sample.git"
             },
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "openshift/wildfly-81-centos7:latest"
             }
           }
         ]
@@ -197,16 +291,26 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "openshift/mysql-55-centos7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "5.5"
+            }
           },
           {
             "name": "5.5",
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "openshift/mysql-55-centos7:latest"
+            }
+          },
+          {
+            "name": "5.6",
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "centos/mysql-56-centos7:latest"
             }
           }
         ]
@@ -220,16 +324,26 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "openshift/postgresql-92-centos7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "9.2"
+            }
           },
           {
             "name": "9.2",
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "openshift/postgresql-92-centos7:latest"
+            }
+          },
+          {
+            "name": "9.4",
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "centos/postgresql-94-centos7:latest"
             }
           }
         ]
@@ -243,16 +357,26 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "openshift/mongodb-24-centos7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "2.4"
+            }
           },
           {
             "name": "2.4",
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "openshift/mongodb-24-centos7:latest"
+            }
+          },
+          {
+            "name": "2.6",
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "centos/mongodb-26-centos7:latest"
             }
           }
         ]
@@ -266,16 +390,19 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "openshift/jenkins-1-centos7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "1"
+            }
           },
           {
             "name": "1",
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "openshift/jenkins-1-centos7:latest"
             }
           }
         ]

+ 160 - 36
roles/openshift_examples/files/examples/image-streams/image-streams-rhel7.json

@@ -11,10 +11,13 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "registry.access.redhat.com/openshift3/ruby-20-rhel7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "2.0"
+            }
           },
           {
             "name": "2.0",
@@ -27,8 +30,23 @@
               "sampleRepo": "https://github.com/openshift/ruby-ex.git"
             },
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/openshift3/ruby-20-rhel7:latest"
+            }
+          },
+          {
+            "name": "2.2",
+            "annotations": {
+              "description": "Build and run Ruby 2.2 applications",
+              "iconClass": "icon-ruby",
+              "tags": "builder,ruby",
+              "supports": "ruby:2.2,ruby",
+              "version": "2.2",
+              "sampleRepo": "https://github.com/openshift/ruby-ex.git"
+            },
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/rhscl/ruby-22-rhel7:latest"
             }
           }
         ]
@@ -42,10 +60,13 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "registry.access.redhat.com/openshift3/nodejs-010-rhel7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "0.10"
+            }
           },
           {
             "name": "0.10",
@@ -58,8 +79,8 @@
               "sampleRepo": "https://github.com/openshift/nodejs-ex.git"
             },
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/openshift3/nodejs-010-rhel7:latest"
             }
           }
         ]
@@ -73,10 +94,13 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "registry.access.redhat.com/openshift3/perl-516-rhel7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "5.16"
+            }
           },
           {
             "name": "5.16",
@@ -89,9 +113,25 @@
               "sampleRepo": "https://github.com/openshift/dancer-ex.git"
             },
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/openshift3/perl-516-rhel7:latest"
+            }
+          },
+          {
+            "name": "5.20",
+            "annotations": {
+              "description": "Build and run Perl 5.20 applications",
+              "iconClass": "icon-perl",
+              "tags": "builder,perl",
+              "supports":"perl:5.20,perl",
+              "version": "5.20",
+              "sampleRepo": "https://github.com/openshift/dancer-ex.git"
+            },
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/rhscl/perl-520-rhel7:latest"
             }
+
           }
         ]
       }
@@ -104,10 +144,13 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "registry.access.redhat.com/openshift3/php-55-rhel7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "5.5"
+            }
           },
           {
             "name": "5.5",
@@ -120,8 +163,23 @@
               "sampleRepo": "https://github.com/openshift/cakephp-ex.git"              
             },
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/openshift3/php-55-rhel7:latest"
+            }
+          },
+          {
+            "name": "5.6",
+            "annotations": {
+              "description": "Build and run PHP 5.6 applications",
+              "iconClass": "icon-php",
+              "tags": "builder,php",
+              "supports":"php:5.6,php",
+              "version": "5.6",
+              "sampleRepo": "https://github.com/openshift/cakephp-ex.git"
+            },
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/rhscl/php-56-rhel7:latest"
             }
           }
         ]
@@ -135,10 +193,13 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "registry.access.redhat.com/openshift3/python-33-rhel7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "3.3"
+            }
           },
           {
             "name": "3.3",
@@ -151,8 +212,38 @@
               "sampleRepo": "https://github.com/openshift/django-ex.git"
             },
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/openshift3/python-33-rhel7:latest"
+            }
+          },
+          {
+            "name": "2.7",
+            "annotations": {
+              "description": "Build and run Python 2.7 applications",
+              "iconClass": "icon-python",
+              "tags": "builder,python",
+              "supports":"python:2.7,python",
+              "version": "2.7",
+              "sampleRepo": "https://github.com/openshift/django-ex.git"
+            },
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/rhscl/python-27-rhel7:latest"
+            }
+          },
+          {
+            "name": "3.4",
+            "annotations": {
+              "description": "Build and run Python 3.4 applications",
+              "iconClass": "icon-python",
+              "tags": "builder,python",
+              "supports":"python:3.4,python",
+              "version": "3.4",
+              "sampleRepo": "https://github.com/openshift/django-ex.git"
+            },
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/rhscl/python-34-rhel7:latest"
             }
           }
         ]
@@ -166,16 +257,26 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "registry.access.redhat.com/openshift3/mysql-55-rhel7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "5.5"
+            }
           },
           {
             "name": "5.5",
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/openshift3/mysql-55-rhel7:latest"
+            }
+          },
+          {
+            "name": "5.6",
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/rhscl/mysql-56-rhel7:latest"
             }
           }
         ]
@@ -189,16 +290,26 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "registry.access.redhat.com/openshift3/postgresql-92-rhel7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "9.2"
+            }
           },
           {
             "name": "9.2",
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/openshift3/postgresql-92-rhel7:latest"
+            }
+          },
+          {
+            "name": "9.4",
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/rhscl/postgresql-94-rhel7:latest"
             }
           }
         ]
@@ -212,16 +323,26 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "registry.access.redhat.com/openshift3/mongodb-24-rhel7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "2.4"
+            }
           },
           {
             "name": "2.4",
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/openshift3/mongodb-24-rhel7:latest"
+            }
+          },
+          {
+            "name": "2.6",
+            "from": {
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/rhscl/mongodb-26-rhel7:latest"
             }
           }
         ]
@@ -235,16 +356,19 @@
         "creationTimestamp": null
       },
       "spec": {
-        "dockerImageRepository": "registry.access.redhat.com/openshift3/jenkins-1-rhel7",
         "tags": [
           {
-            "name": "latest"
+            "name": "latest",
+            "from": {
+              "Kind": "ImageStreamTag",
+              "Name": "1"
+            }
           },
           {
             "name": "1",
             "from": {
-              "Kind": "ImageStreamTag",
-              "Name": "latest"
+              "Kind": "DockerImage",
+              "Name": "registry.access.redhat.com/openshift3/jenkins-1-rhel7:latest"
             }
           }
         ]

+ 151 - 0
roles/openshift_examples/files/examples/infrastructure-templates/enterprise/logging-deployer.yaml

@@ -0,0 +1,151 @@
+apiVersion: "v1"
+kind: "Template"
+metadata:
+  name: logging-deployer-template
+  annotations:
+    description: "Template for deploying everything needed for aggregated logging. Requires cluster-admin 'logging-deployer' service account and 'logging-deployer' secret."
+    tags: "infrastructure"
+labels:
+  logging-infra: deployer
+  provider: openshift
+  component: deployer
+objects:
+-
+  apiVersion: v1
+  kind: Pod
+  metadata:
+    generateName: logging-deployer-
+  spec:
+    containers:
+    - image: ${IMAGE_PREFIX}logging-deployment:${IMAGE_VERSION}
+      imagePullPolicy: Always
+      name: deployer
+      volumeMounts:
+      - name: secret
+        mountPath: /secret
+        readOnly: true
+      - name: empty
+        mountPath: /etc/deploy
+      env:
+        - name: PROJECT
+          valueFrom:
+            fieldRef:
+              fieldPath: metadata.namespace
+        - name: IMAGE_PREFIX
+          value: ${IMAGE_PREFIX}
+        - name: IMAGE_VERSION
+          value: ${IMAGE_VERSION}
+        - name: ENABLE_OPS_CLUSTER
+          value: ${ENABLE_OPS_CLUSTER}
+        - name: KIBANA_HOSTNAME
+          value: ${KIBANA_HOSTNAME}
+        - name: KIBANA_OPS_HOSTNAME
+          value: ${KIBANA_OPS_HOSTNAME}
+        - name: PUBLIC_MASTER_URL
+          value: ${PUBLIC_MASTER_URL}
+        - name: MASTER_URL
+          value: ${MASTER_URL}
+        - name: ES_INSTANCE_RAM
+          value: ${ES_INSTANCE_RAM}
+        - name: ES_CLUSTER_SIZE
+          value: ${ES_CLUSTER_SIZE}
+        - name: ES_NODE_QUORUM
+          value: ${ES_NODE_QUORUM}
+        - name: ES_RECOVER_AFTER_NODES
+          value: ${ES_RECOVER_AFTER_NODES}
+        - name: ES_RECOVER_EXPECTED_NODES
+          value: ${ES_RECOVER_EXPECTED_NODES}
+        - name: ES_RECOVER_AFTER_TIME
+          value: ${ES_RECOVER_AFTER_TIME}
+        - name: ES_OPS_INSTANCE_RAM
+          value: ${ES_OPS_INSTANCE_RAM}
+        - name: ES_OPS_CLUSTER_SIZE
+          value: ${ES_OPS_CLUSTER_SIZE}
+        - name: ES_OPS_NODE_QUORUM
+          value: ${ES_OPS_NODE_QUORUM}
+        - name: ES_OPS_RECOVER_AFTER_NODES
+          value: ${ES_OPS_RECOVER_AFTER_NODES}
+        - name: ES_OPS_RECOVER_EXPECTED_NODES
+          value: ${ES_OPS_RECOVER_EXPECTED_NODES}
+        - name: ES_OPS_RECOVER_AFTER_TIME
+          value: ${ES_OPS_RECOVER_AFTER_TIME}
+    dnsPolicy: ClusterFirst
+    restartPolicy: Never
+    serviceAccount: logging-deployer
+    volumes:
+    - name: empty
+      emptyDir: {}
+    - name: secret
+      secret:
+        secretName: logging-deployer
+parameters:
+-
+  description: 'Specify prefix for logging components; e.g. for "openshift/origin-logging-deployer:v1.1", set prefix "openshift/origin-"'
+  name: IMAGE_PREFIX
+  value: "registry.access.redhat.com/openshift3/"
+-
+  description: 'Specify version for logging components; e.g. for "openshift/origin-logging-deployer:v1.1", set version "v1.1"'
+  name: IMAGE_VERSION
+  value: "3.1.0"
+-
+  description: "If true, set up to use a second ES cluster for ops logs."
+  name: ENABLE_OPS_CLUSTER
+  value: "false"
+-
+  description: "External hostname where clients will reach kibana"
+  name: KIBANA_HOSTNAME
+  required: true
+-
+  description: "External hostname at which admins will visit the ops Kibana."
+  name: KIBANA_OPS_HOSTNAME
+  value: kibana-ops.example.com
+-
+  description: "External URL for the master, for OAuth purposes"
+  name: PUBLIC_MASTER_URL
+  required: true
+-
+  description: "Internal URL for the master, for authentication retrieval"
+  name: MASTER_URL
+  value: "https://kubernetes.default.svc.cluster.local"
+-
+  description: "Amount of RAM to reserve per ElasticSearch instance."
+  name: ES_INSTANCE_RAM
+  value: "8G"
+-
+  description: "How many instances of ElasticSearch to deploy."
+  name: ES_CLUSTER_SIZE
+  required: true
+-
+  description: "Number of nodes required to elect a master (ES minimum_master_nodes). By default, derived from ES_CLUSTER_SIZE / 2 + 1."
+  name: ES_NODE_QUORUM
+-
+  description: "Number of nodes required to be present before the cluster will recover from a full restart. By default, one fewer than ES_CLUSTER_SIZE."
+  name: ES_RECOVER_AFTER_NODES
+-
+  description: "Number of nodes desired to be present before the cluster will recover from a full restart. By default, ES_CLUSTER_SIZE."
+  name: ES_RECOVER_EXPECTED_NODES
+-
+  description: "Timeout for *expected* nodes to be present when cluster is recovering from a full restart."
+  name: ES_RECOVER_AFTER_TIME
+  value: "5m"
+-
+  description: "Amount of RAM to reserve per ops ElasticSearch instance."
+  name: ES_OPS_INSTANCE_RAM
+  value: "8G"
+-
+  description: "How many ops instances of ElasticSearch to deploy. By default, ES_CLUSTER_SIZE."
+  name: ES_OPS_CLUSTER_SIZE
+-
+  description: "Number of ops nodes required to elect a master (ES minimum_master_nodes). By default, derived from ES_CLUSTER_SIZE / 2 + 1."
+  name: ES_OPS_NODE_QUORUM
+-
+  description: "Number of ops nodes required to be present before the cluster will recover from a full restart. By default, one fewer than ES_OPS_CLUSTER_SIZE."
+  name: ES_OPS_RECOVER_AFTER_NODES
+-
+  description: "Number of ops nodes desired to be present before the cluster will recover from a full restart. By default, ES_OPS_CLUSTER_SIZE."
+  name: ES_OPS_RECOVER_EXPECTED_NODES
+-
+  description: "Timeout for *expected* ops nodes to be present when cluster is recovering from a full restart."
+  name: ES_OPS_RECOVER_AFTER_TIME
+  value: "5m"
+

+ 116 - 0
roles/openshift_examples/files/examples/infrastructure-templates/enterprise/metrics-deployer.yaml

@@ -0,0 +1,116 @@
+#!/bin/bash
+#
+# Copyright 2014-2015 Red Hat, Inc. and/or its affiliates
+# and other contributors as indicated by the @author tags.
+#
+# 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.
+#
+
+apiVersion: "v1"
+kind: "Template"
+metadata:
+  name: metrics-deployer-template
+  annotations:
+    description: "Template for deploying the required Metrics integration. Requires cluster-admin 'metrics-deployer' service account and 'metrics-deployer' secret."
+    tags: "infrastructure"
+labels:
+  metrics-infra: deployer
+  provider: openshift
+  component: deployer
+objects:
+-
+  apiVersion: v1
+  kind: Pod
+  metadata:
+    generateName: metrics-deployer-
+  spec:
+    containers:
+    - image: ${IMAGE_PREFIX}metrics-deployer:${IMAGE_VERSION}
+      name: deployer
+      volumeMounts:
+      - name: secret
+        mountPath: /secret
+        readOnly: true
+      - name: empty
+        mountPath: /etc/deploy
+      env:
+        - name: PROJECT
+          valueFrom:
+            fieldRef:
+              fieldPath: metadata.namespace
+        - name: IMAGE_PREFIX
+          value: ${IMAGE_PREFIX}
+        - name: IMAGE_VERSION
+          value: ${IMAGE_VERSION}
+        - name: PUBLIC_MASTER_URL
+          value: ${PUBLIC_MASTER_URL}
+        - name: MASTER_URL
+          value: ${MASTER_URL}
+        - name: REDEPLOY
+          value: ${REDEPLOY}
+        - name: USE_PERSISTENT_STORAGE
+          value: ${USE_PERSISTENT_STORAGE}
+        - name: HAWKULAR_METRICS_HOSTNAME
+          value: ${HAWKULAR_METRICS_HOSTNAME}
+        - name: CASSANDRA_NODES
+          value: ${CASSANDRA_NODES}
+        - name: CASSANDRA_PV_SIZE
+          value: ${CASSANDRA_PV_SIZE}
+        - name: METRIC_DURATION
+          value: ${METRIC_DURATION}
+    dnsPolicy: ClusterFirst
+    restartPolicy: Never
+    serviceAccount: metrics-deployer
+    volumes:
+    - name: empty
+      emptyDir: {}
+    - name: secret
+      secret:
+        secretName: metrics-deployer
+parameters:
+-
+  description: 'Specify prefix for metrics components; e.g. for "openshift/origin-metrics-deployer:v1.1", set prefix "openshift/origin-"'
+  name: IMAGE_PREFIX
+  value: "hawkular/"
+-
+  description: 'Specify version for metrics components; e.g. for "openshift/origin-metrics-deployer:v1.1", set version "v1.1"'
+  name: IMAGE_VERSION
+  value: "0.7.0-SNAPSHOT"
+-
+  description: "Internal URL for the master, for authentication retrieval"
+  name: MASTER_URL
+  value: "https://kubernetes.default.svc:443"
+-
+  description: "External hostname where clients will reach Hawkular Metrics"
+  name: HAWKULAR_METRICS_HOSTNAME
+  required: true
+-
+  description: "If set to true the deployer will try and delete all the existing components before trying to redeploy."
+  name: REDEPLOY
+  value: "false"
+-
+  description: "Set to true for persistent storage, set to false to use non persistent storage"
+  name: USE_PERSISTENT_STORAGE
+  value: "true"
+-
+  description: "The number of Cassandra Nodes to deploy for the initial cluster"
+  name: CASSANDRA_NODES
+  value: "1"
+-
+  description: "The persistent volume size for each of the Cassandra nodes"
+  name: CASSANDRA_PV_SIZE
+  value: "1Gi"
+-
+  description: "How many days metrics should be stored for."
+  name: METRIC_DURATION
+  value: "7"

+ 151 - 0
roles/openshift_examples/files/examples/infrastructure-templates/origin/logging-deployer.yaml

@@ -0,0 +1,151 @@
+apiVersion: "v1"
+kind: "Template"
+metadata:
+  name: logging-deployer-template
+  annotations:
+    description: "Template for deploying everything needed for aggregated logging. Requires cluster-admin 'logging-deployer' service account and 'logging-deployer' secret."
+    tags: "infrastructure"
+labels:
+  logging-infra: deployer
+  provider: openshift
+  component: deployer
+objects:
+-
+  apiVersion: v1
+  kind: Pod
+  metadata:
+    generateName: logging-deployer-
+  spec:
+    containers:
+    - image: ${IMAGE_PREFIX}logging-deployment:${IMAGE_VERSION}
+      imagePullPolicy: Always
+      name: deployer
+      volumeMounts:
+      - name: secret
+        mountPath: /secret
+        readOnly: true
+      - name: empty
+        mountPath: /etc/deploy
+      env:
+        - name: PROJECT
+          valueFrom:
+            fieldRef:
+              fieldPath: metadata.namespace
+        - name: IMAGE_PREFIX
+          value: ${IMAGE_PREFIX}
+        - name: IMAGE_VERSION
+          value: ${IMAGE_VERSION}
+        - name: ENABLE_OPS_CLUSTER
+          value: ${ENABLE_OPS_CLUSTER}
+        - name: KIBANA_HOSTNAME
+          value: ${KIBANA_HOSTNAME}
+        - name: KIBANA_OPS_HOSTNAME
+          value: ${KIBANA_OPS_HOSTNAME}
+        - name: PUBLIC_MASTER_URL
+          value: ${PUBLIC_MASTER_URL}
+        - name: MASTER_URL
+          value: ${MASTER_URL}
+        - name: ES_INSTANCE_RAM
+          value: ${ES_INSTANCE_RAM}
+        - name: ES_CLUSTER_SIZE
+          value: ${ES_CLUSTER_SIZE}
+        - name: ES_NODE_QUORUM
+          value: ${ES_NODE_QUORUM}
+        - name: ES_RECOVER_AFTER_NODES
+          value: ${ES_RECOVER_AFTER_NODES}
+        - name: ES_RECOVER_EXPECTED_NODES
+          value: ${ES_RECOVER_EXPECTED_NODES}
+        - name: ES_RECOVER_AFTER_TIME
+          value: ${ES_RECOVER_AFTER_TIME}
+        - name: ES_OPS_INSTANCE_RAM
+          value: ${ES_OPS_INSTANCE_RAM}
+        - name: ES_OPS_CLUSTER_SIZE
+          value: ${ES_OPS_CLUSTER_SIZE}
+        - name: ES_OPS_NODE_QUORUM
+          value: ${ES_OPS_NODE_QUORUM}
+        - name: ES_OPS_RECOVER_AFTER_NODES
+          value: ${ES_OPS_RECOVER_AFTER_NODES}
+        - name: ES_OPS_RECOVER_EXPECTED_NODES
+          value: ${ES_OPS_RECOVER_EXPECTED_NODES}
+        - name: ES_OPS_RECOVER_AFTER_TIME
+          value: ${ES_OPS_RECOVER_AFTER_TIME}
+    dnsPolicy: ClusterFirst
+    restartPolicy: Never
+    serviceAccount: logging-deployer
+    volumes:
+    - name: empty
+      emptyDir: {}
+    - name: secret
+      secret:
+        secretName: logging-deployer
+parameters:
+-
+  description: 'Specify prefix for logging components; e.g. for "openshift/origin-logging-deployer:v1.1", set prefix "openshift/origin-"'
+  name: IMAGE_PREFIX
+  value: "docker.io/openshift/origin-"
+-
+  description: 'Specify version for logging components; e.g. for "openshift/origin-logging-deployer:v1.1", set version "v1.1"'
+  name: IMAGE_VERSION
+  value: "latest"
+-
+  description: "If true, set up to use a second ES cluster for ops logs."
+  name: ENABLE_OPS_CLUSTER
+  value: "false"
+-
+  description: "External hostname where clients will reach kibana"
+  name: KIBANA_HOSTNAME
+  required: true
+-
+  description: "External hostname at which admins will visit the ops Kibana."
+  name: KIBANA_OPS_HOSTNAME
+  value: kibana-ops.example.com
+-
+  description: "External URL for the master, for OAuth purposes"
+  name: PUBLIC_MASTER_URL
+  required: true
+-
+  description: "Internal URL for the master, for authentication retrieval"
+  name: MASTER_URL
+  value: "https://kubernetes.default.svc.cluster.local"
+-
+  description: "Amount of RAM to reserve per ElasticSearch instance."
+  name: ES_INSTANCE_RAM
+  value: "8G"
+-
+  description: "How many instances of ElasticSearch to deploy."
+  name: ES_CLUSTER_SIZE
+  required: true
+-
+  description: "Number of nodes required to elect a master (ES minimum_master_nodes). By default, derived from ES_CLUSTER_SIZE / 2 + 1."
+  name: ES_NODE_QUORUM
+-
+  description: "Number of nodes required to be present before the cluster will recover from a full restart. By default, one fewer than ES_CLUSTER_SIZE."
+  name: ES_RECOVER_AFTER_NODES
+-
+  description: "Number of nodes desired to be present before the cluster will recover from a full restart. By default, ES_CLUSTER_SIZE."
+  name: ES_RECOVER_EXPECTED_NODES
+-
+  description: "Timeout for *expected* nodes to be present when cluster is recovering from a full restart."
+  name: ES_RECOVER_AFTER_TIME
+  value: "5m"
+-
+  description: "Amount of RAM to reserve per ops ElasticSearch instance."
+  name: ES_OPS_INSTANCE_RAM
+  value: "8G"
+-
+  description: "How many ops instances of ElasticSearch to deploy. By default, ES_CLUSTER_SIZE."
+  name: ES_OPS_CLUSTER_SIZE
+-
+  description: "Number of ops nodes required to elect a master (ES minimum_master_nodes). By default, derived from ES_CLUSTER_SIZE / 2 + 1."
+  name: ES_OPS_NODE_QUORUM
+-
+  description: "Number of ops nodes required to be present before the cluster will recover from a full restart. By default, one fewer than ES_OPS_CLUSTER_SIZE."
+  name: ES_OPS_RECOVER_AFTER_NODES
+-
+  description: "Number of ops nodes desired to be present before the cluster will recover from a full restart. By default, ES_OPS_CLUSTER_SIZE."
+  name: ES_OPS_RECOVER_EXPECTED_NODES
+-
+  description: "Timeout for *expected* ops nodes to be present when cluster is recovering from a full restart."
+  name: ES_OPS_RECOVER_AFTER_TIME
+  value: "5m"
+

+ 116 - 0
roles/openshift_examples/files/examples/infrastructure-templates/origin/metrics-deployer.yaml

@@ -0,0 +1,116 @@
+#!/bin/bash
+#
+# Copyright 2014-2015 Red Hat, Inc. and/or its affiliates
+# and other contributors as indicated by the @author tags.
+#
+# 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.
+#
+
+apiVersion: "v1"
+kind: "Template"
+metadata:
+  name: metrics-deployer-template
+  annotations:
+    description: "Template for deploying the required Metrics integration. Requires cluster-admin 'metrics-deployer' service account and 'metrics-deployer' secret."
+    tags: "infrastructure"
+labels:
+  metrics-infra: deployer
+  provider: openshift
+  component: deployer
+objects:
+-
+  apiVersion: v1
+  kind: Pod
+  metadata:
+    generateName: metrics-deployer-
+  spec:
+    containers:
+    - image: ${IMAGE_PREFIX}metrics-deployer:${IMAGE_VERSION}
+      name: deployer
+      volumeMounts:
+      - name: secret
+        mountPath: /secret
+        readOnly: true
+      - name: empty
+        mountPath: /etc/deploy
+      env:
+        - name: PROJECT
+          valueFrom:
+            fieldRef:
+              fieldPath: metadata.namespace
+        - name: IMAGE_PREFIX
+          value: ${IMAGE_PREFIX}
+        - name: IMAGE_VERSION
+          value: ${IMAGE_VERSION}
+        - name: PUBLIC_MASTER_URL
+          value: ${PUBLIC_MASTER_URL}
+        - name: MASTER_URL
+          value: ${MASTER_URL}
+        - name: REDEPLOY
+          value: ${REDEPLOY}
+        - name: USE_PERSISTENT_STORAGE
+          value: ${USE_PERSISTENT_STORAGE}
+        - name: HAWKULAR_METRICS_HOSTNAME
+          value: ${HAWKULAR_METRICS_HOSTNAME}
+        - name: CASSANDRA_NODES
+          value: ${CASSANDRA_NODES}
+        - name: CASSANDRA_PV_SIZE
+          value: ${CASSANDRA_PV_SIZE}
+        - name: METRIC_DURATION
+          value: ${METRIC_DURATION}
+    dnsPolicy: ClusterFirst
+    restartPolicy: Never
+    serviceAccount: metrics-deployer
+    volumes:
+    - name: empty
+      emptyDir: {}
+    - name: secret
+      secret:
+        secretName: metrics-deployer
+parameters:
+-
+  description: 'Specify prefix for metrics components; e.g. for "openshift/origin-metrics-deployer:v1.1", set prefix "openshift/origin-"'
+  name: IMAGE_PREFIX
+  value: "hawkular/"
+-
+  description: 'Specify version for metrics components; e.g. for "openshift/origin-metrics-deployer:v1.1", set version "v1.1"'
+  name: IMAGE_VERSION
+  value: "0.7.0-SNAPSHOT"
+-
+  description: "Internal URL for the master, for authentication retrieval"
+  name: MASTER_URL
+  value: "https://kubernetes.default.svc:443"
+-
+  description: "External hostname where clients will reach Hawkular Metrics"
+  name: HAWKULAR_METRICS_HOSTNAME
+  required: true
+-
+  description: "If set to true the deployer will try and delete all the existing components before trying to redeploy."
+  name: REDEPLOY
+  value: "false"
+-
+  description: "Set to true for persistent storage, set to false to use non persistent storage"
+  name: USE_PERSISTENT_STORAGE
+  value: "true"
+-
+  description: "The number of Cassandra Nodes to deploy for the initial cluster"
+  name: CASSANDRA_NODES
+  value: "1"
+-
+  description: "The persistent volume size for each of the Cassandra nodes"
+  name: CASSANDRA_PV_SIZE
+  value: "1Gi"
+-
+  description: "How many days metrics should be stored for."
+  name: METRIC_DURATION
+  value: "7"

+ 35 - 28
roles/openshift_examples/files/examples/xpaas-streams/jboss-image-streams.json

@@ -12,19 +12,21 @@
             "kind": "ImageStream",
             "apiVersion": "v1",
             "metadata": {
-                "name": "jboss-webserver3-tomcat7-openshift"
+                "name": "jboss-webserver30-tomcat7-openshift"
             },
             "spec": {
-                "dockerImageRepository": "registry.access.redhat.com/jboss-webserver-3/tomcat7-openshift",
+                "dockerImageRepository": "registry.access.redhat.com/jboss-webserver-3/webserver30-tomcat7-openshift",
                 "tags": [
                     {
-                        "name": "3.0",
+                        "name": "1.1",
                         "annotations": {
-                            "description": "JBoss Web Server v3 Tomcat 7 STI images.",
+                            "description": "JBoss Web Server 3.0 Tomcat 7 S2I images.",
                             "iconClass": "icon-jboss",
-                            "tags": "java",
-                            "supports":"tomcat7:3.0,java",
-                            "version": "3.0"
+                            "tags": "builder,tomcat,tomcat7,java,jboss,xpaas",
+                            "supports":"tomcat7:3.0,tomcat:7,java:8,xpaas:1.1",
+                            "sampleRepo": "https://github.com/jboss-openshift/openshift-quickstarts.git",
+                            "sampleContextDir": "tomcat-websocket-chat",
+                            "version": "1.1"
                         }
                     }
                 ]
@@ -34,19 +36,21 @@
             "kind": "ImageStream",
             "apiVersion": "v1",
             "metadata": {
-                "name": "jboss-webserver3-tomcat8-openshift"
+                "name": "jboss-webserver30-tomcat8-openshift"
             },
             "spec": {
-                "dockerImageRepository": "registry.access.redhat.com/jboss-webserver-3/tomcat8-openshift",
+                "dockerImageRepository": "registry.access.redhat.com/jboss-webserver-3/webserver30-tomcat8-openshift",
                 "tags": [
                     {
-                        "name": "3.0",
+                        "name": "1.1",
                         "annotations": {
-                            "description": "JBoss Web Server v3 Tomcat 8 STI images.",
+                            "description": "JBoss Web Server 3.0 Tomcat 8 S2I images.",
                             "iconClass": "icon-jboss",
-                            "tags": "java",
-                            "supports":"tomcat8:3.0,java",
-                            "version": "3.0"
+                            "tags": "builder,tomcat,tomcat8,java,jboss,xpaas",
+                            "supports":"tomcat8:3.0,tomcat:8,java:8,xpaas:1.1",
+                            "sampleRepo": "https://github.com/jboss-openshift/openshift-quickstarts.git",
+                            "sampleContextDir": "tomcat-websocket-chat",
+                            "version": "1.1"
                         }
                     }
                 ]
@@ -56,19 +60,22 @@
             "kind": "ImageStream",
             "apiVersion": "v1",
             "metadata": {
-                "name": "jboss-eap6-openshift"
+                "name": "jboss-eap64-openshift"
             },
             "spec": {
-                "dockerImageRepository": "registry.access.redhat.com/jboss-eap-6/eap-openshift",
+                "dockerImageRepository": "registry.access.redhat.com/jboss-eap-6/eap64-openshift",
                 "tags": [
                     {
-                        "name": "6.4",
+                        "name": "1.1",
                         "annotations": {
-                            "description": "JBoss EAP 6 STI images.",
+                            "description": "JBoss EAP 6.4 S2I images.",
                             "iconClass": "icon-jboss",
-                            "tags": "javaee",
-                            "supports":"eap:6.4,jee,java",
-                            "version": "6.4"
+                            "tags": "builder,eap,javaee,java,jboss,xpaas",
+                            "supports":"eap:6.4,javaee:6,java:8,xpaas:1.1",
+                            "sampleRepo": "https://github.com/jboss-developer/jboss-eap-quickstarts.git",
+                            "sampleContextDir": "kitchensink",
+                            "sampleRef": "6.4.x",
+                            "version": "1.1"
                         }
                     }
                 ]
@@ -78,19 +85,19 @@
             "kind": "ImageStream",
             "apiVersion": "v1",
             "metadata": {
-                "name": "jboss-amq-6"
+                "name": "jboss-amq-62"
             },
             "spec": {
-                "dockerImageRepository": "registry.access.redhat.com/jboss-amq-6/amq-openshift",
+                "dockerImageRepository": "registry.access.redhat.com/jboss-amq-6/amq62-openshift",
                 "tags": [
                     {
-                        "name": "6.2",
+                        "name": "1.1",
                         "annotations": {
-                            "description": "JBoss ActiveMQ 6 broker image.",
+                            "description": "JBoss A-MQ 6.2 broker image.",
                             "iconClass": "icon-jboss",
-                            "tags": "javaee",
-                            "supports":"amq:6.2,jee,java",
-                            "version": "6.2"
+                            "tags": "messaging,amq,jboss,xpaas",
+                            "supports":"amq:6.2,messaging,xpaas:1.1",
+                            "version": "1.1"
                         }
                     }
                 ]

+ 325 - 0
roles/openshift_examples/files/examples/xpaas-templates/amq62-basic.json

@@ -0,0 +1,325 @@
+{
+    "kind": "Template",
+    "apiVersion": "v1",
+    "metadata": {
+        "annotations": {
+            "description": "Application template for JBoss A-MQ brokers. These can be deployed as standalone or in a mesh. This template doesn't feature SSL support.",
+            "iconClass": "icon-jboss",
+            "tags": "messaging,amq,jboss,xpaas",
+            "version": "1.1.0"
+        },
+        "name": "amq62-basic"
+    },
+    "labels": {
+        "template": "amq62-basic",
+        "xpaas": "1.1.0"
+    },
+    "parameters": [
+        {
+            "description": "The name for the application.",
+            "name": "APPLICATION_NAME",
+            "value": "broker",
+            "required": true
+        },
+        {
+            "description": "Protocols to configure, separated by commas. Allowed values are: `openwire`, `amqp`, `stomp` and `mqtt`.",
+            "name": "MQ_PROTOCOL",
+            "value": "openwire",
+            "required": false
+        },
+        {
+            "description": "Queue names, separated by commas. These queues will be automatically created when the broker starts. If left empty, queues will be still created dynamically.",
+            "name": "MQ_QUEUES",
+            "value": "",
+            "required": false
+        },
+        {
+            "description": "Topic names, separated by commas. These topics will be automatically created when the broker starts. If left empty, topics will be still created dynamically.",
+            "name": "MQ_TOPICS",
+            "value": "",
+            "required": false
+        },
+        {
+            "description": "User name for standard broker user. It is required for connecting to the broker. If left empty, it will be generated.",
+            "name": "MQ_USERNAME",
+            "from": "user[a-zA-Z0-9]{3}",
+            "generate": "expression",
+            "required": false
+        },
+        {
+            "description": "Password for standard broker user. It is required for connecting to the broker. If left empty, it will be generated.",
+            "name": "MQ_PASSWORD",
+            "from": "[a-zA-Z0-9]{8}",
+            "generate": "expression",
+            "required": false
+        },
+        {
+            "description": "User name for admin user. If left empty, it will be generated.",
+            "name": "AMQ_ADMIN_USERNAME",
+            "from": "user[a-zA-Z0-9]{3}",
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Password for admin user. If left empty, it will be generated.",
+            "name": "AMQ_ADMIN_PASSWORD",
+            "from": "[a-zA-Z0-9]{8}",
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "The discovery agent type to use for discovering mesh endpoints.  'dns' will use OpenShift's DNS service to resolve endpoints.  'kube' will use Kubernetes REST API to resolve service endpoints.  If using 'kube' the service account for the pod must have the 'view' role, which can be added via 'oc policy add-role-to-user view system:serviceaccount:<namespace>:default' where <namespace> is the project namespace.",
+            "name": "AMQ_MESH_DISCOVERY_TYPE",
+            "value": "kube",
+            "required": false
+        },
+        {
+            "description": "The A-MQ storage usage limit",
+            "name": "AMQ_STORAGE_USAGE_LIMIT",
+            "value": "100 gb",
+            "required": false
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
+        }
+    ],
+    "objects": [
+        {
+            "kind": "Service",
+            "apiVersion": "v1",
+            "spec": {
+                "ports": [
+                    {
+                        "port": 5672,
+                        "targetPort": 5672
+                    }
+                ],
+                "selector": {
+                    "deploymentConfig": "${APPLICATION_NAME}-amq"
+                }
+            },
+            "metadata": {
+                "name": "${APPLICATION_NAME}-amq-amqp",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                },
+                "annotations": {
+                    "description": "The broker's AMQP port."
+                }
+            }
+        },
+        {
+            "kind": "Service",
+            "apiVersion": "v1",
+            "spec": {
+                "ports": [
+                    {
+                        "port": 1883,
+                        "targetPort": 1883
+                    }
+                ],
+                "selector": {
+                    "deploymentConfig": "${APPLICATION_NAME}-amq"
+                }
+            },
+            "metadata": {
+                "name": "${APPLICATION_NAME}-amq-mqtt",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                },
+                "annotations": {
+                    "description": "The broker's MQTT port."
+                }
+            }
+        },
+        {
+            "kind": "Service",
+            "apiVersion": "v1",
+            "spec": {
+                "ports": [
+                    {
+                        "port": 61613,
+                        "targetPort": 61613
+                    }
+                ],
+                "selector": {
+                    "deploymentConfig": "${APPLICATION_NAME}-amq"
+                }
+            },
+            "metadata": {
+                "name": "${APPLICATION_NAME}-amq-stomp",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                },
+                "annotations": {
+                    "description": "The broker's STOMP port."
+                }
+            }
+        },
+        {
+            "kind": "Service",
+            "apiVersion": "v1",
+            "spec": {
+                "ports": [
+                    {
+                        "port": 61616,
+                        "targetPort": 61616
+                    }
+                ],
+                "selector": {
+                    "deploymentConfig": "${APPLICATION_NAME}-amq"
+                }
+            },
+            "metadata": {
+                "name": "${APPLICATION_NAME}-amq-tcp",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                },
+                "annotations": {
+                    "description": "The broker's OpenWire port."
+                }
+            }
+        },
+        {
+            "kind": "DeploymentConfig",
+            "apiVersion": "v1",
+            "metadata": {
+                "name": "${APPLICATION_NAME}-amq",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                }
+            },
+            "spec": {
+                "strategy": {
+                    "type": "Recreate"
+                },
+                "triggers": [
+                    {
+                        "type": "ImageChange",
+                        "imageChangeParams": {
+                            "automatic": true,
+                            "containerNames": [
+                                "${APPLICATION_NAME}-amq"
+                            ],
+                            "from": {
+                                "kind": "ImageStreamTag",
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                                "name": "jboss-amq-62:1.1"
+                            }
+                        }
+                    },
+                    {
+                        "type": "ConfigChange"
+                    }
+                ],
+                "replicas": 1,
+                "selector": {
+                    "deploymentConfig": "${APPLICATION_NAME}-amq"
+                },
+                "template": {
+                    "metadata": {
+                        "name": "${APPLICATION_NAME}-amq",
+                        "labels": {
+                            "deploymentConfig": "${APPLICATION_NAME}-amq",
+                            "application": "${APPLICATION_NAME}"
+                        }
+                    },
+                    "spec": {
+                        "terminationGracePeriodSeconds": 60,
+                        "containers": [
+                            {
+                                "name": "${APPLICATION_NAME}-amq",
+                                "image": "jboss-amq-62",
+                                "imagePullPolicy": "Always",
+                                "readinessProbe": {
+                                    "exec": {
+                                        "command": [
+                                            "/bin/bash",
+                                            "-c",
+                                            "curl -s -L -u ${AMQ_ADMIN_USERNAME}:${AMQ_ADMIN_PASSWORD} 'http://localhost:8161/hawtio/jolokia/read/org.apache.activemq:type=Broker,brokerName=*,service=Health/CurrentStatus' | grep -q '\"CurrentStatus\" *: *\"Good\"'"
+                                        ]
+                                    }
+                                },
+                                "ports": [
+                                    {
+                                        "name": "amqp",
+                                        "containerPort": 5672,
+                                        "protocol": "TCP"
+                                    },
+                                    {
+                                        "name": "mqtt",
+                                        "containerPort": 1883,
+                                        "protocol": "TCP"
+                                    },
+                                    {
+                                        "name": "stomp",
+                                        "containerPort": 61613,
+                                        "protocol": "TCP"
+                                    },
+                                    {
+                                        "name": "tcp",
+                                        "containerPort": 61616,
+                                        "protocol": "TCP"
+                                    }
+                                ],
+                                "env": [
+                                    {
+                                        "name": "AMQ_USER",
+                                        "value": "${MQ_USERNAME}"
+                                    },
+                                    {
+                                        "name": "AMQ_PASSWORD",
+                                        "value": "${MQ_PASSWORD}"
+                                    },
+                                    {
+                                        "name": "AMQ_TRANSPORTS",
+                                        "value": "${MQ_PROTOCOL}"
+                                    },
+                                    {
+                                        "name": "AMQ_QUEUES",
+                                        "value": "${MQ_QUEUES}"
+                                    },
+                                    {
+                                        "name": "AMQ_TOPICS",
+                                        "value": "${MQ_TOPICS}"
+                                    },
+                                    {
+                                        "name": "AMQ_ADMIN_USERNAME",
+                                        "value": "${AMQ_ADMIN_USERNAME}"
+                                    },
+                                    {
+                                        "name": "AMQ_ADMIN_PASSWORD",
+                                        "value": "${AMQ_ADMIN_PASSWORD}"
+                                    },
+                                    {
+                                        "name": "AMQ_MESH_DISCOVERY_TYPE",
+                                        "value": "${AMQ_MESH_DISCOVERY_TYPE}"
+                                    },
+                                    {
+                                        "name": "AMQ_MESH_SERVICE_NAME",
+                                        "value": "${APPLICATION_NAME}-amq-tcp"
+                                    },
+                                    {
+                                        "name": "AMQ_MESH_SERVICE_NAMESPACE",
+                                        "valueFrom": {
+                                            "fieldRef": {
+                                                "fieldPath": "metadata.namespace"
+                                            }
+                                        }
+                                    },
+                                    {
+                                        "name": "AMQ_STORAGE_USAGE_LIMIT",
+                                        "value": "${AMQ_STORAGE_USAGE_LIMIT}"
+                                    }
+                                ]
+                            }
+                        ]
+                    }
+                }
+            }
+        }
+    ]
+}

+ 121 - 39
roles/openshift_examples/files/examples/xpaas-templates/amq6-persistent.json

@@ -3,82 +3,117 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "description": "Application template for ActiveMQ brokers using persistent storage."
+            "description": "Application template for JBoss A-MQ brokers. These are deployed as standalone and use persistent storage for saving messages. This template supports SSL and requires usage of OpenShift secrets.",
+            "iconClass": "icon-jboss",
+            "tags": "messaging,amq,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "amq6-persistent"
+        "name": "amq62-persistent-ssl"
     },
     "labels": {
-        "template": "amq6-persistent"
+        "template": "amq62-persistent-ssl",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "ActiveMQ Release version, e.g. 6.2, etc.",
-            "name": "AMQ_RELEASE",
-            "value": "6.2"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "broker"
+            "value": "broker",
+            "required": true
         },
         {
-            "description": "Protocol to configure.  Only openwire is supported by EAP.  amqp, amqp+ssl, mqtt, stomp, stomp+ssl, and ssl are not supported by EAP",
+            "description": "Protocols to configure, separated by commas.  Allowed values are: `openwire`, `amqp`, `stomp` and `mqtt`.  SSL variants of these protocols will be configured automaticaly.",
             "name": "MQ_PROTOCOL",
-            "value": "openwire"
+            "value": "openwire",
+            "required": false
         },
         {
-            "description": "Queue names",
+            "description": "Queue names, separated by commas.  These queues will be automatically created when the broker starts.  If left empty, queues will be still created dynamically.",
             "name": "MQ_QUEUES",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
-            "description": "Topic names",
+            "description": "Topic names, separated by commas.  These topics will be automatically created when the broker starts.  If left empty, topics will be still created dynamically.",
             "name": "MQ_TOPICS",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Size of persistent storage for database volume.",
             "name": "VOLUME_CAPACITY",
-            "value": "512Mi"
+            "value": "512Mi",
+            "required": true
         },
         {
-            "description": "Broker user name",
+            "description": "User name for standard broker user.  It is required for connecting to the broker.  If left empty, it will be generated.",
             "name": "MQ_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": false
         },
         {
-            "description": "Broker user password",
+            "description": "Password for standard broker user.  It is required for connecting to the broker.  If left empty, it will be generated.",
             "name": "MQ_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": false
         },
         {
-            "description": "ActiveMQ Admin User",
+            "description": "User name for admin user.  If left empty, it will be generated.",
             "name": "AMQ_ADMIN_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "ActiveMQ Admin Password",
+            "description": "Password for admin user.  If left empty, it will be generated.",
             "name": "AMQ_ADMIN_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Name of a secret containing SSL related files",
             "name": "AMQ_SECRET",
-            "value": "amq-app-secret"
+            "value": "amq-app-secret",
+            "required": true
         },
         {
             "description": "SSL trust store filename",
             "name": "AMQ_TRUSTSTORE",
-            "value": "broker.ts"
+            "value": "broker.ts",
+            "required": true
+        },
+        {
+            "description": "SSL trust store password",
+            "name": "AMQ_TRUSTSTORE_PASSWORD",
+            "value": "",
+            "required": true
         },
         {
             "description": "SSL key store filename",
             "name": "AMQ_KEYSTORE",
-            "value": "broker.ks"
+            "value": "broker.ks",
+            "required": true
+        },
+        {
+            "description": "Password for accessing SSL keystore",
+            "name": "AMQ_KEYSTORE_PASSWORD",
+            "value": "",
+            "required": true
+        },
+        {
+            "description": "The A-MQ storage usage limit",
+            "name": "AMQ_STORAGE_USAGE_LIMIT",
+            "value": "100 gb",
+            "required": false
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -102,7 +137,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's amqp port."
+                    "description": "The broker's AMQP port."
                 }
             }
         },
@@ -126,7 +161,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's amqp ssl port."
+                    "description": "The broker's AMQP SSL port."
                 }
             }
         },
@@ -150,7 +185,31 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's mqtt port."
+                    "description": "The broker's MQTT port."
+                }
+            }
+        },
+        {
+            "kind": "Service",
+            "apiVersion": "v1",
+            "spec": {
+                "ports": [
+                    {
+                        "port": 8883,
+                        "targetPort": 8883
+                    }
+                ],
+                "selector": {
+                    "deploymentConfig": "${APPLICATION_NAME}-amq"
+                }
+            },
+            "metadata": {
+                "name": "${APPLICATION_NAME}-amq-mqtt-ssl",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                },
+                "annotations": {
+                    "description": "The broker's MQTT SSL port."
                 }
             }
         },
@@ -174,7 +233,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's stomp port."
+                    "description": "The broker's STOMP port."
                 }
             }
         },
@@ -198,7 +257,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's stomp ssl port."
+                    "description": "The broker's STOMP SSL port."
                 }
             }
         },
@@ -222,7 +281,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's tcp (openwire) port."
+                    "description": "The broker's OpenWire port."
                 }
             }
         },
@@ -246,7 +305,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's tcp ssl (openwire) port."
+                    "description": "The broker's OpenWire (SSL) port."
                 }
             }
         },
@@ -273,10 +332,13 @@
                             ],
                             "from": {
                                 "kind": "ImageStreamTag",
-                                "namespace": "openshift",
-                                "name": "jboss-amq-6:${AMQ_RELEASE}"
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                                "name": "jboss-amq-62:1.1"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -293,10 +355,11 @@
                     },
                     "spec": {
                         "serviceAccount": "amq-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}-amq",
-                                "image": "jboss-amq-6",
+                                "image": "jboss-amq-62",
                                 "imagePullPolicy": "Always",
                                 "volumeMounts": [
                                     {
@@ -335,6 +398,11 @@
                                         "protocol": "TCP"
                                     },
                                     {
+                                        "name": "mqtt-ssl",
+                                        "containerPort": 8883,
+                                        "protocol": "TCP"
+                                    },
+                                    {
                                         "name": "stomp",
                                         "containerPort": 61613,
                                         "protocol": "TCP"
@@ -365,7 +433,7 @@
                                         "value": "${MQ_PASSWORD}"
                                     },
                                     {
-                                        "name": "AMQ_PROTOCOLS",
+                                        "name": "AMQ_TRANSPORTS",
                                         "value": "${MQ_PROTOCOL}"
                                     },
                                     {
@@ -393,8 +461,20 @@
                                         "value": "${AMQ_TRUSTSTORE}"
                                     },
                                     {
+                                        "name": "AMQ_TRUSTSTORE_PASSWORD",
+                                        "value": "${AMQ_TRUSTSTORE_PASSWORD}"
+                                    },
+                                    {
                                         "name": "AMQ_KEYSTORE",
                                         "value": "${AMQ_KEYSTORE}"
+                                    },
+                                    {
+                                        "name": "AMQ_KEYSTORE_PASSWORD",
+                                        "value": "${AMQ_KEYSTORE_PASSWORD}"
+                                    },
+                                    {
+                                        "name": "AMQ_STORAGE_USAGE_LIMIT",
+                                        "value": "${AMQ_STORAGE_USAGE_LIMIT}"
                                     }
                                 ]
                             }
@@ -427,7 +507,9 @@
                 }
             },
             "spec": {
-                "accessModes": [ "ReadWriteOnce" ],
+                "accessModes": [
+                    "ReadWriteOnce"
+                ],
                 "resources": {
                     "requests": {
                         "storage": "${VOLUME_CAPACITY}"

+ 343 - 0
roles/openshift_examples/files/examples/xpaas-templates/amq62-persistent.json

@@ -0,0 +1,343 @@
+{
+    "kind": "Template",
+    "apiVersion": "v1",
+    "metadata": {
+        "annotations": {
+            "description": "Application template for JBoss A-MQ brokers. These can be deployed as standalone and use persistent storage for saving messages. This template doesn't feature SSL support.",
+            "iconClass": "icon-jboss",
+            "tags": "messaging,amq,jboss,xpaas",
+            "version": "1.1.0"
+        },
+        "name": "amq62-persistent"
+    },
+    "labels": {
+        "template": "amq62-persistent",
+        "xpaas": "1.1.0"
+    },
+    "parameters": [
+        {
+            "description": "The name for the application.",
+            "name": "APPLICATION_NAME",
+            "value": "broker",
+            "required": true
+        },
+        {
+            "description": "Protocols to configure, separated by commas.  Allowed values are: `openwire`, `amqp`, `stomp` and `mqtt`.",
+            "name": "MQ_PROTOCOL",
+            "value": "openwire",
+            "required": false
+        },
+        {
+            "description": "Queue names, separated by commas.  These queues will be automatically created when the broker starts.  If left empty, queues will be still created dynamically.",
+            "name": "MQ_QUEUES",
+            "value": "",
+            "required": false
+        },
+        {
+            "description": "Topic names, separated by commas.  These topics will be automatically created when the broker starts.  If left empty, topics will be still created dynamically.",
+            "name": "MQ_TOPICS",
+            "value": "",
+            "required": false
+        },
+        {
+            "description": "Size of persistent storage for database volume.",
+            "name": "VOLUME_CAPACITY",
+            "value": "512Mi",
+            "required": true
+        },
+        {
+            "description": "User name for standard broker user.  It is required for connecting to the broker.  If left empty, it will be generated.",
+            "name": "MQ_USERNAME",
+            "from": "user[a-zA-Z0-9]{3}",
+            "generate": "expression",
+            "required": false
+        },
+        {
+            "description": "Password for standard broker user.  It is required for connecting to the broker.  If left empty, it will be generated.",
+            "name": "MQ_PASSWORD",
+            "from": "[a-zA-Z0-9]{8}",
+            "generate": "expression",
+            "required": false
+        },
+        {
+            "description": "User name for admin user.  If left empty, it will be generated.",
+            "name": "AMQ_ADMIN_USERNAME",
+            "from": "user[a-zA-Z0-9]{3}",
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Password for admin user.  If left empty, it will be generated.",
+            "name": "AMQ_ADMIN_PASSWORD",
+            "from": "[a-zA-Z0-9]{8}",
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "The A-MQ storage usage limit",
+            "name": "AMQ_STORAGE_USAGE_LIMIT",
+            "value": "100 gb",
+            "required": false
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
+        }
+    ],
+    "objects": [
+        {
+            "kind": "Service",
+            "apiVersion": "v1",
+            "spec": {
+                "ports": [
+                    {
+                        "port": 5672,
+                        "targetPort": 5672
+                    }
+                ],
+                "selector": {
+                    "deploymentConfig": "${APPLICATION_NAME}-amq"
+                }
+            },
+            "metadata": {
+                "name": "${APPLICATION_NAME}-amq-amqp",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                },
+                "annotations": {
+                    "description": "The broker's AMQP port."
+                }
+            }
+        },
+        {
+            "kind": "Service",
+            "apiVersion": "v1",
+            "spec": {
+                "ports": [
+                    {
+                        "port": 1883,
+                        "targetPort": 1883
+                    }
+                ],
+                "selector": {
+                    "deploymentConfig": "${APPLICATION_NAME}-amq"
+                }
+            },
+            "metadata": {
+                "name": "${APPLICATION_NAME}-amq-mqtt",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                },
+                "annotations": {
+                    "description": "The broker's MQTT port."
+                }
+            }
+        },
+        {
+            "kind": "Service",
+            "apiVersion": "v1",
+            "spec": {
+                "ports": [
+                    {
+                        "port": 61613,
+                        "targetPort": 61613
+                    }
+                ],
+                "selector": {
+                    "deploymentConfig": "${APPLICATION_NAME}-amq"
+                }
+            },
+            "metadata": {
+                "name": "${APPLICATION_NAME}-amq-stomp",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                },
+                "annotations": {
+                    "description": "The broker's STOMP port."
+                }
+            }
+        },
+        {
+            "kind": "Service",
+            "apiVersion": "v1",
+            "spec": {
+                "ports": [
+                    {
+                        "port": 61616,
+                        "targetPort": 61616
+                    }
+                ],
+                "selector": {
+                    "deploymentConfig": "${APPLICATION_NAME}-amq"
+                }
+            },
+            "metadata": {
+                "name": "${APPLICATION_NAME}-amq-tcp",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                },
+                "annotations": {
+                    "description": "The broker's OpenWire port."
+                }
+            }
+        },
+        {
+            "kind": "DeploymentConfig",
+            "apiVersion": "v1",
+            "metadata": {
+                "name": "${APPLICATION_NAME}-amq",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                }
+            },
+            "spec": {
+                "strategy": {
+                    "type": "Recreate"
+                },
+                "triggers": [
+                    {
+                        "type": "ImageChange",
+                        "imageChangeParams": {
+                            "automatic": true,
+                            "containerNames": [
+                                "${APPLICATION_NAME}-amq"
+                            ],
+                            "from": {
+                                "kind": "ImageStreamTag",
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                                "name": "jboss-amq-62:1.1"
+                            }
+                        }
+                    },
+                    {
+                        "type": "ConfigChange"
+                    }
+                ],
+                "replicas": 1,
+                "selector": {
+                    "deploymentConfig": "${APPLICATION_NAME}-amq"
+                },
+                "template": {
+                    "metadata": {
+                        "name": "${APPLICATION_NAME}-amq",
+                        "labels": {
+                            "deploymentConfig": "${APPLICATION_NAME}-amq",
+                            "application": "${APPLICATION_NAME}"
+                        }
+                    },
+                    "spec": {
+                        "terminationGracePeriodSeconds": 60,
+                        "containers": [
+                            {
+                                "name": "${APPLICATION_NAME}-amq",
+                                "image": "jboss-amq-62",
+                                "imagePullPolicy": "Always",
+                                "volumeMounts": [
+                                    {
+                                        "mountPath": "/opt/amq/data/kahadb",
+                                        "name": "${APPLICATION_NAME}-amq-pvol"
+                                    }
+                                ],
+                                "readinessProbe": {
+                                    "exec": {
+                                        "command": [
+                                            "/bin/bash",
+                                            "-c",
+                                            "curl -s -L -u ${AMQ_ADMIN_USERNAME}:${AMQ_ADMIN_PASSWORD} 'http://localhost:8161/hawtio/jolokia/read/org.apache.activemq:type=Broker,brokerName=*,service=Health/CurrentStatus' | grep -q '\"CurrentStatus\" *: *\"Good\"'"
+                                        ]
+                                    }
+                                },
+                                "ports": [
+                                    {
+                                        "name": "amqp",
+                                        "containerPort": 5672,
+                                        "protocol": "TCP"
+                                    },
+                                    {
+                                        "name": "mqtt",
+                                        "containerPort": 1883,
+                                        "protocol": "TCP"
+                                    },
+                                    {
+                                        "name": "stomp",
+                                        "containerPort": 61613,
+                                        "protocol": "TCP"
+                                    },
+                                    {
+                                        "name": "tcp",
+                                        "containerPort": 61616,
+                                        "protocol": "TCP"
+                                    }
+                                ],
+                                "env": [
+                                    {
+                                        "name": "AMQ_USER",
+                                        "value": "${MQ_USERNAME}"
+                                    },
+                                    {
+                                        "name": "AMQ_PASSWORD",
+                                        "value": "${MQ_PASSWORD}"
+                                    },
+                                    {
+                                        "name": "AMQ_TRANSPORTS",
+                                        "value": "${MQ_PROTOCOL}"
+                                    },
+                                    {
+                                        "name": "AMQ_QUEUES",
+                                        "value": "${MQ_QUEUES}"
+                                    },
+                                    {
+                                        "name": "AMQ_TOPICS",
+                                        "value": "${MQ_TOPICS}"
+                                    },
+                                    {
+                                        "name": "AMQ_ADMIN_USERNAME",
+                                        "value": "${AMQ_ADMIN_USERNAME}"
+                                    },
+                                    {
+                                        "name": "AMQ_ADMIN_PASSWORD",
+                                        "value": "${AMQ_ADMIN_PASSWORD}"
+                                    },
+                                    {
+                                        "name": "AMQ_STORAGE_USAGE_LIMIT",
+                                        "value": "${AMQ_STORAGE_USAGE_LIMIT}"
+                                    }
+                                ]
+                            }
+                        ],
+                        "volumes": [
+                            {
+                                "name": "${APPLICATION_NAME}-amq-pvol",
+                                "persistentVolumeClaim": {
+                                    "claimName": "${APPLICATION_NAME}-amq-claim"
+                                }
+                            }
+                        ]
+                    }
+                }
+            }
+        },
+        {
+            "apiVersion": "v1",
+            "kind": "PersistentVolumeClaim",
+            "metadata": {
+                "name": "${APPLICATION_NAME}-amq-claim",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                }
+            },
+            "spec": {
+                "accessModes": [
+                    "ReadWriteOnce"
+                ],
+                "resources": {
+                    "requests": {
+                        "storage": "${VOLUME_CAPACITY}"
+                    }
+                }
+            }
+        }
+    ]
+}

+ 134 - 37
roles/openshift_examples/files/examples/xpaas-templates/amq6.json

@@ -3,77 +3,117 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "description": "Application template for ActiveMQ brokers."
+            "description": "Application template for JBoss A-MQ brokers. These can be deployed as standalone or in a mesh. This template supports SSL and requires usage of OpenShift secrets.",
+            "iconClass": "icon-jboss",
+            "tags": "messaging,amq,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "amq6"
+        "name": "amq62-ssl"
     },
     "labels": {
-        "template": "amq6"
+        "template": "amq62-ssl",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "ActiveMQ Release version, e.g. 6.2, etc.",
-            "name": "AMQ_RELEASE",
-            "value": "6.2"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "broker"
+            "value": "broker",
+            "required": true
         },
         {
-            "description": "Protocol to configure.  Only openwire is supported by EAP.  amqp, amqp+ssl, mqtt, stomp, stomp+ssl, and ssl are not supported by EAP",
+            "description": "Protocols to configure, separated by commas. Allowed values are: `openwire`, `amqp`, `stomp` and `mqtt`. SSL variants of these protocols will be configured automaticaly.",
             "name": "MQ_PROTOCOL",
-            "value": "openwire"
+            "value": "openwire",
+            "required": false
         },
         {
-            "description": "Queue names",
+            "description": "Queue names, separated by commas. These queues will be automatically created when the broker starts. If left empty, queues will be still created dynamically.",
             "name": "MQ_QUEUES",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
-            "description": "Topic names",
+            "description": "Topic names, separated by commas. These topics will be automatically created when the broker starts. If left empty, topics will be still created dynamically.",
             "name": "MQ_TOPICS",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
-            "description": "Broker user name",
+            "description": "User name for standard broker user. It is required for connecting to the broker. If left empty, it will be generated.",
             "name": "MQ_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": false
         },
         {
-            "description": "Broker user password",
+            "description": "Password for standard broker user. It is required for connecting to the broker. If left empty, it will be generated.",
             "name": "MQ_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": false
         },
         {
-            "description": "ActiveMQ Admin User",
+            "description": "User name for admin user. If left empty, it will be generated.",
             "name": "AMQ_ADMIN_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "ActiveMQ Admin Password",
+            "description": "Password for admin user. If left empty, it will be generated.",
             "name": "AMQ_ADMIN_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Name of a secret containing SSL related files",
             "name": "AMQ_SECRET",
-            "value": "amq-app-secret"
+            "value": "amq-app-secret",
+            "required": true
         },
         {
             "description": "SSL trust store filename",
             "name": "AMQ_TRUSTSTORE",
-            "value": "broker.ts"
+            "value": "broker.ts",
+            "required": true
+        },
+        {
+            "description": "SSL trust store password",
+            "name": "AMQ_TRUSTSTORE_PASSWORD",
+            "value": "",
+            "required": true
         },
         {
             "description": "SSL key store filename",
             "name": "AMQ_KEYSTORE",
-            "value": "broker.ks"
+            "value": "broker.ks",
+            "required": true
+        },
+        {
+            "description": "Password for accessing SSL keystore",
+            "name": "AMQ_KEYSTORE_PASSWORD",
+            "value": "",
+            "required": true
+        },
+        {
+            "description": "The discovery agent type to use for discovering mesh endpoints.  'dns' will use OpenShift's DNS service to resolve endpoints.  'kube' will use Kubernetes REST API to resolve service endpoints.  If using 'kube' the service account for the pod must have the 'view' role, which can be added via 'oc policy add-role-to-user view system:serviceaccount:<namespace>:default' where <namespace> is the project namespace.",
+            "name": "AMQ_MESH_DISCOVERY_TYPE",
+            "value": "kube",
+            "required": false
+        },
+        {
+            "description": "The A-MQ storage usage limit",
+            "name": "AMQ_STORAGE_USAGE_LIMIT",
+            "value": "100 gb",
+            "required": false
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -97,7 +137,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's amqp port."
+                    "description": "The broker's AMQP port."
                 }
             }
         },
@@ -121,7 +161,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's amqp ssl port."
+                    "description": "The broker's AMQP SSL port."
                 }
             }
         },
@@ -145,7 +185,31 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's mqtt port."
+                    "description": "The broker's MQTT port."
+                }
+            }
+        },
+        {
+            "kind": "Service",
+            "apiVersion": "v1",
+            "spec": {
+                "ports": [
+                    {
+                        "port": 8883,
+                        "targetPort": 8883
+                    }
+                ],
+                "selector": {
+                    "deploymentConfig": "${APPLICATION_NAME}-amq"
+                }
+            },
+            "metadata": {
+                "name": "${APPLICATION_NAME}-amq-mqtt-ssl",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                },
+                "annotations": {
+                    "description": "The broker's MQTT SSL port."
                 }
             }
         },
@@ -169,7 +233,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's stomp port."
+                    "description": "The broker's STOMP port."
                 }
             }
         },
@@ -193,7 +257,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's stomp ssl port."
+                    "description": "The broker's STOMP SSL port."
                 }
             }
         },
@@ -217,7 +281,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's tcp (openwire) port."
+                    "description": "The broker's OpenWire port."
                 }
             }
         },
@@ -241,7 +305,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's tcp ssl (openwire) port."
+                    "description": "The broker's OpenWire (SSL) port."
                 }
             }
         },
@@ -268,10 +332,13 @@
                             ],
                             "from": {
                                 "kind": "ImageStreamTag",
-                                "namespace": "openshift",
-                                "name": "jboss-amq-6:${AMQ_RELEASE}"
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                                "name": "jboss-amq-62:1.1"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -288,10 +355,11 @@
                     },
                     "spec": {
                         "serviceAccount": "amq-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}-amq",
-                                "image": "jboss-amq-6",
+                                "image": "jboss-amq-62",
                                 "imagePullPolicy": "Always",
                                 "volumeMounts": [
                                     {
@@ -326,6 +394,11 @@
                                         "protocol": "TCP"
                                     },
                                     {
+                                        "name": "mqtt-ssl",
+                                        "containerPort": 8883,
+                                        "protocol": "TCP"
+                                    },
+                                    {
                                         "name": "stomp",
                                         "containerPort": 61613,
                                         "protocol": "TCP"
@@ -356,7 +429,7 @@
                                         "value": "${MQ_PASSWORD}"
                                     },
                                     {
-                                        "name": "AMQ_PROTOCOLS",
+                                        "name": "AMQ_TRANSPORTS",
                                         "value": "${MQ_PROTOCOL}"
                                     },
                                     {
@@ -376,10 +449,22 @@
                                         "value": "${AMQ_ADMIN_PASSWORD}"
                                     },
                                     {
+                                        "name": "AMQ_MESH_DISCOVERY_TYPE",
+                                        "value": "${AMQ_MESH_DISCOVERY_TYPE}"
+                                    },
+                                    {
                                         "name": "AMQ_MESH_SERVICE_NAME",
                                         "value": "${APPLICATION_NAME}-amq-tcp"
                                     },
                                     {
+                                        "name": "AMQ_MESH_SERVICE_NAMESPACE",
+                                        "valueFrom": {
+                                            "fieldRef": {
+                                                "fieldPath": "metadata.namespace"
+                                            }
+                                        }
+                                    },
+                                    {
                                         "name": "AMQ_KEYSTORE_TRUSTSTORE_DIR",
                                         "value": "/etc/amq-secret-volume"
                                     },
@@ -388,8 +473,20 @@
                                         "value": "${AMQ_TRUSTSTORE}"
                                     },
                                     {
+                                        "name": "AMQ_TRUSTSTORE_PASSWORD",
+                                        "value": "${AMQ_TRUSTSTORE_PASSWORD}"
+                                    },
+                                    {
                                         "name": "AMQ_KEYSTORE",
                                         "value": "${AMQ_KEYSTORE}"
+                                    },
+                                    {
+                                        "name": "AMQ_KEYSTORE_PASSWORD",
+                                        "value": "${AMQ_KEYSTORE_PASSWORD}"
+                                    },
+                                    {
+                                        "name": "AMQ_STORAGE_USAGE_LIMIT",
+                                        "value": "${AMQ_STORAGE_USAGE_LIMIT}"
                                     }
                                 ]
                             }

+ 118 - 105
roles/openshift_examples/files/examples/xpaas-templates/eap6-amq-persistent-sti.json

@@ -3,129 +3,149 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "description": "Application template for EAP 6 A-MQ applications with persistent storage built using STI.",
-            "iconClass" : "icon-jboss"
+            "description": "Application template for EAP 6 A-MQ applications with persistent storage built using S2I.",
+            "iconClass": "icon-jboss",
+            "tags": "eap,amq,javaee,java,messaging,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "eap6-amq-persistent-sti"
+        "name": "eap64-amq-persistent-s2i"
     },
     "labels": {
-        "template": "eap6-amq-persistent-sti"
+        "template": "eap64-amq-persistent-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "EAP Release version, e.g. 6.4, etc.",
-            "name": "EAP_RELEASE",
-            "value": "6.4"
-        },
-        {
-            "description": "ActiveMQ Release version, e.g. 6.2, etc.",
-            "name": "AMQ_RELEASE",
-            "value": "6.2"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "eap-app"
+            "value": "eap-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-openshift/openshift-quickstarts.git",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "master"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "1.1",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": ""
+            "name": "CONTEXT_DIR",
+            "value": "helloworld-mdb",
+            "required": false
         },
         {
             "description": "Size of persistent storage for database volume.",
             "name": "VOLUME_CAPACITY",
-            "value": "512Mi"
+            "value": "512Mi",
+            "required": true
         },
         {
             "description": "JNDI name for connection factory used by applications to connect to the broker, e.g. java:/ConnectionFactory",
             "name": "MQ_JNDI",
-            "value": "java:/ConnectionFactory"
+            "value": "java:/ConnectionFactory",
+            "required": false
         },
         {
-            "description": "Protocol to configure.  Only openwire is supported by EAP.  amqp, amqp+ssl, mqtt, stomp, stomp+ssl, and ssl are not supported by EAP",
+            "description": "Broker protocols to configure, separated by commas. Allowed values are: `openwire`, `amqp`, `stomp` and `mqtt`. Only `openwire` is supported by EAP.",
             "name": "MQ_PROTOCOL",
-            "value": "openwire"
+            "value": "openwire",
+            "required": false
         },
         {
-            "description": "Queue names",
+            "description": "Queue names, separated by commas. These queues will be automatically created when the broker starts. Also, they will be made accessible as JNDI resources in EAP.",
             "name": "MQ_QUEUES",
-            "value": ""
+            "value": "HELLOWORLDMDBQueue",
+            "required": false
         },
         {
-            "description": "Topic names",
+            "description": "Topic names, separated by commas. These topics will be automatically created when the broker starts. Also, they will be made accessible as JNDI resources in EAP.",
             "name": "MQ_TOPICS",
-            "value": ""
+            "value": "HELLOWORLDMDBTopic",
+            "required": false
         },
         {
             "description": "The name of the secret containing the keystore file",
             "name": "EAP_HTTPS_SECRET",
-            "value": "eap-app-secret"
+            "value": "eap-app-secret",
+            "required": false
         },
         {
             "description": "The name of the keystore file within the secret",
             "name": "EAP_HTTPS_KEYSTORE",
-            "value": "keystore.jks"
+            "value": "keystore.jks",
+            "required": false
         },
         {
             "description": "The name associated with the server certificate",
             "name": "EAP_HTTPS_NAME",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The password for the keystore and certificate",
             "name": "EAP_HTTPS_PASSWORD",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
-            "description": "Broker user name",
+            "description": "User name for standard broker user. It is required for connecting to the broker. If left empty, it will be generated.",
             "name": "MQ_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": false
         },
         {
-            "description": "Broker user password",
+            "description": "Password for standard broker user. It is required for connecting to the broker. If left empty, it will be generated.",
             "name": "MQ_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": false
         },
         {
-            "description": "ActiveMQ Admin User",
+            "description": "User name for broker admin. If left empty, it will be generated.",
             "name": "AMQ_ADMIN_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "ActiveMQ Admin Password",
+            "description": "Password for broker admin. If left empty, it will be generated.",
             "name": "AMQ_ADMIN_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -149,7 +169,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The web server's http port."
+                    "description": "The web server's HTTP port."
                 }
             }
         },
@@ -173,32 +193,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The web server's https port."
-                }
-            }
-        },
-        {
-            "kind": "Service",
-            "apiVersion": "v1",
-            "spec": {
-                "ports": [
-                    {
-                        "port": 8888,
-                        "targetPort": 8888
-                    }
-                ],
-                "portalIP": "None",
-                "selector": {
-                    "deploymentConfig": "${APPLICATION_NAME}"
-                }
-            },
-            "metadata": {
-                "name": "${APPLICATION_NAME}-ping",
-                "labels": {
-                    "application": "${APPLICATION_NAME}"
-                },
-                "annotations": {
-                    "description": "Ping service for clustered applications."
+                    "description": "The web server's HTTPS port."
                 }
             }
         },
@@ -222,25 +217,25 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's tcp (openwire) port."
+                    "description": "The broker's OpenWire port."
                 }
             }
         },
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-              "name": "${APPLICATION_NAME}-http-route",
-              "labels": {
-                  "application": "${APPLICATION_NAME}"
-              },
-              "annotations": {
-                  "description": "Route for application's http service."
-              }
+                "name": "${APPLICATION_NAME}",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                },
+                "annotations": {
+                    "description": "Route for application's HTTP service."
+                }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -249,23 +244,23 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-https-route",
+            "id": "${APPLICATION_NAME}-https",
             "metadata": {
-                "name": "${APPLICATION_NAME}-https-route",
+                "name": "secure-${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "Route for application's https service."
+                    "description": "Route for application's HTTPS service."
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "secure-${APPLICATION_NAME}"
                 },
                 "tls": {
-                    "termination" : "passthrough"
+                    "termination": "passthrough"
                 }
             }
         },
@@ -292,18 +287,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-eap6-openshift:${EAP_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-eap64-openshift:1.1"
                         }
                     }
                 },
@@ -317,18 +313,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -359,6 +358,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -375,6 +377,7 @@
                     },
                     "spec": {
                         "serviceAccount": "eap-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",
@@ -443,12 +446,16 @@
                                         "value": "${MQ_TOPICS}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_NAME",
-                                        "value": "${APPLICATION_NAME}-ping"
+                                        "name": "OPENSHIFT_KUBE_PING_LABELS",
+                                        "value": "application=${APPLICATION_NAME}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_PORT",
-                                        "value": "8888"
+                                        "name": "OPENSHIFT_KUBE_PING_NAMESPACE",
+                                        "valueFrom": {
+                                            "fieldRef": {
+                                                "fieldPath": "metadata.namespace"
+                                            }
+                                        }
                                     },
                                     {
                                         "name": "EAP_HTTPS_KEYSTORE_DIR",
@@ -504,10 +511,13 @@
                             ],
                             "from": {
                                 "kind": "ImageStreamTag",
-                                "namespace": "openshift",
-                                "name": "jboss-amq-6:${AMQ_RELEASE}"
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                                "name": "jboss-amq-62:1.1"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -523,10 +533,11 @@
                         }
                     },
                     "spec": {
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}-amq",
-                                "image": "jboss-amq-6",
+                                "image": "jboss-amq-62",
                                 "imagePullPolicy": "Always",
                                 "readinessProbe": {
                                     "exec": {
@@ -590,7 +601,7 @@
                                         "value": "${MQ_PASSWORD}"
                                     },
                                     {
-                                        "name": "AMQ_PROTOCOLS",
+                                        "name": "AMQ_TRANSPORTS",
                                         "value": "${MQ_PROTOCOL}"
                                     },
                                     {
@@ -634,7 +645,9 @@
                 }
             },
             "spec": {
-                "accessModes": [ "ReadWriteOnce" ],
+                "accessModes": [
+                    "ReadWriteOnce"
+                ],
                 "resources": {
                     "requests": {
                         "storage": "${VOLUME_CAPACITY}"

+ 113 - 103
roles/openshift_examples/files/examples/xpaas-templates/eap6-amq-sti.json

@@ -3,124 +3,143 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "description": "Application template for EAP 6 A-MQ applications built using STI.",
-            "iconClass" : "icon-jboss"
+            "description": "Application template for EAP 6 A-MQ applications built using S2I.",
+            "iconClass": "icon-jboss",
+            "tags": "eap,amq,javaee,java,messaging,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "eap6-amq-sti"
+        "name": "eap64-amq-s2i"
     },
     "labels": {
-        "template": "eap6-amq-sti"
+        "template": "eap64-amq-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "EAP Release version, e.g. 6.4, etc.",
-            "name": "EAP_RELEASE",
-            "value": "6.4"
-        },
-        {
-            "description": "ActiveMQ Release version, e.g. 6.2, etc.",
-            "name": "AMQ_RELEASE",
-            "value": "6.2"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "eap-app"
+            "value": "eap-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-openshift/openshift-quickstarts.git",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "master"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "1.1",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": ""
+            "name": "CONTEXT_DIR",
+            "value": "helloworld-mdb",
+            "required": false
         },
         {
             "description": "JNDI name for connection factory used by applications to connect to the broker, e.g. java:/ConnectionFactory",
             "name": "MQ_JNDI",
-            "value": "java:/ConnectionFactory"
+            "value": "java:/ConnectionFactory",
+            "required": false
         },
         {
-            "description": "Protocol to configure.  Only openwire is supported by EAP.  amqp, amqp+ssl, mqtt, stomp, stomp+ssl, and ssl are not supported by EAP",
+            "description": "Broker protocols to configure, separated by commas. Allowed values are: `openwire`, `amqp`, `stomp` and `mqtt`. Only `openwire` is supported by EAP.",
             "name": "MQ_PROTOCOL",
-            "value": "openwire"
+            "value": "openwire",
+            "required": false
         },
         {
-            "description": "Queue names",
+            "description": "Queue names, separated by commas. These queues will be automatically created when the broker starts. Also, they will be made accessible as JNDI resources in EAP.",
             "name": "MQ_QUEUES",
-            "value": ""
+            "value": "HELLOWORLDMDBQueue",
+            "required": false
         },
         {
-            "description": "Topic names",
+            "description": "Topic names, separated by commas. These topics will be automatically created when the broker starts. Also, they will be made accessible as JNDI resources in EAP.",
             "name": "MQ_TOPICS",
-            "value": ""
+            "value": "HELLOWORLDMDBTopic",
+            "required": false
         },
         {
             "description": "The name of the secret containing the keystore file",
             "name": "EAP_HTTPS_SECRET",
-            "value": "eap-app-secret"
+            "value": "eap-app-secret",
+            "required": false
         },
         {
             "description": "The name of the keystore file within the secret",
             "name": "EAP_HTTPS_KEYSTORE",
-            "value": "keystore.jks"
+            "value": "keystore.jks",
+            "required": false
         },
         {
             "description": "The name associated with the server certificate",
             "name": "EAP_HTTPS_NAME",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The password for the keystore and certificate",
             "name": "EAP_HTTPS_PASSWORD",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
-            "description": "Broker user name",
+            "description": "User name for standard broker user. It is required for connecting to the broker. If left empty, it will be generated.",
             "name": "MQ_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": false
         },
         {
-            "description": "Broker user password",
+            "description": "Password for standard broker user. It is required for connecting to the broker. If left empty, it will be generated.",
             "name": "MQ_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": false
         },
         {
-            "description": "ActiveMQ Admin User",
+            "description": "User name for broker admin. If left empty, it will be generated.",
             "name": "AMQ_ADMIN_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "ActiveMQ Admin Password",
+            "description": "Password for broker admin. If left empty, it will be generated.",
             "name": "AMQ_ADMIN_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -144,7 +163,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The web server's http port."
+                    "description": "The web server's HTTP port."
                 }
             }
         },
@@ -168,32 +187,7 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The web server's https port."
-                }
-            }
-        },
-        {
-            "kind": "Service",
-            "apiVersion": "v1",
-            "spec": {
-                "ports": [
-                    {
-                        "port": 8888,
-                        "targetPort": 8888
-                    }
-                ],
-                "portalIP": "None",
-                "selector": {
-                    "deploymentConfig": "${APPLICATION_NAME}"
-                }
-            },
-            "metadata": {
-                "name": "${APPLICATION_NAME}-ping",
-                "labels": {
-                    "application": "${APPLICATION_NAME}"
-                },
-                "annotations": {
-                    "description": "Ping service for clustered applications."
+                    "description": "The web server's HTTPS port."
                 }
             }
         },
@@ -217,25 +211,25 @@
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "The broker's tcp (openwire) port."
+                    "description": "The broker's OpenWire port."
                 }
             }
         },
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-              "name": "${APPLICATION_NAME}-http-route",
-              "labels": {
-                  "application": "${APPLICATION_NAME}"
-              },
-              "annotations": {
-                  "description": "Route for application's http service."
-              }
+                "name": "${APPLICATION_NAME}",
+                "labels": {
+                    "application": "${APPLICATION_NAME}"
+                },
+                "annotations": {
+                    "description": "Route for application's HTTP service."
+                }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -244,23 +238,23 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-https-route",
+            "id": "${APPLICATION_NAME}-https",
             "metadata": {
-                "name": "${APPLICATION_NAME}-https-route",
+                "name": "secure-${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
                 "annotations": {
-                    "description": "Route for application's https service."
+                    "description": "Route for application's HTTPS service."
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "secure-${APPLICATION_NAME}"
                 },
                 "tls": {
-                    "termination" : "passthrough"
+                    "termination": "passthrough"
                 }
             }
         },
@@ -287,18 +281,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-eap6-openshift:${EAP_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-eap64-openshift:1.1"
                         }
                     }
                 },
@@ -312,18 +307,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -354,6 +352,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -370,6 +371,7 @@
                     },
                     "spec": {
                         "serviceAccount": "eap-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",
@@ -438,12 +440,16 @@
                                         "value": "${MQ_TOPICS}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_NAME",
-                                        "value": "${APPLICATION_NAME}-ping"
+                                        "name": "OPENSHIFT_KUBE_PING_LABELS",
+                                        "value": "application=${APPLICATION_NAME}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_PORT",
-                                        "value": "8888"
+                                        "name": "OPENSHIFT_KUBE_PING_NAMESPACE",
+                                        "valueFrom": {
+                                            "fieldRef": {
+                                                "fieldPath": "metadata.namespace"
+                                            }
+                                        }
                                     },
                                     {
                                         "name": "EAP_HTTPS_KEYSTORE_DIR",
@@ -499,10 +505,13 @@
                             ],
                             "from": {
                                 "kind": "ImageStreamTag",
-                                "namespace": "openshift",
-                                "name": "jboss-amq-6:${AMQ_RELEASE}"
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                                "name": "jboss-amq-62:1.1"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -518,10 +527,11 @@
                         }
                     },
                     "spec": {
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}-amq",
-                                "image": "jboss-amq-6",
+                                "image": "jboss-amq-62",
                                 "imagePullPolicy": "Always",
                                 "readinessProbe": {
                                     "exec": {
@@ -579,7 +589,7 @@
                                         "value": "${MQ_PASSWORD}"
                                     },
                                     {
-                                        "name": "AMQ_PROTOCOLS",
+                                        "name": "AMQ_TRANSPORTS",
                                         "value": "${MQ_PROTOCOL}"
                                     },
                                     {

+ 67 - 66
roles/openshift_examples/files/examples/xpaas-templates/eap6-basic-sti.json

@@ -3,72 +3,86 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "iconClass" : "icon-jboss",
-            "description": "Application template for EAP 6 applications built using STI."
+            "iconClass": "icon-jboss",
+            "description": "Application template for EAP 6 applications built using S2I.",
+            "tags": "eap,javaee,java,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "eap6-basic-sti"
+        "name": "eap64-basic-s2i"
     },
     "labels": {
-        "template": "eap6-basic-sti"
+        "template": "eap64-basic-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "EAP Release version, e.g. 6.4, etc.",
-            "name": "EAP_RELEASE",
-            "value": "6.4"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "eap-app"
+            "value": "eap-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI",
-            "value": "https://github.com/jboss-developer/jboss-eap-quickstarts"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-developer/jboss-eap-quickstarts",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "6.4.x"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "6.4.x",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": "kitchensink"
+            "name": "CONTEXT_DIR",
+            "value": "kitchensink",
+            "required": false
         },
         {
             "description": "Queue names",
             "name": "HORNETQ_QUEUES",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Topic names",
             "name": "HORNETQ_TOPICS",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "HornetQ cluster admin password",
             "name": "HORNETQ_CLUSTER_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -97,36 +111,11 @@
             }
         },
         {
-            "kind": "Service",
-            "apiVersion": "v1",
-            "spec": {
-                "ports": [
-                    {
-                        "port": 8888,
-                        "targetPort": 8888
-                    }
-                ],
-                "portalIP": "None",
-                "selector": {
-                    "deploymentConfig": "${APPLICATION_NAME}"
-                }
-            },
-            "metadata": {
-                "name": "${APPLICATION_NAME}-ping",
-                "labels": {
-                    "application": "${APPLICATION_NAME}"
-                },
-                "annotations": {
-                    "description": "Ping service for clustered applications."
-                }
-            }
-        },
-        {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-                "name": "${APPLICATION_NAME}-http-route",
+                "name": "${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -135,7 +124,7 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -164,18 +153,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-eap6-openshift:${EAP_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-eap64-openshift:1.1"
                         }
                     }
                 },
@@ -189,18 +179,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -231,6 +224,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -246,6 +242,7 @@
                         }
                     },
                     "spec": {
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",
@@ -274,12 +271,16 @@
                                 ],
                                 "env": [
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_NAME",
-                                        "value": "${APPLICATION_NAME}-ping"
+                                        "name": "OPENSHIFT_KUBE_PING_LABELS",
+                                        "value": "application=${APPLICATION_NAME}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_PORT",
-                                        "value": "8888"
+                                        "name": "OPENSHIFT_KUBE_PING_NAMESPACE",
+                                        "valueFrom": {
+                                            "fieldRef": {
+                                                "fieldPath": "metadata.namespace"
+                                            }
+                                        }
                                     },
                                     {
                                         "name": "HORNETQ_CLUSTER_PASSWORD",
@@ -301,4 +302,4 @@
             }
         }
     ]
-}
+}

+ 79 - 74
roles/openshift_examples/files/examples/xpaas-templates/eap6-https-sti.json

@@ -3,92 +3,110 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "iconClass" : "icon-jboss",
-            "description": "Application template for EAP 6 applications built using STI."
+            "iconClass": "icon-jboss",
+            "description": "Application template for EAP 6 applications built using S2I.",
+            "tags": "eap,javaee,java,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "eap6-https-sti"
+        "name": "eap64-https-s2i"
     },
     "labels": {
-        "template": "eap6-https-sti"
+        "template": "eap64-https-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "EAP Release version, e.g. 6.4, etc.",
-            "name": "EAP_RELEASE",
-            "value": "6.4"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "eap-app"
+            "value": "eap-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI",
-            "value": "https://github.com/jboss-developer/jboss-eap-quickstarts"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-developer/jboss-eap-quickstarts",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "6.4.x"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "6.4.x",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": "kitchensink"
+            "name": "CONTEXT_DIR",
+            "value": "kitchensink",
+            "required": false
         },
         {
             "description": "Queue names",
             "name": "HORNETQ_QUEUES",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Topic names",
             "name": "HORNETQ_TOPICS",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The name of the secret containing the keystore file",
             "name": "EAP_HTTPS_SECRET",
-            "value": "eap-app-secret"
+            "value": "eap-app-secret",
+            "required": true
         },
         {
             "description": "The name of the keystore file within the secret",
             "name": "EAP_HTTPS_KEYSTORE",
-            "value": "keystore.jks"
+            "value": "keystore.jks",
+            "required": false
         },
         {
             "description": "The name associated with the server certificate",
             "name": "EAP_HTTPS_NAME",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The password for the keystore and certificate",
             "name": "EAP_HTTPS_PASSWORD",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "HornetQ cluster admin password",
             "name": "HORNETQ_CLUSTER_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -141,36 +159,11 @@
             }
         },
         {
-            "kind": "Service",
-            "apiVersion": "v1",
-            "spec": {
-                "ports": [
-                    {
-                        "port": 8888,
-                        "targetPort": 8888
-                    }
-                ],
-                "portalIP": "None",
-                "selector": {
-                    "deploymentConfig": "${APPLICATION_NAME}"
-                }
-            },
-            "metadata": {
-                "name": "${APPLICATION_NAME}-ping",
-                "labels": {
-                    "application": "${APPLICATION_NAME}"
-                },
-                "annotations": {
-                    "description": "Ping service for clustered applications."
-                }
-            }
-        },
-        {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-                "name": "${APPLICATION_NAME}-http-route",
+                "name": "${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -179,7 +172,7 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -188,9 +181,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-https-route",
+            "id": "${APPLICATION_NAME}-https",
             "metadata": {
-                "name": "${APPLICATION_NAME}-https-route",
+                "name": "secure-${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -199,12 +192,12 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "secure-${APPLICATION_NAME}"
                 },
                 "tls": {
-                    "termination" : "passthrough"
+                    "termination": "passthrough"
                 }
             }
         },
@@ -231,18 +224,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-eap6-openshift:${EAP_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-eap64-openshift:1.1"
                         }
                     }
                 },
@@ -256,18 +250,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -298,6 +295,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -314,6 +314,7 @@
                     },
                     "spec": {
                         "serviceAccount": "eap-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",
@@ -354,12 +355,16 @@
                                 ],
                                 "env": [
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_NAME",
-                                        "value": "${APPLICATION_NAME}-ping"
+                                        "name": "OPENSHIFT_KUBE_PING_LABELS",
+                                        "value": "application=${APPLICATION_NAME}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_PORT",
-                                        "value": "8888"
+                                        "name": "OPENSHIFT_KUBE_PING_NAMESPACE",
+                                        "valueFrom": {
+                                            "fieldRef": {
+                                                "fieldPath": "metadata.namespace"
+                                            }
+                                        }
                                     },
                                     {
                                         "name": "EAP_HTTPS_KEYSTORE_DIR",
@@ -405,4 +410,4 @@
             }
         }
     ]
-}
+}

+ 116 - 92
roles/openshift_examples/files/examples/xpaas-templates/eap6-mongodb-persistent-sti.json

@@ -3,148 +3,179 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "description": "Application template for EAP 6 MongDB applications with persistent storage built using STI.",
-            "iconClass" : "icon-jboss"
+            "description": "Application template for EAP 6 MongDB applications with persistent storage built using S2I.",
+            "iconClass": "icon-jboss",
+            "tags": "eap,mongodb,javaee,java,database,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "eap6-mongodb-persistent-sti"
+        "name": "eap64-mongodb-persistent-s2i"
     },
     "labels": {
-        "template": "eap6-mongodb-persistent-sti"
+        "template": "eap64-mongodb-persistent-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "EAP Release version, e.g. 6.4, etc.",
-            "name": "EAP_RELEASE",
-            "value": "6.4"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "eap-app"
+            "value": "eap-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-openshift/openshift-quickstarts",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "master"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "1.1",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": ""
+            "name": "CONTEXT_DIR",
+            "value": "todolist/todolist-mongodb",
+            "required": false
         },
         {
             "description": "Database JNDI name used by application to resolve the datasource, e.g. java:/jboss/datasources/mongodb",
             "name": "DB_JNDI",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Database name",
             "name": "DB_DATABASE",
-            "value": "root"
+            "value": "root",
+            "required": true
         },
         {
             "description": "Size of persistent storage for database volume.",
             "name": "VOLUME_CAPACITY",
-            "value": "512Mi"
+            "value": "512Mi",
+            "required": true
         },
         {
             "description": "Queue names",
             "name": "HORNETQ_QUEUES",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Topic names",
             "name": "HORNETQ_TOPICS",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The name of the secret containing the keystore file",
             "name": "EAP_HTTPS_SECRET",
-            "value": "eap-app-secret"
+            "value": "eap-app-secret",
+            "required": false
         },
         {
             "description": "The name of the keystore file within the secret",
             "name": "EAP_HTTPS_KEYSTORE",
-            "value": "keystore.jks"
+            "value": "keystore.jks",
+            "required": false
         },
         {
             "description": "The name associated with the server certificate",
             "name": "EAP_HTTPS_NAME",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The password for the keystore and certificate",
             "name": "EAP_HTTPS_PASSWORD",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Sets xa-pool/min-pool-size for the configured datasource.",
-            "name": "DB_MIN_POOL_SIZE"
+            "name": "DB_MIN_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets xa-pool/max-pool-size for the configured datasource.",
-            "name": "DB_MAX_POOL_SIZE"
+            "name": "DB_MAX_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets transaction-isolation for the configured datasource.",
-            "name": "DB_TX_ISOLATION"
+            "name": "DB_TX_ISOLATION",
+            "required": false
         },
         {
             "description": "Disable data file preallocation.",
-            "name": "MONGODB_NOPREALLOC"
+            "name": "MONGODB_NOPREALLOC",
+            "required": false
         },
         {
             "description": "Set MongoDB to use a smaller default data file size.",
-            "name": "MONGODB_SMALLFILES"
+            "name": "MONGODB_SMALLFILES",
+            "required": false
         },
         {
             "description": "Runs MongoDB in a quiet mode that attempts to limit the amount of output.",
-            "name": "MONGODB_QUIET"
+            "name": "MONGODB_QUIET",
+            "required": false
         },
         {
             "description": "HornetQ cluster admin password",
             "name": "HORNETQ_CLUSTER_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user name",
             "name": "DB_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user password",
             "name": "DB_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database admin password",
             "name": "DB_ADMIN_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -202,31 +233,6 @@
             "spec": {
                 "ports": [
                     {
-                        "port": 8888,
-                        "targetPort": 8888
-                    }
-                ],
-                "portalIP": "None",
-                "selector": {
-                    "deploymentConfig": "${APPLICATION_NAME}"
-                }
-            },
-            "metadata": {
-                "name": "${APPLICATION_NAME}-ping",
-                "labels": {
-                    "application": "${APPLICATION_NAME}"
-                },
-                "annotations": {
-                    "description": "Ping service for clustered applications."
-                }
-            }
-        },
-        {
-            "kind": "Service",
-            "apiVersion": "v1",
-            "spec": {
-                "ports": [
-                    {
                         "port": 27017,
                         "targetPort": 27017
                     }
@@ -248,9 +254,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-                "name": "${APPLICATION_NAME}-http-route",
+                "name": "${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -259,7 +265,7 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -268,9 +274,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-https-route",
+            "id": "${APPLICATION_NAME}-https",
             "metadata": {
-                "name": "${APPLICATION_NAME}-https-route",
+                "name": "secure-${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -279,12 +285,12 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "secure-${APPLICATION_NAME}"
                 },
                 "tls": {
-                    "termination" : "passthrough"
+                    "termination": "passthrough"
                 }
             }
         },
@@ -311,18 +317,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-eap6-openshift:${EAP_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-eap64-openshift:1.1"
                         }
                     }
                 },
@@ -336,18 +343,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -378,6 +388,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -394,6 +407,7 @@
                     },
                     "spec": {
                         "serviceAccount": "eap-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",
@@ -470,12 +484,16 @@
                                         "value": "${DB_TX_ISOLATION}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_NAME",
-                                        "value": "${APPLICATION_NAME}-ping"
+                                        "name": "OPENSHIFT_KUBE_PING_LABELS",
+                                        "value": "application=${APPLICATION_NAME}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_PORT",
-                                        "value": "8888"
+                                        "name": "OPENSHIFT_KUBE_PING_NAMESPACE",
+                                        "valueFrom": {
+                                            "fieldRef": {
+                                                "fieldPath": "metadata.namespace"
+                                            }
+                                        }
                                     },
                                     {
                                         "name": "EAP_HTTPS_KEYSTORE_DIR",
@@ -543,10 +561,13 @@
                             ],
                             "from": {
                                 "kind": "ImageStreamTag",
-                                "namespace": "openshift",
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
                                 "name": "mongodb:latest"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -562,6 +583,7 @@
                         }
                     },
                     "spec": {
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}-mongodb",
@@ -574,11 +596,11 @@
                                     }
                                 ],
                                 "volumeMounts": [
-                                     {
-                                         "mountPath": "/var/lib/mongodb/data",
-                                         "name": "${APPLICATION_NAME}-mongodb-pvol"
-                                     }
-                                 ],
+                                    {
+                                        "mountPath": "/var/lib/mongodb/data",
+                                        "name": "${APPLICATION_NAME}-mongodb-pvol"
+                                    }
+                                ],
                                 "env": [
                                     {
                                         "name": "MONGODB_USER",
@@ -633,7 +655,9 @@
                 }
             },
             "spec": {
-                "accessModes": [ "ReadWriteOnce" ],
+                "accessModes": [
+                    "ReadWriteOnce"
+                ],
                 "resources": {
                     "requests": {
                         "storage": "${VOLUME_CAPACITY}"
@@ -642,4 +666,4 @@
             }
         }
     ]
-}
+}

+ 106 - 85
roles/openshift_examples/files/examples/xpaas-templates/eap6-mongodb-sti.json

@@ -3,143 +3,173 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "description": "Application template for EAP 6 MongDB applications built using STI.",
-            "iconClass" : "icon-jboss"
+            "description": "Application template for EAP 6 MongDB applications built using S2I.",
+            "iconClass": "icon-jboss",
+            "tags": "eap,mongodb,javaee,java,database,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "eap6-mongodb-sti"
+        "name": "eap64-mongodb-s2i"
     },
     "labels": {
-        "template": "eap6-mongodb-sti"
+        "template": "eap64-mongodb-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "EAP Release version, e.g. 6.4, etc.",
-            "name": "EAP_RELEASE",
-            "value": "6.4"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "eap-app"
+            "value": "eap-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-openshift/openshift-quickstarts",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "master"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "1.1",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": ""
+            "name": "CONTEXT_DIR",
+            "value": "todolist/todolist-mongodb",
+            "required": false
         },
         {
             "description": "Database JNDI name used by application to resolve the datasource, e.g. java:/jboss/datasources/mongodb",
             "name": "DB_JNDI",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Database name",
             "name": "DB_DATABASE",
-            "value": "root"
+            "value": "root",
+            "required": true
         },
         {
             "description": "Queue names",
             "name": "HORNETQ_QUEUES",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Topic names",
             "name": "HORNETQ_TOPICS",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The name of the secret containing the keystore file",
             "name": "EAP_HTTPS_SECRET",
-            "value": "eap-app-secret"
+            "value": "eap-app-secret",
+            "required": false
         },
         {
             "description": "The name of the keystore file within the secret",
             "name": "EAP_HTTPS_KEYSTORE",
-            "value": "keystore.jks"
+            "value": "keystore.jks",
+            "required": false
         },
         {
             "description": "The name associated with the server certificate",
             "name": "EAP_HTTPS_NAME",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The password for the keystore and certificate",
             "name": "EAP_HTTPS_PASSWORD",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Sets xa-pool/min-pool-size for the configured datasource.",
-            "name": "DB_MIN_POOL_SIZE"
+            "name": "DB_MIN_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets xa-pool/max-pool-size for the configured datasource.",
-            "name": "DB_MAX_POOL_SIZE"
+            "name": "DB_MAX_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets transaction-isolation for the configured datasource.",
-            "name": "DB_TX_ISOLATION"
+            "name": "DB_TX_ISOLATION",
+            "required": false
         },
         {
             "description": "Disable data file preallocation.",
-            "name": "MONGODB_NOPREALLOC"
+            "name": "MONGODB_NOPREALLOC",
+            "required": false
         },
         {
             "description": "Set MongoDB to use a smaller default data file size.",
-            "name": "MONGODB_SMALLFILES"
+            "name": "MONGODB_SMALLFILES",
+            "required": false
         },
         {
             "description": "Runs MongoDB in a quiet mode that attempts to limit the amount of output.",
-            "name": "MONGODB_QUIET"
+            "name": "MONGODB_QUIET",
+            "required": false
         },
         {
             "description": "HornetQ cluster admin password",
             "name": "HORNETQ_CLUSTER_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user name",
             "name": "DB_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user password",
             "name": "DB_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database admin password",
             "name": "DB_ADMIN_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -197,31 +227,6 @@
             "spec": {
                 "ports": [
                     {
-                        "port": 8888,
-                        "targetPort": 8888
-                    }
-                ],
-                "portalIP": "None",
-                "selector": {
-                    "deploymentConfig": "${APPLICATION_NAME}"
-                }
-            },
-            "metadata": {
-                "name": "${APPLICATION_NAME}-ping",
-                "labels": {
-                    "application": "${APPLICATION_NAME}"
-                },
-                "annotations": {
-                    "description": "Ping service for clustered applications."
-                }
-            }
-        },
-        {
-            "kind": "Service",
-            "apiVersion": "v1",
-            "spec": {
-                "ports": [
-                    {
                         "port": 27017,
                         "targetPort": 27017
                     }
@@ -243,9 +248,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-                "name": "${APPLICATION_NAME}-http-route",
+                "name": "${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -254,7 +259,7 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -263,9 +268,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-https-route",
+            "id": "${APPLICATION_NAME}-https",
             "metadata": {
-                "name": "${APPLICATION_NAME}-https-route",
+                "name": "secure-${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -274,12 +279,12 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "secure-${APPLICATION_NAME}"
                 },
                 "tls": {
-                    "termination" : "passthrough"
+                    "termination": "passthrough"
                 }
             }
         },
@@ -306,18 +311,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-eap6-openshift:${EAP_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-eap64-openshift:1.1"
                         }
                     }
                 },
@@ -331,18 +337,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -373,6 +382,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -389,6 +401,7 @@
                     },
                     "spec": {
                         "serviceAccount": "eap-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",
@@ -465,12 +478,16 @@
                                         "value": "${DB_TX_ISOLATION}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_NAME",
-                                        "value": "${APPLICATION_NAME}-ping"
+                                        "name": "OPENSHIFT_KUBE_PING_LABELS",
+                                        "value": "application=${APPLICATION_NAME}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_PORT",
-                                        "value": "8888"
+                                        "name": "OPENSHIFT_KUBE_PING_NAMESPACE",
+                                        "valueFrom": {
+                                            "fieldRef": {
+                                                "fieldPath": "metadata.namespace"
+                                            }
+                                        }
                                     },
                                     {
                                         "name": "EAP_HTTPS_KEYSTORE_DIR",
@@ -538,10 +555,13 @@
                             ],
                             "from": {
                                 "kind": "ImageStreamTag",
-                                "namespace": "openshift",
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
                                 "name": "mongodb:latest"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -557,6 +577,7 @@
                         }
                     },
                     "spec": {
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}-mongodb",
@@ -605,4 +626,4 @@
             }
         }
     ]
-}
+}

+ 113 - 88
roles/openshift_examples/files/examples/xpaas-templates/eap6-mysql-persistent-sti.json

@@ -3,150 +3,182 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "description": "Application template for EAP 6 MySQL applications with persistent storage built using STI.",
-            "iconClass" : "icon-jboss"
+            "description": "Application template for EAP 6 MySQL applications with persistent storage built using S2I.",
+            "iconClass": "icon-jboss",
+            "tags": "eap,mysql,javaee,java,database,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "eap6-mysql-persistent-sti"
+        "name": "eap64-mysql-persistent-s2i"
     },
     "labels": {
-        "template": "eap6-mysql-persistent-sti"
+        "template": "eap64-mysql-persistent-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "EAP Release version, e.g. 6.4, etc.",
-            "name": "EAP_RELEASE",
-            "value": "6.4"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "eap-app"
+            "value": "eap-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-openshift/openshift-quickstarts",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "master"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "1.1",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": ""
+            "name": "CONTEXT_DIR",
+            "value": "todolist/todolist-jdbc",
+            "required": false
         },
         {
             "description": "Database JNDI name used by application to resolve the datasource, e.g. java:/jboss/datasources/mysql",
             "name": "DB_JNDI",
-            "value": ""
+            "value": "java:jboss/datasources/TodoListDS",
+            "required": false
         },
         {
             "description": "Database name",
             "name": "DB_DATABASE",
-            "value": "root"
+            "value": "root",
+            "required": true
         },
         {
             "description": "Size of persistent storage for database volume.",
             "name": "VOLUME_CAPACITY",
-            "value": "512Mi"
+            "value": "512Mi",
+            "required": true
         },
         {
             "description": "Queue names",
             "name": "HORNETQ_QUEUES",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Topic names",
             "name": "HORNETQ_TOPICS",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The name of the secret containing the keystore file",
             "name": "EAP_HTTPS_SECRET",
-            "value": "eap-app-secret"
+            "value": "eap-app-secret",
+            "required": false
         },
         {
             "description": "The name of the keystore file within the secret",
             "name": "EAP_HTTPS_KEYSTORE",
-            "value": "keystore.jks"
+            "value": "keystore.jks",
+            "required": false
         },
         {
             "description": "The name associated with the server certificate",
             "name": "EAP_HTTPS_NAME",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The password for the keystore and certificate",
             "name": "EAP_HTTPS_PASSWORD",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Sets xa-pool/min-pool-size for the configured datasource.",
-            "name": "DB_MIN_POOL_SIZE"
+            "name": "DB_MIN_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets xa-pool/max-pool-size for the configured datasource.",
-            "name": "DB_MAX_POOL_SIZE"
+            "name": "DB_MAX_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets transaction-isolation for the configured datasource.",
-            "name": "DB_TX_ISOLATION"
+            "name": "DB_TX_ISOLATION",
+            "required": false
         },
         {
             "description": "Sets how the table names are stored and compared.",
-            "name": "MYSQL_LOWER_CASE_TABLE_NAMES"
+            "name": "MYSQL_LOWER_CASE_TABLE_NAMES",
+            "required": false
         },
         {
             "description": "The maximum permitted number of simultaneous client connections.",
-            "name": "MYSQL_MAX_CONNECTIONS"
+            "name": "MYSQL_MAX_CONNECTIONS",
+            "required": false
         },
         {
             "description": "The minimum length of the word to be included in a FULLTEXT index.",
-            "name": "MYSQL_FT_MIN_WORD_LEN"
+            "name": "MYSQL_FT_MIN_WORD_LEN",
+            "required": false
         },
         {
             "description": "The maximum length of the word to be included in a FULLTEXT index.",
-            "name": "MYSQL_FT_MAX_WORD_LEN"
+            "name": "MYSQL_FT_MAX_WORD_LEN",
+            "required": false
         },
         {
             "description": "Controls the innodb_use_native_aio setting value if the native AIO is broken.",
-            "name": "MYSQL_AIO"
+            "name": "MYSQL_AIO",
+            "required": false
         },
         {
             "description": "HornetQ cluster admin password",
             "name": "HORNETQ_CLUSTER_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user name",
             "name": "DB_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user password",
             "name": "DB_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -204,31 +236,6 @@
             "spec": {
                 "ports": [
                     {
-                        "port": 8888,
-                        "targetPort": 8888
-                    }
-                ],
-                "portalIP": "None",
-                "selector": {
-                    "deploymentConfig": "${APPLICATION_NAME}"
-                }
-            },
-            "metadata": {
-                "name": "${APPLICATION_NAME}-ping",
-                "labels": {
-                    "application": "${APPLICATION_NAME}"
-                },
-                "annotations": {
-                    "description": "Ping service for clustered applications."
-                }
-            }
-        },
-        {
-            "kind": "Service",
-            "apiVersion": "v1",
-            "spec": {
-                "ports": [
-                    {
                         "port": 3306,
                         "targetPort": 3306
                     }
@@ -250,9 +257,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-                "name": "${APPLICATION_NAME}-http-route",
+                "name": "${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -261,7 +268,7 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -270,9 +277,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-https-route",
+            "id": "${APPLICATION_NAME}-https",
             "metadata": {
-                "name": "${APPLICATION_NAME}-https-route",
+                "name": "secure-${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -281,12 +288,12 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "secure-${APPLICATION_NAME}"
                 },
                 "tls": {
-                    "termination" : "passthrough"
+                    "termination": "passthrough"
                 }
             }
         },
@@ -313,18 +320,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-eap6-openshift:${EAP_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-eap64-openshift:1.1"
                         }
                     }
                 },
@@ -338,18 +346,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -380,6 +391,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -396,6 +410,7 @@
                     },
                     "spec": {
                         "serviceAccount": "eap-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",
@@ -472,12 +487,16 @@
                                         "value": "${DB_TX_ISOLATION}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_NAME",
-                                        "value": "${APPLICATION_NAME}-ping"
+                                        "name": "OPENSHIFT_KUBE_PING_LABELS",
+                                        "value": "application=${APPLICATION_NAME}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_PORT",
-                                        "value": "8888"
+                                        "name": "OPENSHIFT_KUBE_PING_NAMESPACE",
+                                        "valueFrom": {
+                                            "fieldRef": {
+                                                "fieldPath": "metadata.namespace"
+                                            }
+                                        }
                                     },
                                     {
                                         "name": "EAP_HTTPS_KEYSTORE_DIR",
@@ -545,10 +564,13 @@
                             ],
                             "from": {
                                 "kind": "ImageStreamTag",
-                                "namespace": "openshift",
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
                                 "name": "mysql:latest"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -564,6 +586,7 @@
                         }
                     },
                     "spec": {
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}-mysql",
@@ -639,7 +662,9 @@
                 }
             },
             "spec": {
-                "accessModes": [ "ReadWriteOnce" ],
+                "accessModes": [
+                    "ReadWriteOnce"
+                ],
                 "resources": {
                     "requests": {
                         "storage": "${VOLUME_CAPACITY}"
@@ -648,4 +673,4 @@
             }
         }
     ]
-}
+}

+ 108 - 86
roles/openshift_examples/files/examples/xpaas-templates/eap6-mysql-sti.json

@@ -3,145 +3,176 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "description": "Application template for EAP 6 MySQL applications built using STI.",
-            "iconClass" : "icon-jboss"
+            "description": "Application template for EAP 6 MySQL applications built using S2I.",
+            "iconClass": "icon-jboss",
+            "tags": "eap,mysql,javaee,java,database,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "eap6-mysql-sti"
+        "name": "eap64-mysql-s2i"
     },
     "labels": {
-        "template": "eap6-mysql-sti"
+        "template": "eap64-mysql-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "EAP Release version, e.g. 6.4, etc.",
-            "name": "EAP_RELEASE",
-            "value": "6.4"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "eap-app"
+            "value": "eap-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-openshift/openshift-quickstarts",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "master"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "1.1",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": ""
+            "name": "CONTEXT_DIR",
+            "value": "todolist/todolist-jdbc",
+            "required": false
         },
         {
             "description": "Database JNDI name used by application to resolve the datasource, e.g. java:/jboss/datasources/mysql",
             "name": "DB_JNDI",
-            "value": ""
+            "value": "java:jboss/datasources/TodoListDS",
+            "required": false
         },
         {
             "description": "Database name",
             "name": "DB_DATABASE",
-            "value": "root"
+            "value": "root",
+            "required": true
         },
         {
             "description": "Queue names",
             "name": "HORNETQ_QUEUES",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Topic names",
             "name": "HORNETQ_TOPICS",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The name of the secret containing the keystore file",
             "name": "EAP_HTTPS_SECRET",
-            "value": "eap-app-secret"
+            "value": "eap-app-secret",
+            "required": false
         },
         {
             "description": "The name of the keystore file within the secret",
             "name": "EAP_HTTPS_KEYSTORE",
-            "value": "keystore.jks"
+            "value": "keystore.jks",
+            "required": false
         },
         {
             "description": "The name associated with the server certificate",
             "name": "EAP_HTTPS_NAME",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The password for the keystore and certificate",
             "name": "EAP_HTTPS_PASSWORD",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Sets xa-pool/min-pool-size for the configured datasource.",
-            "name": "DB_MIN_POOL_SIZE"
+            "name": "DB_MIN_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets xa-pool/max-pool-size for the configured datasource.",
-            "name": "DB_MAX_POOL_SIZE"
+            "name": "DB_MAX_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets transaction-isolation for the configured datasource.",
-            "name": "DB_TX_ISOLATION"
+            "name": "DB_TX_ISOLATION",
+            "required": false
         },
         {
             "description": "Sets how the table names are stored and compared.",
-            "name": "MYSQL_LOWER_CASE_TABLE_NAMES"
+            "name": "MYSQL_LOWER_CASE_TABLE_NAMES",
+            "required": false
         },
         {
             "description": "The maximum permitted number of simultaneous client connections.",
-            "name": "MYSQL_MAX_CONNECTIONS"
+            "name": "MYSQL_MAX_CONNECTIONS",
+            "required": false
         },
         {
             "description": "The minimum length of the word to be included in a FULLTEXT index.",
-            "name": "MYSQL_FT_MIN_WORD_LEN"
+            "name": "MYSQL_FT_MIN_WORD_LEN",
+            "required": false
         },
         {
             "description": "The maximum length of the word to be included in a FULLTEXT index.",
-            "name": "MYSQL_FT_MAX_WORD_LEN"
+            "name": "MYSQL_FT_MAX_WORD_LEN",
+            "required": false
         },
         {
             "description": "Controls the innodb_use_native_aio setting value if the native AIO is broken.",
-            "name": "MYSQL_AIO"
+            "name": "MYSQL_AIO",
+            "required": false
         },
         {
             "description": "HornetQ cluster admin password",
             "name": "HORNETQ_CLUSTER_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user name",
             "name": "DB_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user password",
             "name": "DB_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -199,31 +230,6 @@
             "spec": {
                 "ports": [
                     {
-                        "port": 8888,
-                        "targetPort": 8888
-                    }
-                ],
-                "portalIP": "None",
-                "selector": {
-                    "deploymentConfig": "${APPLICATION_NAME}"
-                }
-            },
-            "metadata": {
-                "name": "${APPLICATION_NAME}-ping",
-                "labels": {
-                    "application": "${APPLICATION_NAME}"
-                },
-                "annotations": {
-                    "description": "Ping service for clustered applications."
-                }
-            }
-        },
-        {
-            "kind": "Service",
-            "apiVersion": "v1",
-            "spec": {
-                "ports": [
-                    {
                         "port": 3306,
                         "targetPort": 3306
                     }
@@ -245,9 +251,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-                "name": "${APPLICATION_NAME}-http-route",
+                "name": "${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -256,7 +262,7 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -265,9 +271,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-https-route",
+            "id": "${APPLICATION_NAME}-https",
             "metadata": {
-                "name": "${APPLICATION_NAME}-https-route",
+                "name": "secure-${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -276,12 +282,12 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "secure-${APPLICATION_NAME}"
                 },
                 "tls": {
-                    "termination" : "passthrough"
+                    "termination": "passthrough"
                 }
             }
         },
@@ -308,18 +314,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-eap6-openshift:${EAP_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-eap64-openshift:1.1"
                         }
                     }
                 },
@@ -333,18 +340,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -375,6 +385,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -391,6 +404,7 @@
                     },
                     "spec": {
                         "serviceAccount": "eap-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",
@@ -467,12 +481,16 @@
                                         "value": "${DB_TX_ISOLATION}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_NAME",
-                                        "value": "${APPLICATION_NAME}-ping"
+                                        "name": "OPENSHIFT_KUBE_PING_LABELS",
+                                        "value": "application=${APPLICATION_NAME}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_PORT",
-                                        "value": "8888"
+                                        "name": "OPENSHIFT_KUBE_PING_NAMESPACE",
+                                        "valueFrom": {
+                                            "fieldRef": {
+                                                "fieldPath": "metadata.namespace"
+                                            }
+                                        }
                                     },
                                     {
                                         "name": "EAP_HTTPS_KEYSTORE_DIR",
@@ -540,10 +558,13 @@
                             ],
                             "from": {
                                 "kind": "ImageStreamTag",
-                                "namespace": "openshift",
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
                                 "name": "mysql:latest"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -559,6 +580,7 @@
                         }
                     },
                     "spec": {
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}-mysql",
@@ -611,4 +633,4 @@
             }
         }
     ]
-}
+}

+ 111 - 89
roles/openshift_examples/files/examples/xpaas-templates/eap6-postgresql-persistent-sti.json

@@ -3,138 +3,167 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "description": "Application template for EAP 6 PostgreSQL applications with persistent storage built using STI.",
-            "iconClass" : "icon-jboss"
+            "description": "Application template for EAP 6 PostgreSQL applications with persistent storage built using S2I.",
+            "iconClass": "icon-jboss",
+            "tags": "eap,postgresql,javaee,java,database,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "eap6-postgresql-persistent-sti"
+        "name": "eap64-postgresql-persistent-s2i"
     },
     "labels": {
-        "template": "eap6-postgresql-persistent-sti"
+        "template": "eap64-postgresql-persistent-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "EAP Release version, e.g. 6.4, etc.",
-            "name": "EAP_RELEASE",
-            "value": "6.4"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "eap-app"
+            "value": "eap-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-openshift/openshift-quickstarts",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "master"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "1.1",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": ""
+            "name": "CONTEXT_DIR",
+            "value": "todolist/todolist-jdbc",
+            "required": false
         },
         {
             "description": "Database JNDI name used by application to resolve the datasource, e.g. java:/jboss/datasources/postgresql",
             "name": "DB_JNDI",
-            "value": ""
+            "value": "java:jboss/datasources/TodoListDS",
+            "required": false
         },
         {
             "description": "Database name",
             "name": "DB_DATABASE",
-            "value": "root"
+            "value": "root",
+            "required": true
         },
         {
             "description": "Size of persistent storage for database volume.",
             "name": "VOLUME_CAPACITY",
-            "value": "512Mi"
+            "value": "512Mi",
+            "required": true
         },
         {
             "description": "Queue names",
             "name": "HORNETQ_QUEUES",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Topic names",
             "name": "HORNETQ_TOPICS",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The name of the secret containing the keystore file",
             "name": "EAP_HTTPS_SECRET",
-            "value": "eap-app-secret"
+            "value": "eap-app-secret",
+            "required": false
         },
         {
             "description": "The name of the keystore file within the secret",
             "name": "EAP_HTTPS_KEYSTORE",
-            "value": "keystore.jks"
+            "value": "keystore.jks",
+            "required": false
         },
         {
             "description": "The name associated with the server certificate",
             "name": "EAP_HTTPS_NAME",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The password for the keystore and certificate",
             "name": "EAP_HTTPS_PASSWORD",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Sets xa-pool/min-pool-size for the configured datasource.",
-            "name": "DB_MIN_POOL_SIZE"
+            "name": "DB_MIN_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets xa-pool/max-pool-size for the configured datasource.",
-            "name": "DB_MAX_POOL_SIZE"
+            "name": "DB_MAX_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets transaction-isolation for the configured datasource.",
-            "name": "DB_TX_ISOLATION"
+            "name": "DB_TX_ISOLATION",
+            "required": false
         },
         {
             "description": "The maximum number of client connections allowed. This also sets the maximum number of prepared transactions.",
-            "name": "POSTGRESQL_MAX_CONNECTIONS"
+            "name": "POSTGRESQL_MAX_CONNECTIONS",
+            "required": false
         },
         {
             "description": "Configures how much memory is dedicated to PostgreSQL for caching data.",
-            "name": "POSTGRESQL_SHARED_BUFFERS"
+            "name": "POSTGRESQL_SHARED_BUFFERS",
+            "required": false
         },
         {
             "description": "HornetQ cluster admin password",
             "name": "HORNETQ_CLUSTER_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user name",
             "name": "DB_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user password",
             "name": "DB_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -192,31 +221,6 @@
             "spec": {
                 "ports": [
                     {
-                        "port": 8888,
-                        "targetPort": 8888
-                    }
-                ],
-                "portalIP": "None",
-                "selector": {
-                    "deploymentConfig": "${APPLICATION_NAME}"
-                }
-            },
-            "metadata": {
-                "name": "${APPLICATION_NAME}-ping",
-                "labels": {
-                    "application": "${APPLICATION_NAME}"
-                },
-                "annotations": {
-                    "description": "Ping service for clustered applications."
-                }
-            }
-        },
-        {
-            "kind": "Service",
-            "apiVersion": "v1",
-            "spec": {
-                "ports": [
-                    {
                         "port": 5432,
                         "targetPort": 5432
                     }
@@ -238,9 +242,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-                "name": "${APPLICATION_NAME}-http-route",
+                "name": "${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -249,7 +253,7 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -258,9 +262,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-https-route",
+            "id": "${APPLICATION_NAME}-https",
             "metadata": {
-                "name": "${APPLICATION_NAME}-https-route",
+                "name": "secure-${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -269,12 +273,12 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "secure-${APPLICATION_NAME}"
                 },
                 "tls": {
-                    "termination" : "passthrough"
+                    "termination": "passthrough"
                 }
             }
         },
@@ -301,18 +305,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-eap6-openshift:${EAP_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-eap64-openshift:1.1"
                         }
                     }
                 },
@@ -326,18 +331,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -368,6 +376,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -384,6 +395,7 @@
                     },
                     "spec": {
                         "serviceAccount": "eap-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",
@@ -460,12 +472,16 @@
                                         "value": "${DB_TX_ISOLATION}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_NAME",
-                                        "value": "${APPLICATION_NAME}-ping"
+                                        "name": "OPENSHIFT_KUBE_PING_LABELS",
+                                        "value": "application=${APPLICATION_NAME}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_PORT",
-                                        "value": "8888"
+                                        "name": "OPENSHIFT_KUBE_PING_NAMESPACE",
+                                        "valueFrom": {
+                                            "fieldRef": {
+                                                "fieldPath": "metadata.namespace"
+                                            }
+                                        }
                                     },
                                     {
                                         "name": "EAP_HTTPS_KEYSTORE_DIR",
@@ -533,10 +549,13 @@
                             ],
                             "from": {
                                 "kind": "ImageStreamTag",
-                                "namespace": "openshift",
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
                                 "name": "postgresql:latest"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -552,6 +571,7 @@
                         }
                     },
                     "spec": {
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}-postgresql",
@@ -564,10 +584,10 @@
                                     }
                                 ],
                                 "volumeMounts": [
-                                     {
-                                         "mountPath": "/var/lib/pgsql/data",
-                                         "name": "${APPLICATION_NAME}-postgresql-pvol"
-                                     }
+                                    {
+                                        "mountPath": "/var/lib/pgsql/data",
+                                        "name": "${APPLICATION_NAME}-postgresql-pvol"
+                                    }
                                 ],
                                 "env": [
                                     {
@@ -615,7 +635,9 @@
                 }
             },
             "spec": {
-                "accessModes": [ "ReadWriteOnce" ],
+                "accessModes": [
+                    "ReadWriteOnce"
+                ],
                 "resources": {
                     "requests": {
                         "storage": "${VOLUME_CAPACITY}"
@@ -624,4 +646,4 @@
             }
         }
     ]
-}
+}

+ 102 - 83
roles/openshift_examples/files/examples/xpaas-templates/eap6-postgresql-sti.json

@@ -3,133 +3,161 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "description": "Application template for EAP 6 PostgreSQL applications built using STI.",
-            "iconClass" : "icon-jboss"
+            "description": "Application template for EAP 6 PostgreSQL applications built using S2I.",
+            "iconClass": "icon-jboss",
+            "tags": "eap,postgresql,javaee,java,database,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "eap6-postgresql-sti"
+        "name": "eap64-postgresql-s2i"
     },
     "labels": {
-        "template": "eap6-postgresql-sti"
+        "template": "eap64-postgresql-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "EAP Release version, e.g. 6.4, etc.",
-            "name": "EAP_RELEASE",
-            "value": "6.4"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "eap-app"
+            "value": "eap-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-openshift/openshift-quickstarts",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "master"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "1.1",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": ""
+            "name": "CONTEXT_DIR",
+            "value": "todolist/todolist-jdbc",
+            "required": false
         },
         {
             "description": "Database JNDI name used by application to resolve the datasource, e.g. java:/jboss/datasources/postgresql",
             "name": "DB_JNDI",
-            "value": ""
+            "value": "java:jboss/datasources/TodoListDS",
+            "required": false
         },
         {
             "description": "Database name",
             "name": "DB_DATABASE",
-            "value": "root"
+            "value": "root",
+            "required": true
         },
         {
             "description": "Queue names",
             "name": "HORNETQ_QUEUES",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Topic names",
             "name": "HORNETQ_TOPICS",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The name of the secret containing the keystore file",
             "name": "EAP_HTTPS_SECRET",
-            "value": "eap-app-secret"
+            "value": "eap-app-secret",
+            "required": false
         },
         {
             "description": "The name of the keystore file within the secret",
             "name": "EAP_HTTPS_KEYSTORE",
-            "value": "keystore.jks"
+            "value": "keystore.jks",
+            "required": false
         },
         {
             "description": "The name associated with the server certificate",
             "name": "EAP_HTTPS_NAME",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "The password for the keystore and certificate",
             "name": "EAP_HTTPS_PASSWORD",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Sets xa-pool/min-pool-size for the configured datasource.",
-            "name": "DB_MIN_POOL_SIZE"
+            "name": "DB_MIN_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets xa-pool/max-pool-size for the configured datasource.",
-            "name": "DB_MAX_POOL_SIZE"
+            "name": "DB_MAX_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets transaction-isolation for the configured datasource.",
-            "name": "DB_TX_ISOLATION"
+            "name": "DB_TX_ISOLATION",
+            "required": false
         },
         {
             "description": "The maximum number of client connections allowed. This also sets the maximum number of prepared transactions.",
-            "name": "POSTGRESQL_MAX_CONNECTIONS"
+            "name": "POSTGRESQL_MAX_CONNECTIONS",
+            "required": false
         },
         {
             "description": "Configures how much memory is dedicated to PostgreSQL for caching data.",
-            "name": "POSTGRESQL_SHARED_BUFFERS"
+            "name": "POSTGRESQL_SHARED_BUFFERS",
+            "required": false
         },
         {
             "description": "HornetQ cluster admin password",
             "name": "HORNETQ_CLUSTER_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user name",
             "name": "DB_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user password",
             "name": "DB_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -187,31 +215,6 @@
             "spec": {
                 "ports": [
                     {
-                        "port": 8888,
-                        "targetPort": 8888
-                    }
-                ],
-                "portalIP": "None",
-                "selector": {
-                    "deploymentConfig": "${APPLICATION_NAME}"
-                }
-            },
-            "metadata": {
-                "name": "${APPLICATION_NAME}-ping",
-                "labels": {
-                    "application": "${APPLICATION_NAME}"
-                },
-                "annotations": {
-                    "description": "Ping service for clustered applications."
-                }
-            }
-        },
-        {
-            "kind": "Service",
-            "apiVersion": "v1",
-            "spec": {
-                "ports": [
-                    {
                         "port": 5432,
                         "targetPort": 5432
                     }
@@ -233,9 +236,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-                "name": "${APPLICATION_NAME}-http-route",
+                "name": "${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -244,7 +247,7 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -253,9 +256,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-https-route",
+            "id": "${APPLICATION_NAME}-https",
             "metadata": {
-                "name": "${APPLICATION_NAME}-https-route",
+                "name": "secure-${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -264,12 +267,12 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "secure-${APPLICATION_NAME}"
                 },
                 "tls": {
-                    "termination" : "passthrough"
+                    "termination": "passthrough"
                 }
             }
         },
@@ -296,18 +299,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-eap6-openshift:${EAP_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-eap64-openshift:1.1"
                         }
                     }
                 },
@@ -321,18 +325,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -363,6 +370,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -379,6 +389,7 @@
                     },
                     "spec": {
                         "serviceAccount": "eap-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",
@@ -455,12 +466,16 @@
                                         "value": "${DB_TX_ISOLATION}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_NAME",
-                                        "value": "${APPLICATION_NAME}-ping"
+                                        "name": "OPENSHIFT_KUBE_PING_LABELS",
+                                        "value": "application=${APPLICATION_NAME}"
                                     },
                                     {
-                                        "name": "OPENSHIFT_DNS_PING_SERVICE_PORT",
-                                        "value": "8888"
+                                        "name": "OPENSHIFT_KUBE_PING_NAMESPACE",
+                                        "valueFrom": {
+                                            "fieldRef": {
+                                                "fieldPath": "metadata.namespace"
+                                            }
+                                        }
                                     },
                                     {
                                         "name": "EAP_HTTPS_KEYSTORE_DIR",
@@ -528,10 +543,13 @@
                             ],
                             "from": {
                                 "kind": "ImageStreamTag",
-                                "namespace": "openshift",
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
                                 "name": "postgresql:latest"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -547,6 +565,7 @@
                         }
                     },
                     "spec": {
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}-postgresql",
@@ -587,4 +606,4 @@
             }
         }
     ]
-}
+}

+ 56 - 34
roles/openshift_examples/files/examples/xpaas-templates/jws-tomcat8-basic-sti.json

@@ -3,67 +3,81 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "iconClass" : "icon-tomcat",
-            "description": "Application template for JWS applications built using STI."
+            "iconClass": "icon-tomcat",
+            "description": "Application template for JWS applications built using S2I.",
+            "tags": "tomcat,tomcat7,java,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "jws-tomcat8-basic-sti"
+        "name": "jws30-tomcat7-basic-s2i"
     },
     "labels": {
-        "template": "jws-tomcat8-basic-sti"
+        "template": "jws30-tomcat7-basic-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "JWS Release version, e.g. 3.0, 2.1, etc.",
-            "name": "JWS_RELEASE",
-            "value": "3.0"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "jws-app"
+            "value": "jws-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-openshift/openshift-quickstarts.git",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "master"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "1.1",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": ""
+            "name": "CONTEXT_DIR",
+            "value": "tomcat-websocket-chat",
+            "required": false
         },
         {
             "description": "JWS Admin User",
             "name": "JWS_ADMIN_USERNAME",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "JWS Admin Password",
             "name": "JWS_ADMIN_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -94,9 +108,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-                "name": "${APPLICATION_NAME}-http-route",
+                "name": "${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -105,7 +119,7 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -134,18 +148,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-webserver3-tomcat8-openshift:${JWS_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-webserver30-tomcat7-openshift:1.1"
                         }
                     }
                 },
@@ -159,18 +174,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -201,6 +219,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -216,6 +237,7 @@
                         }
                     },
                     "spec": {
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",

+ 68 - 42
roles/openshift_examples/files/examples/xpaas-templates/jws-tomcat8-https-sti.json

@@ -3,87 +3,105 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "iconClass" : "icon-tomcat",
-            "description": "Application template for JWS applications built using STI."
+            "iconClass": "icon-tomcat",
+            "description": "Application template for JWS applications built using S2I.",
+            "tags": "tomcat,tomcat7,java,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "jws-tomcat8-basic-sti"
+        "name": "jws30-tomcat7-https-s2i"
     },
     "labels": {
-        "template": "jws-tomcat8-basic-sti"
+        "template": "jws30-tomcat7-https-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "JWS Release version, e.g. 3.0, 2.1, etc.",
-            "name": "JWS_RELEASE",
-            "value": "3.0"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "jws-app"
+            "value": "jws-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-openshift/openshift-quickstarts.git",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "master"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "1.1",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": ""
+            "name": "CONTEXT_DIR",
+            "value": "tomcat-websocket-chat",
+            "required": false
         },
         {
             "description": "The name of the secret containing the certificate files",
             "name": "JWS_HTTPS_SECRET",
-            "value": "jws-app-secret"
+            "value": "jws-app-secret",
+            "required": true
         },
         {
             "description": "The name of the certificate file within the secret",
             "name": "JWS_HTTPS_CERTIFICATE",
-            "value": "server.crt"
+            "value": "server.crt",
+            "required": false
         },
         {
             "description": "The name of the certificate key file within the secret",
             "name": "JWS_HTTPS_CERTIFICATE_KEY",
-            "value": "server.key"
+            "value": "server.key",
+            "required": false
         },
         {
             "description": "The certificate password",
             "name": "JWS_HTTPS_CERTIFICATE_PASSWORD",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "JWS Admin User",
             "name": "JWS_ADMIN_USERNAME",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "JWS Admin Password",
             "name": "JWS_ADMIN_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -138,9 +156,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-                "name": "${APPLICATION_NAME}-http-route",
+                "name": "${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -149,7 +167,7 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -158,9 +176,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-https-route",
+            "id": "${APPLICATION_NAME}-https",
             "metadata": {
-                "name": "${APPLICATION_NAME}-https-route",
+                "name": "secure-${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -169,12 +187,12 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "secure-${APPLICATION_NAME}"
                 },
                 "tls": {
-                    "termination" : "passthrough"
+                    "termination": "passthrough"
                 }
             }
         },
@@ -201,18 +219,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-webserver3-tomcat8-openshift:${JWS_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-webserver30-tomcat7-openshift:1.1"
                         }
                     }
                 },
@@ -226,18 +245,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -268,6 +290,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -284,6 +309,7 @@
                     },
                     "spec": {
                         "serviceAccount": "jws-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",

+ 106 - 62
roles/openshift_examples/files/examples/xpaas-templates/jws-tomcat7-mongodb-persistent-sti.json

@@ -3,144 +3,174 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "iconClass" : "icon-tomcat",
-            "description": "Application template for JWS MongoDB applications with persistent storage built using STI."
+            "iconClass": "icon-tomcat",
+            "description": "Application template for JWS MongoDB applications with persistent storage built using S2I.",
+            "tags": "tomcat,tomcat7,mongodb,java,database,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "jws-tomcat7-mongodb-persistent-sti"
+        "name": "jws30-tomcat7-mongodb-persistent-s2i"
     },
     "labels": {
-        "template": "jws-tomcat7-mongodb-persistent-sti"
+        "template": "jws30-tomcat7-mongodb-persistent-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "JWS Release version, e.g. 3.0, 2.1, etc.",
-            "name": "JWS_RELEASE",
-            "value": "3.0"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "jws-app"
+            "value": "jws-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-openshift/openshift-quickstarts",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "master"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "1.1",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": ""
+            "name": "CONTEXT_DIR",
+            "value": "todolist/todolist-mongodb",
+            "required": false
         },
         {
             "description": "Database JNDI name used by application to resolve the datasource, e.g. java:/jboss/datasources/mongodb",
             "name": "DB_JNDI",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Database name",
             "name": "DB_DATABASE",
-            "value": "root"
+            "value": "root",
+            "required": true
         },
         {
             "description": "Size of persistent storage for database volume.",
             "name": "VOLUME_CAPACITY",
-            "value": "512Mi"
+            "value": "512Mi",
+            "required": true
         },
         {
             "description": "The name of the secret containing the certificate files",
             "name": "JWS_HTTPS_SECRET",
-            "value": "jws-app-secret"
+            "value": "jws-app-secret",
+            "required": true
         },
         {
             "description": "The name of the certificate file within the secret",
             "name": "JWS_HTTPS_CERTIFICATE",
-            "value": "server.crt"
+            "value": "server.crt",
+            "required": false
         },
         {
             "description": "The name of the certificate key file within the secret",
             "name": "JWS_HTTPS_CERTIFICATE_KEY",
-            "value": "server.key"
+            "value": "server.key",
+            "required": false
         },
         {
             "description": "The certificate password",
             "name": "JWS_HTTPS_CERTIFICATE_PASSWORD",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Sets xa-pool/min-pool-size for the configured datasource.",
-            "name": "DB_MIN_POOL_SIZE"
+            "name": "DB_MIN_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets xa-pool/max-pool-size for the configured datasource.",
-            "name": "DB_MAX_POOL_SIZE"
+            "name": "DB_MAX_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets transaction-isolation for the configured datasource.",
-            "name": "DB_TX_ISOLATION"
+            "name": "DB_TX_ISOLATION",
+            "required": false
         },
         {
             "description": "Disable data file preallocation.",
-            "name": "MONGODB_NOPREALLOC"
+            "name": "MONGODB_NOPREALLOC",
+            "required": false
         },
         {
             "description": "Set MongoDB to use a smaller default data file size.",
-            "name": "MONGODB_SMALLFILES"
+            "name": "MONGODB_SMALLFILES",
+            "required": false
         },
         {
             "description": "Runs MongoDB in a quiet mode that attempts to limit the amount of output.",
-            "name": "MONGODB_QUIET"
+            "name": "MONGODB_QUIET",
+            "required": false
         },
         {
             "description": "Database user name",
             "name": "DB_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user password",
             "name": "DB_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database admin password",
             "name": "DB_ADMIN_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "JWS Admin User",
             "name": "JWS_ADMIN_USERNAME",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "JWS Admin Password",
             "name": "JWS_ADMIN_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -219,9 +249,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-                "name": "${APPLICATION_NAME}-http-route",
+                "name": "${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -230,7 +260,7 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -239,9 +269,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-https-route",
+            "id": "${APPLICATION_NAME}-https",
             "metadata": {
-                "name": "${APPLICATION_NAME}-https-route",
+                "name": "secure-${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -250,12 +280,12 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "secure-${APPLICATION_NAME}"
                 },
                 "tls": {
-                    "termination" : "passthrough"
+                    "termination": "passthrough"
                 }
             }
         },
@@ -282,18 +312,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-webserver3-tomcat7-openshift:${JWS_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-webserver30-tomcat7-openshift:1.1"
                         }
                     }
                 },
@@ -307,18 +338,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -349,6 +383,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -365,6 +402,7 @@
                     },
                     "spec": {
                         "serviceAccount": "jws-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",
@@ -497,10 +535,13 @@
                             ],
                             "from": {
                                 "kind": "ImageStreamTag",
-                                "namespace": "openshift",
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
                                 "name": "mongodb:latest"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -516,6 +557,7 @@
                         }
                     },
                     "spec": {
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}-mongodb",
@@ -528,11 +570,11 @@
                                     }
                                 ],
                                 "volumeMounts": [
-                                     {
-                                         "mountPath": "/var/lib/mongodb/data",
-                                         "name": "${APPLICATION_NAME}-mongodb-pvol"
-                                     }
-                                 ],
+                                    {
+                                        "mountPath": "/var/lib/mongodb/data",
+                                        "name": "${APPLICATION_NAME}-mongodb-pvol"
+                                    }
+                                ],
                                 "env": [
                                     {
                                         "name": "MONGODB_USER",
@@ -587,7 +629,9 @@
                 }
             },
             "spec": {
-                "accessModes": [ "ReadWriteOnce" ],
+                "accessModes": [
+                    "ReadWriteOnce"
+                ],
                 "resources": {
                     "requests": {
                         "storage": "${VOLUME_CAPACITY}"
@@ -596,4 +640,4 @@
             }
         }
     ]
-}
+}

+ 96 - 92
roles/openshift_examples/files/examples/xpaas-templates/jws-tomcat8-mongodb-persistent-sti.json

@@ -3,144 +3,168 @@
     "apiVersion": "v1",
     "metadata": {
         "annotations": {
-            "iconClass" : "icon-tomcat",
-            "description": "Application template for JWS MongoDB applications with persistent storage built using STI."
+            "iconClass": "icon-tomcat",
+            "description": "Application template for JWS MongoDB applications built using S2I.",
+            "tags": "tomcat,tomcat7,mongodb,java,database,jboss,xpaas",
+            "version": "1.1.0"
         },
-        "name": "jws-tomcat8-mongodb-persistent-sti"
+        "name": "jws30-tomcat7-mongodb-s2i"
     },
     "labels": {
-        "template": "jws-tomcat8-mongodb-persistent-sti"
+        "template": "jws30-tomcat7-mongodb-s2i",
+        "xpaas": "1.1.0"
     },
     "parameters": [
         {
-            "description": "JWS Release version, e.g. 3.0, 2.1, etc.",
-            "name": "JWS_RELEASE",
-            "value": "3.0"
-        },
-        {
             "description": "The name for the application.",
             "name": "APPLICATION_NAME",
-            "value": "jws-app"
+            "value": "jws-app",
+            "required": true
         },
         {
             "description": "Custom hostname for service routes.  Leave blank for default hostname, e.g.: <application-name>.<project>.<default-domain-suffix>",
-            "name": "APPLICATION_HOSTNAME",
-            "value": ""
+            "name": "APPLICATION_DOMAIN",
+            "value": "",
+            "required": false
         },
         {
             "description": "Git source URI for application",
-            "name": "GIT_URI"
+            "name": "SOURCE_REPOSITORY_URL",
+            "value": "https://github.com/jboss-openshift/openshift-quickstarts",
+            "required": true
         },
         {
             "description": "Git branch/tag reference",
-            "name": "GIT_REF",
-            "value": "master"
+            "name": "SOURCE_REPOSITORY_REF",
+            "value": "1.1",
+            "required": false
         },
         {
             "description": "Path within Git project to build; empty for root project directory.",
-            "name": "GIT_CONTEXT_DIR",
-            "value": ""
+            "name": "CONTEXT_DIR",
+            "value": "todolist/todolist-mongodb",
+            "required": false
         },
         {
             "description": "Database JNDI name used by application to resolve the datasource, e.g. java:/jboss/datasources/mongodb",
             "name": "DB_JNDI",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Database name",
             "name": "DB_DATABASE",
-            "value": "root"
-        },
-        {
-            "description": "Size of persistent storage for database volume.",
-            "name": "VOLUME_CAPACITY",
-            "value": "512Mi"
+            "value": "root",
+            "required": true
         },
         {
             "description": "The name of the secret containing the certificate files",
             "name": "JWS_HTTPS_SECRET",
-            "value": "jws-app-secret"
+            "value": "jws-app-secret",
+            "required": true
         },
         {
             "description": "The name of the certificate file within the secret",
             "name": "JWS_HTTPS_CERTIFICATE",
-            "value": "server.crt"
+            "value": "server.crt",
+            "required": false
         },
         {
             "description": "The name of the certificate key file within the secret",
             "name": "JWS_HTTPS_CERTIFICATE_KEY",
-            "value": "server.key"
+            "value": "server.key",
+            "required": false
         },
         {
             "description": "The certificate password",
             "name": "JWS_HTTPS_CERTIFICATE_PASSWORD",
-            "value": ""
+            "value": "",
+            "required": false
         },
         {
             "description": "Sets xa-pool/min-pool-size for the configured datasource.",
-            "name": "DB_MIN_POOL_SIZE"
+            "name": "DB_MIN_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets xa-pool/max-pool-size for the configured datasource.",
-            "name": "DB_MAX_POOL_SIZE"
+            "name": "DB_MAX_POOL_SIZE",
+            "required": false
         },
         {
             "description": "Sets transaction-isolation for the configured datasource.",
-            "name": "DB_TX_ISOLATION"
+            "name": "DB_TX_ISOLATION",
+            "required": false
         },
         {
             "description": "Disable data file preallocation.",
-            "name": "MONGODB_NOPREALLOC"
+            "name": "MONGODB_NOPREALLOC",
+            "required": false
         },
         {
             "description": "Set MongoDB to use a smaller default data file size.",
-            "name": "MONGODB_SMALLFILES"
+            "name": "MONGODB_SMALLFILES",
+            "required": false
         },
         {
             "description": "Runs MongoDB in a quiet mode that attempts to limit the amount of output.",
-            "name": "MONGODB_QUIET"
+            "name": "MONGODB_QUIET",
+            "required": false
         },
         {
             "description": "Database user name",
             "name": "DB_USERNAME",
             "from": "user[a-zA-Z0-9]{3}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database user password",
             "name": "DB_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Database admin password",
             "name": "DB_ADMIN_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "JWS Admin User",
             "name": "JWS_ADMIN_USERNAME",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "JWS Admin Password",
             "name": "JWS_ADMIN_PASSWORD",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
-            "description": "Github trigger secret",
-            "name": "GITHUB_TRIGGER_SECRET",
+            "description": "GitHub trigger secret",
+            "name": "GITHUB_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
         },
         {
             "description": "Generic build trigger secret",
-            "name": "GENERIC_TRIGGER_SECRET",
+            "name": "GENERIC_WEBHOOK_SECRET",
             "from": "[a-zA-Z0-9]{8}",
-            "generate": "expression"
+            "generate": "expression",
+            "required": true
+        },
+        {
+            "description": "Namespace in which the ImageStreams for Red Hat Middleware images are installed. These ImageStreams are normally installed in the openshift namespace. You should only need to modify this if you've installed the ImageStreams in a different namespace/project.",
+            "name": "IMAGE_STREAM_NAMESPACE",
+            "value": "openshift",
+            "required": true
         }
     ],
     "objects": [
@@ -219,9 +243,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-http-route",
+            "id": "${APPLICATION_NAME}-http",
             "metadata": {
-                "name": "${APPLICATION_NAME}-http-route",
+                "name": "${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -230,7 +254,7 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "${APPLICATION_NAME}"
                 }
@@ -239,9 +263,9 @@
         {
             "kind": "Route",
             "apiVersion": "v1",
-            "id": "${APPLICATION_NAME}-https-route",
+            "id": "${APPLICATION_NAME}-https",
             "metadata": {
-                "name": "${APPLICATION_NAME}-https-route",
+                "name": "secure-${APPLICATION_NAME}",
                 "labels": {
                     "application": "${APPLICATION_NAME}"
                 },
@@ -250,12 +274,12 @@
                 }
             },
             "spec": {
-                "host": "${APPLICATION_HOSTNAME}",
+                "host": "${APPLICATION_DOMAIN}",
                 "to": {
                     "name": "secure-${APPLICATION_NAME}"
                 },
                 "tls": {
-                    "termination" : "passthrough"
+                    "termination": "passthrough"
                 }
             }
         },
@@ -282,18 +306,19 @@
                 "source": {
                     "type": "Git",
                     "git": {
-                        "uri": "${GIT_URI}",
-                        "ref": "${GIT_REF}"
+                        "uri": "${SOURCE_REPOSITORY_URL}",
+                        "ref": "${SOURCE_REPOSITORY_REF}"
                     },
-                    "contextDir":"${GIT_CONTEXT_DIR}"
+                    "contextDir": "${CONTEXT_DIR}"
                 },
                 "strategy": {
                     "type": "Source",
                     "sourceStrategy": {
+                        "forcePull": true,
                         "from": {
                             "kind": "ImageStreamTag",
-                            "namespace": "openshift",
-                            "name": "jboss-webserver3-tomcat8-openshift:${JWS_RELEASE}"
+                            "namespace": "${IMAGE_STREAM_NAMESPACE}",
+                            "name": "jboss-webserver30-tomcat7-openshift:1.1"
                         }
                     }
                 },
@@ -307,18 +332,21 @@
                     {
                         "type": "GitHub",
                         "github": {
-                            "secret": "${GITHUB_TRIGGER_SECRET}"
+                            "secret": "${GITHUB_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "Generic",
                         "generic": {
-                            "secret": "${GENERIC_TRIGGER_SECRET}"
+                            "secret": "${GENERIC_WEBHOOK_SECRET}"
                         }
                     },
                     {
                         "type": "ImageChange",
                         "imageChange": {}
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ]
             }
@@ -349,6 +377,9 @@
                                 "name": "${APPLICATION_NAME}"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -365,6 +396,7 @@
                     },
                     "spec": {
                         "serviceAccount": "jws-service-account",
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}",
@@ -497,10 +529,13 @@
                             ],
                             "from": {
                                 "kind": "ImageStreamTag",
-                                "namespace": "openshift",
+                                "namespace": "${IMAGE_STREAM_NAMESPACE}",
                                 "name": "mongodb:latest"
                             }
                         }
+                    },
+                    {
+                        "type": "ConfigChange"
                     }
                 ],
                 "replicas": 1,
@@ -516,6 +551,7 @@
                         }
                     },
                     "spec": {
+                        "terminationGracePeriodSeconds": 60,
                         "containers": [
                             {
                                 "name": "${APPLICATION_NAME}-mongodb",
@@ -527,12 +563,6 @@
                                         "protocol": "TCP"
                                     }
                                 ],
-                                "volumeMounts": [
-                                     {
-                                         "mountPath": "/var/lib/mongodb/data",
-                                         "name": "${APPLICATION_NAME}-mongodb-pvol"
-                                     }
-                                 ],
                                 "env": [
                                     {
                                         "name": "MONGODB_USER",
@@ -564,36 +594,10 @@
                                     }
                                 ]
                             }
-                        ],
-                        "volumes": [
-                            {
-                                "name": "${APPLICATION_NAME}-mongodb-pvol",
-                                "persistentVolumeClaim": {
-                                    "claimName": "${APPLICATION_NAME}-mongodb-claim"
-                                }
-                            }
                         ]
                     }
                 }
             }
-        },
-        {
-            "apiVersion": "v1",
-            "kind": "PersistentVolumeClaim",
-            "metadata": {
-                "name": "${APPLICATION_NAME}-mongodb-claim",
-                "labels": {
-                    "application": "${APPLICATION_NAME}"
-                }
-            },
-            "spec": {
-                "accessModes": [ "ReadWriteOnce" ],
-                "resources": {
-                    "requests": {
-                        "storage": "${VOLUME_CAPACITY}"
-                    }
-                }
-            }
         }
     ]
-}
+}

+ 0 - 0
roles/openshift_examples/files/examples/xpaas-templates/jws-tomcat7-mysql-persistent-sti.json


Некоторые файлы не были показаны из-за большого количества измененных файлов