Hashar has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/307425 )

Change subject: (WIP) Crazy rspec for the role module (WIP)
......................................................................

(WIP) Crazy rspec for the role module (WIP)

They should compile.

Finished in 8 minutes 6 seconds
291 examples, 0 failures, 25 pending

Change-Id: Ibcb7fe8d5c86b7ab1e99e0b5633d89bce3b21cfb
---
M .rubocop_todo.yml
A modules/role/.gitignore
A modules/role/.rspec
A modules/role/Rakefile
A modules/role/spec/fixtures/hiera.yaml
A modules/role/spec/fixtures/hieradata/common.yaml
A modules/role/spec/fixtures/hieradata/network.yaml
A modules/role/spec/fixtures/hieradata/realm_labs.yaml
A modules/role/spec/fixtures/hieradata/role/analytics_cluster/hadoop/worker.yaml
A modules/role/spec/fixtures/hieradata/role/analytics_cluster/refinery.yaml
A modules/role/spec/fixtures/hieradata/role/backup.yaml
A modules/role/spec/fixtures/hieradata/role/cache.yaml
A modules/role/spec/fixtures/hieradata/role/cache/2layer.yaml
A modules/role/spec/fixtures/hieradata/role/cache/base.yaml
A modules/role/spec/fixtures/hieradata/role/cache/kafka.yaml
A modules/role/spec/fixtures/hieradata/role/cache/maps.yaml
A modules/role/spec/fixtures/hieradata/role/cache/misc.yaml
A modules/role/spec/fixtures/hieradata/role/cache/text.yaml
A modules/role/spec/fixtures/hieradata/role/cache/upload.yaml
A modules/role/spec/fixtures/hieradata/role/ceilometer.yaml
A modules/role/spec/fixtures/hieradata/role/dataset.yaml
A modules/role/spec/fixtures/hieradata/role/deployment.yaml
A modules/role/spec/fixtures/hieradata/role/elasticsearch.yaml
A modules/role/spec/fixtures/hieradata/role/ganglia.yaml
A modules/role/spec/fixtures/hieradata/role/gerrit/server.yaml
A modules/role/spec/fixtures/hieradata/role/grafana/base.yaml
A modules/role/spec/fixtures/hieradata/role/kafka/analytics/burrow.yaml
A modules/role/spec/fixtures/hieradata/role/labs.yaml
A modules/role/spec/fixtures/hieradata/role/labs/dnsrecursor.yaml
A modules/role/spec/fixtures/hieradata/role/labs/nfs.yaml
A modules/role/spec/fixtures/hieradata/role/labs/ores.yaml
A modules/role/spec/fixtures/hieradata/role/labs/tools.yaml
A modules/role/spec/fixtures/hieradata/role/labs/tools/mailrelay.yaml
A modules/role/spec/fixtures/hieradata/role/lists.yaml
A modules/role/spec/fixtures/hieradata/role/maps.yaml
A modules/role/spec/fixtures/hieradata/role/maps/master.yaml
A modules/role/spec/fixtures/hieradata/role/maps/server.yaml
A modules/role/spec/fixtures/hieradata/role/maps/slave.yaml
A modules/role/spec/fixtures/hieradata/role/mediawiki.yaml
A modules/role/spec/fixtures/hieradata/role/mediawiki/jobrunner.yaml
A modules/role/spec/fixtures/hieradata/role/mediawiki/videoscaler.yaml
A modules/role/spec/fixtures/hieradata/role/openldap/labs.yaml
A modules/role/spec/fixtures/hieradata/role/ores/redis.yaml
A modules/role/spec/fixtures/hieradata/role/osm/master.yaml
A modules/role/spec/fixtures/hieradata/role/otrs/webserver.yaml
A modules/role/spec/fixtures/hieradata/role/phabricator/labs.yaml
A modules/role/spec/fixtures/hieradata/role/phabricator/main.yaml
A modules/role/spec/fixtures/hieradata/role/programdashboard.yaml
A modules/role/spec/fixtures/hieradata/role/prometheus/mysqld_exporter.yaml
A modules/role/spec/fixtures/hieradata/role/prometheus/node_exporter.yaml
A modules/role/spec/fixtures/hieradata/role/prometheus/tools.yaml
A modules/role/spec/fixtures/hieradata/role/puppetmaster.yaml
A modules/role/spec/fixtures/hieradata/role/puppetmaster/common.yaml
A modules/role/spec/fixtures/hieradata/role/puppetmaster/puppetdb.yaml
A modules/role/spec/fixtures/hieradata/role/salt/masters/labs.yaml
A modules/role/spec/fixtures/hieradata/role/snapshot.yaml
A modules/role/spec/fixtures/hieradata/role/striker/web.yaml
A modules/role/spec/fixtures/hieradata/role/swift/proxy.yaml
A modules/role/spec/fixtures/hieradata/role/swift/storage.yaml
A modules/role/spec/fixtures/hieradata/role/thumbor.yaml
A modules/role/spec/fixtures/hieradata/role/toollabs.yaml
A modules/role/spec/fixtures/hieradata/role/toollabs/clush.yaml
A modules/role/spec/fixtures/hieradata/role/toollabs/docker/builder.yaml
A modules/role/spec/fixtures/hieradata/role/toollabs/docker/registry.yaml
A modules/role/spec/fixtures/hieradata/role/toollabs/elasticsearch.yaml
A modules/role/spec/fixtures/hieradata/role/toollabs/etcd.yaml
A modules/role/spec/fixtures/hieradata/role/toollabs/k8s/bastion.yaml
A modules/role/spec/fixtures/hieradata/role/toollabs/k8s/master.yaml
A modules/role/spec/fixtures/hieradata/role/toollabs/k8s/webproxy.yaml
A modules/role/spec/fixtures/hieradata/role/toollabs/k8s/worker.yaml
A modules/role/spec/fixtures/hieradata/role/toollabs/logging/sender.yaml
A modules/role/spec/fixtures/hieradata/role/yubiauth/server.yaml
A modules/role/spec/fixtures/hieradata/role/zuul.yaml
A modules/role/spec/fixtures/manifests/site.pp
A modules/role/spec/fixtures/modules/grub/manifests/bootparam.pp
A modules/role/spec/fixtures/modules/grub/manifests/defaults.pp
A modules/role/spec/fixtures/modules/passwords/manifests/init.pp
A modules/role/spec/fixtures/modules/standard/manifests/init.pp
A modules/role/spec/integration/smoke_compile_roles_spec.rb
A modules/role/spec/spec_helper.rb
80 files changed, 786 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/operations/puppet 
refs/changes/25/307425/33

diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index f71c886..80bccf5 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -1,6 +1,6 @@
 # This configuration was generated by
 # `rubocop --auto-gen-config`
-# on 2015-11-23 13:21:11 +0100 using RuboCop version 0.35.1.
+# on 2016-08-31 11:55:20 +0200 using RuboCop version 0.35.1.
 # The point is for the user to remove these configuration records
 # one by one as the offenses are removed from the code base.
 # Note that changes in the inspected code, or installation of new
@@ -25,6 +25,13 @@
 Lint/RescueException:
   Exclude:
     - 'modules/puppetmaster/lib/puppet/reports/logstash.rb'
+
+# Offense count: 5
+# Cop supports --auto-correct.
+# Configuration parameters: IgnoreEmptyBlocks.
+Lint/UnusedBlockArgument:
+  Exclude:
+    - 'modules/role/spec/unit/they_should_compile_spec.rb'
 
 # Offense count: 2
 # Cop supports --auto-correct.
@@ -275,7 +282,7 @@
     - 'modules/puppetmaster/lib/puppet/reports/logstash.rb'
     - 'modules/wmflib/lib/hiera/backend/proxy_backend.rb'
 
-# Offense count: 23
+# Offense count: 24
 # Cop supports --auto-correct.
 # Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
 Style/RegexpLiteral:
@@ -285,6 +292,7 @@
     - 'modules/bacula/spec/classes/bacula_storage_spec.rb'
     - 'modules/bacula/spec/defines/fileset_spec.rb'
     - 'modules/bacula/spec/defines/storage_device_spec.rb'
+    - 'modules/role/spec/unit/they_should_compile_spec.rb'
     - 'modules/servermon/spec/classes/servermon_app_spec.rb'
     - 'modules/trebuchet/lib/puppet/provider/package/trebuchet.rb'
     - 'modules/wmflib/lib/hiera/backend/nuyaml_backend.rb'
diff --git a/modules/role/.gitignore b/modules/role/.gitignore
new file mode 100644
index 0000000..cb24b55
--- /dev/null
+++ b/modules/role/.gitignore
@@ -0,0 +1,2 @@
+# From rspec example_status_persistence_file_path
+spec/examples.txt
diff --git a/modules/role/.rspec b/modules/role/.rspec
new file mode 100644
index 0000000..f449dae
--- /dev/null
+++ b/modules/role/.rspec
@@ -0,0 +1,2 @@
+--format doc
+--color
diff --git a/modules/role/Rakefile b/modules/role/Rakefile
new file mode 100644
index 0000000..cd3d379
--- /dev/null
+++ b/modules/role/Rakefile
@@ -0,0 +1 @@
+require 'puppetlabs_spec_helper/rake_tasks'
diff --git a/modules/role/spec/fixtures/hiera.yaml 
b/modules/role/spec/fixtures/hiera.yaml
new file mode 100644
index 0000000..4da9d29
--- /dev/null
+++ b/modules/role/spec/fixtures/hiera.yaml
@@ -0,0 +1,12 @@
+:backends:
+  - yaml
+:yaml:
+  :datadir: 'spec/fixtures/hieradata'
+:hierarchy:
+  - "%{::wmf_hiera_role_dir}"
+  - "%{::wmf_hiera_role_parent_dir}"
+  - "%{::wmf_hiera_role_gparent_dir}"
+  # network::subnet from the 'network' puppet module
+  - "realm_%{::realm}"
+  - network
+  - common
diff --git a/modules/role/spec/fixtures/hieradata/common.yaml 
b/modules/role/spec/fixtures/hieradata/common.yaml
new file mode 100644
index 0000000..e467cb5
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/common.yaml
@@ -0,0 +1,59 @@
+puppetmaster: 'puppetmaster_host'
+mail_smarthost:
+    - 'mail_smarthost01'
+    - 'mail_smarthost02'
+statsd: 'statsd-fake.example.org'
+
+etcd::srv_dns: 'etcd.example.org'
+etcd::auth::common::root_password: ''
+
+# standard/base are mocked. Should not be needed:
+base::remote_syslog::enable: false
+
+labs_tld: "wmflabs.example.org"
+
+lvs::configuration::lvs_services:
+    apaches: &lvs_service
+        class: high-traffic1
+        sites:
+            - eqiad
+        ip:
+            eqiad: 127.0.0.1
+        monitors: {}
+    maps: *lvs_service
+
+lvs::configuration::lvs_service_ips:
+    apaches:
+        eqiad: dummy
+    maps:
+        eqiad: dummy
+    misc_web:
+        eqiad: dummy
+    text:
+        eqiad: dummy
+    upload:
+        eqiad: dummy
+
+# FIXME? move below spec/fixtures/hieradata/role/
+
+# For analytics cluster
+# role::zookeeper::client
+# role::analytics_cluster::*
+zookeeper_cluster_name: "zookeeper_test_cluster"
+zookeeper_clusters:
+    zookeeper_test_cluster:
+        hosts:
+            host_a: '1000'
+
+namenode_hosts:
+    - 'namenode_1'
+journalnode_hosts:
+    - 'journalnode_1'
+cdh::hadoop::journalnode_hosts:
+    - 'journalnode_2'
+cdh::hadoop::namenode_hosts:
+    - 'namenode_2'
+cdh::hive::metastore_host:
+    - 'metastore_host'
+cdh::oozie::oozie_host:
+    - 'oozie_host'
diff --git a/modules/role/spec/fixtures/hieradata/network.yaml 
b/modules/role/spec/fixtures/hieradata/network.yaml
new file mode 120000
index 0000000..cc48233
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/network.yaml
@@ -0,0 +1 @@
+../../../../../modules/network/spec/fixtures/hieradata/common.yaml
\ No newline at end of file
diff --git a/modules/role/spec/fixtures/hieradata/realm_labs.yaml 
b/modules/role/spec/fixtures/hieradata/realm_labs.yaml
new file mode 100644
index 0000000..f4c6750
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/realm_labs.yaml
@@ -0,0 +1,2 @@
+saltmaster: "salt_master.wmflabs.example.org"
+labs_global_puppet_master: "puppetmaster.wmflabs.example.org"
diff --git 
a/modules/role/spec/fixtures/hieradata/role/analytics_cluster/hadoop/worker.yaml
 
b/modules/role/spec/fixtures/hieradata/role/analytics_cluster/hadoop/worker.yaml
new file mode 100644
index 0000000..d4d7e71
--- /dev/null
+++ 
b/modules/role/spec/fixtures/hieradata/role/analytics_cluster/hadoop/worker.yaml
@@ -0,0 +1,3 @@
+cdh::hadoop::datanode_mounts:
+    - /var/lib/hadoop/data/a
+    - /var/lib/hadoop/data/b
diff --git 
a/modules/role/spec/fixtures/hieradata/role/analytics_cluster/refinery.yaml 
b/modules/role/spec/fixtures/hieradata/role/analytics_cluster/refinery.yaml
new file mode 100644
index 0000000..668a4ed
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/analytics_cluster/refinery.yaml
@@ -0,0 +1,3 @@
+statistics::servers:
+    - stats_01
+    - stats_02
diff --git a/modules/role/spec/fixtures/hieradata/role/backup.yaml 
b/modules/role/spec/fixtures/hieradata/role/backup.yaml
new file mode 100644
index 0000000..336d17c
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/backup.yaml
@@ -0,0 +1,3 @@
+role::backup::config::days: ['Sat', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri']
+role::backup::config::days: 7
+
diff --git a/modules/role/spec/fixtures/hieradata/role/cache.yaml 
b/modules/role/spec/fixtures/hieradata/role/cache.yaml
new file mode 100644
index 0000000..ed9c4c3
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/cache.yaml
@@ -0,0 +1,10 @@
+cache::misc::nodes:
+    eqiad: ['cache_misc_00']
+    codfw: ['cache_misc_00']
+
+cache::route_table:
+    eqiad: direct
+
+role::cache::2layer::storage_parts:
+  - sda1
+  - sdb1
diff --git a/modules/role/spec/fixtures/hieradata/role/cache/2layer.yaml 
b/modules/role/spec/fixtures/hieradata/role/cache/2layer.yaml
new file mode 100644
index 0000000..680c6dd
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/cache/2layer.yaml
@@ -0,0 +1 @@
+cache::cluster: 'fake_2layer_cache_cluster'
diff --git a/modules/role/spec/fixtures/hieradata/role/cache/base.yaml 
b/modules/role/spec/fixtures/hieradata/role/cache/base.yaml
new file mode 100644
index 0000000..712eef5
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/cache/base.yaml
@@ -0,0 +1 @@
+cache::cluster: 'fake_base_cache_cluster'
diff --git a/modules/role/spec/fixtures/hieradata/role/cache/kafka.yaml 
b/modules/role/spec/fixtures/hieradata/role/cache/kafka.yaml
new file mode 100644
index 0000000..7dda36c
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/cache/kafka.yaml
@@ -0,0 +1 @@
+role::cache::kafka::webrequest::topic: ''
diff --git a/modules/role/spec/fixtures/hieradata/role/cache/maps.yaml 
b/modules/role/spec/fixtures/hieradata/role/cache/maps.yaml
new file mode 100644
index 0000000..3794b91
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/cache/maps.yaml
@@ -0,0 +1,10 @@
+cache::cluster: maps
+cache::maps::apps:
+    kartotherian:
+        route: eqiad
+        backends:
+            eqiad: [127.0.0.1]
+            codfw: [127.0.0.1]
+cache::maps::nodes:
+    eqiad: [127.0.0.1]
+    codfw: [127.0.0.1]
diff --git a/modules/role/spec/fixtures/hieradata/role/cache/misc.yaml 
b/modules/role/spec/fixtures/hieradata/role/cache/misc.yaml
new file mode 100644
index 0000000..76983ff
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/cache/misc.yaml
@@ -0,0 +1 @@
+cache::cluster: misc
diff --git a/modules/role/spec/fixtures/hieradata/role/cache/text.yaml 
b/modules/role/spec/fixtures/hieradata/role/cache/text.yaml
new file mode 100644
index 0000000..5f397a6
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/cache/text.yaml
@@ -0,0 +1,18 @@
+cache::cluster: text
+cache::text::apps:
+    api: &appdef
+        route: eqiad
+        backends:
+            eqiad: [127.0.0.1]
+            codfw: [127.0.0.1]
+    appservers: *appdef
+    appservers_debug: *appdef
+    rendering: *appdef
+    security_audit: *appdef
+    # Services
+    restbase: *appdef
+    cxserver: *appdef
+    citoid: *appdef
+cache::text::nodes:
+    eqiad: [127.0.0.1]
+    codfw: [127.0.0.1]
diff --git a/modules/role/spec/fixtures/hieradata/role/cache/upload.yaml 
b/modules/role/spec/fixtures/hieradata/role/cache/upload.yaml
new file mode 100644
index 0000000..82cb567
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/cache/upload.yaml
@@ -0,0 +1,13 @@
+cache::cluster: upload
+cache::upload::apps:
+    swift:
+        route: eqiad
+        backends:
+            eqiad: 127.0.0.1
+    swift_thumbs:
+        route: eqiad
+        backends:
+            eqiad: 127.0.0.1
+cache::upload::nodes:
+    codfw: [127.0.0.1]
+    eqiad: [127.0.0.1]
diff --git a/modules/role/spec/fixtures/hieradata/role/ceilometer.yaml 
b/modules/role/spec/fixtures/hieradata/role/ceilometer.yaml
new file mode 100644
index 0000000..65841a8
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/ceilometer.yaml
@@ -0,0 +1,5 @@
+labs_keystone_host: "keystone_host"
+labs_nova_controller: "nova_controller"
+labs_nova_api_host: "nova_api_host"
+labs_nova_network_host: "nova_network_host"
+status_wiki_host_master: "status_wiki_host_master"
diff --git a/modules/role/spec/fixtures/hieradata/role/dataset.yaml 
b/modules/role/spec/fixtures/hieradata/role/dataset.yaml
new file mode 100644
index 0000000..299c824
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/dataset.yaml
@@ -0,0 +1,2 @@
+dataset_clients_snapshots: ['snapshot_01']
+dataset_clients_other: ['snapshot_02']
diff --git a/modules/role/spec/fixtures/hieradata/role/deployment.yaml 
b/modules/role/spec/fixtures/hieradata/role/deployment.yaml
new file mode 100644
index 0000000..a702ad1
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/deployment.yaml
@@ -0,0 +1,12 @@
+mediawiki_memcached_servers: ['memcached_01']
+mediawiki::redis_servers::eqiad:
+    shard01:
+        host: 127.0.0.1
+        port: 6379
+    shard02:
+        host: 127.0.0.1
+        port: 6380
+role::deployment::repo_config:
+    test/gerrit:
+        upstream: https://gerrit.example.org/r/test/gerrit.git
+        checkout_submodules: true
diff --git a/modules/role/spec/fixtures/hieradata/role/elasticsearch.yaml 
b/modules/role/spec/fixtures/hieradata/role/elasticsearch.yaml
new file mode 100644
index 0000000..c5e3152
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/elasticsearch.yaml
@@ -0,0 +1,4 @@
+elasticsearch::cluster_hosts: []
+elasticsearch::cluster_name: 'rspec_unit_cluster'
+
+elasticsearch::rack: z0
diff --git a/modules/role/spec/fixtures/hieradata/role/ganglia.yaml 
b/modules/role/spec/fixtures/hieradata/role/ganglia.yaml
new file mode 100644
index 0000000..b1223cf
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/ganglia.yaml
@@ -0,0 +1,12 @@
+ganglia_aggregators: ganglia_aggregator:9649
+ganglia_clusters:
+    decommissioned:
+        name: 'Decommissioned servers'
+        id: 1
+        sites: {}
+    cluster_D:
+        name: 'Cluster D'
+        id: 2
+        sites:
+            eqiad: {}
+            codfw: {}
diff --git a/modules/role/spec/fixtures/hieradata/role/gerrit/server.yaml 
b/modules/role/spec/fixtures/hieradata/role/gerrit/server.yaml
new file mode 100644
index 0000000..683a199
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/gerrit/server.yaml
@@ -0,0 +1,2 @@
+role::gerrit::server::ipv4: '127.0.0.1'
+gerrit::host: 'gerrit.example.org'
diff --git a/modules/role/spec/fixtures/hieradata/role/grafana/base.yaml 
b/modules/role/spec/fixtures/hieradata/role/grafana/base.yaml
new file mode 100644
index 0000000..b39ce8b
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/grafana/base.yaml
@@ -0,0 +1,6 @@
+role::grafana::base::readonly_domain: 'grafana.example.org'
+role::grafana::base::admin_domain: 'grafana-admin.example.org'
+role::grafana::base::secret_key: 'grafanaSecret'
+role::grafana::base::admin_password: 'grafanaAdminPassword'
+role::grafana::base::ldap_editor_description: 'Grafana ldap editor description'
+role::grafana::base::ldap_editor_groups: []
diff --git 
a/modules/role/spec/fixtures/hieradata/role/kafka/analytics/burrow.yaml 
b/modules/role/spec/fixtures/hieradata/role/kafka/analytics/burrow.yaml
new file mode 100644
index 0000000..62f87e1
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/kafka/analytics/burrow.yaml
@@ -0,0 +1,3 @@
+burrow::consumer_groups:
+    - eventlogging_00
+    - eventlogging_01
diff --git a/modules/role/spec/fixtures/hieradata/role/labs.yaml 
b/modules/role/spec/fixtures/hieradata/role/labs.yaml
new file mode 100644
index 0000000..2055694
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/labs.yaml
@@ -0,0 +1,22 @@
+active_labstore_host: 'labstore_01'
+
+labs_certmanager_hostname: "labscertmanager.example.org"
+#labs_global_puppet_master: "puppetmaster.wmflabs.example.org"
+labs_nova_controller: "nova_controller"
+#labs_tld: "wmflabs.example.org"
+labs_private_ips_reverse_dns: "0.10.in-addr.arpa"
+labs_horizon_host: 'horizon.example.org'
+labs_puppet_master: 'labspuppetmaster.example.org'
+
+novaconfig:
+    fixed_range: 10.0.42.0/24
+
+role::labs::redirector::default_url: 'http://example.org'
+role::labs::redirector::redirects: []
+
+role::labs::novaproxy::active_proxy:
+    - novaproxy_01
+role::labs::novaproxy::all_proxies:
+    - novaproxy_01
+
+#saltmaster: puppetmaster_labs
diff --git a/modules/role/spec/fixtures/hieradata/role/labs/dnsrecursor.yaml 
b/modules/role/spec/fixtures/hieradata/role/labs/dnsrecursor.yaml
new file mode 100644
index 0000000..240e7f1
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/labs/dnsrecursor.yaml
@@ -0,0 +1,2 @@
+dnsrecursor::labsaliaser::extra_records:
+    extra1.example.org.: 127.0.0.1
diff --git a/modules/role/spec/fixtures/hieradata/role/labs/nfs.yaml 
b/modules/role/spec/fixtures/hieradata/role/labs/nfs.yaml
new file mode 100644
index 0000000..be098ab
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/labs/nfs.yaml
@@ -0,0 +1,4 @@
+role::labs::nfs::misc::dump_servers_ips:
+    - 127.0.0.1
+statistics_servers:
+    - stats_01
diff --git a/modules/role/spec/fixtures/hieradata/role/labs/ores.yaml 
b/modules/role/spec/fixtures/hieradata/role/labs/ores.yaml
new file mode 100644
index 0000000..93a66c6
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/labs/ores.yaml
@@ -0,0 +1,4 @@
+scap::deployment_server: 'ores_deploy_server'
+
+role::labs::ores::lb::realservers: ['ores_real_1']
+role::labs::ores::redisproxy::server: 'redis_proxy'
diff --git a/modules/role/spec/fixtures/hieradata/role/labs/tools.yaml 
b/modules/role/spec/fixtures/hieradata/role/labs/tools.yaml
new file mode 100644
index 0000000..746907a
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/labs/tools.yaml
@@ -0,0 +1,15 @@
+active_proxy_host: 'active_proxy_host'
+active_redis: 'active_redis_host'
+
+gridengine::gridmaster: 'labs_gridmaster_host'
+
+# role::labs::tools::proxy at least
+k8s_master: 'k8s_master_for_tools'
+flannel::etcd_hosts: []
+k8s_infrastructure_users:
+    - name: 'proxy-infrastructure'
+      token: 'fake_token'
+    - name: 'client-infrastructure'
+      token: 'fake_token'
+
+active_cronrunner: 'tools_cron_host'
diff --git 
a/modules/role/spec/fixtures/hieradata/role/labs/tools/mailrelay.yaml 
b/modules/role/spec/fixtures/hieradata/role/labs/tools/mailrelay.yaml
new file mode 100644
index 0000000..0ccb0de
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/labs/tools/mailrelay.yaml
@@ -0,0 +1,2 @@
+toollabs::is_mail_relay: true
+toollabs::external_hostname: 'external_hostname'
diff --git a/modules/role/spec/fixtures/hieradata/role/lists.yaml 
b/modules/role/spec/fixtures/hieradata/role/lists.yaml
new file mode 100644
index 0000000..51ea448
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/lists.yaml
@@ -0,0 +1,3 @@
+mailman::lists_ip: [127.0.0.1]
+mailman::server_ip: [127.0.0.1]
+mailman::lists_servername: lists.example.org
diff --git a/modules/role/spec/fixtures/hieradata/role/maps.yaml 
b/modules/role/spec/fixtures/hieradata/role/maps.yaml
new file mode 100644
index 0000000..3a3c094
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/maps.yaml
@@ -0,0 +1,7 @@
+maps::cassandra_kartotherian_pass : ''
+maps::cassandra_tilerator_pass: ''
+maps::cassandra_tileratorui_pass: ''
+
+maps::postgresql_kartotherian_pass: ''
+maps::postgresql_tilerator_pass: ''
+maps::postgresql_tileratorui_pass: ''
diff --git a/modules/role/spec/fixtures/hieradata/role/maps/master.yaml 
b/modules/role/spec/fixtures/hieradata/role/maps/master.yaml
new file mode 100644
index 0000000..27fb73a
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/maps/master.yaml
@@ -0,0 +1,4 @@
+maps::hosts: ['map01', 'map02']
+
+maps::postgresql_osmimporter_pass: ''
+maps::postgresql_osmupdater_pass: ''
diff --git a/modules/role/spec/fixtures/hieradata/role/maps/server.yaml 
b/modules/role/spec/fixtures/hieradata/role/maps/server.yaml
new file mode 100644
index 0000000..f77315c
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/maps/server.yaml
@@ -0,0 +1,2 @@
+cassandra::seeds: [ 127.0.0.1 ]
+maps::redis_server: 'maps_redis_01'
diff --git a/modules/role/spec/fixtures/hieradata/role/maps/slave.yaml 
b/modules/role/spec/fixtures/hieradata/role/maps/slave.yaml
new file mode 100644
index 0000000..eecd5f9
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/maps/slave.yaml
@@ -0,0 +1,2 @@
+postgresql::slave::master_server: 'maps_master_server'
+postgresql::slave::replication_pass: ''
diff --git a/modules/role/spec/fixtures/hieradata/role/mediawiki.yaml 
b/modules/role/spec/fixtures/hieradata/role/mediawiki.yaml
new file mode 100644
index 0000000..f8f6201
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/mediawiki.yaml
@@ -0,0 +1,12 @@
+mediawiki_memcached_servers: ['memcached_01']
+mediawiki::redis_servers::eqiad:
+    shard01:
+        host: 127.0.0.1
+        port: 6379
+    shard02:
+        host: 127.0.0.1
+        port: 6380
+
+# Roles parameters
+role::mediawiki::appserver::root_password: ''
+role::mediawiki::webserver::pool: apaches
diff --git a/modules/role/spec/fixtures/hieradata/role/mediawiki/jobrunner.yaml 
b/modules/role/spec/fixtures/hieradata/role/mediawiki/jobrunner.yaml
new file mode 100644
index 0000000..343c978
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/mediawiki/jobrunner.yaml
@@ -0,0 +1,3 @@
+mediawiki::jobrunner::queue_servers:
+    - job_redisdb_01:6379
+    - job_redisdb_02:6380
diff --git 
a/modules/role/spec/fixtures/hieradata/role/mediawiki/videoscaler.yaml 
b/modules/role/spec/fixtures/hieradata/role/mediawiki/videoscaler.yaml
new file mode 100644
index 0000000..343c978
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/mediawiki/videoscaler.yaml
@@ -0,0 +1,3 @@
+mediawiki::jobrunner::queue_servers:
+    - job_redisdb_01:6379
+    - job_redisdb_02:6380
diff --git a/modules/role/spec/fixtures/hieradata/role/openldap/labs.yaml 
b/modules/role/spec/fixtures/hieradata/role/openldap/labs.yaml
new file mode 100644
index 0000000..186bce0
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/openldap/labs.yaml
@@ -0,0 +1,4 @@
+openldap::server_id: ''
+openldap::suffix: ''
+openldap::datadir: ''
+
diff --git a/modules/role/spec/fixtures/hieradata/role/ores/redis.yaml 
b/modules/role/spec/fixtures/hieradata/role/ores/redis.yaml
new file mode 100644
index 0000000..21e168d
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/ores/redis.yaml
@@ -0,0 +1,4 @@
+ores::redis::password: ''
+ores::redis::queue_maxmemory: ''
+ores::redis::cache_maxmemory: ''
+ores::redis::client_hosts: []
diff --git a/modules/role/spec/fixtures/hieradata/role/osm/master.yaml 
b/modules/role/spec/fixtures/hieradata/role/osm/master.yaml
new file mode 100644
index 0000000..0129703
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/osm/master.yaml
@@ -0,0 +1 @@
+osm::postgresql_osmupdater_pass: ''
diff --git a/modules/role/spec/fixtures/hieradata/role/otrs/webserver.yaml 
b/modules/role/spec/fixtures/hieradata/role/otrs/webserver.yaml
new file mode 100644
index 0000000..9e6d108
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/otrs/webserver.yaml
@@ -0,0 +1,4 @@
+otrs::otrs_database_host: 'otrsdbhost'
+otrs::otrs_database_name: 'otrsdbname'
+cache::misc::nodes:
+    eqiad: ['cache_misc_00']
diff --git a/modules/role/spec/fixtures/hieradata/role/phabricator/labs.yaml 
b/modules/role/spec/fixtures/hieradata/role/phabricator/labs.yaml
new file mode 100644
index 0000000..69ca3c3
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/phabricator/labs.yaml
@@ -0,0 +1,2 @@
+phabricator_active_server: ''
+scap::deployment_server: 'phabricator_labs_deploy_server'
diff --git a/modules/role/spec/fixtures/hieradata/role/phabricator/main.yaml 
b/modules/role/spec/fixtures/hieradata/role/phabricator/main.yaml
new file mode 100644
index 0000000..69a7821
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/phabricator/main.yaml
@@ -0,0 +1,6 @@
+phabricator_active_server: 'phabricator_01'
+phabricator_servers:
+    - phabricator_01
+    - phabricator_02
+cache::misc::nodes:
+    eqiad: ['cache_misc_00']
diff --git a/modules/role/spec/fixtures/hieradata/role/programdashboard.yaml 
b/modules/role/spec/fixtures/hieradata/role/programdashboard.yaml
new file mode 100644
index 0000000..cb21b49
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/programdashboard.yaml
@@ -0,0 +1,8 @@
+programdashboard::server_name: 'program-dashboard.example.org'
+programdashboard::server_admin: 'educat...@example.org'
+
+programdashboard::app::directory: /srv/programdashboard
+programdashboard::app::environment: production
+programdashboard::app::owner: programdashboard
+programdashboard::app::group: programdashboard
+programdashboard::app::dependencies: []
diff --git 
a/modules/role/spec/fixtures/hieradata/role/prometheus/mysqld_exporter.yaml 
b/modules/role/spec/fixtures/hieradata/role/prometheus/mysqld_exporter.yaml
new file mode 100644
index 0000000..c539068
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/prometheus/mysqld_exporter.yaml
@@ -0,0 +1 @@
+prometheus_nodes: []
diff --git 
a/modules/role/spec/fixtures/hieradata/role/prometheus/node_exporter.yaml 
b/modules/role/spec/fixtures/hieradata/role/prometheus/node_exporter.yaml
new file mode 100644
index 0000000..c539068
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/prometheus/node_exporter.yaml
@@ -0,0 +1 @@
+prometheus_nodes: []
diff --git a/modules/role/spec/fixtures/hieradata/role/prometheus/tools.yaml 
b/modules/role/spec/fixtures/hieradata/role/prometheus/tools.yaml
new file mode 100644
index 0000000..19a572a
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/prometheus/tools.yaml
@@ -0,0 +1,4 @@
+k8s::master_host: 'prometheus_k8s_master_host'
+k8s_infrastructure_users:
+  - name: 'prometheus'
+    token: 'fake_token_for_prometheus'
diff --git a/modules/role/spec/fixtures/hieradata/role/puppetmaster.yaml 
b/modules/role/spec/fixtures/hieradata/role/puppetmaster.yaml
new file mode 100644
index 0000000..3713361
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/puppetmaster.yaml
@@ -0,0 +1,5 @@
+base_config: ''
+puppetmaster::servers:
+    puppetmaster.example.org:
+        - { worker: puppetworker1.example.org, loadfactor: 5}
+        - { worker: puppetworker2.example.org, loadfactor: 5, offline: true}
diff --git a/modules/role/spec/fixtures/hieradata/role/puppetmaster/common.yaml 
b/modules/role/spec/fixtures/hieradata/role/puppetmaster/common.yaml
new file mode 100644
index 0000000..67ee357
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/puppetmaster/common.yaml
@@ -0,0 +1 @@
+role::puppetmaster::common::base_config: {}
diff --git 
a/modules/role/spec/fixtures/hieradata/role/puppetmaster/puppetdb.yaml 
b/modules/role/spec/fixtures/hieradata/role/puppetmaster/puppetdb.yaml
new file mode 100644
index 0000000..ccc542b
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/puppetmaster/puppetdb.yaml
@@ -0,0 +1,4 @@
+puppetmaster::puppetdb::master: 'puppetdb_master'
+puppetmaster::puppetdb::slaves: ['puppetdb_slave_01']
+puppetdb::password::replication: ''
+puppetdb::password::rw: ''
diff --git a/modules/role/spec/fixtures/hieradata/role/salt/masters/labs.yaml 
b/modules/role/spec/fixtures/hieradata/role/salt/masters/labs.yaml
new file mode 100644
index 0000000..21bc0f3
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/salt/masters/labs.yaml
@@ -0,0 +1,6 @@
+labs_keystone_host: 'keystone_host'
+labs_nova_api_host: 'nova_api_host'
+labs_nova_controller: 'nova_controller'
+labs_nova_network_host: 'nova_network_host'
+labs_puppet_master: 'puppet_master'
+status_wiki_host_master: 'wiki_host_master'
diff --git a/modules/role/spec/fixtures/hieradata/role/snapshot.yaml 
b/modules/role/spec/fixtures/hieradata/role/snapshot.yaml
new file mode 100644
index 0000000..39873eb
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/snapshot.yaml
@@ -0,0 +1,8 @@
+mediawiki_memcached_servers: ['memcached_01']
+mediawiki::redis_servers::eqiad:
+    shard01:
+        host: 127.0.0.1
+        port: 6379
+    shard02:
+        host: 127.0.0.1
+        port: 6380
diff --git a/modules/role/spec/fixtures/hieradata/role/striker/web.yaml 
b/modules/role/spec/fixtures/hieradata/role/striker/web.yaml
new file mode 100644
index 0000000..4a6bb00
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/striker/web.yaml
@@ -0,0 +1,5 @@
+striker::apache::server_name: 'striker.example.org'
+striker::apache::docroot: ''
+striker::apache::servers: []
+striker::uwsgi::port: 1234
+striker::uwsgi::config: ''
diff --git a/modules/role/spec/fixtures/hieradata/role/swift/proxy.yaml 
b/modules/role/spec/fixtures/hieradata/role/swift/proxy.yaml
new file mode 100644
index 0000000..66e0357
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/swift/proxy.yaml
@@ -0,0 +1,10 @@
+swift::hash_path_suffix: ''
+swift::proxy::proxy_service_host: ''
+swift::proxy::rewrite_thumb_server: ''
+swift::proxy::shard_container_list: []
+swift::proxy::rewrite_account: 'rewrite_account'
+swift::params::accounts:
+    rewrite_account:  # username
+        user: 'rewriter' 
+        account_name: ''
+swift::proxyhosts: []
diff --git a/modules/role/spec/fixtures/hieradata/role/swift/storage.yaml 
b/modules/role/spec/fixtures/hieradata/role/swift/storage.yaml
new file mode 100644
index 0000000..52dd582
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/swift/storage.yaml
@@ -0,0 +1,5 @@
+swift::hash_path_suffix: ''
+swift_storage_drives: []
+swift::storagehosts: []
+swift::proxyhosts: []
+swift_aux_partitions: []
diff --git a/modules/role/spec/fixtures/hieradata/role/thumbor.yaml 
b/modules/role/spec/fixtures/hieradata/role/thumbor.yaml
new file mode 100644
index 0000000..43febf3
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/thumbor.yaml
@@ -0,0 +1,3 @@
+swift::proxy::shard_container_list:
+    - global-math-render
+    - wikipedia-public
diff --git a/modules/role/spec/fixtures/hieradata/role/toollabs.yaml 
b/modules/role/spec/fixtures/hieradata/role/toollabs.yaml
new file mode 100644
index 0000000..21ca7ad
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/toollabs.yaml
@@ -0,0 +1,7 @@
+toollabs::checker_hosts:
+    - tools_checker_01
+    - tools_checker_02
+
+toollabs::proxy::proxies:
+    - tools_proxy_01
+    - tools_proxy_02
diff --git a/modules/role/spec/fixtures/hieradata/role/toollabs/clush.yaml 
b/modules/role/spec/fixtures/hieradata/role/toollabs/clush.yaml
new file mode 100644
index 0000000..f5ba5f4
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/toollabs/clush.yaml
@@ -0,0 +1 @@
+role::toollabs::clush::target::master: 'toolabs_clush_master'
diff --git 
a/modules/role/spec/fixtures/hieradata/role/toollabs/docker/builder.yaml 
b/modules/role/spec/fixtures/hieradata/role/toollabs/docker/builder.yaml
new file mode 100644
index 0000000..3b60962
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/toollabs/docker/builder.yaml
@@ -0,0 +1,3 @@
+docker::registry: 'docker_registry'
+docker::username: 'docker_username'
+docker::password: 'docker_password'
diff --git 
a/modules/role/spec/fixtures/hieradata/role/toollabs/docker/registry.yaml 
b/modules/role/spec/fixtures/hieradata/role/toollabs/docker/registry.yaml
new file mode 100644
index 0000000..8b8a30e
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/toollabs/docker/registry.yaml
@@ -0,0 +1,4 @@
+docker::builder_host: 'docker_builder_host'
+docker::username: 'docker_username'
+docker::password: 'docker_password'
+docker::password_hash: 'docker_password_hash'
diff --git 
a/modules/role/spec/fixtures/hieradata/role/toollabs/elasticsearch.yaml 
b/modules/role/spec/fixtures/hieradata/role/toollabs/elasticsearch.yaml
new file mode 100644
index 0000000..15c2ff5
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/toollabs/elasticsearch.yaml
@@ -0,0 +1,3 @@
+elasticsearch::cluster_name: 'toollabs_elasticsearch_cluster'
+elasticsearch::unicast_hosts:
+    - tools_es_01
diff --git a/modules/role/spec/fixtures/hieradata/role/toollabs/etcd.yaml 
b/modules/role/spec/fixtures/hieradata/role/toollabs/etcd.yaml
new file mode 100644
index 0000000..8f7e503
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/toollabs/etcd.yaml
@@ -0,0 +1,16 @@
+flannel::etcd_hosts:
+    - tools_flannel_etcd_01
+    - tools_flannel_etcd_02
+
+k8s::bastion_hosts:
+    - tools_bastion_01
+    - tools_bastion_02
+k8s::etcd_hosts:
+    - tools_k8s_etcd_01
+    - tools_k8s_etcd_02
+k8s::master_hosts:
+    - tools_k8s_master_01
+    - tools_k8s_master_02
+k8s::worker_hosts:
+    - tools_worker_01
+    - tools_worker_02
diff --git 
a/modules/role/spec/fixtures/hieradata/role/toollabs/k8s/bastion.yaml 
b/modules/role/spec/fixtures/hieradata/role/toollabs/k8s/bastion.yaml
new file mode 100644
index 0000000..effbe74
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/toollabs/k8s/bastion.yaml
@@ -0,0 +1,4 @@
+k8s::master_host: 'master'
+k8s_infrastructure_users:
+    - name: 'client-infrastructure'
+      token: 'fake_token_for-client-infrastructure'
diff --git a/modules/role/spec/fixtures/hieradata/role/toollabs/k8s/master.yaml 
b/modules/role/spec/fixtures/hieradata/role/toollabs/k8s/master.yaml
new file mode 100644
index 0000000..8fc3532
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/toollabs/k8s/master.yaml
@@ -0,0 +1,3 @@
+k8s::etcd_hosts: []
+docker::registry: ''
+k8s_infrastructure_users: []
diff --git 
a/modules/role/spec/fixtures/hieradata/role/toollabs/k8s/webproxy.yaml 
b/modules/role/spec/fixtures/hieradata/role/toollabs/k8s/webproxy.yaml
new file mode 100644
index 0000000..7b300a4
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/toollabs/k8s/webproxy.yaml
@@ -0,0 +1,8 @@
+k8s_master: 'master_for_toollabs_webproxy'
+k8s_infrastructure_users:
+    - name: 'client-infrastructure'
+      token: 'fake_token_for-client-infrastructure'
+    - name: 'proxy-infrastructure'
+      token: 'fake_token_for-proxy-infrastructure'
+flannel::etcd_hosts: []
+active_proxy_host: ''
diff --git a/modules/role/spec/fixtures/hieradata/role/toollabs/k8s/worker.yaml 
b/modules/role/spec/fixtures/hieradata/role/toollabs/k8s/worker.yaml
new file mode 100644
index 0000000..b8f9398
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/toollabs/k8s/worker.yaml
@@ -0,0 +1,6 @@
+docker::builder_host: 'docker_builder_host'
+k8s::version: ''
+k8s::master_host: 'k8s_master_for_toolslabs_worker'
+k8s_infrastructure_users:
+    - name: 'client-infrastructure'
+      token: 'fake_token_for_client-infrastructure'
diff --git 
a/modules/role/spec/fixtures/hieradata/role/toollabs/logging/sender.yaml 
b/modules/role/spec/fixtures/hieradata/role/toollabs/logging/sender.yaml
new file mode 100644
index 0000000..84f64e8
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/toollabs/logging/sender.yaml
@@ -0,0 +1 @@
+role::toollabs::logging::sender::centralserver_ips: []
diff --git a/modules/role/spec/fixtures/hieradata/role/yubiauth/server.yaml 
b/modules/role/spec/fixtures/hieradata/role/yubiauth/server.yaml
new file mode 100644
index 0000000..e97e402
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/yubiauth/server.yaml
@@ -0,0 +1,2 @@
+yubiauth_servers: ['yubi1', 'yubi2']
+yubiauth_server_primary: 'yubi1'
diff --git a/modules/role/spec/fixtures/hieradata/role/zuul.yaml 
b/modules/role/spec/fixtures/hieradata/role/zuul.yaml
new file mode 100644
index 0000000..ea205b2
--- /dev/null
+++ b/modules/role/spec/fixtures/hieradata/role/zuul.yaml
@@ -0,0 +1,23 @@
+zuul::common:
+    gerrit_server: gerrit.wikimedia.org
+    gerrit_user: jenkins-bot
+    url_pattern: 
'https://integration.wikimedia.org/ci/job/{job.name}/{build.number}/console'
+    status_url: 'https://integration.wikimedia.org/zuul/'
+
+zuul::server:
+    # ferm defaults to ACCEPT on loopback:
+    gearman_server: 127.0.0.1
+    config_git_branch: master
+    gearman_server_start: true
+    jenkins_server: http://127.0.0.1:8080/ci
+    jenkins_user: zuul-bot
+    # FIXME use lookup?
+    statsd_host: statsd.eqiad.wmnet
+
+zuul::merger:
+    gearman_server: '208.80.154.135'  # gallium.wikimedia.org
+    gerrit_ssh_key_file: 'ssh/ci/jenkins-bot_gerrit_id_rsa'
+    git_dir: '/srv/ssd/zuul/git'
+    git_email: "zuul-merger@%{::hostname}"
+    git_name: 'Wikimedia Zuul Merger'
+    zuul_url: "git://%{::fqdn}"
diff --git a/modules/role/spec/fixtures/manifests/site.pp 
b/modules/role/spec/fixtures/manifests/site.pp
new file mode 100644
index 0000000..ba62e88
--- /dev/null
+++ b/modules/role/spec/fixtures/manifests/site.pp
@@ -0,0 +1,36 @@
+## Lot of manifests do not explicitly require ::base and we mock it anyway
+require_package('git')
+#require_package('openssh-server')
+
+if $::realm == 'production' {
+    include standard
+
+    # From base monitoring. Required by role::cache::*
+    file { '/usr/lib/nagios/plugins/check-fresh-files-in-dir.py': }
+    file { '/etc/puppet/puppet.conf': }
+} else {
+    include role::labs::instance
+    mount { '/data/project': }
+}
+
+# Usually comes from base but it is not included on labs
+# Exec[apt-get update]
+include apt
+
+# Workaround for puppet on Mac OS X raising:
+#
+# NoMethodError: undefined method `groups' for nil:NilClass
+# https://tickets.puppetlabs.com/browse/PUP-1547
+User {
+    provider => 'useradd',
+}
+
+# FIXME
+class role::statsite {
+}
+
+class privateexim::aliases::private {
+}
+class privateexim::listserve {
+    $mailing_lists = []
+}
diff --git a/modules/role/spec/fixtures/modules/grub/manifests/bootparam.pp 
b/modules/role/spec/fixtures/modules/grub/manifests/bootparam.pp
new file mode 100644
index 0000000..ec176a8
--- /dev/null
+++ b/modules/role/spec/fixtures/modules/grub/manifests/bootparam.pp
@@ -0,0 +1,11 @@
+# rspec would fail with:
+# error during compilation: not supported on systems running an old augeas
+#
+# Would be resolved by bumping augeas in Gemfile
+define grub::bootparam(
+  $ensure=present,
+  $key=$title,
+  $value=undef,
+  $glob=true,
+) {
+}
diff --git a/modules/role/spec/fixtures/modules/grub/manifests/defaults.pp 
b/modules/role/spec/fixtures/modules/grub/manifests/defaults.pp
new file mode 100644
index 0000000..a5430c9
--- /dev/null
+++ b/modules/role/spec/fixtures/modules/grub/manifests/defaults.pp
@@ -0,0 +1,2 @@
+class grub::defaults {
+}
diff --git a/modules/role/spec/fixtures/modules/passwords/manifests/init.pp 
b/modules/role/spec/fixtures/modules/passwords/manifests/init.pp
new file mode 100644
index 0000000..410ed1d
--- /dev/null
+++ b/modules/role/spec/fixtures/modules/passwords/manifests/init.pp
@@ -0,0 +1,39 @@
+class passwords::bacula {}
+class passwords::etherpad_lite {}
+class passwords::exim {}
+class passwords::geoip {}
+class passwords::gerrit {}
+class passwords::grafana::labs {}
+class passwords::grafana::production {}
+class passwords::graphite {}
+class passwords::ldap::production {}
+class passwords::ldap::wmf_cluster {}
+class passwords::misc::contint::jenkins {}
+class passwords::misc::private_static_site {}
+class passwords::misc::rt {}
+class passwords::misc::scripts {}
+class passwords::mysql::etherpad_lite {}
+class passwords::mysql::iegreview {}
+class passwords::mysql::labsdb {}
+class passwords::mysql::otrs{}
+class passwords::mysql::phabricator {}
+class passwords::mysql::research {}
+class passwords::nodepool {}
+class passwords::openldap::corp {}
+class passwords::openldap::labs {}
+class passwords::openldap::labtest {}
+class passwords::osm {}
+class passwords::phabricator {}
+class passwords::postgres {}
+class passwords::prometheus {}
+class passwords::puppet::database {}
+class passwords::racktables {}
+class passwords::rancid {}
+class passwords::redis {}
+class passwords::root {}
+class passwords::servermon {}
+class passwords::statistics::user {}
+class passwords::tendril {}
+class passwords::testreduce::mysql {}
+class passwords::tor {}
+class passwords::yubiauth {}
diff --git a/modules/role/spec/fixtures/modules/standard/manifests/init.pp 
b/modules/role/spec/fixtures/modules/standard/manifests/init.pp
new file mode 100644
index 0000000..a3fb215
--- /dev/null
+++ b/modules/role/spec/fixtures/modules/standard/manifests/init.pp
@@ -0,0 +1,3 @@
+class standard {
+    service { 'ganglia-monitor':}
+}
diff --git a/modules/role/spec/integration/smoke_compile_roles_spec.rb 
b/modules/role/spec/integration/smoke_compile_roles_spec.rb
new file mode 100644
index 0000000..ffb7f65
--- /dev/null
+++ b/modules/role/spec/integration/smoke_compile_roles_spec.rb
@@ -0,0 +1,215 @@
+require 'spec_helper'
+require 'pathname'
+
+manifests_dir = Pathname.new(File.expand_path(
+        File.dirname(__FILE__) + '/../../manifests'))
+
+# Classes to be used on labs instances
+# We default to 'production' realm
+labs_roles = [
+    'role::ci::castor::server',
+    'role::ci::jenkins_access',
+    'role::ci::slave::browsertests',
+    'role::ci::slave::labs',
+    'role::ci::slave::localbrowser',
+    'role::labs::puppetmaster',
+    'role::phragile::labs',
+    'role::phabricator::labs',
+    'role::toollabs::clush::master',
+]
+labs_roles_start_with = [
+    'role::beta',
+    'role::labs::instance',
+    'role::labs::ores',
+    'role::labs::tools',
+    'role::toollabs',
+]
+
+bypass_roles = [
+    # Not a class but a define:
+    'role::cache::instances',
+    # pending_deletion
+    # https://gerrit.wikimedia.org/r/#/c/301076/
+    'role::mha::manager',
+    'role::mha::node',
+    # Deprecated
+    'role::deprecated::mediawiki',
+]
+
+pending_reasons = {
+    'role::analytics_cluster::rsyncd' => 'Lacks rsync::server (Exec[compile 
fragments])',
+    'role::analytics_cluster::oozie::server' => 'Nrpe depends on 
cdh::hive::metastore',
+
+    'role::beta::bastion' => 'Miss Git::clone[operations/mediawiki-config',
+
+    'role::ceilometer::compute' => 'Miss ceilometer.conf.erb',
+    'role::ceilometer::controller' => 'Miss ceilometer.conf.erb',
+
+    'role::deployment::mediawiki' => 'Should be Trusty. Lacks systemd on 
Jessie',
+    'role::deployment::salt_masters' => 'Miss File[/srv/salt]',
+    'role::deployment::server' => 'Should be Trusty. Lacks systemd on Jessie',
+
+    'role::labs::mediawiki_vagrant' => 'Ubuntu trusty not supported by test 
suite',
+    'role::labs::vagrant_lxc' => 'Ubuntu trusty not supported by test suite',
+    'role::striker::web' => 'Ubuntu trusty not supported by test suite',
+
+    'role::toollabs::docker::builder' => 'Package[docker-engine] not defined!',
+
+    # Pending /manifests/role/mariadb.pp to move to a role module
+    'role::labs::db::master' => 'role::mariadb::grants not under modules/',
+    'role::labs::db::replica' => 'role::mariadb::grants not under modules/',
+    'role::labs::db::slave' => 'role::mariadb::grants not under modules/',
+    'role::labs::dns' => 'role::mariadb::grants not under modules/',
+
+    # Classes names are suffixed with '::server'
+    'role::labs::openstack::designate' => 'Not in autoloader layout',
+    'role::labs::openstack::keystone' => 'Not in autoloader layout',
+    'role::labs::openstack::glance' => 'Not in autoloader layout',
+    'role::labs::openstack::nova' => 'Not in autoloader layout',
+
+    'role::puppetmaster::backend' => 'Miss Exec[compile puppet.conf]',
+    'role::puppetmaster::frontend' => 'Miss Exec[compile puppet.conf]',
+
+    'role::salt::masters::labs' => 'Class default to "juno" version"',
+    'role::snapshot::deployment' => 'Miss datasets user/groups T113467',
+    'role::swift::stats_reporter' => 'Miss package[python-swiftclient]',
+}
+
+def fixtures_fact(role_name)
+    # mediawiki/appserver/api.yaml
+    hiera_role_dir = role_name.gsub(/::/, '/')
+    # mediawiki/appserver.yaml
+    hiera_parent_dir = Pathname.new(hiera_role_dir).parent.to_s
+    # mediawiki.yaml
+    hiera_gparent_dir = Pathname.new(hiera_role_dir).parent.parent.to_s
+    facts = {
+        # Paths for hiera lookup
+        :wmf_hiera_role_dir => hiera_role_dir,
+        :wmf_hiera_role_parent_dir => hiera_parent_dir,
+        :wmf_hiera_role_gparent_dir => hiera_gparent_dir,
+
+        :initsystem => 'systemd',
+        :interfaces => 'eth0,lo',
+        :ipaddress => '127.0.0.1',
+        :ipv4 => '127.0.0.1',
+
+        # Debian jessie
+        :lsbdistcodename => 'jessie',
+        :lsbdistid => 'Debian',
+        :lsbdistrelease => '8.5',
+        :operatingsystem => 'Debian',
+
+#            # Ubuntu trusty
+#            :lsbdistcodename => 'trusty',
+#            :lsbdistid => 'Ubuntu',
+#            :lsbdistrelease => '14.04',
+#            :operatingsystem => 'Ubuntu',
+#
+        :mail_smarthost => ['smtp1.example.org'],
+        :memorysize_mb => 1024,
+        :memoryfree => '512 MB',
+        :nameservers => ['127.0.0.1'],
+        :processorcount => 1,
+        :realm => 'production',
+        :site => 'eqiad',
+        :uniqueid => '00000000',
+    }
+    return facts
+end
+
+Dir.glob(File.join(manifests_dir, '**/*.pp')).sort.each do |role_file|
+    relative = Pathname.new(role_file).relative_path_from(manifests_dir)
+    role_name = 'role::' + relative.to_s.gsub(/(\/|\.pp$)/, {'/' => '::', 
'\.pp' => ''})
+
+    next if bypass_roles.include?(role_name)
+
+    describe role_name, :type => :class do
+
+        facts = fixtures_fact(role_name)
+
+        before(:each) {
+            if pending_reasons.keys.include?(role_name)
+                pending(pending_reasons[role_name])
+            end
+            # Per doc, accepting |args| is mandatory
+            Puppet::Parser::Functions.newfunction(:secret, :type => :rvalue) { 
|args|
+                return 'stub_secret'
+            }
+            Puppet::Parser::Functions.newfunction(:ipresolve, :type => 
:rvalue) { |args|
+                return '127.0.0.1'
+            }
+            Puppet::Parser::Functions.newfunction(:generate, :type => :rvalue) 
{ |args|
+                return ''
+            }
+            Puppet::Parser::Functions.newfunction(:kafka_config, :type => 
:rvalue) { |args|
+                return {
+                    'name' => 'fake_kafka_cluster',
+                    'brokers' => {
+                        'string' => '',
+                        'array' => [],
+                    },
+                    'zookeeper' => {
+                        'url' => '',
+                        'hosts' => [],
+                    }
+                }
+            }
+        }
+
+        let(:pre_condition) {
+            # This is terrible. Antoine "hashar" Musso
+            conds = []
+            case role_name
+
+            # role::analytics_cluster
+            # Most are apparently not entry points
+            when 
/^role::analytics_cluster::(druid::hadoop|hadoop::(balancer|logstash)|mysql_password|refinery.*)$/
+                conds << 'include role::analytics_cluster::hadoop::client'
+
+            when 'role::analytics_cluster::rsyncd'
+                conds << 'include role::analytics_cluster::client'
+
+            when 'role::bastionhost::twofa', 'role::phabricator::main'
+                conds << 'package { "openssh-server": }'
+
+            # role::cache
+            when /^role::cache::(2layer|base|kafka::webrequest)$/
+                conds << "service { 'varnish-frontend': }"
+            when /^role::cache::kafka::(eventlogging|statsv)$/
+                conds << 'service { "varnish": }'
+            when 'role::cache::kafka'
+                conds << 'include varnishkafka'
+
+            when 'role::dataset::primary'
+                conds << 'user { "root": }'
+
+            end
+
+        }
+
+        if labs_roles.include?(role_name) || 
role_name.start_with?(*labs_roles_start_with)
+            context "When applied on a labs instance" do
+                let(:facts) do
+                    facts.merge({  :realm => 'labs' })
+                end
+                it { is_expected.to compile }
+            end
+        elsif role_name == 'role::lvs::balancer'
+            context 'When hostname is lvs1010' do
+                let(:facts) do
+                    facts.merge({ :hostname => 'lvs1010' })
+                end
+                it { is_expected.to compile }
+            end
+        elsif role_name == 'role::puppetmaster::frontend'
+            context 'When hostname is puppetmaster.example.org'
+            let(:facts) do
+                facts.merge({ :fqdn => 'puppetmaster.example.org' })
+            end
+            it { is_expected.to compile }
+        else
+            let(:facts) { facts }
+            it { is_expected.to compile }
+        end
+    end
+end
diff --git a/modules/role/spec/spec_helper.rb b/modules/role/spec/spec_helper.rb
new file mode 100644
index 0000000..1ddefe4
--- /dev/null
+++ b/modules/role/spec/spec_helper.rb
@@ -0,0 +1,33 @@
+require 'rspec-puppet'
+require 'puppetlabs_spec_helper/module_spec_helper'
+
+fixture_path = File.expand_path(File.join(__FILE__, '..', 'fixtures'))
+root_path = File.expand_path(File.join(__FILE__, '..', '..', '..', '..'))
+
+RSpec.configure do |c|
+  c.module_path = [
+          File.join(fixture_path, 'modules'),
+          File.join(root_path, 'modules'),
+      ].join(':')
+  # Do not add c.manifest_dir which would boot manifests/site.pp
+  c.template_dir = File.join(root_path, 'templates')
+  c.environmentpath = File.join(Dir.pwd, 'spec')
+  c.hiera_config = File.join(fixture_path, 'hiera.yaml')
+
+  # For --next-failure
+  c.example_status_persistence_file_path = File.join(
+      File.dirname(__FILE__), 'examples.txt')
+
+  c.before(:each) do
+    # From Max Lincoln: https://gist.github.com/maxlinc/6382696
+    ENV['PUPPET_LOG'] = 'debug' if ENV['PUPPET_DEBUG']
+    if ENV['PUPPET_LOG']
+        levels = %w(debug info notice warning err alert emerg crit)
+        if !levels.include?(ENV['PUPPET_LOG'])
+            raise "Unknown log level for PUPPET_LOG. Must be one of: #{levels}"
+        end
+        Puppet::Util::Log.level = :"#{ENV['PUPPET_LOG']}"
+        Puppet::Util::Log.newdestination(:console)
+    end
+  end
+end

-- 
To view, visit https://gerrit.wikimedia.org/r/307425
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibcb7fe8d5c86b7ab1e99e0b5633d89bce3b21cfb
Gerrit-PatchSet: 33
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Hashar <has...@free.fr>
Gerrit-Reviewer: Hashar <has...@free.fr>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to