require 'spec_helper_acceptance'

RSpec.context 'ZPool: Basic Tests' do
  before(:all) do
    # ZPool: setup
    solaris_agents.each do |agent|
      zpool_setup agent
    end
  end

  after(:all) do
    # ZPool: cleanup
    solaris_agents.each do |agent|
      zpool_clean agent
    end
  end

  solaris_agents.each do |agent|
    it 'can create an idempotent zpool resource' do
      # ZPool: create zpool disk
      apply_manifest_on(agent, "zpool{ tstpool: ensure=>present, disk=>'/ztstpool/dsk1' }") do |result|
        assert_match(%r{ensure: created}, result.stdout, "err: #{agent}")
      end

      # ZPool: zpool should be idempotent
      apply_manifest_on(agent, "zpool{ tstpool: ensure=>present, disk=>'/ztstpool/dsk1' }") do |result|
        refute_match(%r{ensure: created}, result.stdout, "err: #{agent}")
      end

      # ZPool: remove zpool
      apply_manifest_on(agent, 'zpool{ tstpool: ensure=>absent }') do |result|
        assert_match(%r{ensure: removed}, result.stdout, "err: #{agent}")
      end
    end

    it 'can create a zpool resource with a disk array' do
      # ZPool: create zpool with a disk array
      apply_manifest_on(agent, "zpool{ tstpool: ensure=>present, disk=>['/ztstpool/dsk1','/ztstpool/dsk2'] }") do |result|
        assert_match(%r{ensure: created}, result.stdout, "err: #{agent}")
      end

      # ZPool: verify disk array was created
      on(agent, 'zpool list -H') do |result|
        assert_match(%r{tstpool}, result.stdout, "err: #{agent}")
      end

      # ZPool: verify puppet resource reports on the disk array
      on(agent, puppet('resource zpool tstpool')) do |result|
        assert_match(%r{ensure\s+=> 'present'}, result.stdout, "err: #{agent}")
        assert_match(%r{disk +=> .'.+dsk1 .+dsk2'.}, result.stdout, "err: #{agent}")
      end

      # ZPool: remove zpool in preparation for mirror tests
      apply_manifest_on(agent, 'zpool{ tstpool: ensure=>absent }') do |result|
        assert_match(%r{ensure: removed}, result.stdout, "err: #{agent}")
      end
    end

    it 'can create a mirrored zpool resource with 3 virtual devices' do
      # ZPool: create mirrored zpool with 3 virtual devices
      apply_manifest_on(agent, "zpool{ tstpool: ensure=>present, mirror=>['/ztstpool/dsk1 /ztstpool/dsk2 /ztstpool/dsk3'] }") do |result|
        assert_match(%r{ensure: created}, result.stdout, "err: #{agent}")
      end

      # ZPool: verify mirrors were created
      on(agent, 'zpool status -v tstpool') do |result|
        # 	NAME                STATE     READ WRITE CKSUM
        # tstpool             ONLINE       0     0     0
        #   mirror-0          ONLINE       0     0     0
        #     /ztstpool/dsk1  ONLINE       0     0     0
        #     /ztstpool/dsk2  ONLINE       0     0     0
        #     /ztstpool/dsk3  ONLINE       0     0     0
        assert_match(%r{tstpool.*\n\s+mirror.*\n\s*/ztstpool/dsk1.*\n\s*/ztstpool/dsk2.*\n\s*/ztstpool/dsk3}m, result.stdout, "err: #{agent}")
      end

      # ZPool: verify puppet resource reports on the mirror
      on(agent, puppet('resource zpool tstpool')) do |result|
        assert_match(%r{ensure\s+=> 'present'}, result.stdout, "err: #{agent}")
        assert_match(%r{mirror\s+=> \['/ztstpool/dsk1 /ztstpool/dsk2 /ztstpool/dsk3'\]}, result.stdout, "err: #{agent}")
      end

      # ZPool: remove zpool in preparation for multiple mirrors
      apply_manifest_on(agent, 'zpool{ tstpool: ensure=>absent }') do |result|
        assert_match(%r{ensure: removed}, result.stdout, "err: #{agent}")
      end
    end

    it 'can create two mirrored zpools each with two virtual devices' do
      # ZPool: create 2 mirrored zpools each with 2 virtual devices
      apply_manifest_on(agent, "zpool{ tstpool: ensure=>present, mirror=>['/ztstpool/dsk1 /ztstpool/dsk2', '/ztstpool/dsk3 /ztstpool/dsk5'] }") do |result|
        assert_match(%r{ensure: created}, result.stdout, "err: #{agent}")
      end

      # ZPool: verify both mirrors were created
      on(agent, 'zpool status -v tstpool') do |result|
        # 	NAME                STATE     READ WRITE CKSUM
        # tstpool             ONLINE       0     0     0
        #   mirror-0          ONLINE       0     0     0
        #     /ztstpool/dsk1  ONLINE       0     0     0
        #     /ztstpool/dsk2  ONLINE       0     0     0
        #   mirror-1          ONLINE       0     0     0
        #     /ztstpool/dsk3  ONLINE       0     0     0
        #     /ztstpool/dsk5  ONLINE       0     0     0
        assert_match(%r{tstpool.*\n\s+mirror.*\n\s*/ztstpool/dsk1.*\n\s*/ztstpool/dsk2.*\n\s+mirror.*\n\s*/ztstpool\/dsk3.*\n\s*/ztstpool/dsk5}m, result.stdout, "err: #{agent}")
      end

      # ZPool: verify puppet resource reports on both mirrors
      on(agent, puppet('resource zpool tstpool')) do |result|
        assert_match(%r{ensure\s+=> 'present'}, result.stdout, "err: #{agent}")
        assert_match(%r{mirror\s+=> \['/ztstpool/dsk1 /ztstpool/dsk2', '/ztstpool/dsk3 /ztstpool/dsk5'\]}, result.stdout, "err: #{agent}")
      end

      # ZPool: remove zpool in preparation for raidz test
      apply_manifest_on(agent, 'zpool{ tstpool: ensure=>absent }') do |result|
        assert_match(%r{ensure: removed}, result.stdout, "err: #{agent}")
      end
    end

    it 'can create raidz pool consisting of three virtual devices' do
      # ZPool: create raidz pool consisting of 3 virtual devices
      apply_manifest_on(agent, "zpool{ tstpool: ensure=>present, raidz=>['/ztstpool/dsk1 /ztstpool/dsk2 /ztstpool/dsk3'] }") do |result|
        pp "THIS IS THE RESULT: #{result} THIS IS THE RESULT'S CLASS #{result.class}"
        pp "THIS IS THE RESULT METHODS #{result.methods.sort}"
        pp "RESULT.STDOUT IS #{result.stdout} RESULT.STDERR IS #{result.stderr}"
        assert_match(%r{ensure: created}, result.stdout, "err: #{agent}")
      end

      # ZPool: verify raidz pool was created
      on(agent, 'zpool status -v tstpool') do |result|
        # 	NAME                STATE     READ WRITE CKSUM
        # tstpool             ONLINE       0     0     0
        #   raidz1-0          ONLINE       0     0     0
        #     /ztstpool/dsk1  ONLINE       0     0     0
        #     /ztstpool/dsk2  ONLINE       0     0     0
        #     /ztstpool/dsk3  ONLINE       0     0     0
        assert_match(%r{tstpool.*\n\s+raidz.*\n\s*/ztstpool/dsk1.*\n\s*/ztstpool/dsk2.*\n\s*/ztstpool/dsk3}m, result.stdout, "err: #{agent}")
      end

      # ZPool: verify puppet reports on the raidz pool
      on(agent, puppet('resource zpool tstpool')) do |result|
        assert_match(%r{ensure\s+=> 'present'}, result.stdout, "err: #{agent}")
        assert_match(%r{raidz\s+=> \['/ztstpool/dsk1 /ztstpool/dsk2 /ztstpool/dsk3'\]}, result.stdout, "err: #{agent}")
      end

      # ZPool: remove zpool in preparation for multiple raidz pools
      apply_manifest_on(agent, 'zpool{ tstpool: ensure=>absent }') do |result|
        assert_match(%r{ensure: removed}, result.stdout, "err: #{agent}")
      end
    end

    it 'can create two raidz zpools each with two virtual devices' do
      # ZPool: create 2 mirrored zpools each with 2 virtual devices
      apply_manifest_on(agent, "zpool{ tstpool: ensure=>present, raidz=>['/ztstpool/dsk1 /ztstpool/dsk2', '/ztstpool/dsk3 /ztstpool/dsk5'] }") do |result|
        pp "THIS IS THE RESULT: #{result} THIS IS THE RESULT'S CLASS #{result.class}"
        pp "THIS IS THE RESULT METHODS #{result.methods.sort}"
        pp "RESULT.STDOUT IS #{result.stdout} RESULT.STDERR IS #{result.stderr}"
        assert_match(%r{ensure: created}, result.stdout, "err: #{agent}")
      end

      # ZPool: verify both raidz were created
      on(agent, 'zpool status -v tstpool') do |result|
        # 	NAME                STATE     READ WRITE CKSUM
        # tstpool             ONLINE       0     0     0
        #   raidz1-0          ONLINE       0     0     0
        #     /ztstpool/dsk1  ONLINE       0     0     0
        #     /ztstpool/dsk2  ONLINE       0     0     0
        #   raidz1-1          ONLINE       0     0     0
        #     /ztstpool/dsk3  ONLINE       0     0     0
        #     /ztstpool/dsk5  ONLINE       0     0     0
        assert_match(%r{tstpool.*\n\s+raidz.*\n\s*/ztstpool/dsk1.*\n\s*/ztstpool/dsk2.*\n\s+raidz.*\n\s*/ztstpool/dsk3.*\n\s*/ztstpool/dsk5}m, result.stdout, "err: #{agent}")
      end

      # ZPool: verify puppet resource reports on both raidz
      on(agent, puppet('resource zpool tstpool')) do |result|
        assert_match(%r{ensure\s+=> 'present'}, result.stdout, "err: #{agent}")
        assert_match(%r{raidz\s+=> \['/ztstpool/dsk1 /ztstpool/dsk2', '/ztstpool/dsk3 /ztstpool/dsk5'\]}, result.stdout, "err: #{agent}")
      end

      # ZPool: remove
      apply_manifest_on(agent, 'zpool { tstpool: ensure => absent }') do |result|
        assert_match(%(ensure: removed), result.stdout, "err: #{agent}")
      end
    end
  end
end
