Merge pull request #46 from salt-formulas/pr/fix/install_formulas_fix

version to be specified for salt formula
diff --git a/.kitchen.yml b/.kitchen.yml
index 39df9e8..bfcf829 100644
--- a/.kitchen.yml
+++ b/.kitchen.yml
@@ -15,6 +15,12 @@
   formula: salt
   grains:
     noservices: true
+  vendor_repo:
+    - type: apt
+      url: http://apt-mk.mirantis.com/trusty
+      key_url: http://apt-mk.mirantis.com/public.gpg
+      components: salt
+      distribution: testing
   state_top:
     base:
       "*":
@@ -103,8 +109,8 @@
               - master_ssh_key
               - master_ssh_password
               - master_ssh_root
-              - master_handler
               - minion_pki_cert
+              - master_formulas
       pillars-from-files:
         minion_pki.sls: tests/pillar/minion_pki_ca.sls
         minion_pki_cert.sls: tests/pillar/minion_pki_cert.sls
@@ -113,7 +119,7 @@
         master_ssh_key.sls: tests/pillar/master_ssh_minion_key.sls
         master_ssh_password.sls: tests/pillar/master_ssh_minion_password.sls
         master_ssh_root.sls: tests/pillar/master_ssh_minion_root.sls
-        master_handler.sls: tests/pillar/master_custom_handler.sls
+        master_formulas.sls: tests/pillar/master_formulas.sls
 
   - name: control-default
     provisioner:
diff --git a/.travis.yml b/.travis.yml
index 6479b4b..3cb3de2 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -27,7 +27,7 @@
 
 script:
   - test ! -e .kitchen.yml || bundle exec kitchen converge || true
-  - test ! -e .kitchen.yml || bundle exec kitchen verify
+  - test ! -e .kitchen.yml || bundle exec kitchen verify -t tests/integration
 
 notifications:
   webhooks:
diff --git a/README.rst b/README.rst
index 89628cc..3c42d00 100644
--- a/README.rst
+++ b/README.rst
@@ -70,9 +70,21 @@
         ...
         environment:
           prd:
-            keysone:
+            keystone:
               source: pkg
               name: salt-formula-keystone
+            nova:
+              source: pkg
+              name: salt-formula-keystone
+              version: 0.1+0~20160818133412.24~1.gbp6e1ebb
+            postresql:
+              source: pkg
+              name: salt-formula-postgresql
+              version: purged
+
+Formula keystone is installed latest version and the formulas without version are installed in one call to aptpkg module.
+If the version attribute is present sls iterates over formulas and take action to install specific version or remove it.
+The version attribute may have these values ``[latest|purged|removed|<VERSION>]``.
 
 Clone master branch of keystone formula as local feature branch
 
diff --git a/salt/master/env.sls b/salt/master/env.sls
index 4f1c86e..3a8cfd7 100644
--- a/salt/master/env.sls
+++ b/salt/master/env.sls
@@ -136,20 +136,47 @@
 {%- endif %}
 
 {%- set _formula_pkgs = [] %}
+{%- set _formula_pkgs_with_version = [] %}
 {%- for formula_name, formula in environment.get('formula', {}).iteritems() %}
 {%- if formula.source == 'pkg' %}
+{%- if formula.version is defined %}
+{%- do _formula_pkgs_with_version.append(formula) %}
+{%- else %}
 {%- do _formula_pkgs.append(formula.name) %}
 {%- endif %}
+{%- endif %}
 {%- endfor %}
 
 {% if _formula_pkgs|length > 1 %}
-
 salt_master_{{ environment_name }}_pkg_formulas:
   pkg.latest:
   - pkgs:
 {%- for  pkg in _formula_pkgs %}
     - {{ pkg }}
 {%- endfor %}
+  - refresh: True
+  - cache_valid_time: 300
+{% endif %}
+
+{% if _formula_pkgs_with_version|length > 1 %}
+{%- for formula in _formula_pkgs_with_version %}
+salt_master_{{ environment_name }}_pkg_formula_{{ formula.name }}:
+{%- if formula.version == 'latest' %}
+ pkg.latest:
+  - refresh: True
+  - cache_valid_time: 300
+{%- elif formula.version == 'purged' %}
+ pkg.purged:
+{%- elif formula.version == 'removed' %}
+ pkg.removed:
+{%- else %}
+ pkg.installed:
+  - version: {{ formula.version }}
+  - refresh: True
+  - cache_valid_time: 300
+{% endif %}
+  - name: {{ formula.name }}
+{%- endfor %}
 
 {% endif %}
 
diff --git a/tests/integration/master-default/formulas_spec.rb b/tests/integration/master-default/formulas_spec.rb
new file mode 100644
index 0000000..73c55d4
--- /dev/null
+++ b/tests/integration/master-default/formulas_spec.rb
@@ -0,0 +1,13 @@
+
+%w(keepalived haproxy libvirt ntp openssh).each do |f|
+  describe package("salt-formula-#{f}") do
+    it { should be_installed }
+  end
+end
+
+%w(mysql postgresql).each do |f|
+  describe package("salt-formula-#{f}") do
+    it { should_not be_installed }
+  end
+end
+
diff --git a/tests/pillar/master_formulas.sls b/tests/pillar/master_formulas.sls
new file mode 100644
index 0000000..92e270a
--- /dev/null
+++ b/tests/pillar/master_formulas.sls
@@ -0,0 +1,51 @@
+git:
+  client:
+    enabled: true
+linux:
+  system:
+    enabled: true
+salt:
+  master:
+    enabled: true
+    pillar:
+      source:
+        engine: local
+    environment:
+      prd:
+        formula:
+          keepalived:
+            source: pkg
+            name: salt-formula-keepalived
+          haproxy:
+            source: pkg
+            name: salt-formula-haproxy
+          libvirt:
+            source: pkg
+            name: salt-formula-libvirt
+            version: latest
+          ntp:
+            source: pkg
+            name: salt-formula-ntp
+            version: latest
+          openssh:
+            source: pkg
+            name: salt-formula-openssh
+            version: latest
+          mysql:
+            source: pkg
+            name: salt-formula-mysql
+            version: purged
+          postgresql:
+            source: pkg
+            name: salt-formula-postgresql
+            version: removed
+      dev:
+        formula:
+          aptly:
+            source: git
+            address: 'https://github.com/salt-formulas/salt-formula-aptly.git'
+            revision: master
+          bind:
+            source: git
+            address: 'https://github.com/salt-formulas/salt-formula-bind.git'
+            revision: master