crush map fix

Change-Id: I1c860bbe370b85458326c0dfaaef8eefd6f75abe
diff --git a/README.rst b/README.rst
index 579ac19..9312c48 100644
--- a/README.rst
+++ b/README.rst
@@ -202,14 +202,12 @@
           host: 10.0.0.3
         keyring:
           admin:
-            key: AQBHPYhZv5mYDBAAvisaSzCTQkC5gywGUp/voA==
             caps:
               mds: "allow *"
               mgr: "allow *"
               mon: "allow *"
               osd: "allow *"
           bootstrap-osd:
-            key: BQBHPYhZv5mYDBAAvisaSzCTQkC5gywGUp/voA==
             caps:
               mon: "allow profile bootstrap-osd"
 
@@ -247,11 +245,9 @@
         enabled: true
         keyring:
           mon:
-            key: AQAnQIhZ6in5KxAAdf467upoRMWFcVg5pbh1yg==
             caps:
               mon: "allow *"
           admin:
-            key: AQBHPYhZv5mYDBAAvisaSzCTQkC5gywGUp/voA==
             caps:
               mds: "allow *"
               mgr: "allow *"
@@ -284,15 +280,22 @@
 
     ceph:
       common:
-        config:
-          osd:
-            key: value
+        version: luminous
+        fsid: a619c5fc-c4ed-4f22-9ed2-66cf2feca23d
+        public_network: 10.0.0.0/24, 10.1.0.0/24
+        cluster_network: 10.10.0.0/24, 10.11.0.0/24
+        keyring:
+          bootstrap-osd:
+            caps:
+              mon: "allow profile bootstrap-osd"
+          ....
       osd:
         enabled: true
         ceph_host_id: '39'
-        journal_size: 20480
-        bluestore_block_db_size: 1073741824    (1G)
-        bluestore_block_wal_size: 1073741824   (1G)
+        crush_parent: rack01
+        journal_size: 20480                     (20G)
+        bluestore_block_db_size: 10073741824    (10G)
+        bluestore_block_wal_size: 10073741824   (10G)
         bluestore_block_size: 807374182400     (800G)
         backend:
           filestore:
@@ -485,7 +488,7 @@
             max_size: 10
             steps:
               - take crushroot.performanceblock.satahss.1
-              - choseleaf firstn 0 type failure_domain
+              - chooseleaf firstn 0 type failure_domain
               - emit
 
 Ceph monitoring
diff --git a/ceph/files/crushmap b/ceph/files/crushmap
index a1065c4..07a441a 100644
--- a/ceph/files/crushmap
+++ b/ceph/files/crushmap
@@ -6,30 +6,27 @@
 {%- set osds = {} -%}
 {%- set weights = {} -%}
 
-# the following for loop must be changed
+{%- for node_name, node_grains in salt['mine.get']('*', 'grains.items').iteritems() -%}
+  {%- if node_grains.ceph.ceph_disk is defined -%}
+    {# load OSDs and compute weight#}
+    {%- set node_weight = [] -%}
+    {%- for osd_id, osd in node_grains.ceph.ceph_disk.iteritems() -%}
+      {%- do osd.update({'host': node_grains.nodename }) -%}
+      {%- do osds.update({osd_id: osd}) -%}
+      {%- do node_weight.append(osd.weight|float) -%}
+    {%- endfor -%}
 
-#{%- for node_name, node_grains in salt['mine.get']('*', 'grains.items').iteritems() -%}
-#  {%- if node_grains.ceph_osd_host_id is defined -%}
-#    {# load OSDs and compute weight#}
-#    {%- set node_weight = [] -%}
-#    {%- for osd_relative_id, osd in node_grains.ceph_osd_disk.iteritems() -%}
-#      {%- set osd_id = node_grains.ceph_osd_host_id ~ osd_relative_id -%}
-#      {%- do osd.update({'host': node_grains.nodename }) -%}
-#      {%- do osds.update({osd_id: osd}) -%}
-#      {%- do node_weight.append(osd.weight) -%}
-#    {%- endfor -%}
-#
-#    {%- do hosts.update({node_grains.nodename: {'weight': node_weight|sum, 'parent': node_grains.ceph_crush_parent }}) -%}
-#
-#  {%- endif -%}
-#{%- endfor -%}
+    {%- do hosts.update({node_grains.nodename: {'weight': node_weight|sum, 'parent': node_grains.ceph_crush_parent }}) -%}
+
+  {%- endif -%}
+{%- endfor -%}
 
 {%- set _crush = setup.crush -%}
 {%- set _buckets = [] %}
 
 # tunables
 {%- for k, v in _crush.get('tunables', {}).iteritems() %}
-tunable {{ k }}: {{ v }}
+tunable {{ k }} {{ v }}
 {%- endfor %}
 
 # types
@@ -39,26 +36,29 @@
 {%- endfor %}
 
 # devices
-{%- for disk_id, disk in osds.iteritems() %}
+{% for disk_id, disk in osds|dictsort %}
 device {{ disk_id }} osd.{{ disk_id }}{%- if disk.get('class') %} class {{ disk.class }}{% endif %}
 {%- endfor %}
 
+{% set count = [1] %}
+
 # host buckets
 {%- for bucket in hosts %}
 {%- set weight = [] %}
 host {{ bucket }} {
-  id -{{ loop.index }}
+  id -{{ count[0] }}
   alg straw2
   hash 0
   {%- for disk_id, disk in osds.iteritems() %}
   {%- if disk.host == bucket %}
   item osd.{{ disk_id }} weight {{ disk.weight }}
-  {%- do weight.append(disk.weight) %}
+  {%- do weight.append(disk.weight|float) %}
   {%- endif %}
   {%- endfor %}
   {%- do weights.update({'host-' ~ bucket: weight|sum}) %}
   # weight: {{ weights['host-' ~ bucket] }}
   # parent: {{ hosts[bucket].parent }}
+  {% if count.append(count.pop() + 1) %}{% endif %}
 }
 {%- endfor %}
 
@@ -67,7 +67,7 @@
 {%- for resource in _crush.get(i, {}) -%}
 {% set weight = [] %}
 {{ i }} {{ resource.name }} {
-  id -{{ loop.index }}
+  id -{{ count[0] }}
   alg {{ resource.get('alg', 'straw2') }}
   hash {{ resource.get('hash', 0) }}
 
@@ -96,21 +96,21 @@
   {%- do weights.update({i ~ '-' ~ resource.name: weight|sum }) %}
   # weight: {{ weight|sum }}
 }
+{% if count.append(count.pop() + 1) %}{% endif %}
 {%- endfor %}
 {%- endfor %}
 
 # rules
 {%- for rule_name, rule in _crush.get('rule', {}).iteritems() %}
 rule {{ rule_name }} {
-  {%- for opt_name, opt in rule.iteritems() %}
-    {%- if opt is iterable and opt is not string -%}
-    {%- for i in opt %}
-    {{ opt_name }} {{ i }}
-    {%- endfor %}
-    {%- else %}
-    {{ opt_name }} {{ opt }}
-    {%- endif %}
+  ruleset {{ rule.ruleset }}
+  type {{ rule.type }}
+  min_size {{ rule.min_size }}
+  max_size {{ rule.max_size }}
+  {%- for step in rule.steps %}
+  step {{ step }}
   {%- endfor %}
 }
 {% endfor %}
 # end crush map
+
diff --git a/ceph/meta/salt.yml b/ceph/meta/salt.yml
index e69de29..1dc9a8c 100644
--- a/ceph/meta/salt.yml
+++ b/ceph/meta/salt.yml
@@ -0,0 +1,9 @@
+grain:
+  {%- if pillar.get('ceph', {}).get('osd', {}).get('enabled', False) %}
+  {%- from "ceph/map.jinja" import osd with context %}
+  {%- if osd.crush_parent is defined %}
+  ceph:
+    {%- set ceph_crush_parent = {'ceph_crush_parent': osd.crush_parent} %}
+    {{ ceph_crush_parent|yaml(False)|indent(4) }}
+  {%- endif %}
+  {%- endif %}
\ No newline at end of file
diff --git a/tests/pillar/ceph_osd_single.sls b/tests/pillar/ceph_osd_single.sls
index 3138ed7..81d0fa8 100644
--- a/tests/pillar/ceph_osd_single.sls
+++ b/tests/pillar/ceph_osd_single.sls
@@ -27,6 +27,7 @@
           osd: "allow *"
   osd:
     enabled: true
+    crush_parent: rack01
     version: kraken
     host_id: 10
     backend: