require File.expand_path(File.dirname(__FILE__) + '/spec_helper')

require IRONFAN_DIR("lib/ironfan")

describe "ironfan" do
  describe 'successfuly runs example' do

    describe 'webserver_demo:' do
      before :all do
        @cluster = get_example_cluster(:webserver_demo)
        @cluster.resolve!
      end

      it 'loads successfuly' do
        @cluster.should be_a(Ironfan::Cluster)
        @cluster.name.should == :webserver_demo
      end

      it 'cluster is right' do
        @cluster.to_hash.should == {
          :name            => :webserver_demo,
          :run_list        => ["role[base_role]", "role[chef_client]", "role[ssh]", "role[nfs_client]", "role[big_package]", "role[webserver_demo_cluster]"],
          :chef_attributes => { :webnode_count => 6 },
          :facet_name    => "webserver_demo_cluster",
        }
      end

      it 'defaults cluster' do
        defaults_cluster = Ironfan.cluster(:defaults)
        cloud_hash = defaults_cluster.cloud.to_hash
        [:security_groups, :user_data].each{|k| cloud_hash.delete k }
        cloud_hash.should == {
          :availability_zones => ['us-east-1d'],
          :region             => "us-east-1",
          :flavor             => "m1.small",
          :image_name         => "lucid",
          :backing            => "ebs",
          :disable_api_termination => false,
          :public_ip         => false,
          :bootstrap_distro   => "ubuntu10.04-ironfan",
        }
      end

      it 'cluster cloud is right' do
        cloud_hash = @cluster.cloud.to_hash
        [:security_groups, :user_data].each{|k| cloud_hash.delete k }
        cloud_hash.should == {
          :availability_zones => ['us-east-1d'],
          :region             => "us-east-1",
          :flavor             => "t1.micro",
          :image_name         => "maverick",
          :backing            => "instance",
          :disable_api_termination => false,
          :public_ip         => false,
          :bootstrap_distro   => "ubuntu10.04-ironfan",
          :keypair            => :webserver_demo,
        }
      end

      it 'facet cloud is right' do
        cloud_hash = @cluster.facet(:webnode).cloud.to_hash
        [:security_groups, :user_data].each{|k| cloud_hash.delete k }
        cloud_hash.should == {
          :backing            => "ebs",
        }
      end

      it 'webnode facets are right' do
        @cluster.facets.length.should == 3
        fct = @cluster.facet(:webnode)
        fct.to_hash.should == {
          :name            => :webnode,
          :run_list        => ["role[nginx]", "role[redis_client]", "role[mysql_client]", "role[elasticsearch_client]", "role[awesome_website]", "role[webserver_demo_webnode]"],
          :chef_attributes => {:split_testing=>{:group=>"A"}},
          :facet_role      => "webserver_demo_webnode",
          :instances       => 6,
        }
      end

      it 'dbnode facets are right' do
        fct = @cluster.facet(:dbnode)
        fct.to_hash.should == {
          :name            => :dbnode,
          :run_list        => ["role[mysql_server]", "role[redis_client]", "role[webserver_demo_dbnode]" ],
          :chef_attributes => {},
          :facet_role      => "webserver_demo_dbnode",
          :instances       => 2,
        }
        fct.cloud.flavor.should == 'c1.xlarge'
        fct.server(0).cloud.flavor.should == 'm1.large'
      end

      it 'esnode facets are right' do
        fct = @cluster.facet(:esnode)
        fct.to_hash.should == {
          :name            => :esnode,
          :run_list        => ["role[nginx]", "role[redis_server]", "role[elasticsearch_datanode]", "role[elasticsearch_httpnode]", "role[webserver_demonode]"],
          :chef_attributes => {},
          :facet_role      => "webserver_demonode",
          :instances       => 1,
        }
        fct.cloud.flavor.should == 'm1.large'
      end

      it 'cluster security groups are right' do
        gg = @cluster.security_groups
        gg.keys.should == ['default', 'ssh', 'nfs_client', 'webserver_demo']
      end

      it 'facet webnode security groups are right' do
        gg = @cluster.facet(:webnode).security_groups
        gg.keys.sort.should == ["default", "webserver_demo", "webserver_demo-awesome_website", "webserver_demo-redis_client", "webserver_demo-webnode", "nfs_client", "ssh"]
        gg['webserver_demo-awesome_website'].range_authorizations.should == [[80..80, "0.0.0.0/0", "tcp"], [443..443, "0.0.0.0/0", "tcp"]]
      end

      it 'facet dbnode security groups are right' do
        gg = @cluster.facet(:dbnode).security_groups
        gg.keys.sort.should == ["default", "webserver_demo", "webserver_demo-dbnode", "webserver_demo-redis_client", "nfs_client", "ssh"]
      end

      it 'facet esnode security groups are right' do
        gg = @cluster.facet(:esnode).security_groups
        gg.keys.sort.should == ["default", "webserver_demo", "webserver_demo-esnode", "webserver_demo-redis_server", "nfs_client", "ssh"]
        gg['webserver_demo-redis_server'][:name].should == "webserver_demo-redis_server"
        gg['webserver_demo-redis_server'][:description].should == "ironfan generated group webserver_demo-redis_server"
        gg['webserver_demo-redis_server'].group_authorizations.should == [['webserver_demo-redis_client', nil]]
      end

      it 'has servers' do
        @cluster.servers.map(&:fullname).should == [
          "webserver_demo-dbnode-0", "webserver_demo-dbnode-1",
          "webserver_demo-esnode-0",
          "webserver_demo-webnode-0", "webserver_demo-webnode-1", "webserver_demo-webnode-2", "webserver_demo-webnode-3", "webserver_demo-webnode-4", "webserver_demo-webnode-5"
        ]
      end

      describe 'resolving servers gets right' do
        before do
          @server = @cluster.slice(:webnode, 5).first
          @server.cloud.stub!(:validation_key).and_return("I_AM_VALID")
          @server.resolve!
        end

        it 'attributes' do
          @server.to_hash.should == {
            :name            => 'webserver_demo-webnode-5',
            :run_list        => ["role[base_role]", "role[chef_client]", "role[ssh]", "role[nfs_client]", "role[big_package]", "role[webserver_demo_cluster]", "role[nginx]", "role[redis_client]", "role[mysql_client]", "role[elasticsearch_client]", "role[awesome_website]", "role[webserver_demo_webnode]"],
            :instances => 6,
            :chef_attributes => {
              :split_testing  => {:group=>"B"},
              :webnode_count  => 6,
              :node_name      => "webserver_demo-webnode-5",
              :cluster_name => :webserver_demo, :facet_name => :webnode, :facet_index => 5,
            },
          }
        end

        it 'security groups' do
          @server.security_groups.keys.sort.should == ['default', 'webserver_demo', 'webserver_demo-awesome_website', 'webserver_demo-redis_client', 'webserver_demo-webnode', 'nfs_client', 'ssh']
        end
        it 'run list' do
          @server.run_list.should == ["role[base_role]", "role[chef_client]", "role[ssh]", "role[nfs_client]", "role[big_package]", "role[webserver_demo_cluster]", "role[nginx]", "role[redis_client]", "role[mysql_client]", "role[elasticsearch_client]", "role[awesome_website]", "role[webserver_demo_webnode]"]
        end

        it 'user_data' do
          @server.cloud.user_data.should == {
            "chef_server"            => "https://api.opscode.com/organizations/infochimps",
            "validation_client_name" => "chef-validator",
            "validation_key"         => "I_AM_VALID",
          }
        end

        it 'cloud settings' do
          hsh = @server.cloud.to_hash
          hsh.delete(:security_groups)
          hsh.delete(:user_data)
          hsh.should == {
            :availability_zones => ["us-east-1c"],
            :region             => "us-east-1",
            :flavor             => "t1.micro",
            :image_name         => "maverick",
            :backing            => "ebs",
            :disable_api_termination => false,
            :public_ip         => false,
            :bootstrap_distro   => "ubuntu10.04-ironfan",
            :keypair            => :webserver_demo,
          }
        end

      end
    end
  end
end