Top Level Namespace

Defined Under Namespace

Modules: Miasma

Constant Summary collapse

MIASMA_COMPUTE_ABSTRACT =
->{

  # Required `let`s:
  # * compute: compute API
  # * build_args: server build arguments [Smash]

  describe Miasma::Models::Compute, :vcr do

    it 'should provide #servers collection' do
      compute.servers.must_be_kind_of Miasma::Models::Compute::Servers
    end

    describe Miasma::Models::Compute::Servers do

      it 'should provide instance class used within collection' do
        compute.servers.model.must_equal Miasma::Models::Compute::Server
      end

      it 'should build new instance for collection' do
        instance = compute.servers.build(:name => 'test')
        instance.must_be_kind_of Miasma::Models::Compute::Server
      end

      it 'should provide #all servers' do
        compute.servers.all.must_be_kind_of Array
      end

    end

    describe Miasma::Models::Compute::Server do

      before do
        unless($miasma_instance)
          VCR.use_cassette('Miasma_Models_Compute_Global/GLOBAL_compute_instance_create') do
            @instance = compute.servers.build(build_args)
            @instance.save
            until(@instance.state == :running)
              miasma_spec_sleep
              @instance.reload
            end
            $miasma_instance = @instance
          end
          Kernel.at_exit do
            VCR.use_cassette('Miasma_Models_Compute_Global/GLOBAL_compute_instance_destroy') do
              $miasma_instance.destroy
            end
          end
        else
          @instance = $miasma_instance
        end
        @instance.reload
      end

      let(:instance){ @instance }

      describe 'instance methods' do

        it 'should have a name' do
          instance.name.must_equal build_args[:name]
        end

        it 'should have an image_id' do
          instance.image_id.must_equal build_args[:image_id]
        end

        it 'should have a flavor_id' do
          instance.flavor_id.must_equal build_args[:flavor_id]
        end

        it 'should have an address' do
          instance.addresses.detect do |addr|
            addr.version == 4
          end.address.must_match /^(\d+)+\.(\d+)\.(\d+)\.(\d+)$/
        end

        it 'should have a status' do
          instance.status.wont_be_nil
        end

        it 'should be in :running state' do
          instance.state.must_equal :running
        end

      end

    end

    describe 'instance lifecycle' do
      it 'should create new server, reload details and destroy server' do
        instance = compute.servers.build(build_args)
        instance.save
        instance.id.wont_be_nil
        instance.state.must_equal :pending
        compute.servers.reload.get(instance.id).wont_be_nil
        until(instance.state == :running)
          miasma_spec_sleep
          instance.reload
        end
        instance.state.must_equal :running
        instance.destroy
        while(instance.state == :running)
          miasma_spec_sleep
          instance.reload
        end
        [:pending, :terminated].must_include instance.state
        if(instance.state == :pending)
          until(instance.state == :terminated)
            miasma_spec_sleep
            instance.reload
          end
          instance.state.must_equal :terminated
        end
      end

    end

  end
}
MIASMA_STORAGE_ABSTRACT =
->{

  # Required `let`s:
  # * storage: storage API

  describe Miasma::Models::Storage, :vcr do

    it 'should provide #buckets collection' do
      storage.buckets.must_be_kind_of Miasma::Models::Storage::Buckets
    end

    describe Miasma::Models::Storage::Buckets do

      it 'should provide instance class used within collection' do
        storage.buckets.model.must_equal Miasma::Models::Storage::Bucket
      end

      it 'should build new instance for collection' do
        storage.buckets.build.must_be_kind_of Miasma::Models::Storage::Bucket
      end

      it 'should provide #all buckets' do
        storage.buckets.all.must_be_kind_of Array
      end

    end

    describe Miasma::Models::Storage::Bucket do

      it 'should act like a bucket' do
        bucket = storage.buckets.build(:name => 'miasma-test-bucket-010')
        bucket.save
        bucket.reload

        # should include the bucket
        storage.buckets.reload.get('miasma-test-bucket-010').wont_be_nil
        # should have a name
        bucket.name.must_equal 'miasma-test-bucket-010'
        # should have a #files collection
        bucket.files.must_be_kind_of Miasma::Models::Storage::Files
        #should provide #all files
        bucket.files.all.must_be_kind_of Array
        # should include reference to containing bucket
        bucket.files.bucket.must_equal bucket
        # should build new instance for collection
        bucket.files.build.must_be_kind_of Miasma::Models::Storage::File

        file_content = 'blahblahblah'
        file = bucket.files.build
        file.name = 'miasma-test-file'
        file.body = file_content
        file.save
        file.reload

        # should have a name
        file.name.must_equal 'miasma-test-file'
        # should have a size
        file.size.must_equal file_content.size
        # should have an updated timestamp
        file.updated.must_be_kind_of Time
        # should create a valid url
        open(file.url).read.must_equal file_content
        # should have a body
        file.body.must_respond_to :readpartial
        file.body.readpartial(Miasma::Models::Storage::READ_BODY_CHUNK_SIZE).must_equal file_content
        file.destroy

        big_file_content = '*' * Miasma::Models::Storage::MAX_BODY_SIZE_FOR_STRINGIFY
        big_file = bucket.files.build
        big_file.name = 'miasma-test-file-big'
        big_file.body = big_file_content
        big_file.save
        big_file.reload

        # should be the correct size
        big_file.size.must_equal big_file.size
        # should provide streaming body
        big_file.body.must_respond_to :readpartial
        content = big_file.body.readpartial(big_file.size)
        content.must_equal big_file_content
        big_file.destroy

        require 'tempfile'
        local_io_file = Tempfile.new('miasma-storage-test')
        big_io_content = '*' * (Miasma::Models::Storage::MAX_BODY_SIZE_FOR_STRINGIFY * 1.3)
        local_io_file.write big_io_content
        local_io_file.flush
        local_io_file.rewind
        remote_file = bucket.files.build
        remote_file.name = 'miasma-test-io-object-010'
        remote_file.body = local_io_file
        remote_file.save
        remote_file.reload

        # should be the correct size
        remote_file.size.must_equal local_io_file.size
        # should provide streaming body
        remote_file.body.must_respond_to :readpartial
        content = ''
        while(chunk = remote_file.body.readpartial(1024))
          content << chunk
        end
        content.must_equal big_io_content
        remote_file.destroy
        bucket.destroy
      end

    end

  end
}
MIASMA_LOAD_BALANCER_ABSTRACT =
->{

  # Required `let`s:
  # * load_balancer: load balancer API
  # * build_args: load balancer build arguments [Smash]

  describe Miasma::Models::LoadBalancer, :vcr do

    it 'should provide #balancers collection' do
      load_balancer.balancers.must_be_kind_of Miasma::Models::LoadBalancer::Balancers
    end

    describe Miasma::Models::LoadBalancer::Balancers do

      it 'should provide instance class used within collection' do
        load_balancer.balancers.model.must_equal Miasma::Models::LoadBalancer::Balancer
      end

      it 'should build new instance for collection' do
        instance = load_balancer.balancers.build
        instance.must_be_kind_of Miasma::Models::LoadBalancer::Balancer
      end

      it 'should provide #all balancers' do
        load_balancer.balancers.all.must_be_kind_of Array
      end

    end

    describe Miasma::Models::LoadBalancer::Balancer do

      before do
        unless($miasma_balancer)
          VCR.use_cassette('Miasma_Models_LoadBalancer_Global/GLOBAL_load_balancer_create') do
            @balancer = load_balancer.balancers.build(build_args)
            @balancer.save
            until(@balancer.state == :active)
              miasma_spec_sleep
              @balancer.reload
            end
            $miasma_balancer = @balancer
          end
          Kernel.at_exit do
            VCR.use_cassette('Miasma_Models_LoadBalancer_Global/GLOBAL_load_balancer_destroy') do
              $miasma_balancer.destroy
            end
          end
        else
          @balancer = $miasma_balancer
        end
        @balancer.reload
      end

      let(:balancer){ @balancer }

      describe 'collection' do

        it 'should include balancer' do
          load_balancer.balancers.reload.get(balancer.id).wont_be_nil
        end

      end

      describe 'balancer methods' do

        it 'should have a name' do
          balancer.name.must_equal build_args[:name]
        end

        it 'should be in :active state' do
          balancer.state.must_equal :active
        end

        it 'should have a status' do
          balancer.status.wont_be_nil
          balancer.status.must_be_kind_of String
        end

        it 'should have a public address' do
          balancer.public_addresses.wont_be :empty?
        end

      end

    end

  end
}
MIASMA_ORCHESTRATION_ABSTRACT =
->{

  # Required `let`s:
  # * orchestration: orchestration API
  # * build_args: stack build arguments [Smash]

  describe Miasma::Models::Orchestration, :vcr do

    it 'should provide #stacks collection' do
      orchestration.stacks.must_be_kind_of Miasma::Models::Orchestration::Stacks
    end

    describe Miasma::Models::Orchestration::Stacks do

      it 'should provide instance class used within collection' do
        orchestration.stacks.model.must_equal Miasma::Models::Orchestration::Stack
      end

      it 'should build new instance for collection' do
        instance = orchestration.stacks.build
        instance.must_be_kind_of Miasma::Models::Orchestration::Stack
      end

      it 'should provide #all stacks' do
        orchestration.stacks.all.must_be_kind_of Array
      end

    end

    describe Miasma::Models::Orchestration::Stacks do

      before do
        unless($miasma_stack)
          VCR.use_cassette('Miasma_Models_Orchestration_Global/GLOBAL_orchestration_stack_create') do
            @stack = orchestration.stacks.build(build_args)
            @stack.save
            Timeout.timeout(500) do
              until(@stack.state == :create_complete)
                miasma_spec_sleep
                @stack.reload
              end
            end
            @stack.template
            orchestration.stacks.reload
            $miasma_stack = @stack
          end
          Kernel.at_exit do
            VCR.use_cassette('Miasma_Models_Compute_Global/GLOBAL_orchestration_stack_destroy') do
              $miasma_stack.destroy
            end
          end
        else
          @stack = $miasma_stack
        end
        @stack.reload
      end

      let(:stack){ @stack }

      describe 'collection' do

        it 'should include stack' do
          orchestration.stacks.all.detect{|s| s.id == stack.id}.wont_be_nil
          orchestration.stacks.get(stack.id).wont_be_nil
        end

      end

      describe 'instance methods' do

        it 'should have a name' do
          stack.name.must_equal build_args[:name]
        end

        it 'should be in :create_complete state' do
          stack.state.must_equal :create_complete
        end

        it 'should have a status' do
          stack.status.must_be_kind_of String
        end

        it 'should have a creation time' do
          stack.created.must_be_kind_of Time
        end

        it 'should have parameters used for creation' do
          stack.parameters.to_smash.must_equal build_args[:parameters].to_smash
        end

        it 'should include the templated used for creation' do
          stack.template.to_smash.must_equal build_args[:template].to_smash
        end

      end

    end

    describe 'instance lifecycle' do
      it 'should create new stack, reload details and destroy stack' do
        stack = orchestration.stacks.build(build_args.merge(:name => 'miasma-test-stack-2'))
        stack.save
        stack.id.wont_be_nil
        stack.state.must_equal :create_in_progress
        orchestration.stacks.reload.get(stack.id).wont_be_nil
        until(stack.state == :create_complete)
          miasma_spec_sleep
          stack.reload
        end
        stack.state.must_equal :create_complete
        stack.destroy
        [:delete_in_progress, :delete_complete].must_include stack.state
        Timeout.timeout(500) do
          until(stack.state == :delete_complete)
            miasma_spec_sleep
            stack.reload
          end
        end
        stack.state.must_equal :delete_complete
      end

    end

  end
}

Instance Method Summary collapse

Instance Method Details

#miasma_spec_sleep(interval = 20) ⇒ Object



6
7
8
9
10
11
12
# File 'lib/miasma/specs.rb', line 6

def miasma_spec_sleep(interval=20)
  if(ENV['MIASMA_TEST_LIVE_REQUESTS'])
    sleep(20)
  else
    sleep(0.1)
  end
end