fog-softlayer-0.3.17/0000755000076400007640000000000012424143106013414 5ustar pravipravifog-softlayer-0.3.17/spec/0000755000076400007640000000000012424143106014346 5ustar pravipravifog-softlayer-0.3.17/spec/fog/0000755000076400007640000000000012424143106015121 5ustar pravipravifog-softlayer-0.3.17/spec/fog/compute/0000755000076400007640000000000012424143106016575 5ustar pravipravifog-softlayer-0.3.17/spec/fog/compute/softlayer_spec.rb0000644000076400007640000000177512424143106022156 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require "minitest/autorun" require "fog/softlayer" describe Fog::Compute::Softlayer do describe "when global config is available" do before do @arguments = { :softlayer_api_url => "http://localhost", :softlayer_username => "username", :softlayer_api_key => "key" } @credential_guard = Minitest::Mock.new def @credential_guard.reject {} end Fog.stub :credentials, @credential_guard do @service = Fog::Compute::Softlayer.new(@arguments) end end it "responds to #request" do assert_respond_to @service, :request end end describe "when created without required arguments" do it "raises an error" do Fog.stub :credentials, {} do assert_raises ArgumentError do Fog::Compute::Softlayer.new({}) end end end end end fog-softlayer-0.3.17/LICENSE.txt0000644000076400007640000000206012424143106015235 0ustar pravipravi© Copyright IBM Corporation 2014. MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. fog-softlayer-0.3.17/CONTRIBUTING.md0000644000076400007640000000156112424143106015650 0ustar pravipravi## Getting Involved New contributors are always welcome, when it doubt please ask questions. We strive to be an open and welcoming community. Please be nice to one another. ### Coding * Pick a task: * Offer feedback on open [pull requests](https://github.com/fog/fog-softlayer/pulls). * Review open [issues](https://github.com/fog/fog-softlayer/issues) for things to help on. * [Create an issue](https://github.com/fog/fog-softlayer/issues/new) to start a discussion on additions or features. * Fork the project, add your changes and tests to cover them in a topic branch. * Commit your changes and rebase against `softlayer/fog` to ensure everything is up to date. * [Submit a pull request](https://github.com/fog/fog-softlayer/compare/). ### Non-Coding * Offer feedback on open [issues](https://github.com/fog/fog-softlayer/issues). * Organize or volunteer at events. fog-softlayer-0.3.17/.travis.yml0000644000076400007640000000143412424143106015527 0ustar pravipravilanguage: ruby script: bundle exec rake travis matrix: fast_finish: true include: - rvm: 1.8.7 gemfile: gemfiles/Gemfile-ruby-1.8.7 - rvm: 1.9.3 gemfile: Gemfile - rvm: 2.0.0 gemfile: Gemfile - rvm: 2.1.0 gemfile: Gemfile - rvm: 2.1.1 gemfile: Gemfile # env: COVERAGE=true - rvm: 2.1.1 gemfile: gemfiles/Gemfile-edge - rvm: jruby-18mode gemfile: gemfiles/Gemfile-ruby-1.8.7 - rvm: jruby-19mode gemfile: Gemfile - rvm: jruby-head gemfile: Gemfile allow_failures: - rvm: 1.8.7 - rvm: jruby-18mode - rvm: jruby-head notifications: email: - matt.eldridge@us.ibm.com before_install: - gem update --system # todo: workaround for https://github.com/rubygems/rubygems/pull/763 fog-softlayer-0.3.17/CONTRIBUTORS.md0000644000076400007640000000031312424143106015670 0ustar pravipravi* Celso Fernandes * Hiroyuki Urasoko * Konstantin Krauss * Matt Eldridge * geemus fog-softlayer-0.3.17/tests/0000755000076400007640000000000012424143106014556 5ustar pravipravifog-softlayer-0.3.17/tests/compute/0000755000076400007640000000000012424143106016232 5ustar pravipravifog-softlayer-0.3.17/tests/compute/server_helper.rb0000644000076400007640000000147612424143106021434 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # def server_tests(connection, params = {}, mocks_implemented = true) model_tests(connection.servers, params, mocks_implemented) do tests('#reload').returns(true) do pending if Fog.mocking? && !mocks_implemented @instance.wait_for { ready? } identity = @instance.identity !identity.nil? && identity == @instance.reload.identity end responds_to([:ready?, :state]) yield if block_given? tests('#reboot').succeeds do pending if Fog.mocking? && !mocks_implemented @instance.wait_for { ready? } @instance.reboot end if !Fog.mocking? || mocks_implemented @instance.wait_for { ready? } end end end fog-softlayer-0.3.17/tests/compute/flavors_helper.rb0000644000076400007640000000171312424143106021574 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # def flavors_tests(connection, params = {}, mocks_implemented = true) tests('success') do tests("#all").succeeds do pending if Fog.mocking? && !mocks_implemented connection.flavors.all end if !Fog.mocking? || mocks_implemented @identity = connection.flavors.first.identity end tests("#get('#{@identity}')").succeeds do pending if Fog.mocking? && !mocks_implemented connection.flavors.get(@identity) end end tests('failure') do if !Fog.mocking? || mocks_implemented invalid_flavor_identity = connection.flavors.first.identity.to_s.gsub(/\w/, '0') end tests("#get('#{invalid_flavor_identity}')").returns(nil) do pending if Fog.mocking? && !mocks_implemented connection.flavors.get(invalid_flavor_identity) end end end fog-softlayer-0.3.17/tests/compute/servers_helper.rb0000644000076400007640000000064012424143106021607 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # def servers_tests(connection, params = {}, mocks_implemented = true) collection_tests(connection.servers, params, mocks_implemented) do if !Fog.mocking? || mocks_implemented @instance.wait_for { ready? } yield if block_given? end end end fog-softlayer-0.3.17/tests/helpers/0000755000076400007640000000000012424143106016220 5ustar pravipravifog-softlayer-0.3.17/tests/helpers/compute/0000755000076400007640000000000012424143106017674 5ustar pravipravifog-softlayer-0.3.17/tests/helpers/compute/server_helper.rb0000644000076400007640000000147612424143106023076 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # def server_tests(connection, params = {}, mocks_implemented = true) model_tests(connection.servers, params, mocks_implemented) do tests('#reload').returns(true) do pending if Fog.mocking? && !mocks_implemented @instance.wait_for { ready? } identity = @instance.identity !identity.nil? && identity == @instance.reload.identity end responds_to([:ready?, :state]) yield if block_given? tests('#reboot').succeeds do pending if Fog.mocking? && !mocks_implemented @instance.wait_for { ready? } @instance.reboot end if !Fog.mocking? || mocks_implemented @instance.wait_for { ready? } end end end fog-softlayer-0.3.17/tests/helpers/compute/flavors_helper.rb0000644000076400007640000000171312424143106023236 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # def flavors_tests(connection, params = {}, mocks_implemented = true) tests('success') do tests("#all").succeeds do pending if Fog.mocking? && !mocks_implemented connection.flavors.all end if !Fog.mocking? || mocks_implemented @identity = connection.flavors.first.identity end tests("#get('#{@identity}')").succeeds do pending if Fog.mocking? && !mocks_implemented connection.flavors.get(@identity) end end tests('failure') do if !Fog.mocking? || mocks_implemented invalid_flavor_identity = connection.flavors.first.identity.to_s.gsub(/\w/, '0') end tests("#get('#{invalid_flavor_identity}')").returns(nil) do pending if Fog.mocking? && !mocks_implemented connection.flavors.get(invalid_flavor_identity) end end end fog-softlayer-0.3.17/tests/helpers/compute/servers_helper.rb0000644000076400007640000000064012424143106023251 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # def servers_tests(connection, params = {}, mocks_implemented = true) collection_tests(connection.servers, params, mocks_implemented) do if !Fog.mocking? || mocks_implemented @instance.wait_for { ready? } yield if block_given? end end end fog-softlayer-0.3.17/tests/helpers/model_helper.rb0000644000076400007640000000163312424143106021207 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # def model_tests(collection, params = {}, mocks_implemented = true) tests('success') do @instance = collection.new(params) tests("#save").succeeds do pending if Fog.mocking? && !mocks_implemented @instance.save end if block_given? yield end tests("#destroy").succeeds do pending if Fog.mocking? && !mocks_implemented @instance.destroy end end end # Generates a unique identifier with a random differentiator. # Useful when rapidly re-running tests, so we don't have to wait # serveral minutes for deleted objects to disappear from the API # E.g. 'fog-test-1234' def uniq_id(base_name = 'fog-test') # random_differentiator suffix = rand(65536).to_s(16).rjust(4, '0') [base_name, suffix] * '-' end fog-softlayer-0.3.17/tests/helpers/schema_validator_tests.rb0000644000076400007640000000745712424143106023311 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests('Fog::Schema::DataValidator', 'meta') do validator = Fog::Schema::DataValidator.new tests('#validate') do tests('returns true') do returns(true, 'when value matches schema expectation') do validator.validate({"key" => "Value"}, {"key" => String}) end returns(true, 'when values within an array all match schema expectation') do validator.validate({"key" => [1, 2]}, {"key" => [Integer]}) end returns(true, 'when nested values match schema expectation') do validator.validate({"key" => {:nested_key => "Value"}}, {"key" => {:nested_key => String}}) end returns(true, 'when collection of values all match schema expectation') do validator.validate([{"key" => "Value"}, {"key" => "Value"}], [{"key" => String}]) end returns(true, 'when collection is empty although schema covers optional members') do validator.validate([], [{"key" => String}]) end returns(true, 'when additional keys are passed and not strict') do validator.validate({"key" => "Value", :extra => "Bonus"}, {"key" => String}, {:allow_extra_keys => true}) end returns(true, 'when value is nil and schema expects NilClass') do validator.validate({"key" => nil}, {"key" => NilClass}) end returns(true, 'when value and schema match as hashes') do validator.validate({}, {}) end returns(true, 'when value and schema match as arrays') do validator.validate([], []) end returns(true, 'when value is a Time') do validator.validate({"time" => Time.now}, {"time" => Time}) end returns(true, 'when key is missing but value should be NilClass (#1477)') do validator.validate({}, {"key" => NilClass}, {:allow_optional_rules => true}) end returns(true, 'when key is missing but value is nullable (#1477)') do validator.validate({}, {"key" => Fog::Nullable::String}, {:allow_optional_rules => true}) end end tests('returns false') do returns(false, 'when value does not match schema expectation') do validator.validate({"key" => nil}, {"key" => String}) end returns(false, 'when key formats do not match') do validator.validate({"key" => "Value"}, {:key => String}) end returns(false, 'when additional keys are passed and strict') do validator.validate({"key" => "Missing"}, {}) end returns(false, 'when some keys do not appear') do validator.validate({}, {"key" => String}) end returns(false, 'when collection contains a member that does not match schema') do validator.validate([{"key" => "Value"}, {"key" => 5}], [{"key" => String}]) end returns(false, 'when collection has multiple schema patterns') do validator.validate([{"key" => "Value"}], [{"key" => Integer}, {"key" => String}]) end returns(false, 'when hash and array are compared') do validator.validate({}, []) end returns(false, 'when array and hash are compared') do validator.validate([], {}) end returns(false, 'when a hash is expected but another data type is found') do validator.validate({"key" => {:nested_key => []}}, {"key" => {:nested_key => {}}}) end returns(false, 'when key is missing but value should be NilClass (#1477)') do validator.validate({}, {"key" => NilClass}, {:allow_optional_rules => false}) end returns(false, 'when key is missing but value is nullable (#1477)') do validator.validate({}, {"key" => Fog::Nullable::String}, {:allow_optional_rules => false}) end end end end fog-softlayer-0.3.17/tests/helpers/collection_helper.rb0000644000076400007640000000524712424143106022247 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # def collection_tests(collection, params = {}, mocks_implemented = true) tests('success') do tests("#new(#{params.inspect})").succeeds do pending if Fog.mocking? && !mocks_implemented collection.new(params) end tests("#create(#{params.inspect})").succeeds do pending if Fog.mocking? && !mocks_implemented @instance = collection.create(params) end # FIXME: work around for timing issue on AWS describe_instances mocks if Fog.mocking? && @instance.respond_to?(:ready?) @instance.wait_for { ready? } end tests("#all").succeeds do pending if Fog.mocking? && !mocks_implemented collection.all end if !Fog.mocking? || mocks_implemented @identity = @instance.identity end tests("#get(#{@identity})").succeeds do pending if Fog.mocking? && !mocks_implemented collection.get(@identity) end tests('Enumerable') do pending if Fog.mocking? && !mocks_implemented methods = [ 'all?', 'any?', 'find', 'detect', 'collect', 'map', 'find_index', 'flat_map', 'collect_concat', 'group_by', 'none?', 'one?' ] # JRuby 1.7.5+ issue causes a SystemStackError: stack level too deep # https://github.com/jruby/jruby/issues/1265 if RUBY_PLATFORM == "java" and JRUBY_VERSION =~ /1\.7\.[5-8]/ methods.delete('all?') end methods.each do |enum_method| if collection.respond_to?(enum_method) tests("##{enum_method}").succeeds do block_called = false collection.send(enum_method) {|x| block_called = true } block_called end end end [ 'max_by','min_by' ].each do |enum_method| if collection.respond_to?(enum_method) tests("##{enum_method}").succeeds do block_called = false collection.send(enum_method) {|x| block_called = true; 0 } block_called end end end end if block_given? yield end if !Fog.mocking? || mocks_implemented @instance.destroy end end tests('failure') do if !Fog.mocking? || mocks_implemented @identity = @identity.to_s @identity = @identity.gsub(/[a-zA-Z]/) { Fog::Mock.random_letters(1) } @identity = @identity.gsub(/\d/) { Fog::Mock.random_numbers(1) } @identity end tests("#get('#{@identity}')").returns(nil) do pending if Fog.mocking? && !mocks_implemented collection.get(@identity) end end end fog-softlayer-0.3.17/tests/helpers/formats_helper_tests.rb0000644000076400007640000000724712424143106023013 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests('test_helper', 'meta') do tests('comparing welcome data against schema') do data = {:welcome => "Hello" } data_matches_schema(:welcome => String) { data } end tests('#data_matches_schema') do tests('when value matches schema expectation') do data_matches_schema({"key" => String}) { {"key" => "Value"} } end tests('when values within an array all match schema expectation') do data_matches_schema({"key" => [Integer]}) { {"key" => [1, 2]} } end tests('when nested values match schema expectation') do data_matches_schema({"key" => {:nested_key => String}}) { {"key" => {:nested_key => "Value"}} } end tests('when collection of values all match schema expectation') do data_matches_schema([{"key" => String}]) { [{"key" => "Value"}, {"key" => "Value"}] } end tests('when collection is empty although schema covers optional members') do data_matches_schema([{"key" => String}], {:allow_optional_rules => true}) { [] } end tests('when additional keys are passed and not strict') do data_matches_schema({"key" => String}, {:allow_extra_keys => true}) { {"key" => "Value", :extra => "Bonus"} } end tests('when value is nil and schema expects NilClass') do data_matches_schema({"key" => NilClass}) { {"key" => nil} } end tests('when value and schema match as hashes') do data_matches_schema({}) { {} } end tests('when value and schema match as arrays') do data_matches_schema([]) { [] } end tests('when value is a Time') do data_matches_schema({"time" => Time}) { {"time" => Time.now} } end tests('when key is missing but value should be NilClass (#1477)') do data_matches_schema({"key" => NilClass}, {:allow_optional_rules => true}) { {} } end tests('when key is missing but value is nullable (#1477)') do data_matches_schema({"key" => Fog::Nullable::String}, {:allow_optional_rules => true}) { {} } end end tests('#formats backwards compatible changes') do tests('when value matches schema expectation') do formats({"key" => String}) { {"key" => "Value"} } end tests('when values within an array all match schema expectation') do formats({"key" => [Integer]}) { {"key" => [1, 2]} } end tests('when nested values match schema expectation') do formats({"key" => {:nested_key => String}}) { {"key" => {:nested_key => "Value"}} } end tests('when collection of values all match schema expectation') do formats([{"key" => String}]) { [{"key" => "Value"}, {"key" => "Value"}] } end tests('when collection is empty although schema covers optional members') do formats([{"key" => String}]) { [] } end tests('when additional keys are passed and not strict') do formats({"key" => String}, false) { {"key" => "Value", :extra => "Bonus"} } end tests('when value is nil and schema expects NilClass') do formats({"key" => NilClass}) { {"key" => nil} } end tests('when value and schema match as hashes') do formats({}) { {} } end tests('when value and schema match as arrays') do formats([]) { [] } end tests('when value is a Time') do formats({"time" => Time}) { {"time" => Time.now} } end tests('when key is missing but value should be NilClass (#1477)') do formats({"key" => NilClass}) { {} } end tests('when key is missing but value is nullable (#1477)') do formats({"key" => Fog::Nullable::String}) { {} } end end end fog-softlayer-0.3.17/tests/helpers/mock_helper.rb0000644000076400007640000000110312424143106021030 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # # Use so you can run in mock mode from the command line # # FOG_MOCK=true fog if ENV["FOG_MOCK"] == "true" Fog.mock! end # if in mocked mode, fill in some fake credentials for us if Fog.mock? Fog.credentials = { :softlayer_username => 'sl-username', :softlayer_api_key => 'abcdefghijklmnopqrstuvwxyz', :softlayer_default_domain => 'example.com', :softlayer_cluster => 'dal05' }.merge(Fog.credentials) end fog-softlayer-0.3.17/tests/helpers/responds_to_helper.rb0000644000076400007640000000062412424143106022445 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Shindo class Tests def responds_to(method_names) for method_name in [*method_names] tests("#respond_to?(:#{method_name})").returns(true) do @instance.respond_to?(method_name) end end end end end fog-softlayer-0.3.17/tests/helpers/formats_helper.rb0000644000076400007640000000730512424143106021564 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require "fog/schema/data_validator" # format related hackery # allows both true.is_a?(Fog::Boolean) and false.is_a?(Fog::Boolean) # allows both nil.is_a?(Fog::Nullable::String) and ''.is_a?(Fog::Nullable::String) module Fog module Boolean; end module Nullable module Boolean; end module Integer; end module String; end module Time; end module Float; end module Hash; end module Array; end end end [FalseClass, TrueClass].each {|klass| klass.send(:include, Fog::Boolean)} [FalseClass, TrueClass, NilClass, Fog::Boolean].each {|klass| klass.send(:include, Fog::Nullable::Boolean)} [NilClass, String].each {|klass| klass.send(:include, Fog::Nullable::String)} [NilClass, Time].each {|klass| klass.send(:include, Fog::Nullable::Time)} [Integer, NilClass].each {|klass| klass.send(:include, Fog::Nullable::Integer)} [Float, NilClass].each {|klass| klass.send(:include, Fog::Nullable::Float)} [Hash, NilClass].each {|klass| klass.send(:include, Fog::Nullable::Hash)} [Array, NilClass].each {|klass| klass.send(:include, Fog::Nullable::Array)} module Shindo class Tests # Generates a Shindo test that compares a hash schema to the result # of the passed in block returning true if they match. # # The schema that is passed in is a Hash or Array of hashes that # have Classes in place of values. When checking the schema the # value should match the Class. # # Strict mode will fail if the data has additional keys. Setting # +strict+ to +false+ will allow additional keys to appear. # # @param [Hash] schema A Hash schema # @param [Hash] options Options to change validation rules # @option options [Boolean] :allow_extra_keys # If +true+ does not fail when keys are in the data that are # not specified in the schema. This allows new values to # appear in API output without breaking the check. # @option options [Boolean] :allow_optional_rules # If +true+ does not fail if extra keys are in the schema # that do not match the data. Not recommended! # @yield Data to check with schema # # @example Using in a test # Shindo.tests("comparing welcome data against schema") do # data = {:welcome => "Hello" } # data_matches_schema(:welcome => String) { data } # end # # comparing welcome data against schema # + data matches schema # # @example Example schema # { # "id" => String, # "ram" => Integer, # "disks" => [ # { # "size" => Float # } # ], # "dns_name" => Fog::Nullable::String, # "active" => Fog::Boolean, # "created" => DateTime # } # # @return [Boolean] def data_matches_schema(schema, options = {}) test('data matches schema') do validator = Fog::Schema::DataValidator.new valid = validator.validate(yield, schema, options) @message = validator.message unless valid valid end end # @deprecated #formats is deprecated. Use #data_matches_schema instead def formats(format, strict = true) test('has proper format') do if strict options = {:allow_extra_keys => false, :allow_optional_rules => true} else options = {:allow_extra_keys => true, :allow_optional_rules => true} end validator = Fog::Schema::DataValidator.new valid = validator.validate(yield, format, options) @message = validator.message unless valid valid end end end end fog-softlayer-0.3.17/tests/helpers/succeeds_helper.rb0000644000076400007640000000043612424143106021705 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Shindo class Tests def succeeds test('succeeds') do !!instance_eval(&Proc.new) end end end end fog-softlayer-0.3.17/tests/helper.rb0000644000076400007640000000245312424143106016366 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'simplecov' require 'securerandom' if ENV['COVERAGE'] == 'true' && RUBY_VERSION != "1.9.2" require 'coveralls' SimpleCov.command_name "shindo:#{Process.pid.to_s}" SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ SimpleCov::Formatter::HTMLFormatter, Coveralls::SimpleCov::Formatter ] SimpleCov.merge_timeout 3600 SimpleCov.start end ENV['FOG_RC'] = ENV['FOG_RC'] || File.expand_path('../.fog', __FILE__) ENV['FOG_CREDENTIAL'] = ENV['FOG_CREDENTIAL'] || 'default' require 'fog/core' Excon.defaults.merge!(:debug_request => true, :debug_response => true) require File.expand_path(File.join(File.dirname(__FILE__), 'helpers', 'mock_helper')) Fog.mock! if ENV['FOG_MOCK'] # This overrides the default 600 seconds timeout during live test runs if Fog.mocking? FOG_TESTING_TIMEOUT = ENV['FOG_TEST_TIMEOUT'] || 2000 Fog.timeout = 2000 Fog::Logger.warning "Setting default fog timeout to #{Fog.timeout} seconds" else FOG_TESTING_TIMEOUT = Fog.timeout end def lorem_file File.open(File.dirname(__FILE__) + '/lorem.txt', 'r') end def array_differences(array_a, array_b) (array_a - array_b) | (array_b - array_a) end fog-softlayer-0.3.17/tests/softlayer/0000755000076400007640000000000012424143106016566 5ustar pravipravifog-softlayer-0.3.17/tests/softlayer/compute/0000755000076400007640000000000012424143106020242 5ustar pravipravifog-softlayer-0.3.17/tests/softlayer/compute/schema.rb0000644000076400007640000001300712424143106022030 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Softlayer module Nullable module Account; end module BareMetal; end module Collected; end module Collection; end module VirtualGuest; end module Image; end module IPV4; end module LoadBalancer; end end end end Hash.send :include, Fog::Softlayer::Nullable::Account NilClass.send :include, Fog::Softlayer::Nullable::Account Hash.send :include, Fog::Softlayer::Nullable::BareMetal NilClass.send :include, Fog::Softlayer::Nullable::BareMetal Hash.send :include, Fog::Softlayer::Nullable::Collected NilClass.send :include, Fog::Softlayer::Nullable::Collected Hash.send :include, Fog::Softlayer::Nullable::Collection NilClass.send :include, Fog::Softlayer::Nullable::Collection Hash.send :include, Fog::Softlayer::Nullable::VirtualGuest NilClass.send :include, Fog::Softlayer::Nullable::VirtualGuest Hash.send :include, Fog::Softlayer::Nullable::Image NilClass.send :include, Fog::Softlayer::Nullable::Image Hash.send :include, Fog::Softlayer::Nullable::IPV4 NilClass.send :include, Fog::Softlayer::Nullable::IPV4 Hash.send :include, Fog::Softlayer::Nullable::LoadBalancer NilClass.send :include, Fog::Softlayer::Nullable::LoadBalancer class Softlayer module Compute module Formats module Struct ## nothing here yet end module BareMetal SERVER = { "accountId" => String, "createDate" => String, "dedicatedAccountHostOnlyFlag" => Fog::Nullable::Boolean, "domain" => Fog::Nullable::String, "fullyQualifiedDomainName" => Fog::Nullable::String, "hostname" => Fog::Nullable::String, "id" => String, "lastPowerStateId" => Fog::Nullable::String, "lastVerifiedDate" => Fog::Nullable::String, "maxCpu" => Fog::Nullable::String, "maxCpuUnits" => String, "maxMemory" => Fog::Nullable::String, "metricPollDate" => Fog::Nullable::String, "modifyDate" => Fog::Nullable::String, "startCpus" => Fog::Nullable::String, "statusId" => Integer, "globalIdentifier" => String } TAGS = { 'empRecordId'=>nil, 'id'=>String, 'resourceTableId'=>Integer, 'tagId'=> Fog::Nullable::String, 'tagTypeId'=>Fog::Nullable::Integer, 'usrRecordId'=>Fog::Nullable::Integer, 'tag'=>{'accountId'=>Integer, 'id'=>String, 'internal'=>Integer, 'name'=>String}, 'tagType'=>{'description'=>String, 'keyName'=>String} } end module VirtualGuest SERVER = { "accountId" => String, "createDate" => String, "dedicatedAccountHostOnlyFlag" => Fog::Nullable::Boolean, "domain" => String, "fullyQualifiedDomainName" => Fog::Nullable::String, "hostname" => String, "id" => String, "lastPowerStateId" => Fog::Nullable::String, "lastVerifiedDate" => Fog::Nullable::String, "maxCpu" => Fog::Nullable::String, "maxCpuUnits" => String, "maxMemory" => Integer, "metricPollDate" => Fog::Nullable::String, "modifyDate" => Fog::Nullable::String, "startCpus" => Integer, "statusId" => Integer, "globalIdentifier" => String } TAGS = { 'empRecordId'=>nil, 'id'=>String, 'resourceTableId'=>Integer, 'tagId'=> Fog::Nullable::String, 'tagTypeId'=>Fog::Nullable::Integer, 'usrRecordId'=>Fog::Nullable::Integer, 'tag'=>{'accountId'=>Integer, 'id'=>String, 'internal'=>Integer, 'name'=>String}, 'tagType'=>{'description'=>String, 'keyName'=>String} } end module KeyPair KP = { "createDate" => String, "fingerprint" => String, "id" => Integer, "key" => String, "label" => String, "modifyDate" => Fog::Nullable::String, } end module Collected SERVER = { :id => Fog::Nullable::Integer, :hostname => Fog::Nullable::String, :domain => Fog::Nullable::String, :fqdn => Fog::Nullable::String, :cpu => Fog::Nullable::String, :ram => Fog::Nullable, :disk => Fog::Nullable::Array, :private_ip_address => Fog::Nullable::String, :public_ip_address => Fog::Nullable::String, :flavor_id => Fog::Nullable::String, :bare_metal => Fog::Nullable::Boolean, :os_code => Fog::Nullable::String, :image_id => Hash, :ephemeral_storage => Fog::Nullable::Boolean, :created_at => Fog::Nullable::Time, :last_verified_date => Fog::Nullable::Time, :metric_poll_date => Fog::Nullable::Time, :modify_date => Fog::Nullable::Time, :account_id => Fog::Nullable::Integer, :datacenter => Fog::Nullable::String, :single_tenant => Fog::Nullable::Boolean, :global_identifier => Fog::Nullable::String, :hourly_billing_flag => Fog::Nullable::Boolean, } end module Collection SERVERS = [Softlayer::Compute::Formats::Collected::SERVER] end end end end fog-softlayer-0.3.17/tests/softlayer/compute/helper.rb0000644000076400007640000000032112424143106022042 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require File.expand_path("schema", File.dirname(__FILE__)) fog-softlayer-0.3.17/tests/softlayer/helper.rb0000644000076400007640000000032712424143106020374 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/softlayer' Excon.defaults[:ssl_verify_peer] = false fog-softlayer-0.3.17/tests/softlayer/requests/0000755000076400007640000000000012424143106020441 5ustar pravipravifog-softlayer-0.3.17/tests/softlayer/requests/compute/0000755000076400007640000000000012424143106022115 5ustar pravipravifog-softlayer-0.3.17/tests/softlayer/requests/compute/bmc_tests.rb0000644000076400007640000000425512424143106024433 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Compute[:softlayer] | server requests", ["softlayer"]) do tests('success') do @sl_connection = Fog::Compute[:softlayer] @bmc = { :operatingSystemReferenceCode => 'UBUNTU_LATEST', :processorCoreAmount => 2, :memoryCapacity => 2, :hourlyBillingFlag => true, :domain => 'example.com', :hostname => 'test', :datacenter => { :name => 'wdc01' } } tests("#create_bare_metal_server('#{@bmc}')") do response = @sl_connection.create_bare_metal_server(@bmc) @server_id = response.body['id'] data_matches_schema(Softlayer::Compute::Formats::BareMetal::SERVER, {:allow_extra_keys => true}) { response.body } data_matches_schema(201) { response.status } end tests("#get_bare_metal_servers()") do @sl_connection.get_bare_metal_servers.body.each do |bms| data_matches_schema(Softlayer::Compute::Formats::BareMetal::SERVER) { bms } end end tests("#delete_bare_metal_server('#{@server_id})'") do response = @sl_connection.delete_bare_metal_server(@server_id) data_matches_schema(true) {response.body} data_matches_schema(200) {response.status} end end tests('failure') do bmc = @bmc.dup; bmc.delete(:hostname) tests("#create_bare_metal_server('#{bmc}')") do response = @sl_connection.create_bare_metal_server(bmc) data_matches_schema('SoftLayer_Exception_MissingCreationProperty'){ response.body['code'] } data_matches_schema(500){ response.status } end tests("#create_bare_metal_server(#{[@bmc]}").raises(ArgumentError) do @sl_connection.create_bare_metal_server([@bmc]) end tests("#delete_bare_metal_server('99999999999999')'") do response = @sl_connection.delete_bare_metal_server(99999999999999) data_matches_schema(String) {response.body} data_matches_schema(500) {response.status} end end end fog-softlayer-0.3.17/tests/softlayer/requests/compute/vm_tests.rb0000644000076400007640000000561512424143106024315 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Compute[:softlayer] | server requests", ["softlayer"]) do @sl_connection = Fog::Compute[:softlayer] @vms = [{ :hostname => "host1", :domain => "example.com", :startCpus => 1, :maxMemory => 1024, :hourlyBillingFlag => true, :localDiskFlag => true, :operatingSystemReferenceCode => "UBUNTU_LATEST" }, { :hostname => "host2", :domain => "example.com", :startCpus => 1, :maxMemory => 1024, :hourlyBillingFlag => true, :localDiskFlag => true, :operatingSystemReferenceCode => "UBUNTU_LATEST" } ] @vm = @vms.first tests('success') do tests("#create_vms('#{@vms}')") do response = @sl_connection.create_vms(@vms) #data_matches_schema(Softlayer::Compute::Formats::VirtualGuest::SERVER, {:allow_extra_keys => true}) { response.body.first } data_matches_schema(200) { response.status } end tests("#create_vm('#{@vm}')") do response = @sl_connection.create_vm(@vm) @vm_id = response.body.first['id'] #data_matches_schema([Softlayer::Compute::Formats::VirtualGuest::SERVER], {:allow_extra_keys => true}) { response.body } data_matches_schema(200) { response.status } end tests"#get_vms()" do response = @sl_connection.get_vms data_matches_schema(200) { response.status } #data_matches_schema(Softlayer::Compute::Formats::VirtualGuest::SERVER) { vm } end tests("#delete_vm('#{@vm_id})'") do response = @sl_connection.delete_vm(@vm_id) data_matches_schema(true) {response.body} data_matches_schema(200) {response.status} end end tests('failure') do vms = @vms.dup; vms.first.delete(:hostname) tests("#create_vms('#{vms}')") do response = @sl_connection.create_vms(vms) data_matches_schema('SoftLayer_Exception_MissingCreationProperty'){ response.body['code'] } data_matches_schema(500){ response.status } end vm = @vm.dup; vm.delete('domain') tests("#create_vm('#{vm}')") do response = @sl_connection.create_vm(vm) data_matches_schema('SoftLayer_Exception_MissingCreationProperty'){ response.body['code'] } data_matches_schema(500){ response.status } end tests("#create_vms(#{@vm}").raises(ArgumentError) do @sl_connection.create_vms(@vm) end tests("#create_vm(#{@vms}").raises(ArgumentError) do @sl_connection.create_vm(@vms) end tests("#delete_vm('99999999999999')'") do response = @sl_connection.delete_vm(99999999999999) data_matches_schema(String) {response.body} data_matches_schema(500) {response.status} end end end fog-softlayer-0.3.17/tests/softlayer/requests/compute/tag_tests.rb0000644000076400007640000000722712424143106024447 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Compute[:softlayer] | tag requests", ["softlayer"]) do @sl_connection = Fog::Compute[:softlayer] opts = { :flavor_id => 'm1.small', :os_code => 'UBUNTU_LATEST', :name => 'matt', :datacenter => 'dal05', :domain => 'example.com', :bare_metal => false} @vm = @sl_connection.servers.create(opts) opts[:bare_metal] = true @bmc = @sl_connection.servers.create(opts) test_tags = ['foo', 'bar', 'baz'] tests('success') do tests("#create_vm_tags('#{@vm.id}', #{test_tags})") do returns(true, "returns true") { @sl_connection.create_vm_tags(@vm.id, test_tags).body} end tests("#create_bare_metal_tags('#{@bmc.id}', #{test_tags})") do returns(true, "returns true") { @sl_connection.create_bare_metal_tags(@bmc.id, test_tags).body } end tests("#get_vm_tags('#{@vm.id}')") do data_matches_schema(Softlayer::Compute::Formats::VirtualGuest::TAGS, {:allow_extra_keys => true}) { @sl_connection.get_vm_tags(@vm.id).body['tagReferences'].first } end tests("#get_bare_metal_tags('#{@bmc.id}')") do data_matches_schema(Softlayer::Compute::Formats::BareMetal::TAGS, {:allow_extra_keys => true}) { @sl_connection.get_bare_metal_tags(@bmc.id).body['tagReferences'].first } end tests("#delete_vm_tags('#{@vm.id}')") do returns(3, "three tags for VM with id #{@vm.id}") { @sl_connection.get_vm_tags(@vm.id).body['tagReferences'].count } returns(true, "returns true") { @sl_connection.delete_vm_tags(@vm.id, ['foo', 'bar']).body } returns(1, "one tag remains for VM with id #{@vm.id}") { @sl_connection.get_vm_tags(@vm.id).body['tagReferences'].count } end tests("#delete_bare_metal_tags('#{@bmc.id}')") do returns(3, "three tags for BM server with id #{@bmc.id}") { @sl_connection.get_bare_metal_tags(@bmc.id).body['tagReferences'].count } returns(true, "returns true") { @sl_connection.delete_bare_metal_tags(@bmc.id, ['foo', 'bar']).body } returns(1, "one tag remains for BM server with id #{@bmc.id}") { @sl_connection.get_bare_metal_tags(@bmc.id).body['tagReferences'].count } end end tests('failure') do tests("#create_vm_tags(123456789, #{test_tags})") do returns(404, "server doesn't exist") { @sl_connection.create_vm_tags(123456789).status } end tests("#create_bare_metal_tags(123456789, #{test_tags})") do returns(404, "server doesn't exist") { @sl_connection.create_bare_metal_tags(123456789).status } end tests("#get_vm_tags(123456789)") do returns(404, "server doesn't exist") { @sl_connection.get_vm_tags(123456789).status } end tests("#get_bare_metal_tags(123456789)") do returns(404, "server doesn't exist") { @sl_connection.get_bare_metal_tags(123456789).status } end tests("#delete_vm_tags(123456789, #{test_tags})") do returns(404, "server doesn't exist") { @sl_connection.delete_vm_tags(123456789, test_tags).status } end tests("#delete_bare_metal_tags(123456789, #{test_tags})") do returns(404, "server doesn't exist") { @sl_connection.delete_bare_metal_tags(123456789, test_tags).status } end tests("#delete_bare_metal_tags(123456789, #{test_tags})") do returns(404, "server doesn't exist") { @sl_connection.delete_bare_metal_tags(123456789, test_tags).status } end tests("#create_vm_tags").raises(ArgumentError) do @sl_connection.create_vm_tags(@vm.id, 'foo') end tests("#create_bare_metal_tags").raises(ArgumentError) do @sl_connection.create_bare_metal_tags(@vm.id, 'foo') end end end fog-softlayer-0.3.17/tests/softlayer/requests/compute/key_pair_tests.rb0000644000076400007640000000473212424143106025475 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Compute[:softlayer] | key_pair requests", ["softlayer"]) do @sl_connection = Fog::Compute[:softlayer] opts = { :flavor_id => 'm1.small', :os_code => 'UBUNTU_LATEST', :name => 'matt', :datacenter => 'dal05', :domain => 'example.com', :bare_metal => false} @vm = @sl_connection.servers.create(opts) opts[:bare_metal] = true @bmc = @sl_connection.servers.create(opts) @key_gen = Proc.new { string='ssh-rsa '; while string.length < 380 do; string << Fog::Mock.random_base64(1); end; string; } @kp1 = @sl_connection.key_pairs.new @kp1.label = 'test-key-1' @kp1.key = @key_gen.call @kp1.save tests('success') do tests("#create_key_pair") do key = @sl_connection.create_key_pair(:key => @key_gen.call, :label => 'test-key-tmp') @kp2 = @sl_connection.key_pairs.get(key.body['id']) returns(200) { key.status } data_matches_schema(Integer) { key.body['id'] } end tests("#get_key_pairs") do data_matches_schema([Softlayer::Compute::Formats::KeyPair::KP]) { @sl_connection.get_key_pairs.body} returns(200) { @sl_connection.get_key_pairs.status } returns(2) { @sl_connection.get_key_pairs.body.count } end tests("#get_key_pair(#{@kp1.id}") do data_matches_schema(Softlayer::Compute::Formats::KeyPair::KP) { @sl_connection.get_key_pair(@kp1.id).body } end tests("#update_key_pair(#{@kp1.id}, 'label' => 'some-new-name'}") do returns(true) { @sl_connection.update_key_pair(@kp1.id, 'label' => 'some-new-name').body } returns('some-new-name') { @sl_connection.get_key_pair(@kp1.id).body['label'] } end tests("#delete_key_pair(#{@kp1.id}") do returns(true) { @sl_connection.delete_key_pair(@kp1.id).body } returns(1) { @sl_connection.get_key_pairs.body.count } end end tests('failure') do tests("#get_key_pair").raises(ArgumentError) do @sl_connection.get_key_pair end tests("#get_key_pair(#{@kp1.id}") do returns(404) { @sl_connection.get_key_pair(@kp1.id).status } end tests("#update_key_pair(#{@kp1.id}, 'label' => 'random thing'") do returns(404) { @sl_connection.update_key_pair(@kp1.id, 'label' => 'random thing' ).status } end tests("#delete_key_pair(#{@kp1.id}") do returns(404) { @sl_connection.delete_key_pair(@kp1.id).status } end end end fog-softlayer-0.3.17/tests/softlayer/requests/network/0000755000076400007640000000000012424143106022132 5ustar pravipravifog-softlayer-0.3.17/tests/softlayer/requests/network/network_tests.rb0000644000076400007640000000767612424143106025412 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Network[:softlayer] | network requests", ["softlayer"]) do @sl = Fog::Network[:softlayer] @order = { 'complexType' => 'SoftLayer_Container_Product_Order_Network_Vlan', 'name' => 'test-vlan', 'routerId' => 1234, 'router' => 'fcr01a.xxx01', 'location' => 1234, 'quantity' =>1, 'packageId' =>0, 'prices' =>[ {'id' => 42 }, {'id' => 42 }, ] } tests('success') do tests("#get_private_vlan_price_code") do data_matches_schema(Integer) { @sl.get_private_vlan_price_code } end tests("#get_public_vlan_price_code") do data_matches_schema(Integer) { @sl.get_public_vlan_price_code } end tests("#get_subnet_package_id") do data_matches_schema(Integer) { @sl.get_subnet_package_id } end tests("#get_subnet_price_code") do data_matches_schema(Integer) { @sl.get_subnet_price_code } end tests("#create_network(#{@order})") do returns(@order['router']) { @sl.create_network(@order).body['orderDetails']['router']['hostname'] } returns(200) { @sl.create_network(@order).status } end tests("#list_networks") do @network_ids = @sl.list_networks.body.map { |vlan| vlan['id'] } returns(2) { @network_ids.count } end tests("#get_network(#{@network_ids[0]})") do returns(200) { @sl.get_network(@network_ids[0]).status} returns(200) { @sl.get_network(@network_ids[1]).status} end tests("#create_network_tags(#{@network_ids[0]}, ['sparkle', 'motion'])") do returns(200) { @sl.create_network_tags(@network_ids[0], ['sparkle', 'motion']).status } end tests("#get_network_tags(#{@network_ids[0]})") do tags = @sl.get_network_tags(@network_ids[0]).body['tagReferences'].map { |ref| ref['tag']['name'] } returns(2) { tags.count } returns(true) { ['sparkle', 'motion'].include?(tags[0]) } returns(true) { ['sparkle', 'motion'].include?(tags[1]) } end tests("#delete_network_tags(#{@network_ids[0]}, ['sparkle'])") do returns(200) { @sl.delete_network_tags(@network_ids[0], ['sparkle']).status } tags = @sl.get_network_tags(@network_ids[0]).body['tagReferences'].map { |ref| ref['tag']['name'] } returns(1) { tags.count } returns(false) { ['sparkle'].include?( tags[0]) } returns(true) { ['motion'].include?( tags[0]) } end tests("#delete_network(#{@network_ids[1]})") do response = @sl.delete_network(@network_ids[1]) returns(200) { response.status } returns(true) { response.body } end end tests('failure') do tests("#create_network").raises(ArgumentError) do @sl.create_network end tests("#get_network").raises(ArgumentError) do @sl.get_network end tests("#get_network(#{@network_ids[1]})") do returns(404) { @sl.get_network(@network_ids[1]).status } end tests("#create_network_tags(#{@network_ids[1]}, ['sparkle', 'motion'])") do returns(404) { @sl.create_network_tags(@network_ids[1], ['sparkle', 'motion']).status } end tests("#create_network_tags(#{@network_ids[0]}, 'sparkle,motion')").raises(ArgumentError) do @sl.create_network_tags(@network_ids[0], 'sparkle,motion').status end tests("#get_network_tags(#{@network_ids[1]})") do returns(404) { @sl.get_network_tags(@network_ids[1]).status } end tests("#delete_network_tags(#{@network_ids[1]}, ['sparkle'])") do returns(404) { @sl.delete_network_tags(@network_ids[1], ['sparkle']).status } end tests("#delete_network_tags(#{@network_ids[0]}, 'sparkle')").raises(ArgumentError) do @sl.delete_network_tags(@network_ids[0], 'sparkle').status end tests("#delete_network(#{@network_ids[1]})") do returns(404) { @sl.delete_network(@network_ids[1]).status } end end end fog-softlayer-0.3.17/tests/softlayer/requests/storage/0000755000076400007640000000000012424143106022105 5ustar pravipravifog-softlayer-0.3.17/tests/softlayer/requests/storage/auth_tests.rb0000644000076400007640000000052412424143106024616 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Storage[:softlayer] | auth_tests", ["softlayer"]) do tests('success') do pending if Fog.mocking? end tests('failure') do pending if Fog.mocking? end end fog-softlayer-0.3.17/tests/softlayer/requests/storage/container_tests.rb0000644000076400007640000000304512424143106025640 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Storage[:softlayer] | container_tests", ["softlayer"]) do @storage = Fog::Storage[:softlayer] @container = 'example-testing' tests('success') do # should be an empty array tests("#get_containers") do data_matches_schema(Array) { @storage.get_containers.body} end # should get an empty body w/ 201 status tests("#put_container(#{@container})") do response = @storage.put_container(@container) data_matches_schema(201) { response.status } data_matches_schema('') { response.body } end tests("#get_container(#{@container})") do response = @storage.get_container(@container) data_matches_schema(200) { response.status } data_matches_schema(Array) { response.body } end tests("#delete_container") do response = @storage.delete_container(@container) data_matches_schema(204) { response.status} data_matches_schema('') { response.body } end end tests('failure') do tests("#get_container('swing-and-a-miss')") do data_matches_schema(404) { @storage.get_container('foo-bar-baz-bang').status } end tests("#delete_container") do response = @storage.delete_container('sdfgsdgsdfgsdfg') data_matches_schema(404) { response.status } data_matches_schema('

Not Found

The resource could not be found.

') { response.body } end end end fog-softlayer-0.3.17/tests/softlayer/requests/storage/object_tests.rb0000644000076400007640000000457512424143106025135 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Storage[:softlayer] | container_tests", ["softlayer"]) do @storage = Fog::Storage[:softlayer] @container = 'example-testing' @object1 = 'test-object' @object2 = 'test-object-2' @object3 = 'test-object-3' @storage.put_container(@container) tests('success') do tests("#put_object") do response = @storage.put_object(@container, @object1, 'The quick brown fox jumps over the lazy dog.') data_matches_schema(201) { response.status } data_matches_schema('') { response.body } @storage.put_object(@container, @object2, 'The quick brown fox jumps over the lazy dog, again.') data_matches_schema(201) { response.status } data_matches_schema('') { response.body } end tests("#get_object") do response = @storage.get_object(@container, @object2) data_matches_schema(200) { response.status } data_matches_schema('The quick brown fox jumps over the lazy dog, again.') { response.body } end tests("#copy_object") do @storage.copy_object(@container, @object2, @container, @object3) response = @storage.get_object(@container, @object3) data_matches_schema(200) { response.status } end tests("#get_object_https_url") do url = @storage.get_object_https_url(@container, @object1, Time.now + 300) data_matches_schema(String) { url } end tests("#delete_object") do response = @storage.delete_object(@container, @object2) data_matches_schema(204) { response.status} data_matches_schema('') { response.body } end end tests('failure') do tests("#get_object('non-existent-container', 'non-existent-object')") do data_matches_schema(404) { @storage.get_container('non-existent-container', 'non-existent-object').status } end tests("#get_object(#{@container}, 'non-existent-object')") do data_matches_schema(404) { @storage.get_container('non-existent-container', 'non-existent-object').status } end tests('#delete_object') do response = @storage.delete_object(@container, 'foobarbangbaz') data_matches_schema(404) { response.status } data_matches_schema('

Not Found

The resource could not be found.

') { response.body } end end end fog-softlayer-0.3.17/tests/softlayer/models/0000755000076400007640000000000012424143106020051 5ustar pravipravifog-softlayer-0.3.17/tests/softlayer/models/compute/0000755000076400007640000000000012424143106021525 5ustar pravipravifog-softlayer-0.3.17/tests/softlayer/models/compute/image_tests.rb0000644000076400007640000000107712424143106024363 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Compute[:softlayer] | Image model", ["softlayer"]) do pending if Fog.mocking? tests("success") do @service = Fog::Compute[:softlayer] tests("#all") do @image = @service.images.all.first returns(Fog::Compute::Softlayer::Image) { @image.class } end tests("#get") do returns(Fog::Compute::Softlayer::Image) { @service.images.get(@image.id).class } end end end fog-softlayer-0.3.17/tests/softlayer/models/compute/server_tests.rb0000644000076400007640000000562412424143106024611 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Compute[:softlayer] | Server model", ["softlayer"]) do pending unless Fog.mocking? tests("success") do vm_opts = { :flavor_id => 'm1.small', :image_id => '23f7f05f-3657-4330-8772-329ed2e816bc', :name => 'test-vm', :domain => 'example.com', :datacenter => 'dal05', :bare_metal => false } bmc_opts = { :flavor_id => 'm1.small', :os_code => 'UBUNTU_LATEST', :name => 'test-bmc', :domain => 'bare-metal-server.com', :datacenter => 'dal05', :bare_metal => true } @vm = Fog::Compute[:softlayer].servers.new(vm_opts) @bmc = Fog::Compute[:softlayer].servers.new(bmc_opts) ## defaults should be as exactly().timespected tests("#hourly_billing_flag") do returns(true) { @vm.hourly_billing_flag } end tests("#ephemeral_storage") do returns(false) { @vm.ephemeral_storage } end ## this should just function as an alias tests("#dns_name") do returns(@vm.dns_name) { @vm.fqdn } end tests("#name=") do @bmc.name = "new-test-bmc" returns(true) { @bmc.name == @bmc.attributes[:hostname] and @bmc.name == "new-test-bmc" } end tests("#ram=") do @bmc.ram = [{'hardwareComponentModel' => { 'capacity' => 4}}] returns(4096) { @bmc.ram } end ## the bare_metal? method should tell the truth tests("#bare_metal?") do returns(false) { @vm.bare_metal? } returns(true) { @bmc.bare_metal? } end tests("#save") do returns(true) { @vm.save } end end tests ("failure") do # should not allow Virtual Guests creation without bare_metal flag tests(".new").raises(Exception) do # As we don't have fixture I don't touch original vm_opts nobm_vm_opts = vm_opts.clone nobm_vm_opts.delete(:bare_metal) Fog::Compute[:softlayer].servers.new(nobm_vm_opts) end # should not allow Bare Metal creation without bare_metal flag tests(".new").raises(Exception) do # As we don't have fixture I don't touch original bmc_opts nobm_bmc_opts = bmc_opts.clone nobm_bmc_opts.delete(:bare_metal) Fog::Compute[:softlayer].servers.new(nobm_bmc_opts) end # should not allow a set bare_metal flag manually on Virtual Guests tests("#bare_metal=").raises(NoMethodError) do @vm.bare_metal = true end # should not allow a set bare_metal flag manually on Bare Metal Servers tests("#bare_metal=").raises(NoMethodError) do @vm.bare_metal = false end # should not allow a second save tests("#save").raises(Fog::Errors::Error) do @vm.save end tests("#destroy").raises(ArgumentError) do @bmc.destroy end @vm.destroy end end fog-softlayer-0.3.17/tests/softlayer/models/compute/flavor_tests.rb0000644000076400007640000000102512424143106024563 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Compute[:softlayer] | Flavor model", ["softlayer"]) do tests("success") do @service = Fog::Compute[:softlayer] tests("#all") do returns(Fog::Compute::Softlayer::Flavor) { @service.flavors.all.first.class } end tests("#get") do returns(Fog::Compute::Softlayer::Flavor) { @service.flavors.get('m1.tiny').class } end end end fog-softlayer-0.3.17/tests/softlayer/models/compute/key_pair_tests.rb0000644000076400007640000000241212424143106025076 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Compute[:softlayer] | KeyPair model", ["softlayer"]) do pending unless Fog.mocking? @sl_connection = Fog::Compute[:softlayer] @key_gen = Proc.new { string='ssh-rsa '; while string.length < 380 do; string << Fog::Mock.random_base64(1); end; string; } @kp1 = @sl_connection.key_pairs.create(:label => 'test-key-1', :key => @key_gen.call) tests("success") do tests("#label=") do returns('new-label') { @kp1.label = 'new-label' } end tests("#label") do returns('new-label') { @kp1.label} end tests("#key=") do @new_key_value = @key_gen.call returns(@new_key_value) { @kp1.key = @new_key_value } end tests("#key") do returns(@new_key_value) { @kp1.key } end tests("#create(:label => 'test-key-2', :key => #{@key_gen.call}") do data_matches_schema(Fog::Compute::Softlayer::KeyPair) { @sl_connection.key_pairs.create(:label => 'test-key-2', :key => @key_gen.call)} end tests("#destroy") do returns(true) { @sl_connection.key_pairs.first.destroy } end end tests ("failure") do # ToDo: Failure cases. end end fog-softlayer-0.3.17/tests/softlayer/models/dns/0000755000076400007640000000000012424143106020635 5ustar pravipravifog-softlayer-0.3.17/tests/softlayer/models/dns/domains_tests.rb0000644000076400007640000000542012424143106024037 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::DNS[:softlayer] | Domains model", ["softlayer"]) do @service = Fog::DNS[:softlayer] tests("success") do tests("#create") do name = "fog-domain-"+SecureRandom.random_number(36**12).to_s(36).rjust(12, "0") + ".com" @domain = @service.domains.create(name) returns(Fog::DNS::Softlayer::Domain) { @service.domains.get(@domain.id).class } returns(@domain.name, "returns the object with correct name") { @service.domains.get(@domain.id).name } @domain.destroy end tests("#all") do # Setup # Not made on before block to make test fast name1 = "fog-domain1-"+SecureRandom.random_number(36**12).to_s(36).rjust(12, "0") + ".com" @domain1 = @service.domains.create(name1) name2 = "fog-domain2-"+SecureRandom.random_number(36**12).to_s(36).rjust(12, "0") + ".com" @domain2 = @service.domains.create(name2) name3 = "fog-domain3-"+SecureRandom.random_number(36**12).to_s(36).rjust(12, "0") + ".com" @domain3 = @service.domains.create(name3) # Tests if we get the 3 domains we created @domains = @service.domains.all @domains.each do |domain| returns(Fog::DNS::Softlayer::Domain, "returns a "+domain.name) { domain.class } end # Check ifs domains we created are included domains_names = @domains.map { |domain| domain.name } returns(true, "contains domain 1 with name "+@domain1.name) { domains_names.include? @domain1.name } returns(true, "contains domain 2 with name "+@domain2.name) { domains_names.include? @domain2.name } returns(true, "contains domain 3 with name "+@domain3.name) { domains_names.include? @domain3.name } # Made this way so test pass even theres other domains on account returns(true, "returns at least 3 domains") { @domains.count >= 3 } # Teardown # Do not leave test domains on my account @domain1.destroy @domain2.destroy @domain3.destroy end name = "fog-domain-"+SecureRandom.random_number(36**12).to_s(36).rjust(12, "0") + ".com" @domain = @service.domains.create(name) tests("#get") do returns(Fog::DNS::Softlayer::Domain) { @service.domains.get(@domain.id).class } returns(@domain.name, "returns the object with correct name") { @service.domains.get(@domain.id).name } end tests("#get_by_name") do returns(Fog::DNS::Softlayer::Domain) { @service.domains.get_by_name(@domain.name).class } returns(@domain.name, "returns the object with correct name") { @service.domains.get_by_name(@domain.name).name } end @domain.destroy end end fog-softlayer-0.3.17/tests/softlayer/models/dns/record_tests.rb0000644000076400007640000000425612424143106023671 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::DNS[:softlayer] | Record model", ["softlayer"]) do @service = Fog::DNS[:softlayer] tests("success") do # Setup name = "fog-domain-"+SecureRandom.random_number(36**12).to_s(36).rjust(12, "0") + ".com" @domain = @service.domains.create(name) tests("#save") do record = { 'data' => '127.0.0.1', 'host' => '@', 'type' => 'a' } current_serial = @domain.serial @record = @domain.create_record(record) @domain.reload @domain.records(true) returns(4, "returns default plus one created, total 4 records") { @domain.records.count } returns(true, "returns serial increased") { (current_serial + 1) <= @domain.serial } returns("127.0.0.1", "returns the right value for created record") { @domain.records.last.value } @domain.records.last.value = "192.168.0.1" current_serial = @domain.serial @domain.records.last.save @domain.records(true) @domain.reload returns(4, "returns 4 records (no duplicated)") { @domain.records.count } returns("192.168.0.1", "returns the right value for updated record") { @domain.records.last.value } returns(true, "returns serial increased") { (current_serial + 1) <= @domain.serial } end tests("#get") do @record_get = @service.records.get(@record.id) returns(Fog::DNS::Softlayer::Record) { @record_get.class } tests("after updating the record") do @record_get.value = "192.168.10.1" @record_get.save @record_get.reload returns("192.168.10.1", "returns right value") { @record_get.value } end end tests("#destroy") do current_serial = @domain.serial @domain.records.last.destroy @domain.records(true) @domain.reload returns(true, "returns serial increased") { (current_serial + 1) <= @domain.serial } returns(3, "returns default records for domain (last was deleted)") { @domain.records.count } end # Teardown @domain.destroy end end fog-softlayer-0.3.17/tests/softlayer/models/dns/domain_tests.rb0000644000076400007640000000311312424143106023651 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::DNS[:softlayer] | Domain model", ["softlayer"]) do tests("success") do @service = Fog::DNS[:softlayer] # Setup name = "fog-domain-"+SecureRandom.random_number(36**12).to_s(36).rjust(12, "0") + ".com" @domain = @service.domains.create(name) tests("#records") do returns(3, "returns 3 default records (SOA / NS1 / NS2)") { @domain.records.count } end tests("#create_record") do record = { 'data' => '127.0.0.1', 'host' => '@', 'type' => 'a' } current_serial = @domain.serial @domain.create_record(record) @domain.records(true) @domain.reload returns(true, "returns serial increased") { (current_serial.to_i + 1) <= @domain.serial } returns(4, "returns default plus one created, total 4 records") { @domain.records.count } returns("127.0.0.1", "returns the right value for created record") { @domain.records.last.value } returns("@", "returns the right name for created record") { @domain.records.last.name } returns("a", "returns the right type for created record") { @domain.records.last.type } end tests("#destroy") do returns(true, "returns confirmation of domain removal") { @domain.destroy } returns(false, "returns no domain with that name") { @service.domains.get_by_name(@domain.name) } end # Teardown # Not needed, domain was already destroyed end end fog-softlayer-0.3.17/tests/softlayer/models/dns/records_tests.rb0000644000076400007640000000112112424143106024040 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::DNS[:softlayer] | Records model", ["softlayer"]) do @service = Fog::DNS[:softlayer] tests("success") do # Setup name = "fog-domain-"+SecureRandom.random_number(36**12).to_s(36).rjust(12, "0") + ".com" @domain = @service.domains.create(name) tests("#all") do returns(3, "returns default records for domain") { @domain.records.count } end # Teardown @domain.destroy end end fog-softlayer-0.3.17/tests/softlayer/models/storage/0000755000076400007640000000000012424143106021515 5ustar pravipravifog-softlayer-0.3.17/tests/softlayer/models/storage/directory_tests.rb0000644000076400007640000000236012424143106025271 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Storage[:softlayer] | Directory model", ["softlayer"]) do pending unless Fog.mocking? tests("success") do @test_dir1 = 'test-dir-1' @test_dir2 = 'test-dir-2' @storage = Fog::Storage[:softlayer] tests("#create") do data_matches_schema(Fog::Storage::Softlayer::Directory) { @storage.directories.create(:key => @test_dir1) } end tests("#get") do data_matches_schema(Fog::Storage::Softlayer::Directory) { @storage.directories.get(@test_dir1) } end tests("#all") do @storage.directories.create(:key => @test_dir2) schema = [ Fog::Storage::Softlayer::Directory, Fog::Storage::Softlayer::Directory ] data_matches_schema(schema) { @storage.directories.all } end tests("#destroy") do data_matches_schema(true) { @storage.directories.get(@test_dir1).destroy } data_matches_schema([Fog::Storage::Softlayer::Directory]) { @storage.directories.all } end end tests ("failure") do tests("#create").raises(ArgumentError) do @storage.directories.create end end end fog-softlayer-0.3.17/tests/softlayer/models/storage/file_tests.rb0000644000076400007640000000312312424143106024202 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests("Fog::Storage[:softlayer] | File model", ["softlayer"]) do pending unless Fog.mocking? tests("success") do @storage = Fog::Storage[:softlayer] @test_dir1 = @storage.directories.create(:key => 'test-container-1') @test_dir2 = @storage.directories.create(:key => 'test-container-2') @test_file1 = 'test-object-1' @test_file2 = 'test-object-2' @test_file3 = 'test-object-3' tests("#create") do data_matches_schema(Fog::Storage::Softlayer::File) { @test_dir1.files.create(:key => @test_file1) } data_matches_schema(Fog::Storage::Softlayer::File) { @test_dir1.files.create(:key => @test_file2) } end tests("#all") do schema = [ Fog::Storage::Softlayer::File, Fog::Storage::Softlayer::File ] data_matches_schema(schema) { @test_dir1.files.all } end tests("#get") do data_matches_schema(Fog::Storage::Softlayer::File) { @test_dir1.files.get(@test_file1) } end tests("#copy") do data_matches_schema(Fog::Storage::Softlayer::File) { @test_dir1.files.get(@test_file1).copy(@test_dir2, @test_file1)} data_matches_schema(Fog::Storage::Softlayer::File) { @test_dir2.files.get(@test_file1) } end tests("#destroy") do data_matches_schema(true) { @test_dir1.files.get(@test_file1).destroy } end end tests ("failure") do tests("#create").raises(ArgumentError) do @test_dir1.files.create end end end fog-softlayer-0.3.17/tests/softlayer/compute_tests.rb0000644000076400007640000000144312424143106022013 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # Shindo.tests('Fog::Compute[:softlayer]', ['softlayer']) do @test_service = Fog::Compute[:softlayer] end Shindo.tests('Fog::Compute.new', ['softlayer']) do tests("service options") do { :softlayer_api_url => "https://example.com", :softlayer_username => "user-12345", :softlayer_api_key => "password1234", }.each_pair do |option, sample| tests("recognises :#{option}").returns(true) do options = {:provider => "Softlayer"} options[option] = sample begin Fog::Compute.new(options) true rescue ArgumentError false end end end end end fog-softlayer-0.3.17/tests/lorem.txt0000644000076400007640000000067612424143106016446 0ustar pravipraviLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.fog-softlayer-0.3.17/fog-softlayer.gemspec0000644000076400007640000000271512424143106017547 0ustar pravipravi# coding: utf-8 lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'fog/softlayer/version' Gem::Specification.new do |spec| spec.name = "fog-softlayer" spec.version = Fog::Softlayer::VERSION spec.authors = ["Matt Eldridge"] spec.email = ["matt.eldridge@us.ibm.com"] spec.date = '2014-07-16' spec.description = %q{Module for the 'fog' gem to support SoftLayer Cloud} spec.summary = %q{This library can be used as a module for `fog` or as standalone provider to use the SoftLayer Cloud in applications} spec.homepage = "https://github.com/fog/fog-softlayer" spec.license = "MIT" spec.files = `git ls-files`.split($/) spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"] spec.add_dependency 'fog-core' spec.add_dependency 'fog-json' spec.add_development_dependency('minitest') spec.add_development_dependency('rake') spec.add_development_dependency('rbvmomi') spec.add_development_dependency('yard') spec.add_development_dependency('thor') spec.add_development_dependency('rbovirt', '0.0.24') spec.add_development_dependency('shindo', '~> 0.3.4') spec.add_development_dependency('fission') spec.add_development_dependency('pry') spec.add_development_dependency('osrcry') end fog-softlayer-0.3.17/examples/0000755000076400007640000000000012424143106015232 5ustar pravipravifog-softlayer-0.3.17/examples/tags.md0000644000076400007640000000745212424143106016522 0ustar pravipravi### Tags Examples These examples all assume you have `~/.fog` which contains the following ```yaml default: softlayer_username: example-username softlayer_api_key: 1a1a1a1a1a1a1a1a1a11a1a1a1a1a1a1a1a1a1 softlayer_default_domain: example.com ``` #### Create a connection to SoftLayer Compute Service ```ruby require 'fog/softlayer' @sl = Fog::Compute[:softlayer] ``` #### Tags with Servers 1. Add some tags to a server. ```ruby server = @sl.servers.get(1234567) # get the server in question server.add_tags(['sparkle', 'motion']) # => true ``` 1. Verify that the tags stuck. ```ruby server.tags # => ["sparkle", "motion"] ``` 1. Remove a tag. ```ruby server.tags # => ["sparkle", "motion"] server.delete_tags(["sparkle"]) # => true server.tags # => ["motion"] ``` 1. Put it back. ```ruby server.tags # => ["motion"] server.add_tags(['sparkle']) # => true server.tags # => ["sparkle", "motion"] ``` 1. Get servers tagged by a single tag. ```ruby @sl.servers.tagged_with(['foo']) # => [, , ...] ``` 1. Get servers tagged by multiple tags (tag OR tag OR ...). ```ruby @sl.servers.tagged_with(['foo','bar']) # => [, , ...] ``` 1. List all tags on account that have been assigned to a server. ```ruby @sl.tags.all # => [, , ...] ``` 1. Anatomy of a Tag object. ```ruby ``` 1. Miscellany ```ruby tag = @sl.tags.get(32850) tag.references # => [, , ...] ``` #### Create a connection to SoftLayer Network Service ```ruby require 'fog/softlayer' @sl = Fog::Network[:softlayer] ``` #### Tags with Networks 1. Add some tags to a network. ```ruby net = @sl.networks.get(1234567) # get the network in question net.add_tags(['sparkle', 'motion']) # => true ``` 1. Verify that the tags stuck. ```ruby net.tags # => ["sparkle", "motion"] ``` 1. Remove a tag. ```ruby net.tags # => ["sparkle", "motion"] net.delete_tags(["sparkle"]) # => true net.tags # => ["motion"] ``` 1. Put it back. ```ruby net.tags # => ["motion"] net.add_tags(['sparkle']) # => true net.tags # => ["sparkle", "motion"] ``` 1. Get networks tagged by a single tag. ```ruby @sl.networks.tagged_with(['foo']) # => [, , ...] ``` 1. Get networks tagged by multiple tags (tag OR tag OR ...). ```ruby @sl.networks.tagged_with(['foo','bar']) # => [, , ...] ``` 1. List all tags on account that have been assigned to a network. ```ruby @sl.tags.all # => [, , ...] ``` 1. Anatomy of a Tag object. ```ruby ``` 1. Miscellany ```ruby tag = @sl.tags.get(32850) tag.references # => [, , ...] ``` fog-softlayer-0.3.17/examples/dns.md0000644000076400007640000000327212424143106016344 0ustar pravipravi### DNS Examples These examples all assume you have `~/.fog` which contains the following ```yaml default: softlayer_username: example-username softlayer_api_key: 1a1a1a1a1a1a1a1a1a11a1a1a1a1a1a1a1a1a1 ``` #### Create a connection to SoftLayer DNS Service ```ruby require 'fog/softlayer' @sl = Fog::DNS[:softlayer] ``` ##### Create Operations * Create Domain ```ruby @domain = @sl.domains.create('yourdomain.com') ``` * Create Record ```ruby record = { 'value' => '127.0.0.1', 'host' => '@', 'type' => 'a' } @domain.create_record(record) ``` ##### Read Operations * List all domains ```ruby @domains = @sl.domains.all @domain = @domains.first ``` * Get specific domain by id ```ruby @domain = @sl.domains.get(123456) ``` * Get specific domain by name ```ruby @domain = @sl.domains.get_by_name('yourdomain.com') ``` * Get Domains Records ```ruby @domain = @sl.domains.get(123456) @domain.records ``` * Get specific record by id ```ruby @domain = @sl.domains.get(123456) @domain.records.get(456789012) ``` or using the service: ```ruby @sl.records.get(456789012) ``` ##### Update Operations After this point we consider you have a Fog::DNS::Softlayer::Domain on @domain variable * Update Record Entry ```ruby @domain.records @domain.records[3].value = "192.168.0.3" @domain.records[3].save ``` ##### Destroy Operations After this point we consider you have a Fog::DNS::Softlayer::Domain on @domain variable * Destroy Domain ```ruby @domain = @sl.domains.get(123456) @domain.destroy ``` * Destroy Record ```ruby @domain = @sl.domains.get(123456) @domain.records.last.destroy ``` fog-softlayer-0.3.17/examples/key_pairs.md0000644000076400007640000000333312424143106017544 0ustar pravipravi### Key Pair Examples These examples all assume you have `~/.fog` which contains the following ```yaml default: softlayer_username: example-username softlayer_api_key: 1a1a1a1a1a1a1a1a1a11a1a1a1a1a1a1a1a1a1 softlayer_default_domain: example.com ``` #### Create a connection to SoftLayer Compute Service ```ruby require 'fog/softlayer' @sl = Fog::Compute[:softlayer] ``` #### Key Pair Basics 1. Create ```ruby kp1 = @sl.key_pairs.create(:label => 'my-new-key', :key => 'ssh-rsa AAAAxbU2lx...') # => kp2 = @sl.key_pairs.new kp2.label = 'my-new-new-key' kp2.key = 'ssh-rsa AAAAxbU2lx...' kp2.save # => ``` 1. Get ```ruby # By id: kp = @sl.key_pairs.get(123456) # => # By label: kp = @sl.key_pairs.by_label('my-new-key') # => ``` 1. Destroy ```ruby kp = @sl.key_pairs.by_label('my-new-key') # => kp.destroy ``` ### Key Pairs with Servers 1. Create a server with one or more key pairs ```ruby the_first_key = @sl.key_pairs.by_label('my-new-key') # => the_second_key = @sl.key_pairs.by_label('my-other-new-key') # => opts = { :flavor_id => 'm1.small', :os_code => 'UBUNTU_LATEST', :datacenter => 'hkg02', :name => 'cphrmky', :key_pairs => [ the_first_key, the_second_key ] } @sl.servers.create(opts) # => ``` 1. Look at the key pairs on a server. ```ruby server = @sl.servers.get(12345) server.key_pairs # => [ , # ] ```fog-softlayer-0.3.17/examples/storage.md0000644000076400007640000000520512424143106017222 0ustar pravipravi### Storage Examples These examples all assume you have `~/.fog` which contains the following ```yaml default: softlayer_username: example-username softlayer_api_key: 1a1a1a1a1a1a1a1a1a11a1a1a1a1a1a1a1a1a1 softlayer_cluster: cluster # currently supported clusters are dal05, sng01, ams01 ``` #### Create a connection to SoftLayer Object Storage ```ruby require 'fog/softlayer' @sl = Fog::Storage[:softlayer] ``` #### Use the Models 1. List directories/containers. ```ruby dirs = @sl.directories dirs.size # the number of directories ``` 1. Create a directory/container. ```ruby @sl.directories.create(:key => 'a-container') ``` 1. Get a directory/container ```ruby dir = @sl.directories.get('a-container') dir.key # => 'a-container' ``` 1. Create a new file/object ```ruby dir = @sl.directories.get('a-container') # Pass a string. dir.files.create(:key => 'data.txt', :body => 'The quick brown fox jumps over the lazy dog.') # From a file. dir.files.create(:key => 'file-data.txt', :body => File.open('/path/to/file-data.txt') ``` 1. Get an existing file/object ```ruby dir = @sl.directories.get('a-container') file = dir.files.get('data.txt') file.body # => 'The quick brown fox jumps over the lazy dog.' ``` 1. Copy a file/object ```ruby file = @sl.directories.get('a-container').files.get('data.txt') copy = file.copy('a-container', 'copy-of-data.txt') copy.body # => 'The quick brown fox jumps over the lazy dog.' ``` 1. List the files in a directory/container ```ruby @sl.directories.get('a-container').files # => [ # # ... ``` 1. Get a signed [temporary] url for a file/object ```ruby file = @sl.directories.get('a-container').files.get('data.txt') file.url(Time.now + 300) # url expires in 5 minutes # => "https://dal05.objectstorage.softlayer.net:443/v1/AUTH_1a1a1a1a-1a1a-1a1a-1a1a-1a1a1a1a1a1a/a-container/data.txt?temp_url_sig=1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a&temp_url_expires=1401901023" ``` 1. Delete files/objects from a directory/container. ```ruby dir = @sl.directories('a-container') dir.files.get('data.txt').destroy dir.files.get('file-data.txt').destroy dir.files.get('copy-of-data.txt').destroy # Must destroy all files/objects before destroying container. dir.destroy ``` fog-softlayer-0.3.17/examples/compute.md0000644000076400007640000001572212424143106017237 0ustar pravipravi### Compute Examples These examples all assume you have `~/.fog` which contains the following ```yaml default: softlayer_username: example-username softlayer_api_key: 1a1a1a1a1a1a1a1a1a11a1a1a1a1a1a1a1a1a1 softlayer_default_domain: example.com ``` #### Create a connection to SoftLayer Compute Service ```ruby require 'fog/softlayer' @sl = Fog::Compute[:softlayer] ``` #### Use the Models 1. List all servers ```ruby @sl.servers # list all servers @sl.servers.size # get a count of all servers ``` 1. Get a server's details ```ruby server = @sl.servers.get() server.name # => 'hostname.example.com' server.created_at # => DateTime the server was created server.state # => 'Running', 'Stopped', 'Terminated', etc. ``` 1. Get all servers tagged with certain tags. ```ruby prod_fe_servers = @sl.servers.tagged_with(['production', 'frontend']) # => [ , # , # , # , # ,] ``` 1. Get a server's public/frontend VLAN ```ruby server = @sl.servers.get(12345) server.vlan # => , # network_space="PUBLIC", # router={"hostname"=>"fcr01a.sjc01", "id"=>82412, "datacenter"=>{"id"=>168642, "longName"=>"San Jose 1", "name"=>"sjc01"}} # > ``` 1. Get a server's private/backend VLAN ```ruby server = @sl.servers.get(12345) server.private_vlan # => , # network_space="PRIVATE", # router={"hostname"=>"bcr01a.sjc01", "id"=>82461, "datacenter"=>{"id"=>168642, "longName"=>"San Jose 1", "name"=>"sjc01"}} # > ``` 1. Get a server's tags ```ruby server = @sl.servers.get(12345) server.tags # => ['production', 'frontend'] ``` 1. Add tags to a server ```ruby server = @sl.servers.get(12345) server.tags # => ['production', 'frontend'] server.add_tags(['sparkle', 'motion'] # => true server.tags # => ['production', 'frontend', 'sparkle', 'motion'] ``` 1. Delete tags from a server ```ruby server = @sl.servers.get(12345) server.tags # => ['production', 'frontend', 'sparkle', 'motion'] server.delete_tags(['sparkle', 'motion'] # => true server.tags # => ['production', 'frontend'] ``` 1. Provision a new VM with flavor (simple). ```ruby opts = { :flavor_id => "m1.small", :image_id => "23f7f05f-3657-4330-8772-329ed2e816bc", :name => "test", :datacenter => "ams01" } new_server = @sl.servers.create(opts) new_server.id # => 1337 ``` 1. Provision a new Bare Metal instance with flavor (simple). ```ruby opts = { :flavor_id => "m1.small", :os_code => "UBUNTU_LATEST", :name => "test1", :datacenter => "ams01", :bare_metal => true } @sl.servers.create(opts) new_server.id # => 1338 ``` 1. Provision a new VM without flavor. ```ruby opts = { :cpu => 2, :ram => 2048, :disk => [{'device' => 0, 'diskImage' => {'capacity' => 100 } }], :ephemeral_storage => true, :domain => "not-my-default.com", :name => "hostname", :os_code => "UBUNTU_LATEST", :name => "test2", :datacenter => "ams01" } ``` 1. Provision a Bare Metal Instance without a flavor ```ruby opts = { :cpu => 8, :ram => 16348, :disk => {'capacity' => 100 }, :ephemeral_storage => true, :domain => "not-my-default.com", :name => "hostname", :os_code => "UBUNTU_LATEST", :name => "test2", :datacenter => "ams01", :bare_metal => true } ``` 1. Create a server with one or more key pairs (also see [key_pairs.md](./key_pairs.md) ) ```ruby the_first_key = @sl.key_pairs.by_label('my-new-key') # => the_second_key = @sl.key_pairs.by_label('my-other-new-key') # => opts = { :flavor_id => 'm1.small', :os_code => 'UBUNTU_LATEST', :datacenter => 'hkg02', :name => 'cphrmky', :key_pairs => [ the_first_key, the_second_key ] } @sl.servers.create(opts) # => ``` 1. Delete a VM or Bare Metal instance. ```ruby @sl.servers.get().destroy ``` 1. Provision a Server (works the same for VM and Bare Metal) into a specific VLAN ```ruby # I want to launch another server to hold docker containers into my existing staging VLANs # I'll start by getting a staging server so I can use its vlans as a reference. staging_server = @sl.servers.tagged_with(['staging', 'docker']).first # => opts = { :flavor_id => 'm1.large', :image_id => '23f7f05f-3657-4330-8772-329ed2e816bc', # Ubuntu Docker Image :domain => 'staging.example.com', :datacenter => 'ams01', # This needs to be the same datacenter as the target VLAN of course. :name => 'additional-docker-host', :vlan => staging.server.vlan, # Passing in a object. :private_vlan => staging.server.private_vlan.id, # Passing in an Integer (the id of a network/vlan) works too. } new_staging_server = @sl.servers.create(opts) # => ``` 1. Provision a Server with only a private network. ```ruby opts = { :flavor_id => 'm1.large', :os_code => 'UBUNTU_LATEST', :domain => 'example.com', :datacenter => 'ams01', :name => 'private-eye', :private_network_only => true } private_vm = @sl.servers.create(opts) # => ``` 1. Provision a Server with 1Gbps network components. ```ruby opts = { :flavor_id => 'm1.large', :os_code => 'UBUNTU_LATEST', :domain => 'example.com', :datacenter => 'wdc01', :name => 'speedy-tubes', :network_components => [ {:speed => 1000 } ], } private_vm = @sl.servers.create(opts) # => ``` 1. Provision a Server with user metadata. ```ruby opts = { :flavor_id => "m1.small", :image_id => "23f7f05f-3657-4330-8772-329ed2e816bc", :name => "test", :datacenter => "ams01", :user_data => "my-custom-user-metadata" } new_server = @sl.servers.create(opts) new_server.user_data # => "my-custom-user-metadata" new_server.user_data = "new-user-metadata" new_server.user_data # => "new-user-metadata" ``` fog-softlayer-0.3.17/examples/global_ip_address.md0000644000076400007640000000764112424143106021221 0ustar pravipravi#### Global IP Address examples These examples all assume you have `~/.fog` which contains the following: ```yaml default: softlayer_username: example-username softlayer_api_key: 1a1a1a1a1a1a1a1a1a11a1a1a1a1a1a1a1a1a1 ``` ##### Create a connection to SoftLayer network ```ruby require 'fog/softlayer' @sl = Fog::Network[:softlayer] ``` Global IP addresses are accessed through the `Fog::Network::Softlayer::Ip` model. Unlike "normal" IP addresses they can be specifically created and destroyed (non-global IP addresses are created/destroyed via a subnet). ```ruby global_ips = @network.ips.select { |ip| ip.global? } # => [ , # , # note=nil, # assigned_to=nil # > # ] ``` Route an unrouted global IP to a specific server: ```ruby global_ip = @network.ips.select { |ip| ip.global? && !ip.routed? }.first # => global_ip.routed? # => false @compute = Fog::Compute[:softlayer] dest_server = @compute.servers.tagged_with(['production', 'frontend', 'hkg']).first # => dest_ip = @network.ips.by_address(dest_server.public_ip_address) # => global_ip.route(dest_ip) # => true global_ip.reload # => , # note=nil, # assigned_to=nil # > global_ip.routed? # => true ``` That same address to a different server: ```ruby global_ip = @network.ips.by_address('203.0.113.5') global_ip.destination.address # => 203.0.113.8 london_server = @compute.servers.tagged_with(['production', 'frontend', 'lon']).first # => dest_ip = @network.ips.by_address(london_server.public_ip_address) # => global_ip.route(dest_ip) # => true global_ip.reload # => global_ip.destination.address # => 203.0.113.9 ``` Unroute the same address: ```ruby global_ip = @network.ips.by_address('203.0.113.5') global_ip.routed? # => true global_ip.unroute # => true global_ip.reload # => global_ip.routed? # => false ``` Create new IPv4: *Note:* these methods are blocking and can take several seconds to respond. ```ruby @network.create_new_global_ipv4 # => ``` Create new IPv6: ```ruby @network.create_new_global_ipv6 # => ``` Destroy a global IP address: ```ruby ip = @network.ips.by_address('203.0.113.5') ip.global? # => true ip.destroy # => true ``` fog-softlayer-0.3.17/examples/network.md0000644000076400007640000001623412424143106017253 0ustar pravipravi### Network Examples Note that SoftLayer uses the term `VLAN`. The Fog project tries to keep things provider independent, and we'll be referring to them as `networks`. These examples all assume you have `~/.fog` which contains the following ```yaml default: softlayer_username: example-username softlayer_api_key: 1a1a1a1a1a1a1a1a1a11a1a1a1a1a1a1a1a1a1 ``` #### Create a connection to SoftLayer Network ```ruby require 'fog/softlayer' @sl = Fog::Network[:softlayer] ``` #### Use the Models 1. List existing networks. ```ruby nets = @sl.networks # => [ , # network_space="PUBLIC" # router={"hostname"=>"fcr02.wdc01", "id"=>40378, "datacenter"=>{"id"=>37473, "longName"=>"Washington, DC 1", "name"=>"wdc01"}} # >, # , # network_space="PRIVATE" # router={"hostname"=>"bcr02.wdc01", "id"=>40379, "datacenter"=>{"id"=>37473, "longName"=>"Washington, DC 1", "name"=>"wdc01"}} # >, # ] ``` 1. Get a network by ID. ```ruby net = @sl.networks.get(123456) # => , # network_space="PUBLIC" # router={"hostname"=>"fcr02.wdc01", "id"=>40378, "datacenter"=>{"id"=>37473, "longName"=>"Washington, DC 1", "name"=>"wdc01"}} # > ``` 1. Get a network by name. ```ruby @sl.networks.by_name('some-name') # => , # network_space="PUBLIC" # router={"hostname"=>"fcr02.wdc01", "id"=>40378, "datacenter"=>{"id"=>37473, "longName"=>"Washington, DC 1", "name"=>"wdc01"}} # > ``` 1. Get all networks with a particular tag. ```ruby prod_backend_nets = @sl.networks.tagged_with(['production', 'private']) # => [, # , # , # ] ``` 1. Get a network's tags. ```ruby net = @sl.networks.get(123456) net.tags # => ['sparkle', 'motion', 'production', 'public'] ``` 1. Get a network's router. ```ruby net = @sl.networks.by_name('some-name') net.router # => {"hostname"=>"bcr02a.ams01", # "id"=>190854, # "datacenter"=>{"id"=>265592, "longName"=>"Amsterdam 1", "name"=>"ams01"}} ``` 1. Get a network's subnets. ```ruby net = @sl.networks.get(123456) net.subnets # => [ , # ] ``` 1. Get a subnet's IP Addresses. ```ruby net = @sl.networks.get(123456) # Here I'm selecting the primary subnet... subnet = net.subnets.select { |vlan| vlan.type == "PRIMARY" }.first # => addys = subnet.addresses # => [ , # , # "hostname.example.com", "id"=>281730} # >, # "hostname-2.example.com", "id"=>281730} # >, # ..., # ] ``` 1. Create a new network. ```ruby # We're creating a network in wdc01, the same steps will work for any datacenter. # @sl.datacenters will give you a list of available datacenters. wdc01 = @sl.datacenters.by_name('wdc01') wdc01.routers # => [{"hostname"=>"bcr01.wdc01", "id"=>16358}, # {"hostname"=>"bcr02.wdc01", "id"=>40379}, # {"hostname"=>"bcr03a.wdc01", "id"=>85816}, # {"hostname"=>"bcr04a.wdc01", "id"=>180611}, # {"hostname"=>"bcr05a.wdc01", "id"=>235754}, # {"hostname"=>"fcr01.wdc01", "id"=>16357}, # {"hostname"=>"fcr02.wdc01", "id"=>40378}, # {"hostname"=>"fcr03a.wdc01", "id"=>85814}, # {"hostname"=>"fcr04a.wdc01", "id"=>180610}, # {"hostname"=>"fcr05a.wdc01", "id"=>235748}] # We want to create a public network so be sure to use one of the fcr* routers. # If we were creating a private network we'd want to use a bcr* router. opts = { :name => 'my-new-network', :datacenter => wdc01, :router => wdc01.routers[4], :network_space => 'PUBLIC', } @sl.networks.create(opts) ``` 1. Add tags to a network. ```ruby net = @sl.networks.by_name('my-new-network') net.tags # => ['sparkle'] net.add_tags(['motion']) # => true net.tags # => ['sparkle', 'motion'] ``` 1. Delete tags from a network. ```ruby net = @sl.networks.by_name('my-new-network') net.tags # => ['sparkle', 'motion'] net.delete_tags(['motion']) # => true net.tags # => ['sparkle'] ``` 1. Delete a network. ```ruby @sl.networks.by_name('my-retired-network').destroy # => true # You can't delete a network if it has actively routed addresses... ``` fog-softlayer-0.3.17/README.md0000644000076400007640000000170312424143106014674 0ustar pravipravi### `fog-softlayer` - SoftLayer module for fog. [![Gem Version](https://badge.fury.io/rb/fog-softlayer.png)](http://badge.fury.io/rb/fog-softlayer) [![Build Status](https://api.travis-ci.org/fog/fog-softlayer.svg)](https://travis-ci.org/fog/fog-softlayer) [![Dependency Status](https://gemnasium.com/fog/fog-softlayer.svg)](https://gemnasium.com/fog/fog-softlayer) This gem is a module for the `fog` gem that allows you to manage resources in the SoftLayer Cloud. It is included by the main `fog` metagem but can used as an independent library in other applications. Currently supported services: * Compute * Storage * DNS * Network Additional services coming soon: * CDN * Load Balancer * Message Queue #### Installation Add this line to your application's Gemfile: gem "fog-softlayer" And then execute: $ bundle Or install it yourself as: $ gem install fog-softlayer #### Usage See `examples/` #### Contributing See `CONTRIBUTING.md` fog-softlayer-0.3.17/CHANGELOG.md0000644000076400007640000000356512424143106015236 0ustar pravipravi## 0.3.10 2014-07-22 * Added support for Global IP addresses * Create. * Destroy. * Route. * Unroute. ## 0.3.7 2014-07-11 * Added support for ssh key pairs. * See [key_pairs.md](https://github.com/fog/fog-softlayer/blob/master/examples/key_pairs.md) for details. * Fix [issue 19](https://github.com/fog/fog-softlayer/issues/19) Storage initialization bug. * Fix [issue 17](https://github.com/fog/fog-softlayer/issues/17), incompatibility with Rails 4.1.4. *thanks konsti* * Updated .fog file example and datacenter option. *thanks urasoko* * Fix [issue 14](https://github.com/fog/fog-softlayer/issues/14), added `:private_network_only` flag to Server model. ## 0.3.2 2014-06-30 * No longer requires `fog` gem. ## 0.3.0 2014-06-26 * Added Network service. * Network model. * Subnet model. * Ip model. * Tag model. * Added vlan and private_vlan properties to Server model. * Fixed up bare_metal? on Server so it's not a hack. *thanks fernandes* * Fixed Bundler/dep issues with Ruby 1.8.7. *thanks fernandes* * Added some missing license headers. * Updated Compute examples and Tag examples to reflect new Network service. * Moved shared logic from `lib/fog/softlayer/compute.rb` to `lib/fog/softlayer/core.rb` ## 0.2.1 2014-06-17 * Add support for SoftLayer Tags on Compute resources. ## 0.1.1 2014-06-10 * Fix Compute model after breaking change to SLAPI. :datacenter is no longer optional. ## 0.1.0 2014-06-10 * Add missing get method to Fog::DNS::Softlayer::Record. * Add OS attribute and ssh_password method to Compute model. ### 0.0.9 2014-06-10 * Initial support for DNS. ### 0.0.8 2014-06-05 * Released support for Object Storage. ### 0.0.7 2014-05-29 * Compute requests and models initial development complete. Supports both VMs and BMC. * Storage requests and models initial development complete. ### 0.0.1 / 2014-04-18 * Initial release of `fog-softlayer` module. fog-softlayer-0.3.17/Gemfile0000644000076400007640000000036212424143106014710 0ustar pravipravisource "https://rubygems.org" group :development, :test do # This is here because gemspec doesn't support require: false gem 'coveralls', :require => false gem 'netrc', :require => false gem 'octokit', :require => false end gemspec fog-softlayer-0.3.17/metadata.yml0000644000076400007640000003175112424143106015726 0ustar pravipravi--- !ruby/object:Gem::Specification name: fog-softlayer version: !ruby/object:Gem::Version version: 0.3.17 platform: ruby authors: - Matt Eldridge autorequire: bindir: bin cert_chain: [] date: 2014-07-16 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: fog-core requirement: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :runtime prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: fog-json requirement: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :runtime prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: minitest requirement: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: rake requirement: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: rbvmomi requirement: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: yard requirement: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: thor requirement: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: rbovirt requirement: !ruby/object:Gem::Requirement requirements: - - '=' - !ruby/object:Gem::Version version: 0.0.24 type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - '=' - !ruby/object:Gem::Version version: 0.0.24 - !ruby/object:Gem::Dependency name: shindo requirement: !ruby/object:Gem::Requirement requirements: - - ~> - !ruby/object:Gem::Version version: 0.3.4 type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ~> - !ruby/object:Gem::Version version: 0.3.4 - !ruby/object:Gem::Dependency name: fission requirement: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: pry requirement: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: osrcry requirement: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' description: Module for the 'fog' gem to support SoftLayer Cloud email: - matt.eldridge@us.ibm.com executables: [] extensions: [] extra_rdoc_files: [] files: - .gitignore - .travis.yml - CHANGELOG.md - CONTRIBUTING.md - CONTRIBUTORS.md - Gemfile - LICENSE.txt - README.md - Rakefile - docs/cla-corporate.md - docs/cla-individual.md - docs/fog-softlayer-CCLA.pdf - docs/fog-softlayer-CLA.pdf - examples/compute.md - examples/dns.md - examples/global_ip_address.md - examples/key_pairs.md - examples/network.md - examples/storage.md - examples/tags.md - fog-softlayer.gemspec - gemfiles/Gemfile-edge - gemfiles/Gemfile-ruby-1.8.7 - lib/fog/softlayer.rb - lib/fog/softlayer/compute.rb - lib/fog/softlayer/compute/shared.rb - lib/fog/softlayer/core.rb - lib/fog/softlayer/dns.rb - lib/fog/softlayer/models/compute/flavor.rb - lib/fog/softlayer/models/compute/flavors.rb - lib/fog/softlayer/models/compute/image.rb - lib/fog/softlayer/models/compute/images.rb - lib/fog/softlayer/models/compute/key_pair.rb - lib/fog/softlayer/models/compute/key_pairs.rb - lib/fog/softlayer/models/compute/network_component.rb - lib/fog/softlayer/models/compute/network_components.rb - lib/fog/softlayer/models/compute/server.rb - lib/fog/softlayer/models/compute/servers.rb - lib/fog/softlayer/models/compute/tag.rb - lib/fog/softlayer/models/compute/tags.rb - lib/fog/softlayer/models/dns/domain.rb - lib/fog/softlayer/models/dns/domains.rb - lib/fog/softlayer/models/dns/record.rb - lib/fog/softlayer/models/dns/records.rb - lib/fog/softlayer/models/network/datacenter.rb - lib/fog/softlayer/models/network/datacenters.rb - lib/fog/softlayer/models/network/ip.rb - lib/fog/softlayer/models/network/ips.rb - lib/fog/softlayer/models/network/network.rb - lib/fog/softlayer/models/network/networks.rb - lib/fog/softlayer/models/network/subnet.rb - lib/fog/softlayer/models/network/subnets.rb - lib/fog/softlayer/models/network/tag.rb - lib/fog/softlayer/models/network/tags.rb - lib/fog/softlayer/models/storage/directories.rb - lib/fog/softlayer/models/storage/directory.rb - lib/fog/softlayer/models/storage/file.rb - lib/fog/softlayer/models/storage/files.rb - lib/fog/softlayer/network.rb - lib/fog/softlayer/requests/compute/create_bare_metal_server.rb - lib/fog/softlayer/requests/compute/create_bare_metal_tags.rb - lib/fog/softlayer/requests/compute/create_key_pair.rb - lib/fog/softlayer/requests/compute/create_vm.rb - lib/fog/softlayer/requests/compute/create_vm_tags.rb - lib/fog/softlayer/requests/compute/create_vms.rb - lib/fog/softlayer/requests/compute/delete_bare_metal_server.rb - lib/fog/softlayer/requests/compute/delete_bare_metal_tags.rb - lib/fog/softlayer/requests/compute/delete_key_pair.rb - lib/fog/softlayer/requests/compute/delete_vm.rb - lib/fog/softlayer/requests/compute/delete_vm_tags.rb - lib/fog/softlayer/requests/compute/describe_tags.rb - lib/fog/softlayer/requests/compute/get_bare_metal_server.rb - lib/fog/softlayer/requests/compute/get_bare_metal_servers.rb - lib/fog/softlayer/requests/compute/get_bare_metal_tags.rb - lib/fog/softlayer/requests/compute/get_key_pair.rb - lib/fog/softlayer/requests/compute/get_key_pairs.rb - lib/fog/softlayer/requests/compute/get_references_by_tag_name.rb - lib/fog/softlayer/requests/compute/get_tag.rb - lib/fog/softlayer/requests/compute/get_vm.rb - lib/fog/softlayer/requests/compute/get_vm_tags.rb - lib/fog/softlayer/requests/compute/get_vms.rb - lib/fog/softlayer/requests/compute/update_key_pair.rb - lib/fog/softlayer/requests/dns/create_domain.rb - lib/fog/softlayer/requests/dns/create_record.rb - lib/fog/softlayer/requests/dns/delete_domain.rb - lib/fog/softlayer/requests/dns/delete_record.rb - lib/fog/softlayer/requests/dns/get_domain.rb - lib/fog/softlayer/requests/dns/get_domain_by_name.rb - lib/fog/softlayer/requests/dns/get_domains.rb - lib/fog/softlayer/requests/dns/get_record.rb - lib/fog/softlayer/requests/dns/get_records.rb - lib/fog/softlayer/requests/dns/update_record.rb - lib/fog/softlayer/requests/network/create_network.rb - lib/fog/softlayer/requests/network/create_network_tags.rb - lib/fog/softlayer/requests/network/delete_global_ip_address.rb - lib/fog/softlayer/requests/network/delete_network.rb - lib/fog/softlayer/requests/network/delete_network_tags.rb - lib/fog/softlayer/requests/network/get_datacenter_routers.rb - lib/fog/softlayer/requests/network/get_datacenters.rb - lib/fog/softlayer/requests/network/get_global_ip_address.rb - lib/fog/softlayer/requests/network/get_global_ip_records.rb - lib/fog/softlayer/requests/network/get_ip_address.rb - lib/fog/softlayer/requests/network/get_ip_addresses.rb - lib/fog/softlayer/requests/network/get_network.rb - lib/fog/softlayer/requests/network/get_network_tags.rb - lib/fog/softlayer/requests/network/get_private_vlan_price_code.rb - lib/fog/softlayer/requests/network/get_public_vlan_price_code.rb - lib/fog/softlayer/requests/network/get_references_by_tag_name.rb - lib/fog/softlayer/requests/network/get_subnet.rb - lib/fog/softlayer/requests/network/get_subnet_package_id.rb - lib/fog/softlayer/requests/network/get_subnet_price_code.rb - lib/fog/softlayer/requests/network/list_networks.rb - lib/fog/softlayer/requests/network/list_subnets.rb - lib/fog/softlayer/requests/network/route_global_ip.rb - lib/fog/softlayer/requests/network/unroute_global_ip.rb - lib/fog/softlayer/requests/storage/copy_object.rb - lib/fog/softlayer/requests/storage/delete_container.rb - lib/fog/softlayer/requests/storage/delete_multiple_objects.rb - lib/fog/softlayer/requests/storage/delete_object.rb - lib/fog/softlayer/requests/storage/delete_static_large_object.rb - lib/fog/softlayer/requests/storage/get_container.rb - lib/fog/softlayer/requests/storage/get_containers.rb - lib/fog/softlayer/requests/storage/get_object.rb - lib/fog/softlayer/requests/storage/get_object_https_url.rb - lib/fog/softlayer/requests/storage/head_container.rb - lib/fog/softlayer/requests/storage/head_containers.rb - lib/fog/softlayer/requests/storage/head_object.rb - lib/fog/softlayer/requests/storage/post_set_meta_temp_url_key.rb - lib/fog/softlayer/requests/storage/put_container.rb - lib/fog/softlayer/requests/storage/put_dynamic_obj_manifest.rb - lib/fog/softlayer/requests/storage/put_object.rb - lib/fog/softlayer/requests/storage/put_object_manifest.rb - lib/fog/softlayer/requests/storage/put_static_obj_manifest.rb - lib/fog/softlayer/storage.rb - lib/fog/softlayer/version.rb - spec/fog/compute/softlayer_spec.rb - tests/compute/flavors_helper.rb - tests/compute/server_helper.rb - tests/compute/servers_helper.rb - tests/helper.rb - tests/helpers/collection_helper.rb - tests/helpers/compute/flavors_helper.rb - tests/helpers/compute/server_helper.rb - tests/helpers/compute/servers_helper.rb - tests/helpers/formats_helper.rb - tests/helpers/formats_helper_tests.rb - tests/helpers/mock_helper.rb - tests/helpers/model_helper.rb - tests/helpers/responds_to_helper.rb - tests/helpers/schema_validator_tests.rb - tests/helpers/succeeds_helper.rb - tests/lorem.txt - tests/softlayer/compute/helper.rb - tests/softlayer/compute/schema.rb - tests/softlayer/compute_tests.rb - tests/softlayer/helper.rb - tests/softlayer/models/compute/flavor_tests.rb - tests/softlayer/models/compute/image_tests.rb - tests/softlayer/models/compute/key_pair_tests.rb - tests/softlayer/models/compute/server_tests.rb - tests/softlayer/models/dns/domain_tests.rb - tests/softlayer/models/dns/domains_tests.rb - tests/softlayer/models/dns/record_tests.rb - tests/softlayer/models/dns/records_tests.rb - tests/softlayer/models/storage/directory_tests.rb - tests/softlayer/models/storage/file_tests.rb - tests/softlayer/requests/compute/bmc_tests.rb - tests/softlayer/requests/compute/key_pair_tests.rb - tests/softlayer/requests/compute/tag_tests.rb - tests/softlayer/requests/compute/vm_tests.rb - tests/softlayer/requests/network/network_tests.rb - tests/softlayer/requests/storage/auth_tests.rb - tests/softlayer/requests/storage/container_tests.rb - tests/softlayer/requests/storage/object_tests.rb homepage: https://github.com/fog/fog-softlayer licenses: - MIT metadata: {} post_install_message: rdoc_options: [] require_paths: - lib required_ruby_version: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' required_rubygems_version: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' requirements: [] rubyforge_project: rubygems_version: 2.2.2 signing_key: specification_version: 4 summary: This library can be used as a module for `fog` or as standalone provider to use the SoftLayer Cloud in applications test_files: - spec/fog/compute/softlayer_spec.rb has_rdoc: fog-softlayer-0.3.17/docs/0000755000076400007640000000000012424143106014344 5ustar pravipravifog-softlayer-0.3.17/docs/fog-softlayer-CLA.pdf0000644000076400007640000011607512424143106020227 0ustar pravipravi%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xݎ)+-H l`2@ 0+˖rmg~|ݜ!)*wN|Sk/jǵwɗ_xnH-Ftz +߆9ڿ{|=ޞѰףiד ~ ~{< y`į6jz͠Qw{7hԄޙ?5pgqTbzk>_m`&loBT^`ZZ^ڮZ% oʜqՋWW{C^rywhǏ-~rQB/{",MNWk -)đx*~2e( \Kmh/4]i6}q &#@-"p:Yd>N̈P{eA_%?̦Ù+ k7 3 AlhFfzgCzePj`n{|fԬN7> Tr@S@MW=!f:X{ 2O;Ivꛥ$ND3W]pH3߾W"0c- *vˠ<= p=`uvt&~? 1e=OuY[ (%lQV obFS:@N5lrk!1A8*/&Å,m؍ l(lP6h9S374@9,ZYfܧʟPq &, M! PGPwT.vdx ê']'^c]UWM΂t!I^2Lh:4K%|݊IWuLyĆ-hg^L\qU{% XyTe׎n06t(jc,{VX]GSɆUi2(RMS=tպվֳ=S!&to3hgDW]+|*b'pU-F=f"R{aC\)Ƿض4QgS E&ulww ]`6;d+%0:l]K$"\ʬoS DN9w8YR c( ԐGe= eo2ǽK.*nEp:\",9 T1X2U>ǀ>jӥ*Zf^^ۇ~Z#P̝anL8P{O@\sՑv5Kkn$&|W"eB'JC0?vs rz6.{~}_5W%Z*_r2./a#!msc)Av y9Wb"TJ8p1Z B_7 y/9F endstream endobj 5 0 obj 2859 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792] /Annots 10 0 R >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT2 9 0 R /TT1 8 0 R >> >> endobj 10 0 obj [ 11 0 R 12 0 R ] endobj 13 0 obj << /Length 14 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 14 0 obj 2612 endobj 7 0 obj [ /ICCBased 13 0 R ] endobj 16 0 obj << /Length 17 0 R /Filter /FlateDecode >> stream x[oS, X‹$q."AEՇf.dX3,jwsv+A_ ?ڙ9쐿_EW|m_?}};ffv^^?VIc߷Mg>[\湭}:̞Wˋu$,{v қm&q#DxnoG77{gm~:;,\4vkڳD}᳊_mhǪ7U̿AM _F4[-EH\b;VkH!xL1QC_*A.=phVyaM9EB iU໳UӝSgjD4pl__?⧙UϒDneYW. B=.a؃#sVNdP2H-rh '#mhgZY~D隌͈$r &j0#)mH3q>֤bDX#swG&iv:%u˰2$}0 `Ydd6xz":`o$ BdQJ|vkdxCUkv YojEDg0 U{ VPvgYߞï+˅Gǧȉ) !H x/(Pw7w>"l+FeNM7S>x^C1l L7q0h^JŨgT 1zAB` "Oo ,or&Dc;FS08gljd@%ǵe'EvubQW1sI*3Y\G;Նc2Aq8G #+`A @_8qi'硆\$֒#3|"x‚"1WN͠+}zZj &f\Rs)ö>=tICH#EO@M^ikgL@@y#elL̇%9!v=O ^sIpdZw~PBbRjE1Qڑ#Èq(e2{~+ Hs4-,%-!<65BqIܳ"0 s !N%\h̢+ D/J2co˺!DjqrM8<}dU1r]޷8x1-zp% P{K|6[חc@vLRiC2 )Ŭw78.O'X0ٞdid RD OFPѧC`7g) Ȏ-YTRJ"dj@O>< 7@x7c/%FOy8BNm֜:A:Il# VrѦ7NUuP-ڛһ..BfͦMoN/H3]FH6'. _iv% {(1B#ʟ8:.GG+) ; Gg yuMΖ|7-hw<МKm53l?zr)I LؗD5Ǫ"f{|^~6v/d 2[@m#!?דH iuD nA )ggOJ00HpӤȲpPUn.kbIe 鬣~aPV#t 0#1 b{;QsE}~p-3߂v kBk7Jw,CAX@mb?eBdLyL,A*@Nd Nvq8q]|@ Z{̗c/*"`=eT炠>ݽcQz M#`. jؤtNu"XSaA;%%m(RV.<))%葠]ƓT]z [jb DБDWM|)d@k$.Q(nkka_ 'qAؽm-RX"à\;dHl46"wTp&y'u°Zepr, G*0؄IX1#.G[P_pnn;/H _  i  &dL}ݠb)&& Fņe Ո-4RLdK#bS7~NTdӚ XOAΔfW(xˠnNqf;M=[CIzõsfh`xW,Y6m":nCU\HyFӽbXF ,tGJ)+z@0b{$L{#[Og3 %g5ةaKCXǮy]M=@" T`/ػ B( H5 *ZS egE*j2KZ? b1m 3g|(Aė)fwPmXF2; dxCk:kXZJEZUSK4T6_/Vq4-Y/TI]%|F3Hq 2G b'L!m"&:]b) JxC]bM3!*E`>1ͼ9lQ]1\ ^Ncb}bCr?U*ZNV7L!PznK2mDaJ&O~8 cEVŭ ֤PFCZzCP'/B̅H3D`loaaM>gwOXpMVBLzCz"H:b !^CIOaf^2Zz*8PPrϜ:!BuHbAZa Q!g,̖&A =: A`cq 0H#47Y+/qvVQLV)I!( i(a2x SV YZDŅ.Rfy+!N<e) jbPBFXf=>pl8'Tl<ˋ[JRܩ7.if~>G:bf{hCE]ðx"/XK(I]sBD&ȒPڷY{Y@C}Ys,܁ qG14nD-P0 ÓQ;4xWq_7,!ĒML9gs5dF# ! RKZFYDAR'G`TdejM `0ջX,u/阂XC2e.b{FYq^V>z1._̏K]_MԞi6|??Բnh?وcK6CZ#XV=∸G ݐDE̯xS?40-#P()x^8:opx2 !`A{2cϋpMRefLZ;MEwӸ8;fƗ98kubA7|Z8RC[P" oy qhds^m 57?H D4ϗۡU3lne< uoKy{R1TX8Z8TQ I*MQ& R1IEMW Ď+zb9dj t/=J*[CY>Zid2C/V If^ÏWF#4B(& ;F4klNC <5QtD UT5Yn5?Gv{M.7S$߰-ьÎԤ.H^ǯ!%E"5mSG)aP8B$ Dq9DkGHK*hgq5q 94 sIV~^7u=zrQ~෗k='lG7z)6 szd@ r_.ʷ0bF<^Jbc Hawm2iBG̱'' ] dS :tY*jyw >hЇHF=Ѫ"\?W߸8 endstream endobj 17 0 obj 4788 endobj 15 0 obj << /Type /Page /Parent 3 0 R /Resources 18 0 R /Contents 16 0 R /MediaBox [0 0 612 792] >> endobj 18 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT2 9 0 R >> >> endobj 20 0 obj << /Length 21 0 R /Filter /FlateDecode >> stream x͚]s+0Z %{''JNLtƮKvu=sŒi' C>/|b=48y&}L⦉ݿfӒi牨F֛`z9-Vߞ$y[ /-"}y~:2٢pVDY8V4K2bPO͑lza ɲQ:`YQNTJCXJ:ed"BХ\G%W>HVb_VhG$ԏZH}:T#[BMfb%.aCJB-[BFX <π4P5J,!oIdMUH.Gl)b@4/p#6kYv]\\0(Q\:rC8Twn1K$fxt>:d;,Ygq]UHMhjt 7qLUs-tܻ-䤾HlR\Pd@Z1ʼnƌecۖGy[0*ҽ ~tADy]KáԵ ;%T>İ4VL|it]큊q"H>f70˛_ v`ܹbLU^)XP>a|/ӊOMdu}dkV2|,wu Ό:A?i4M~ }[bQ[Ej;ɦ. Af0+lq.T &B$gМI48+ElSd(plOz1w&IT bebս /twS/(/\S.,y.e5|c"X՟ߌMzTlɉlѾm]]\|J.~I`(`[0ҾTJ.H $hHͽfelFü_eĻGG&eAсw+0ˠ$T@= xM+u(6eЬ_óX}peHIH4@'F(hO/KL&XK eP׳*Ac)d.qZX.[=!S@kPVBq,}TjuBc 3 cWPפzV^BWrԉ /1Co>wuBh^'zTp<:Q<:ھ%_sMt7RAqkIM* 7'ک>ى$l_$`%ptwCvPl6B?d2D>al*|Pko?ԓ -{-td<өp7RI^ȤqE!~KcXĊBIխd0 IHfJ$AɊlPk UQhʸFvZGa5¡h#>Lh{Hљl[L#߶πxUl!)r/م毗[ࠁ2&|mDXHPH\k'?%7"p W#dLGe,I7NEi&E6ٻ6ރ>zhsؖM-?% '}X;Q'qR !8Z*[׍qT _`] :2%9KKxU1Fp88f#`~?,v_ʒ44O8xtu'`xZ8 ތ ;{BuA4fp$@u:;44Ub"͙9e*vg7XgmB:$A{jn{y%0)λB&{ (’DԀSQp>^-ml`t6gij6. (XnO=d3:bL+](B(VS ܅ endstream endobj 21 0 obj 2624 endobj 19 0 obj << /Type /Page /Parent 3 0 R /Resources 22 0 R /Contents 20 0 R /MediaBox [0 0 612 792] >> endobj 22 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT2 9 0 R >> >> endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 3 /Kids [ 2 0 R 15 0 R 19 0 R ] >> endobj 23 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 12 0 obj << /A 24 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [ 172 440.4 285.6 452.4 ] >> endobj 24 0 obj << /S /URI /URI (mailto:pjackson@softlayer.com) >> endobj 11 0 obj << /A 25 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [ 88 591.6 292.8 603.6 ] >> endobj 25 0 obj << /S /URI /URI (http://www.github.com/softlayer/fog-softlayer) >> endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /KEWYNX+Helvetica-Bold /FontDescriptor 26 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 118 /Widths [ 278 0 474 0 0 0 0 0 333 333 0 0 278 0 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 722 722 0 0 0 0 0 278 0 0 611 833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 611 556 611 556 0 611 611 278 0 0 278 889 611 611 0 0 389 556 333 611 556 ] >> endobj 26 0 obj << /Type /FontDescriptor /FontName /KEWYNX+Helvetica-Bold /Flags 32 /FontBBox [-1018 -481 1436 1159] /ItalicAngle 0 /Ascent 770 /Descent -230 /CapHeight 720 /StemV 0 /XHeight 644 /MaxWidth 1500 /FontFile2 27 0 R >> endobj 27 0 obj << /Length 28 0 R /Length1 11492 /Filter /FlateDecode >> stream x: xUsNyKi#ֿ0ZCk֌ 4" LD(@pe!!m''f7_]]AK G|2(|IJ~2D}E2?I*y%A;`;6J x0$ t! -?d0/ħ4ٗ[^̲ qk:is-3{]8oxX9mxgIؿw;n\s+HIsk;T4捈I+rO|!gs0+HfNq8K3t1Ub/TYL!'cd FۗA5)^PQ$pIiC'0D pPVUGT^e1a I3y4Ij(Ƿkj\saveVفi̷X^XC+,6}N5[`ޘٴVqfWl:8Qk+5TLf-cT*ig5t1cM ttt_4VFF52ĕC@[gD_E$dѺ ^"/ ؀58@`A&IoBނ Y o|JҰn.R?!k ź_)FNɭg_bnO$1 k\Yd!"OɷLg\ 6 6Ãgm4M$:_|Ylc1_;mEdpA1x/p ; ;R.KDEI.&3 d Cgy|1fd38)9 jv=ξ~i68*!Q ɌlAC:dD!&^OK 'U=.<24HRFv!Ry,wdn`.ğ(ʦl-;#{sp- n 䇄$W'Έ2@%I b!8 ϣ`0oIdJu6BK=HY*ȃlFi>g %pO̔H)E+5z\iTݖbLF^ӨU1QJ\& <2ܕvK =jj2iU U]&`Ꚗ>lhLKpKhK@IRiNW,A2 wUؚ-A)]/KhL[Ya vKe"M(2pJq&ףqIEed m:Q_hTY`6gd#:pL[n `~;M[91"_T嶫*WoEl;avehn ;8JD,݄}% :#ϡ3U+oLaCr4,ba0xpk)6l8߈kGBضHfA^ c-ë,#= @ό2#-M_*o}(@lYmkK#%C J*Q t7tI['_$j W`L 8ݵA74$A#IGbuU8fn,pY1T@UT3,} ,UNT)!akFhB&kל0hnd~l׌=,TFZUjC@OEBWьLG%>8܌rF)E/6М4縰>o kz>&5p/*°9\8J7Aj %Lw=^ǏRz %8Oåt#>Tpp(piq4'ҍDNAj'K8\w=.OOCR78<74gҍDDjgH3qxpxuqik8܌47Qrؗp ?a4F'TE$X~=,_Rz  )?*ax2<f-zAVoއ Ř^q)ln V1 zhIp;)}c~=Mļ/x H!⩡F )Q3G56@Kiq=6H},A f~3KUט fy>.ZGsCײo|r?^0g$qb KbY$$Fui M*LU}[R @iIBnNڪv"^>͟abk4%X??2uRgC |vN.amgZs8?zS>40/mgQґ!dABN" !70!ӆ0HG)QЪtz3ɨU Mg+n_8‘]_&E$h(Z^gШqZޤ?ȍ7Gɓ ^O*>㶔bSQ8SI>2햭S+l*hnp_τt]>Ï~ޅ'>3|q+4Ndl1&zۨ< !A9Ȇb=]xs N4tuW8\qg|1׃T_Ic<DcԇBi=vgU[{HvU忨~G`@J8E'C|bP$:*6s=}._EMML.LJ<P84yD* LT*I|e (Q4dtOU C^/^D!J%%%7UXmw5{xhQ%ȃl#cuzk*?EVga#'O%g|dӿ}hV䦅#vnΫC[x_}%ޕ__;ut&&\'GZF^xƒkF$5$RԜt Dv'<t_,0L/cM" I!k#=MU}+/ƅ.=u/)`]?q:|Q;QQhoDLΫu2< ]8P[[Nء_䉼L! rNԘDBI:[3A,Ujj4/hbbXE(>FdXBdcXY,Ė8杄_|٧Lhkp%+ƒ$֭ ~)Z׷HQkQ*qrһTĚ&9Jn^]ᨂ)Ң]_f%WK^6uq) r2FFFT*,v^ĘR sSi6Lס(C"şO3Z*akf\)7׳$SVڱ6ٻɿk M84lᏇ.gUjWo [9ܓ -U1dIөUFԾVf`.5Ξlu1(Ց({2Y5'Yd@HIb<\E>En9S%9٢FpDӃgI 9Ycv8sqM rۘwMڋFK:]:EJ~Hjb|bw^jЁh6.Mߡ#G_ Cvsي[ĉpsj&7fgnP?\ZJ91N: WAt kIDL_!ILݼ]wqH߶՗sߊ+1@xnGm4t $kI񺰗kOCRS@X{%\x--FG>H=[1*e1n;i{MB/Ø>%wܟI,zT2z$p"6Bd׀kAЕҒAՠZ/id|pyiU"UK:E=ۼY*>;S~/޾xKLfش~e܌\˸*%ĴC-~i͡.,(=3Ouяk}<JhT܎F Sy>14F+O0,ON^$z.Nl}'2(w1zt(9;k溲P?8QN k{=EY"Y Yn c4j$'@ PJhԼV1 c %̅;\w=<1ޟxtIF:}ܷQ 2믟3>q!]Zq?(1N&1,Q31Jgnd!kâ+V'$u:(44LJme\+b+܆y*ȕ?,m[y Cao\%Y9gU*k KMYVbRp Ngr5"NSݱZ%IW"j3z)+ c3>ØuU@cR̃oF<ÌV}n\F$W"E=  P=JXy> 7 =e)t&K7N7[A1F3E+&ҔH<cBn[z]9l"1H)^9S2j:vwZY~҅T\=~Dxs8 !PPЊ"<,)#\F#F(A\? XSkK!U/LU'_0&^I'1c䗎K _17ɯyL~՘-c4?9  endstream endobj 28 0 obj 7287 endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ZGETNN+Helvetica /FontDescriptor 29 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 222 /Widths [ 278 0 355 0 0 889 0 0 333 333 0 0 278 333 278 278 556 556 556 556 556 556 556 556 556 0 278 278 0 0 0 0 1015 667 667 722 722 667 611 778 722 278 0 667 556 833 722 778 667 0 722 667 611 722 0 944 0 667 0 278 0 278 0 556 0 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 500 ] >> endobj 29 0 obj << /Type /FontDescriptor /FontName /ZGETNN+Helvetica /Flags 32 /FontBBox [-951 -481 1445 1122] /ItalicAngle 0 /Ascent 770 /Descent -230 /CapHeight 737 /StemV 0 /XHeight 540 /MaxWidth 1500 /FontFile2 30 0 R >> endobj 30 0 obj << /Length 31 0 R /Length1 22308 /Filter /FlateDecode >> stream x|yxU9tU}Kw:Nwg! IHHH m*@웠&* ." !Jq*.30K/:#+Tu:|[U[0IɐL%gh=!I'ImB7OjΙ6;Q%D6kqBz͙>eyҎ}tHiӧϞ(Qy17Ϟ'wM=%qPs]ϐشΙ7z#DK$߱Ht~",;Ow?Iա1=X׮g{MI|gaӿ n%@"Pv-nDw@Ox2>@ւ Kϣv>_cbcz!pp[/PF o$[t)$L9KHɠd ǩPW>? :Fo"$E~*oD[+XR/^Hڛ+^ <ؘJuz{C:Sg Hmo UtV- 1b x< cWFt|- fev2 !FRQNdѐ=(gqd+9Egbn!-e÷nѝ7g7K ʉsp|n#.??N#rN+MXDU(P2 bd*`r!=Oы݇Q;N"G?BK |[T:>Aږ9 ,qùl;5|ߟ$_D&8ZY/K#K>`q$ijyr~7B-ctNAf Gh}LUt"ٌI'ut 5dt\wH'mdYˏ!;;>!)p&[$~q F>RefefD#PZ0*ߗ]NfN+KQ9JUjƧ6G7 P]]&TNmT 8uӕ1\9˕ĕWRsj9)ZJmUU(ZϪB mjyZ~H-Qjf:>qU9ءGٍI ˠ`I_vEu7TU s|z!C뫫áaxFNh'y0948&o'44sٽ,ͮPUkWJo8̅k&LYW˪Ymz Om teg#Xg ?3Y M_7s,Mhn~ӫ?jUPe #͡uZ#:h;4 ʍXt6꘢rWpuf; `sj6hԿL醆VڱTGݘͨQYAr5LVRץ7y]jMtV81e]C88|"ቱ) p7qpz[ژ;8\}7qmfpMsv*8<÷^oM68J Vu_2 q$ImA,7/>M)N\w vw;4{vvη`?Q+Qo@y k0P#2K@u8þ7h=7Xro-γvPoBYY5U0.5_0AfQk t @L$ x"!6bWaq"rdXbDO}I&5zmCLUqɂY'|+׬4k"-kjO >)b}#dacqmdMmט[_X[s6k{#Qx9ӝO9]]_G4yxǒJ;/A8pgģ M`r^+@3 VGe%y쵟!#N" -AKT)lhmxJVaU`bb?pi )yd4|oFƚd0%YcV෎tc4']maK2\ެt)ߺ==*ѦAT}MU]nki)չ. #ɐdMs's5:#(}(hp6CYu+FVS)d 9a`5 >=v߃?锼>6kb9 S+:̒}2b-+hi(u~ϔe*]ڤ|ar6 Э91' te͐z&ٓ4iJBמ;*Ɇ,**K{}I}~|YÈ,I/]xgaGϹԘ+@:.!p[[AWt@>lXxh8:~r5MxB+z:BΞ n:c.mY砧dzY0f HEղN?/%!*C{ZBonl8ְ]*c)㰻bax%)+jNΒG{,,IM|&OPy#l"XL3*8N3E ׆̽f+ڠR㘖ÆU<%2.ѬˠlV [+hBCiF ,:&jpǰF|k^Y;d7g9w(~粍XaxΔI9 2h6G9[ζEFwRdј\.JEFhnIܻ@f|+-+)_̌?7*K{"D+FᴈD`/ ް; TI &gl gt:!{z[*JJHc#<8d'!5CF /")::"E[ܟ*#J]'uѣ>s%9Q咧|ЊaMR&5dL,Md#VF4Td꒎[ R+tQ~QJI&].C*+\Jηh%XD -P09_=׿$6Pf~C+OQO3eYRCmmM%1Xm6))jͥsai1&+IRO{7)IM &F춊8Fk#ͦ"3P-Sci5UaNhЀA4Ȟ`\ΆXX944IRX 8\0-=.ԶMcW]?ٻ gȌҶOo3,Ŵ`fа3AVl؜PuML6@';!~hJ#tsڣ͡[Vlٯ3njPtJet?[k'&>ÊG+Poʯi>Z+⾻Nl۾&a;4ŤytH.'k:Vo?2^kĜ\nIX)$B+MB$-ZYg0*XK+>8f<~dh>h3 0kp~(`*8A5ij@~\= ycBÒ`* t.oW>Lɧ|q_ȟo䇄z>PO)zWE۶>А.{^T |f˱dq ,xZ8\W-7rhSϕ-TmH`RP` L/smS89wj n.VKY&RNunCIb#{5poaN,L93-;p/\ZΫ\ٞ0j&pHH=,o߾)ox٧|A~ՋimrȆ]{[/=~t苴T?9$ȉXX`e+)IIqr5M|qȖTNE\x:-aGD# 'YFoh*a1+z3iPEb8 )_Moʓ'4oʪ  {uh *> K)SFk^6pG432a1Z@pӵB}"&ULيrU%#Okg^}֢TULh|T\@؋VZlNիO[(?=0~;;>h_|2O:>f4*|6'Yx? Z߫bLNN<۹%9-FaUْbZR4!{y!.St@ |9lu)t$N;9'Nya[BUCc;U* ݒ \0$ Al4D(/ zhR9lk)3y؂EAK( 1 }z'o *JneS)GگNNsCQ~srV=kѻ?G^8écNE,(kSx(dA kDz1OÕ/wjAST})#xO\,0P6rdu}BNy(rl-шa1*IBq oE%.~bݣ1eQQQ WSq<B 5( =eI,rN4򝚟h.ix1K3XrLrpʫfH),y, 7w,;]A->wsx\Pt}#,V, @ERQ4=c&#w}(X>PlsHEv}a??1c5r[8.Sa,ѕkQ\#''uo+UAcF]kōLڈn*Zxs̐'H}hh{[8ǯ. ˎ{t켹tع6Q["pꧻ3{TPƾ_^'Yx5S0폃Ϝ*[Y [j{DZ#CYNT܂|uNG52F^Hc:- Ib(GQz[#Aٜ'룿'BG z;!K{lGźƂ &wR>^|zk>Mq=[UXːN+ ZpM. UV0( X /l?&7^zuz&I۟.*;uįQ^ YP+'.+/0N̾|С}bE3 3 KB>ݾ.HrlQSz:X n$- / ^E {g[xۦbdXBJqJ iQ=|~ng'_o (L![\T<J~Nl q}(; 9C/V F[ZykJs]X)DMR\ė,O͔#Γy>f2>['tԒa7=R\iA_| P.LOe ׮f^琢gfO9Jx5 ɥKo#`i`g=yMoݖYcG~P~r|x2=d*qIP$Rl* F&Fk&Wk0M7Mu^ii:^W}+[۝әdKzZ {w;'3 y hZ2ae#/d!Y\wݫYakb,)gBѐ8NtGt u\PU^R^84^`> e}(cYkjVIJ 4 ZD^@&gL8Qu 讱Zgǡ-97sylAQx=ꆩJ!ȸ-܊];1ZfnlITGE1#f'Y `=@ *E^RcH  6Ѧ8SfS3$am<}"^ 꼹&lzXΦi$ŭES`޹sIi Km;@QxILO0!8ELa0b%Yݩ -34Kՠ tlese˸,/uP9\*/٥̬=>əIO>-PPf%TkTʙqmU*`TQӑF'Lĝ̙jǒ{ BaǦYܛi-`6-*irR dѥz{Tzs͹4X{M/^T %[ğ=թ95qHiS"`?&V CG(:0ũ}eώ?VP?ɡH? ),4hK?g{Yx3?# Vvv{Vy/[yޮ{%2GK_uy|x]P:SbгAX`X _`Lʰ͌^2 H5é*Nw#Ѻ5SNL:V(b._-5̹߳/G޿BNv~vṷhxL)a\O zjMLŰl~ɦ.k5gZހ>VUE+7n=Æx%tP]ʚ@ռ .nٹl%kw/}@KgzH4\#RE/taj-"?E$&k3rпʟo'??֞|ҟrcd1O/H3I:SvbagR'ztɂ\TFs~ܕ~Dg1 &c RCB0x& jfciJ׺;L,Aݐ+d:LɨkSu/26󿝎`bŞ @tI U8 47:Xht[TXJŒyRߴI1舟ohذIoY 4 *i{GweJÓre`RMߣuIRns95D}7LmLwjh{P7EoI#HdxMX3aZF3' |; ɏKjp** E쌞ŪHg#˖:\-WX|r?/ዷ.rJiճ?}&qvS }B}Wnh##?6@4Wyl^9o RITu7%-Ȳِfk$Ag3wd'|sE~ 81Si.UkQJj f Ġ[B+ZbC)`3 Oćr4v>~!GOJ@5 ͔xE%ǯeƀCȹ >BQ520q8PGƒxߞ3U&\`;vBKP|`F%--Ӌ["F@h;C!4Fxj&oUo~3BOv&7pL=&K3J&.,VSd%@J[=sXDmH@)A!EHR5DE3)A*g8e'LY<$ b/ X'J 6<@J8!R6DZJ_Zٿ%V/orڿ [wIf әe!E%IMXEX$K&MKv\IQ9 ]7:?q+FWd_2,xf%] cBzx^4_n|9$6$\KTKHS]׼<s, c=6 ^gsz3L"m5wEz;n]sȆ]# <vU66?.PsB &jo̗Dވƭy%2^ugz'.MS2a jcRiB ]avW0pCw__Bw=9i6?'O6:+Έbː/ofPn7s>'ww'Lz[2z8h7YuxC M\۴.B%J%|Fv!MبmXBfU:a9 ENoWvx͛?Sک4iq"A3\Ҹs?FeFMXmeȩ>IwHIߧO3qQ7]: KZuX.G3ވ!ĆzL»>b>6cƀBZOTnK{{w0J?yU98aZ1/m]e#)<~Ϙ,+# c*Y+,q׹{nqO![]ޟ*4߫w$8L݋ P'v-U}mjgO#hKF l;6%`1f: 'ܭDV׺`7}^yr ʷSt<0_~^ Ԁ J_W#觅D'_+&̙!*f^e4Xm $갵 ubPq_ml]u,/8St5@%*ܾy_7\hnVq1V,MFz8Z ֦FGNMYlXl\lj Oٕ)6u$|nG=7#I?pq uBol}59uɈH o)5!\O}cʄoTjFu4NELu&Ӂ48M F r$ȇ Rǒ MMJ `(GuA ku@R9ؤX|A&D Nk)LSg4aU{&oзw>MQ1x3>=H>j*Ҳݻ .yݪ}Oq?n:hhasuLϮgטt/&8L$>,݉ ͝i9#dpU#ɼe6IB{^}ᅈ#ߘb.hxuMO Zi[!iz5.֫~imc34 TѤ#NvKn7\]ALyZj>rٗPO5fA%LK*ܲ 9,} ^:=LW>;dž>2g 4G!׋Vҷ\N#ӹ4jadGZ/֊'/ $Z; HK>xAmj"&hMI"kx : >0etƓeo;v nyARb 52@2T#eH~^uw%s6:"Ҧ Oi ~KuLY̋g!޵wd^-HuJ;qm^?U)O7JFbJi^Ǯjdȏpf h }P[c8Pf<5׻'K2DFvWw@^I#81ñt[)Ua[n V ~s΅W&3PZwϾ'-ʩ#~}D%Xl?^=n /Pԓ") "`!Ҁ JZzD^+ɝ%L]#DB|(b!OYMO#]%|u(X-Nu5n %:ku_(oۤ[[[\{ pԺN9*m[-"vr"~rI~Ĝ0g2ɡgx _ĬN_%\2E=(2ȜbbVt.[D")$эl6l'c\eشP NU= F'"OѴ#e.3}LX)+2E#?k`}Wxonckb=5ud4tf dPK4>g; !a@MVzlEuI,x '[D㘑о| 7_K%%Z&k)Bi7O< 5wA?A\{+|C>1mf8_i1MGƗf]8i\g>;~$K+NC~yz]mKNt I ։(^7[Ѽ؛v1ЧϸOI l-3 8}`` ;9kDmd.2[{d;q&֞_{˸)1Ry:?N kUXnD4QcBd% ZEFV6xpvݔYSϘ4ggY;444 "5iЧ?1! 444 "5iЧ?8* -z t)Ϡv` TZ Zz4SПAc TZ ZzZGz..uUp}F]ݺvra8n:ntvCt}Qzqz..^]؟X-]]}ԫԫko.6>_sS}`.]vR֥>K.]꣺oRۥ~G: 7.I]ꓻU=yv9?K}z.]wvRg7!7Rӥ>K}^=]t7v/R_ԥ~|>s` endstream endobj 31 0 obj 15167 endobj 32 0 obj (fog-softlayer-CLA) endobj 33 0 obj (Mac OS X 10.9.2 Quartz PDFContext) endobj 34 0 obj (Matthew Eldridge) endobj 35 0 obj (Markdown Pro) endobj 36 0 obj (D:20140520161444Z00'00') endobj 1 0 obj << /Title 32 0 R /Author 34 0 R /Producer 33 0 R /Creator 35 0 R /CreationDate 36 0 R /ModDate 36 0 R >> endobj xref 0 37 0000000000 65535 f 0000038979 00000 n 0000002975 00000 n 0000014024 00000 n 0000000022 00000 n 0000002955 00000 n 0000003094 00000 n 0000005972 00000 n 0000014540 00000 n 0000022578 00000 n 0000003202 00000 n 0000014348 00000 n 0000014171 00000 n 0000003236 00000 n 0000005951 00000 n 0000010893 00000 n 0000006008 00000 n 0000010872 00000 n 0000011000 00000 n 0000013819 00000 n 0000011098 00000 n 0000013798 00000 n 0000013926 00000 n 0000014121 00000 n 0000014281 00000 n 0000014457 00000 n 0000014948 00000 n 0000015179 00000 n 0000022557 00000 n 0000023278 00000 n 0000023503 00000 n 0000038761 00000 n 0000038783 00000 n 0000038819 00000 n 0000038871 00000 n 0000038906 00000 n 0000038937 00000 n trailer << /Size 37 /Root 23 0 R /Info 1 0 R /ID [ <24c031c9e042e78100165199c66ae7a1> <24c031c9e042e78100165199c66ae7a1> ] >> startxref 39099 %%EOF fog-softlayer-0.3.17/docs/cla-corporate.md0000644000076400007640000001547112424143106017431 0ustar pravipravi #### International Business Machines, Inc. #####Software Grant and Corporate Contributor License Agreement ("Agreement") http://www.github.org/softlayer/fog-softlayer/ Thank you for your interest in IBM’s fog-softlayer project (“the Project"). In order to clarify the intellectual property license granted with Contributions from any person or entity, IBM must have a Contributor License Agreement (CLA) on file that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of IBM and its users; it does not change your rights to use your own Contributions for any other purpose. This version of the Agreement allows an entity (the "Corporation") to submit Contributions to the Project, to authorize Contributions submitted by its designated employees to the Project, and to grant copyright and patent licenses thereto If you have not already done so, please complete and sign, then scan and email a pdf file of this Agreement to pjackson@softlayer.com. Please read this document carefully before signing and keep a copy for your records. Corporation name: ________________________________________________ Corporation address: ________________________________________________ Point of Contact: ________________________________________________ E-Mail: ________________________________________________ Telephone: _____________________ You accept and agree to the following terms and conditions for Your present and future Contributions submitted to the Project. Except for the license granted herein to IBM and recipients of software distributed by IBM, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with IBM. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean the code, documentation or other original works of authorship expressly identified in Schedule B, as well as any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to IBM for inclusion in, or documentation of, the Project managed by IBM (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to IBM or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, IBM for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to IBM and to recipients of software distributed by IBM a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to IBM and to recipients of software distributed by IBM a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) were submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that You are legally entitled to grant the above license. You represent further that each employee of the Corporation designated on Schedule A below (or in a subsequent written modification to that Schedule) is authorized to submit Contributions on behalf of the Corporation. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to IBM separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. It is your responsibility to notify IBM when any change is required to the list of designated employees authorized to submit Contributions on behalf of the Corporation, or to the Corporation's Point of Contact with IBM. Please sign: __________________________________ Date: _______________ Title: __________________________________ Corporation: __________________________________ Schedule A [Initial list of designated employees. NB: authorization is not tied to particular Contributions.] Schedule B [Identification of optional concurrent software grant. Would be left blank or omitted if there is no concurrent software grant.] fog-softlayer-0.3.17/docs/cla-individual.md0000644000076400007640000001474112424143106017562 0ustar pravipravi#### International Business Machines, Inc. (IBM) #####Individual Contributor License Agreement ("Agreement") http://www.github.com/softlayer/fog-softlayer Thank you for your interest in the fog-softlayer project ("the Project"). In order to clarify the intellectual property license granted with Contributions from any person or entity, IBM must have a Contributor License Agreement ("CLA") on file that has been signed by each Contributor, indicating agreement to the license terms below. This license is for your protection as a Contributor as well as the protection of IBM and its customers; it does not change your rights to use your own Contributions for any other purpose. If you have not already done so, please complete and sign, then scan and email a pdf file of this Agreement to pjackson@softlayer.com Please read this document carefully before signing and keep a copy for your records. Full name: ______________________________________________________ (optional) Public name: _________________________________________ Mailing Address: ________________________________________________ Country: ______________________________________________________ Telephone: ______________________________________________________ E-Mail: ______________________________________________________ You accept and agree to the following terms and conditions for Your present and future Contributions submitted to the Project. Except for the license granted herein to IBM and recipients of software distributed by IBM, You reserve all right, title, and interest in and to Your Contributions. 1. Definitions. "You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with IBM. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to the Project for inclusion in, or documentation of, the Project (”the Work”). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Project or its representatives,including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Project for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." 2. Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to IBM and to recipients of software distributed by IBM a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works. 3. Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to IBM and to recipients of software distributed by IBM a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work to which Your Contribution(s) were submitted, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed. 4. You represent that you are legally entitled to grant the above license. If your employer(s) has rights to intellectual property that you create that includes your Contributions, you represent that you have received permission to make Contributions on behalf of that employer, that your employer has waived such rights for your Contributions to the Project, or that your employer has executed a separate Corporate CLA with IBM. 5. You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions. 6. You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 7. Should You wish to submit work that is not Your original creation, You may submit it to the Project separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]". 8. You agree to notify IBM of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect. Please sign: __________________________________ Date: ________________ fog-softlayer-0.3.17/docs/fog-softlayer-CCLA.pdf0000644000076400007640000012211512424143106020322 0ustar pravipravi%PDF-1.3 % 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xɎ j}1I"@ G6JꦗcU⨪ά^8aj*#cc̚ǰ$̗aNMSطamVi z?6V? o=i'Y3C1iz2OU|g0Od{oBԌ]xtjoކcWP|sձ4^|։?k^/J,r^+ي7L]a\/妏+a;? ҰAj얕wRQHU-3p&0)Y%!q7Wg?ݘr3L0ڙLxřm'jC}9N8{&~WitMvާxyۮ,kl=m\p|t{pD!AFjwV GG# fW̌%6}U]3_zY/RP0]y`oU E_ ;IBMP{^IEd$d0 j6E>.CDRVKA lԋIa`g*bx %he:UX͚U{W_tuL6ɼʫ1̐^ KO{pXD r2E,.VT(){nkb ^ɟ MEa5"/{+tكh@,o D?(EC \ 4Y AxdOt2 F9!f9QgOy0vsum}/PKvAA+j >7 pT U=Z<1j?h6#* 7*vBQsrTgPH<Ⱥ 8!_Ζ6.p:pA]G;:[L-ĉpRB] \:XNki Ʋi< ܉Q|dH:  maqFh/-4pAv;ƳkƊV-}(K6ufU>w=*˽bwe}ۗKkQcDpY".U"-+)( P[˷쳉㑓XG]v8ڊbD`:oJ<`9'##'{ie{Y>4}\6p?c׸a݉oFg$H*$18ط%9QP8y$ `=ttlgDyFX[SUܢB *$ w.|#bBUbS,|vϪhz5y1G.e}4]Y(6&+EAol-|GF{OI3'b}7mדΰ,7I*[]}f袪ذ\Wt_%` Nm9YUXeIm\`Atr,=~A¨fh _> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT2 9 0 R /TT1 8 0 R >> >> endobj 10 0 obj [ 11 0 R 12 0 R ] endobj 13 0 obj << /Length 14 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream xwTSϽ7" %z ;HQIP&vDF)VdTG"cE b PQDE݌k 5ޚYg}׺PtX4X\XffGD=HƳ.d,P&s"7C$ E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI(L0_&l2E9r9hxgIbטifSb1+MxL 0oE%YmhYh~S=zU&ϞAYl/$ZUm@O ޜl^ ' lsk.+7oʿ9V;?#I3eE妧KD d9i,UQ h A1vjpԁzN6p\W p G@ K0ށiABZyCAP8C@&*CP=#t] 4}a ٰ;GDxJ>,_“@FXDBX$!k"EHqaYbVabJ0՘cVL6f3bձX'?v 6-V``[a;p~\2n5׌ &x*sb|! ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZ ZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴ kh&45ǢYYF֠9<|y+ =X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY) Σ -rqr.d._xpUەZM׍vm=+KGǔ ^WWbj>:>>>v}/avO8 FV> 2 u/_$\BCv< 5 ]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK .3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%Y jgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{׿m>PkAma꺿g_DHGGu;776ƱqoC{P38!9 ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf endstream endobj 14 0 obj 2612 endobj 7 0 obj [ /ICCBased 13 0 R ] endobj 16 0 obj << /Length 17 0 R /Filter /FlateDecode >> stream x՜]W bEjWh i EbVKo)GόUE.<=/9Ծ a9iX܆t֋ge0S[8:0>zM~X3[(Zd/@y|CtG$$'HSQPREEzAkjrCb`A٢D#dH23տ"$kY0K80Ffy#)' }fQVB'9! |M5mf3Y1,ΛVRmLzl,rI}?@+(@G|atXH4iwBD8T ѼqP_&X` @Z0WUjXL@`{}JC0؆-b_mhcDB↧p!nAO<]-4hq$T%HbJ-=(P7I)9RÇYFVcZ$Lpop6)֠%XB3}#2@+56&/AY`2f.-v1e4Hbsq瓖WWya,I)F;Bݥ =PbM@ztz}18Fs'5Nv~>:[tJ5;fAB26yFܳU7e-1*hXVڴ,TuS0ʈ똼݈_OU18n 2?j9C`1>Hvr#ypqf)? W`[<[hCd~s! F`0`k2bApqni51Mv؆M2],uYU)W+07d x@Zd# 1Cr6Hy4^".}?ݳX>Q j0bQjENVO>!&}^!rF/HidB|g;XLt.Ҏ z[C$LZwĴ:FXYo-Ll } e$VW*DCq2 f,g0DYR*bw(}mؾ )*x-u#~f@V fmo(8c4YW~K&XLAEZѠD6. Ġi'LE\N>D͈D{Q=\Ogi,ElvUd2 6Ρ-iN0lNλuW+W+/i'xf=1Ǵ }OA/ڇ`1 SceV Nd>k!#(*|^{NZ)IٌD=42Wrх4'G[sFTvXCafp _ #@To^qf$5sc;(gn XᯃG9Ev@W/ ٱb%^9B1,=  vqWrcpMBb;8Jpv_`mV2D~B̛'x;T\Ɗ%bꉉ(?O ~ kAV?0 '|%Q@3UWPHr*KPciDj<$JL4L.GO_ {(†iYE1-c\01XcDD7LS@xE),MK],@`ԌP&ih@`<1*?CƜOYȟx?y&UI5}#@v>_C=BHUN3XO%`]' NxnP& _A-d_7W@yL8&e ;MmFwډǝJn{e{эO[񍏗ydg~6j*^V7>7|MX3wxB\]b| icé>TF#369ŝek-ȹO1 @@; z)!4ğ.!J%Ҳr `R">l~25չ-ΤN79vj mr%f枰)h/ 4Vy K"Rmk"Q#>: x?<إA%~U,OsүE͖w'nrFar[ lr{v,kqlr/nrOVZ=I&'$ WD0CZvط>)߽R,1y/+*KJhl1| (G}3ƃ)L670d)H(0$(H9ct˲{-!u)Nw)K]p,^(8} Mثދ+ؑ&Q&RÓ$#(LgD8*/}[ Ncv 50A-ңsb$}+dO:cgu^b,{ͯ@44xe8  JBQLѬ#jp-D&U$l.۝VcYŁ.XM `%Fa n<}vG FȎszjkuGC;\1ZvLŌ\ P~it|ǔ*\8۲Lvx9`PⰕ%R^pE}R&DRf B9::ԋRov DOH,y 8ż Ⴄl] x/ (Ѽb'dĬ8 tcޜ@y[TU(خyI"P/ֶDy7'$r8-ޑrLƶQvd  tkn"\iyD` h]Ke,LŽ#j7ύ"ȃKYq A= l#,v优vx% 9^[`PՈۼAPOIGxjΤap#]t>&,{zd`܌Ia#> 蘑- |)Egtr V f.4pedC1%$#Gx3H±2(.[k(3 e+W:BpR}Z.I#Zd: _&oe[vU Lk뇅} ~c/,V8d[a%_)udCpP-a #zO _ I /]T6 ~z|U-@2jv`iSڿiXVw42--tJ)XFXEO 3Sl 0LP,$Fч. `0dBj5O0)T_ 9GQlsdGP%͢JXdo}g+V Q?fL@'0HA:|9Po~}vT@5lQp;kHr9Y VypD(V9r60|sgst]O'-ܦ[xU9WN >g$(l9%*5);P9ӚD[mɄ [F8ospgl%vqVXw1e#_~s}/^d2U虘~-",co\s$&%`P endstream endobj 17 0 obj 4743 endobj 15 0 obj << /Type /Page /Parent 3 0 R /Resources 18 0 R /Contents 16 0 R /MediaBox [0 0 612 792] >> endobj 18 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT2 9 0 R >> >> endobj 20 0 obj << /Length 21 0 R /Filter /FlateDecode >> stream x͛ێ ݄ H'wZy(l9;HHѮl(ͳH9h.CVᯪ߅oûj=l M, _w򌃉zy`==q0a }`bSAy[szTGL^J}l.LoXI&P{#E@hrs75GiY53 !+\lb n7I/у1`.w-K{n>"1ޤpyy].} q'ʤ(V= seP2j"ĭ0B!@Ƀ;Ɉɦ2G2QLGO)A^ (?bYSj0]~IjBupCS%@&jO<Ɛ=ƁG)wV@o^"y d~Ĥtv|%DL\8W[IXy]H"79O]t1D5vĥ75`8b|ؽu]~j\ONAcn`B}8W PŅHrB1WQHzDtgTQ@qO 5`tѯ=^;ðϝvoЁһQj2jr֓c&wM0PN a2I)5K R-3 EL3xxB@%4 #j-{nAnnO[o|Y!ru\1nj>yQS iK)PBw-f(Q(GpnXb'Ee(Y4 j(vυ}KUءצGVg6"GAtĦd  aP[^@E0i8k|f2fL|!{,7$G 2т QQiD6Zt]y8t)<dbiI h={]_nPSj)!QSd)8ɾPZ_21T/1QOF]8jlɹydb'l:G񥫡uع,ҹ{.w.1͗BMʆv_Sok}^ʶ.o oZq _Cqj|h:^,f"Y_gY3>4 !)Xu~ |1c**ߑNƓêk_AXLJ=]Y{EVoǒЌÜMR`FEqٽJlF-S+u86H .^KԫniG{m.V y//Ӗ$0 ABa&HYFK2Hļ7ta6 K3^< G%ȑn,[ǧC#ͭSMvsJ3b!{y35UEєJ#fACY*ɳ\pN&m>y@u=AʚCly* 6Xwuͱv@NQwW\״ZfIqoY le+֥_ֹV bz\߯S_PΨЦh9nRhw $/&ɏ).P 9=P`u<(a3)\Sgd WiwhtV杏Ge,jP|?e endstream endobj 21 0 obj 3089 endobj 19 0 obj << /Type /Page /Parent 3 0 R /Resources 22 0 R /Contents 20 0 R /MediaBox [0 0 612 792] >> endobj 22 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT2 9 0 R >> >> endobj 3 0 obj << /Type /Pages /MediaBox [0 0 612 792] /Count 3 /Kids [ 2 0 R 15 0 R 19 0 R ] >> endobj 23 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 12 0 obj << /A 24 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [172 397.2 285.6 409.2] >> endobj 24 0 obj << /Type /Action /S /URI /URI 25 0 R >> endobj 25 0 obj (mailto:pjackson@softlayer.com) endobj 11 0 obj << /A 26 0 R /Border [ 0 0 0 ] /Type /Annot /Subtype /Link /Rect [88 591.6 290.4 603.6] >> endobj 26 0 obj << /Type /Action /S /URI /URI 27 0 R >> endobj 27 0 obj (http://www.github.org/softlayer/fog-softlayer/) endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ABVIPD+Helvetica-Bold /FontDescriptor 28 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 119 /Widths [ 278 0 474 0 0 0 0 0 333 333 0 0 278 0 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 722 722 0 0 0 778 0 278 0 0 611 833 0 0 0 0 0 667 0 0 0 0 0 0 0 0 0 0 0 0 0 556 611 556 611 556 333 611 611 278 0 0 278 889 611 611 611 0 389 556 333 611 0 778 ] >> endobj 28 0 obj << /Type /FontDescriptor /FontName /ABVIPD+Helvetica-Bold /Flags 32 /FontBBox [-1018 -481 1436 1159] /ItalicAngle 0 /Ascent 770 /Descent -230 /CapHeight 720 /StemV 149 /XHeight 532 /StemH 124 /AvgWidth 479 /MaxWidth 1500 /FontFile2 29 0 R >> endobj 29 0 obj << /Length 30 0 R /Length1 12500 /Filter /FlateDecode >> stream x{ xTE]zIY;ݝIH:lBXL0 "AGQ@䍣4Fcpy.PWN&|}骺U7/ēu'-sSE}v1_my]4V=FvۅKVŞ7 XoOh?9ߋ6-A]h; %̏w]8ڎD"˖GQ]Oۀkn"Oۈ^HĊo^%Ow`㧎jת0N-gxF-eGvpe V@`"GxL;jj˧ixx>*5m$e%vZKrY3~.7P p<R߻`?]i]d^.BEwHDk)˶?V6>Ž*ʮ߳Asw\?bN̿uq[kEyK{CCKݙyxN{>*D=f>{-=`DGg/uGsgEW`Ivɞ՞^<ސnn萼+(+.OI=ɦs޾!8ӛQېU   љ<6,e2[t*ӕ)dAS%TJP *NETɡL:V(-u7ᨊ#SHHA3T&j~KUS5Bӂ[gwY%~NKO7ۺWmܲ\7srp̮y{Y\ t8ύͺ[]5{ڙm{fzjZ- SGyxڟYMjT֚֚j k.QMăD/"6&T4B"oa4#2D‘A֍f0x4M&&J8Y *MEi1y&;F?Ỗ|Jfa\KH>RS*#K><T~r*iM'>q"{4גۑO>zGޅSN6q.CϏ|AvG#+W#SjLKwȺﰷT"q-%אd'yD5OH4w|M?Ža1 u;),Gc;ׅ>.6l"ws5.9Iɏ$L4NpcNn w6_Ŀ'(-u⁈y=#pN'9d<4}:i#=j*6ؾOާ>ZDLz>"] zπ]g\[6sp~n5A=;(t q/FtVH~ńMI>HPq)Nnv]!( Ӵ&W8IXB%t)n>`y o7i\rj.;VAs|73"_{o0GX&b8AFWЁ[u#ntȅF##QA*.Ghs~crfӉGv9ju+zkjM~OHhA2{ +FmڠՅ:xOm`ښ=?/H'w Wu0178{Fچ?`K(@uZwG[nr]l }n Sls:.fku߀V ko CB=1Z]ծ]9iil imr#?oex'?*㝖deΰll ek&͠c>-X3 NEgR(\7#FwoM 5jM>1_7 x-g]_%Xl};?=8z-^ƾ2vYjϹ6;p5mku!R ?t2[TÍ'j 1p;'/w9z!RG.f,df3hO<l­LxəvLYg (6 6F9ɹvx(K~s|w2;7/2F$5$U$7$y9$'sdWK~n7i^X]E9{NnMMf hFY=z5`#olQuO#blul̝_9C(h;!}DB߾"c4(r=>l'G=1$8D@ "NAMSH'v`KS+!%d6[Wn?ℇIѧ'Tyk9+/k 4Wh$mv z9 ĀST!6i<шBs6BFU\RԡpTwͺpW0(*w꽀=3GC?N er~[r$D/D"ʻ{`qc\7AI4E|Td3<ܪpIH&,\ , J$>I1JRa%.o6m9K6V_;u05t}I_v=Jh>50`'_jTB21K$ #5!y0?ˇ1BE扴v&+ Եbt#]TzSʠHRͭq:lX'$kD,DUh;$͘:ɩw>?L>xH3|pD9^1K3VQnPBj7 ;ۄ ikRJƗ*E.YLE}JUԜh+@QZC4y@s(iq=_j]1U7diO_nqHP^ȋ rS 7zF]EPTH;I'ujq"⤜=D;8407Bi bj'2shӍ!WoW6TM^isTLӕmDZsr0`Qm4ʰ.!wK!p.Z\@6S(y9{UKEғ-ujj2,:pGCҁɝ:礕M!̗~W1p#ZJrinUުS +fqͳsڷwߵEgQmeSlqUv7TvSYUfOWڜeVv#{j֗+++@ȸb(;fٙgpd̩ N7SO;1jf{Nǥth>fW m_S/ZzQ۰Y?'.ՏB6,Oj;J^N2r BT*ڕdH2R2N<ʲWu>] rv:ŭǣYԩwya\l:Fbjצ΁ϚGWH3Yw*ҿ`|wТƗytoJNaz!I>}h@ z(xi9i^Q TB{!^O-]<4;E!B"$UMyU Խևbr?U1Os'->xtt Qw ܬ&JJ-M*:xUj>P,UU*r~3^l?@?GNW*ڤi[3LPVj* W3$$*5& J7h|p *^ zp DkR++t1kZL04(Pdm_ Cl2Ra)= }IIK'9zƱC(ӹ9wI9V1>͊-&@ 'X_2Zki\(|m.ۘe37hq%ċ%ɖ|YYn)ڌS82G+֎Kj&Js&f*l)R'f>30̸З裘>fvA> h"er2{=y'bJlNf&!=LK)+ VOqȴ szr5Ҡ~Mڻe ǧJ/ko;fFum\䦯4Ic=7u\_W2elV|s'_/)2cQ{:S<tG&mPj55nliv=ޫ:3;[}#Ƞl+QQ!c2ʀOgd1DP3@LT:f5\YeKzިp !UnS4qt?N4C7[펍Ά~bgWxHVAhrx ~l6*Kp:REN,칹45u̍ fK3zTH)܁ E75b%]~}l3K[%dawy2q::Bh-ɮ^fΆs (O\xhuYR|-2W+wRtr)Ll]sUBy͜6Z 5K%Oݰ/C_01s:mv}T-*tQMv\OKh&ޜdJ27LMɶSy8}G,)n mLKpIpg8fC^s߼:#+n]gssҭ.7HqV:pv91苒h| 5XFlR:cM*Hב񔾼4P>$-6)h+K7Sv g^QG/‹5޸:8{4ZbDTIN᜞ a3Fj4Mn]3T F9X&^J.DdQY:ϺPd1e` X@x#@\ceZ8 s+<)ϗ:/䅺?WRpx aEwOiPx!Zp:,`x lũRl3# Fʧ v ,P΃~"O4?Yz7ݻt :9u }xߴTFߩ -(f4&A:HBQ! /U"0p%9a|r&/ vK i駙ny $q'RğǟI>ixϯ߷S_U52`nmxH"Y _JQ(|Hx'4Oܘ"{@;fM樠+(PD<'$ttiПt /|-x#vAGF:Q(zCyp`ϲ2Zu١J tN:pEY ٽ3l,ذyc쌶%œu3s&f5+^mΛ6-='i,vCX1/R# ;Ҧ*APaY9U|Ry8AV$gߐsVO\&m\$t9.'<gz>)[fp9e*nS&o$.E%Yu'h-7l*j芽&|°vK=peg/)q"{E _~5zz*ZWIj)|پ|c/(^ts~vW_r׆>{2 FЁS`~\b<6k2^qp\YvKz {- 1xhdckrjRrDX.jY'tP*繾SBK&18Mrq LSx^-8FdmѐJpiS`B^6//Ѩq3|eVGҚIs5OVdS %*$᣺^ /輀vp~XxF~&j"({]&勵)0MZ3>P7cE`7;⤊Gpv+x/w==VXVh|O`? Z\|3%l`:M;="ɒ3_O3ˡ0I&v}ap>qxρ3oȏj' d2^mĻpL'dޡM/"s)**?=&gɊwW_dQag? xpp Ry @pNÀ'G_@y<@ X p`g$dNa=G{#x{Dkhn9WՖ9G&~mzͣ3FGjF/9ӾpQEɈ8gG_27}e3) endstream endobj 30 0 obj 8059 endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /XKOREL+Helvetica /FontDescriptor 31 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 222 /Widths [ 278 0 355 0 0 889 0 191 333 333 0 0 278 333 278 278 556 556 556 556 556 556 556 556 556 0 278 278 0 0 0 0 1015 667 667 722 722 667 611 778 722 278 0 667 556 833 722 778 667 0 722 667 611 722 0 944 0 667 0 278 0 278 0 556 0 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 222 0 0 0 0 0 0 0 0 500 ] >> endobj 31 0 obj << /Type /FontDescriptor /FontName /XKOREL+Helvetica /Flags 32 /FontBBox [-951 -481 1445 1122] /ItalicAngle 0 /Ascent 770 /Descent -230 /CapHeight 717 /StemV 98 /XHeight 523 /StemH 85 /AvgWidth -441 /MaxWidth 1500 /FontFile2 32 0 R >> endobj 32 0 obj << /Length 33 0 R /Length1 22544 /Filter /FlateDecode >> stream x|y|T9w{g[f2Lf& IJBC6VYd .EY\pD-)"X`֊ojV}ϝ!~G?s9޹BċSfOB7MiO3}v.?B?]w )O1uRS<} Hi3f_[p޷9n:{ҢOPOc쩉G|};UsM6}CDKn#Ht~",;Ow>IoW|?JTh^L%CΨfH;N*AŠܤ$AOx2>@V Jϡv>OcKB&'SMく_ԳH7 DYKH=ɠ[gSϑ9n)}n_JA5ڋDH@_ 1?'e~;GF~Z,)px@'NؐN @_JD=tɢ^E?0tS;p;]+ؔY g 3kQǼ%-nn l)CHA)YV,deYj/ hI%~Y#8(/_< 2'{&No3 hԒ?qX@`%A=aXl Ge "g\鮴VOꙫMG57Bq?NMEI)YA2u|s?Ύ$<~k^l?qEWN_5-qNY8Fq\ wk,~?ߋ[e 6! ZaߝnaX&cq"ܣY٧Z7!ҝZ ?~;ZM'MtYj9$s<_4F~iJ-dG$vܲ_܌ѹu}cYH8=L%{=naY-fAʒFx^5ډB$T_I80ہʩ_Ӛ~7 2+22vJjN 9RkBq#PYu1C-Uղ`?HqϨNmSkZkgXӋ^LqĈݸ  `WԴzC58LJk&5PS 6l3rzlE;P12y"+MMddBխ%_^-լv N560U'ڤ rZF6BKYs6!2aDCkKurk=2$W_k)Zths~&ߥh\sTC(zd͚5l%<:N%e8~](A0DO W% >k/%*KC.w8p^ q_ñkF#o@kc*Cpp͵^ZqqxAڍFFk-xqx8|#;ãwthh&cCpp㵖^qhs#8Kn%pKKn,$ZIW2R*luj߃hkH tk} 44q\CR@ύ=^ WSFםv87]mOAH?#aԳP~3 0RP=ZF3<-(3 v}3[.[PyV9@Ef~eXv2 ]z*%TPJEKt L$  E~C$AFBNèEH!2dzr@%s4PW u% _Dn-k"3'L%>A#]S^|xaچ=)BAKĜ$d5:3!隈I25! Vva BJ=5$~bi,I/{{a)M?sRc:SH0njUu^7C٨قh6b;uli}S5Mާ{9pTɎ$ꢛqu C=y3P bbNۢnaZXGOm#sc"IX2ZK;ݥ:LGTvT7E$aoD#N;g͠2Jf J.#8l<:_ذYxm*fߋ%'b`j4b)c ZK,E\(]B>vı(P{fV65;Ć[|I9|K寿?D/H˕ʧ/uGu2 $vZ3dM"iYʋ} -!˱׷F[cky;11Xa%B0VGʒet%'g| K);kʗ|ȏW oX,00*gj攜 r4"tsgۍb#Pn)6hO.N|{SҎU$]i\ 3^>t ,*x`W3ʒޞъ8-!|x7 27Π_AoPecf:{kyɻ7=Sϕy[PyoTphBH|\-R Ju. LvT,F1W2{SJ-wt\.=ߕY2&^v乡&CXP/5I4b$5)%FgC *s0 b愪+hb:C ȎPUgݰl>] cfQ'7,C=;}g?,{'9_]-ҍUt_wV%!~{ ШXp2 hn0; 60M}I5pF%iK/,ufMP_2C!6s|羀Bij,UYEشpD$D9MEw'" i+ _*@_GoP#_;/,'$x,F1oT*P vvkTW]A B|G&(}6Ptٳó Dp]<#w/!7۱ƒYW-'Sѯ/5 j2.ZU4|Cp-[8>yt.'k :v~74~_Nf9v/APYiubN?@,DJ!ȕ&!ȃǍyבg-4Sx3ֲʎ3:g*,p@V#00 ,H*c $ FP Z WBа$>] K#G k +77O.m/2AGir`$Sм_(Ux#tNj志ONzH\{^iۣrz[=N{7ڭ * Ta8nZ6S/ͩιz@gP~Yآ{N׮mi2SK dDB] [q.aXg׋V'hD( bYV"jcV q`\;v=4"^[&.8CTf,Oz$In5u#fx5f3 3OԆ!ʯ]9ǹCOs㘱\@ەz5 (meb,YY% 4Xor Iè)QYOfi '3޺?o<p}ˢm h̋fL|n]/@*ub>3$XynRן/_*TZSyWyCQ_>Ѕo }֜< 991 lr>%#).Yηyưl^}5e"SW;NKH$HIFg['6ZJv`5|b AT%Cj {>[(kc6eE|GFQ ͽE}pT9>DžabR Z9E L\5rxvxCP_?=0|$w:w\}xOS:?b9*}:?Y.x? +j+bLNNlf<1إNEh fZwĉp@KN@PxbٳBll\9;syqЉ%@`h0}Ɩhİi·#-ꏒ~'SD1CpT5r\χH 3t8$ H7bFF+@$|' ^sFL|f 35ƭSBE9\eʡ""Rf3t02xBOGhP ONR[1n+9 q'W6ph`Y$11.Ee+Q. N\Q0I?6 mB0A(8ۏs ًj\ q@c5 cNzh>ޮO6 1FA~k0q cXǍ9)dq FVRnu^(70b#;hyŲ23Cb몟N"%i0P{qR$.,=RLyG!nE%9,OwҧC'&]O9rANɧEW9U.GFim`r-8$ xjd ν, ^tZfu3 ZYh7XG($9C/WOzFv^ <{fy;ϊʇZu-N3@vMJZ7ŝS>anUa/CBpP.`8hA Z48(6LW[UZà,&b3jb[û)kHMW~0_^z]98I~!DPoW(Ǖw/*/0N̾}>оI♆ņ%V`a_b$9b6)Y=iAk ^g/΢3-PbjmS12 ,s!%vAj{gJqeQ]|v.o PyL!m\\T<JƁ^l LɾH! S#s 5%`9`.D&K)z.KSÎ@'LfʑpT|?z"-jbSfI̛)f4e/>X|O(O'2}>=4{۽{'+Jޚ{Qg RS8ce)Xؑ?!lwah^7eڃ1߮OO&v첕a%6!3)DJLtm s=i7-=M > {^^fk{s:lIO dmq]p  $ nN{dn˂Q!r D[K7fEL態:N{EO Ǹlob2/kѴKu8lt퀹l"gXV"/h$m8L K2sNly)$*G,O3Wp;7Qoʉ!DŽdⒸ[>^ Ke,cYz<⏆qC>CriEJ hyFlG/hp,DCe<Z%P{O¬W"^ȑUd- D&2CcZ lj0eGw27`<3<UĺuuExmc'VS7LUAmYVSisGlry%-lC<*x1 >ɚH [k^ūHP5|π` my}Nn}ٔIXO%pGxWnIF޻"1Vi5IqkfѠT0@"w,mQZ:h;նNd/uN2$IBzKqЁSdTĺ { I4V՛}zL,T&[ Z>@Jy6Y~+/ [͒(i._;]uHQ+ ]ڝퟜ-  D"J??vU;}@T93njnl3J8iIRS9SXrO#} ]A(0l0՝QUt }JQU׭Eǚ̦E8nt. qSpFh[%?+vxpWؐby_ݼq|Әv;QCF~K|/4UXWm|F3"+̉v>irR dѥz{Tzs͹4X UϟW %[ğ=թ95qHiS"`?&V CG(0ũL|-l'7~_P:Zzמӛ' ißgby~([%1YPB0,W;XI68tbKSf8UPũNc86Z&pIǪS4TL8y0ٛC]3>aXS=^x Z^ SAJ;W=񓅱>:X.d1,۹$?_8K/r͙7z=)yUݻ?t}ZԭG|!d9^Y跚[TŢb-R\d-Kw\9fT~/>UK_Fo_~mOQ`) 4ҟXzd@zC|,b7ˏzwx%vɚ 1饃叴> ]p][[[d1O/H3I:S6v`agR'ztɂ\TFs L?QUę̂4kr"<Ԓ!^ mfY@YZrz.)BS|!oDld7 `4S2ꚥfeg to#Xg$1Ї-]B%O_Zb5_Z\g7$ݘ?r #RL}Ơ-ҐPwz7Ɨԕ?;gUR" jۿ~>י)z{LQcHm\(c?-FKC@ &=u{2)zKz D"$ËEoڜ` "4 =a@eH~\VcWq!]M0-Mdg)QE:Y,ե5R ;+('^/c"|ɖ?W.SUZO_ o荽BUЀW N6l}1 F8֭/;er)%Nqbf\rTH dflH 5à3f;29J)2(luW5j3@dAb-em±iTs^idD#4l}?Cdy%1Fkxu-r)̋cK+];5ls|\spZ@Q@K}[O%\Bp%UΧZڟ5(-mkSZl5Bǩ-+,;~zaz+Ѿ2p.XqXHZ)O=)yn&ϕaIN2f#bD! J Jdd='΄]0e%(9~ʝ=.l.xpxC ly2oǕ;9Aȓ$+˄C*݆E-IMXC>X$K&MKv\IQ9 ]7:?q+FWd_2,xIfM] cBz]pϛ/v\cmiP&%%Ů^KIXQܖa+ᰬC oiڄ-7L3jM} _3whveҮ:Ʋ'hk8AcD͚h7pvѸ:C룹L$ÅnJ&XB_,U*1-Y6/aW qC8?{bJs.'>&xh,FrAf -&gNsv-Kӟ솾 ~#y<.MF/rFк,p{*?D6-PɅhDIg7D0_px6=enUdhXNdB彇MO+?>UP5iM9ƕ+pckVF at݄զ^ɻ\\곘4~1}4u{u𮃙iIPUB}9Nl!K-c3:1f * L鶄7wk_=TV['(o]=ذظ>?Dz{sM:nźq3 fyl^5ĵ< @Gr. ~fJEvs2W# W[<0 $;!HK>xmj"&hMI"kx : ^U/L39t9{ :ዝIu ^%ZD")+fu`A9rE$BXfv2j\M 5ȯTEPo`4x>xh361yE0NA"P5&Ph>h361yE`JA7@A@΀΃.n ;(Tj-=z:::aV$G=G]Uݮ8ѣ٣ޫGyݟ޸^޻G/.\wGGGGGO:dQgY{c=7WQQQQQQq]uu h{ԇQգ~S==7QGiܣ>GG]աZ{gQգ~[={zٽ?wQۣ>G= zԛ{/QW_ƿ%ןOޟT˪+ endstream endobj 33 0 obj 15304 endobj 34 0 obj (cla-corporate) endobj 35 0 obj (Mac OS X 10.9.3 Quartz PDFContext) endobj 36 0 obj (Matthew Eldridge) endobj 37 0 obj () endobj 38 0 obj (Markdown Pro) endobj 39 0 obj (D:20140521160626Z00'00') endobj 40 0 obj () endobj 41 0 obj [ () ] endobj 1 0 obj << /Title 34 0 R /Author 36 0 R /Subject 37 0 R /Producer 35 0 R /Creator 38 0 R /CreationDate 39 0 R /ModDate 39 0 R /Keywords 40 0 R /AAPL:Keywords 41 0 R >> endobj xref 0 42 0000000000 65535 f 0000040888 00000 n 0000003360 00000 n 0000014829 00000 n 0000000022 00000 n 0000003340 00000 n 0000003479 00000 n 0000006357 00000 n 0000015416 00000 n 0000024263 00000 n 0000003587 00000 n 0000015188 00000 n 0000014976 00000 n 0000003621 00000 n 0000006336 00000 n 0000011233 00000 n 0000006393 00000 n 0000011212 00000 n 0000011340 00000 n 0000014624 00000 n 0000011438 00000 n 0000014603 00000 n 0000014731 00000 n 0000014926 00000 n 0000015084 00000 n 0000015140 00000 n 0000015295 00000 n 0000015351 00000 n 0000015834 00000 n 0000016092 00000 n 0000024242 00000 n 0000024967 00000 n 0000025218 00000 n 0000040613 00000 n 0000040635 00000 n 0000040667 00000 n 0000040719 00000 n 0000040754 00000 n 0000040773 00000 n 0000040804 00000 n 0000040846 00000 n 0000040865 00000 n trailer << /Size 42 /Root 23 0 R /Info 1 0 R /ID [ <33cae561f9d53f0cfafad3936531fee7> <33cae561f9d53f0cfafad3936531fee7> ] >> startxref 41063 %%EOF fog-softlayer-0.3.17/lib/0000755000076400007640000000000012424143106014162 5ustar pravipravifog-softlayer-0.3.17/lib/fog/0000755000076400007640000000000012424143106014735 5ustar pravipravifog-softlayer-0.3.17/lib/fog/softlayer/0000755000076400007640000000000012424143106016745 5ustar pravipravifog-softlayer-0.3.17/lib/fog/softlayer/network.rb0000644000076400007640000001472412424143106020773 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/softlayer/core' module Fog module Network class Softlayer < Fog::Service requires :softlayer_username, :softlayer_api_key ## MODELS # model_path 'fog/softlayer/models/network' model :datacenter collection :datacenters model :network collection :networks #model :port #collection :ports model :subnet collection :subnets model :ip collection :ips model :tag collection :tags #model :router #collection :routers ## REQUESTS # request_path 'fog/softlayer/requests/network' request :list_networks request :create_network request :delete_network request :get_network request :get_private_vlan_price_code request :get_public_vlan_price_code request :get_subnet_package_id request :get_subnet_price_code request :get_datacenters request :get_datacenter_routers request :get_references_by_tag_name request :create_network_tags request :delete_network_tags request :get_network_tags request :list_subnets request :get_subnet request :get_ip_address request :get_global_ip_address request :get_ip_addresses request :get_global_ip_records request :route_global_ip request :unroute_global_ip request :delete_global_ip_address class Mock #Fog::Mock.random_ip, def self.reset @data = nil end def initialize(options={}) @softlayer_api_key = options[:softlayer_api_key] @softlayer_username = options[:softlayer_username] @networks = [] @datacenters = [ {"id"=>265592, "longName"=>"Amsterdam 1", "name"=>"ams01"}, {"id"=>358698, "longName"=>"Ashburn, VA 3", "name"=>"wdc03"}, {"id"=>3, "longName"=>"Dallas 1", "name"=>"dal01"}, {"id"=>154770, "longName"=>"Dallas 2", "name"=>"dal02"}, {"id"=>167092, "longName"=>"Dallas 4", "name"=>"dal04"}, {"id"=>138124, "longName"=>"Dallas 5", "name"=>"dal05"}, {"id"=>154820, "longName"=>"Dallas 6", "name"=>"dal06"}, {"id"=>142776, "longName"=>"Dallas 7", "name"=>"dal07"}, {"id"=>352494, "longName"=>"Hong Kong 2", "name"=>"hkg02"}, {"id"=>142775, "longName"=>"Houston 2", "name"=>"hou02"}, {"id"=>358694, "longName"=>"London 2", "name"=>"lon02"}, {"id"=>168642, "longName"=>"San Jose 1", "name"=>"sjc01"}, {"id"=>18171, "longName"=>"Seattle", "name"=>"sea01"}, {"id"=>224092, "longName"=>"Singapore 1", "name"=>"sng01"}, {"id"=>448994, "longName"=>"Toronto 1", "name"=>"tor01"}, {"id"=>37473, "longName"=>"Washington, DC 1", "name"=>"wdc01"} ] @tags = [] end def credentials { :provider => 'softlayer', :softlayer_username => @softlayer_username, :softlayer_api_key => @softlayer_api_key } end end class Real include Fog::Softlayer::Slapi def initialize(options={}) @softlayer_api_key = options[:softlayer_api_key] @softlayer_username = options[:softlayer_username] end def request(service, path, options = {}) options = {:username => @softlayer_username, :api_key => @softlayer_api_key}.merge(options) Fog::Softlayer::Slapi.slapi_request(service, path, options) end def create_new_global_ipv4 order = { "complexType" => 'SoftLayer_Container_Product_Order_Network_Subnet', "packageId" => 0, # everything that's not a Server is package 0 when using placeOrder "prices" => [{"id"=>global_ipv4_price_code}], "quantity" => 1 } request(:product_order, :place_order, :body => order, :http_method => :POST).status == 200 end def create_new_global_ipv6 order = { "complexType" => 'SoftLayer_Container_Product_Order_Network_Subnet', "packageId" => 0, # everything that's not a Server is package 0 when using placeOrder "prices" => [{"id"=>global_ipv6_price_code}], "quantity" => 1 } request(:product_order, :place_order, :body => order, :http_method => :POST).status == 200 end def list_networks self.list_networks end private ## # Queries the SoftLayer API and returns the "category code" required for ordering a Global IPv4 address. # @return [Integer] def global_ipv4_cat_code request(:product_package, '0/get_configuration', :query => 'objectMask=mask[isRequired,itemCategory]').body.map do |item| item['itemCategory']['id'] if item['itemCategory']['categoryCode'] == 'global_ipv4' end.compact.first end ## # Queries the SoftLayer API and returns the "category code" required for ordering a Global IPv4 address. # @return [Integer] def global_ipv6_cat_code request(:product_package, '0/get_configuration', :query => 'objectMask=mask[isRequired,itemCategory]').body.map do |item| item['itemCategory']['id'] if item['itemCategory']['categoryCode'] == 'global_ipv6' end.compact.first end ## # Queries the SoftLayer API and returns the "price code" required for ordering a Global IPv4 address. # @return [Integer] def global_ipv4_price_code request(:product_package, '0/get_item_prices', :query => 'objectMask=mask[id,item.description,categories.id]').body.map do |item| item['id'] if item['categories'][0]['id'] == global_ipv4_cat_code end.compact.first end ## # Queries the SoftLayer API and returns the "price code" required for ordering a Global IPv4 address. # @return [Integer] def global_ipv6_price_code request(:product_package, '0/get_item_prices', :query => 'objectMask=mask[id,item.description,categories.id]').body.map do |item| item['id'] if item['categories'][0]['id'] == global_ipv6_cat_code end.compact.first end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/dns.rb0000644000076400007640000001207712424143106020065 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/softlayer/core' require 'fog/softlayer/compute/shared' module Fog module DNS class Softlayer < Fog::Service class MissingRequiredParameter < Fog::Errors::Error; end # Client credentials requires :softlayer_username, :softlayer_api_key # Excon connection settings recognizes :softlayer_api_url recognizes :softlayer_default_domain model_path 'fog/softlayer/models/dns' collection :domains model :domain collection :records model :record request_path 'fog/softlayer/requests/dns' request :create_domain request :create_record request :delete_domain request :delete_record request :get_domain request :get_domain_by_name request :get_domains request :get_record request :get_records request :update_record # The Mock Service allows you to run a fake instance of the Service # which makes no real connections. # # class Mock attr_accessor :default_domain include Fog::Softlayer::Compute::Shared def initialize(args) @softlayer_domains = [] super(args) end end ## # Makes real connections to Softlayer. # class Real attr_accessor :default_domain include Fog::Softlayer::Compute::Shared # Sends the real request to the real SoftLayer service. # # @param [String] service # ...ayer.com/rest/v3/Softlayer_Service_Name... # @param path [String] # ...ayer.com/rest/v3/Softlayer_Service_Name/path.json # @param [Hash] options # @option options [Array] :body # HTTP request body parameters # @option options [String] :softlayer_api_url # Override the default (or configured) API endpoint # @option options [String] :softlayer_username # Email or user identifier for user based authentication # @option options [String] :softlayer_api_key # Password for user based authentication # @return [Excon::Response] def request(service, path, options={}) # default HTTP method to get if not passed http_method = options[:http_method] || :get # set the target base url @request_url = options[:softlayer_api_url] || Fog::Softlayer::SL_API_URL # tack on the username and password credentialize_url(@credentials[:username], @credentials[:api_key]) # set the SoftLayer Service name set_sl_service(service) # set the request path (known as the "method" in SL docs) set_sl_path(path) # set the query params if any # build request params params = { :headers => user_agent_header } params[:headers]['Content-Type'] = 'application/json' params[:expects] = options[:expected] || [200,201] params[:body] = Fog::JSON.encode({:parameters => [ options[:body] ]}) unless options[:body].nil? params[:query] = options[:query] unless options[:query].nil? # initialize connection object @connection = Fog::Core::Connection.new(@request_url, false, params) # send it response = @connection.request(:method => http_method) # decode it response.body = Fog::JSON.decode(response.body) response end private def credentialize_url(username, apikey) @request_url = "https://#{username}:#{apikey}@#{@request_url}" end ## # Prepend "SoftLayer_" to the service name and Snake_Camel_Case the string before appending it to the @request_url. # # On DNS we have the service: SoftLayer_Dns_Domain_ResourceRecord # As it does NOT follow any pattern, you can specify # :dns_domain_resourceRecord # So set_sl_service will NOT change you service name case (just first letters), pay attention def set_sl_service(service) service = "SoftLayer_" << service.to_s.gsub(/^softlayer_/i, '').split('_').map{|i| i[0].upcase + i[1..-1]}.join('_') @request_url += "/#{service}" end ## # Try to smallCamelCase the path before appending it to the @request_url # def set_sl_path(path) path = path.to_s.softlayer_underscore.softlayer_camelize @request_url += "/#{path}.json" end def user_agent_header {"User-Agent" => "Fog SoftLayer Adapter #{Fog::Softlayer::VERSION}"} end end end end end ## some helpers for some dirty work class String def softlayer_camelize self.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join end def softlayer_underscore self.gsub(/::/, '/'). gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). gsub(/([a-z\d])([A-Z])/,'\1_\2'). tr("-", "_"). downcase end end fog-softlayer-0.3.17/lib/fog/softlayer/compute/0000755000076400007640000000000012424143106020421 5ustar pravipravifog-softlayer-0.3.17/lib/fog/softlayer/compute/shared.rb0000644000076400007640000000232512424143106022216 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Softlayer module Compute # The Shared module consists of code that was duplicated between the Real # and Mock implementations. # module Shared # Creates a new instance of the Softlayer Compute service # # @param [Hash] options # @option options [String] :softlayer_api_url # Override the default (or configured) API endpoint # @option options [String] :softlayer_username # Email or user identifier for user based authentication # @option options [String] :softlayer_api_key # Password for user based authentication # def initialize(options) @api_url = options[:softlayer_api_url] || SL_API_URL @credentials = { :username => options[:softlayer_username], :api_key => options[:softlayer_api_key] } @default_domain = options[:softlayer_default_domain] end def self.valid_request?(required, passed) required.all? {|k| passed.key?(k)} end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/version.rb0000644000076400007640000000032512424143106020757 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Softlayer VERSION = "0.3.17" end end fog-softlayer-0.3.17/lib/fog/softlayer/compute.rb0000644000076400007640000001023412424143106020746 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/softlayer/core' require 'fog/softlayer/compute/shared' module Fog module Compute class Softlayer < Fog::Service class MissingRequiredParameter < Fog::Errors::Error; end # Client credentials requires :softlayer_username, :softlayer_api_key # Excon connection settings recognizes :softlayer_api_url, :softlayer_default_domain, :softlayer_default_datacenter model_path 'fog/softlayer/models/compute' collection :flavors model :flavor collection :images model :image collection :key_pairs model :key_pair collection :network_components model :network_component collection :servers model :server collection :tags model :tag request_path 'fog/softlayer/requests/compute' request :create_bare_metal_server request :create_bare_metal_tags request :create_key_pair request :create_vm request :create_vms request :create_vm_tags request :delete_bare_metal_server request :delete_bare_metal_tags request :delete_key_pair request :delete_vm request :delete_vm_tags request :describe_tags request :get_bare_metal_server request :get_bare_metal_servers request :get_bare_metal_tags request :get_key_pair request :get_key_pairs request :get_references_by_tag_name request :get_tag request :get_vm_tags request :get_vm request :get_vms request :update_key_pair # The Mock Service allows you to run a fake instance of the Service # which makes no real connections. # # class Mock include Fog::Softlayer::Slapi include Fog::Softlayer::Compute::Shared attr_accessor :default_domain, :virtual_guests, :bare_metal_servers, :softlayer_default_domain, :softlayer_default_datacenter def initialize(args) @virtual_guests = [] @bare_metal_servers = [] @tags = [] @key_pairs = [] super(args) end def request(method, path, options = {}) _request end def request_access_token(connection, credentials) _request end def _request raise Fog::Errors::MockNotImplemented end def list_servers vms = self.get_vms.body bare_metals = self.get_bare_metal_servers.body vms.map! { |server| server['bare_metal'] = false } bare_metals.map! { |server| server['bare_metal'] = true } (vms << bare_metals).flatten end end ## # Makes real connections to Softlayer. # class Real attr_accessor :softlayer_default_domain attr_accessor :softlayer_default_datacenter include Fog::Softlayer::Slapi include Fog::Softlayer::Compute::Shared def initialize(options={}) @softlayer_api_key = options[:softlayer_api_key] @softlayer_username = options[:softlayer_username] @softlayer_default_domain = options[:softlayer_default_domain] @softlayer_default_datacenter = options[:softlayer_default_datacenter] end def request(service, path, options = {}) options = {:username => @softlayer_username, :api_key => @softlayer_api_key}.merge(options) Fog::Softlayer::Slapi.slapi_request(service, path, options) end def list_servers (self.get_vms.body.map {|s| s['bare_metal'] = false; s } << self.get_bare_metal_servers.body.map {|s| s['bare_metal'] = true; s}).flatten end end end end end ## some helpers for some dirty work class String def softlayer_camelize self.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join end def softlayer_underscore self.gsub(/::/, '/'). gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). gsub(/([a-z\d])([A-Z])/,'\1_\2'). tr("-", "_"). downcase end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/0000755000076400007640000000000012424143106020620 5ustar pravipravifog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/0000755000076400007640000000000012424143106022274 5ustar pravipravifog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/create_bare_metal_tags.rb0000644000076400007640000000322012424143106027252 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def create_bare_metal_tags(id, tags = []) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) response = Excon::Response.new response.status = self.get_bare_metal_server(id).status if response.status != 404 tags.each do |tag| @tags << { 'empRecordId'=>nil, 'id'=>Fog::Mock.random_numbers(7), 'resourceTableId'=>id, 'tagId'=> tagId = Fog::Mock.random_numbers(5), 'tagTypeId'=>1, 'usrRecordId'=>123456, 'tag'=>{'accountId'=>987654, 'id'=>tagId, 'internal'=>0, 'name'=>tag}, 'tagType'=>{'description'=>'Hardware', 'keyName'=>'HARDWARE'} } end response.body = true else response.body = { "error"=>"Unable to find object with id of '#{id}'.", "code"=>"SoftLayer_Exception_ObjectNotFound" } end response end end class Real def create_bare_metal_tags(id, tags = []) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) self.request(:hardware_server, "#{id}/set_tags", :body => tags.join(','), :http_method => :post) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/get_key_pair.rb0000644000076400007640000000146712424143106025273 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def get_key_pair(id) response = Excon::Response.new response.status = 200 response.body = key_pair = @key_pairs.select { |kp| kp['id'] == id }.first if key_pair.nil? response.body = { "error"=>"Unable to find object with id of '#{id}'.", "code"=>"SoftLayer_Exception_ObjectNotFound" } response.status = 404 end response end end class Real def get_key_pair(id) request(:security_ssh_key, id) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/get_references_by_tag_name.rb0000644000076400007640000000202212424143106030122 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def get_references_by_tag_name(tag_list) response = Excon::Response.new response.status = 200 response.body = tag_list.split(',').map do |tag| refs = @tags.select { |ref| ref['tag']['name'] == tag } unless refs.empty? { 'accountId' => Fog::Softlayer.mock_account_id, 'id'=>Fog::Mock.random_numbers(7), 'internal' => 0, 'name' => tag, 'references' => refs } end end.compact response end end class Real def get_references_by_tag_name(tag_list) self.request(:tag, "get_tag_by_tag_name/#{tag_list}", :query => 'objectMask=references') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/delete_vm.rb0000644000076400007640000000200012424143106024555 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock # Delete a VM # @param [Integer] id # @return [Excon::Response] def delete_vm(id) response = Excon::Response.new # Found it and deleted it. response.status = 200 response.body = self.get_vms.body.map{|server| server['id']}.include?(id) # Didn't find it, give the error that the API would give. unless response.body response.body = Fog::JSON.encode({:error => "A billing item is required to process a cancellation.", :code => "SoftLayer_Exception_NotFound"}) response.status = 500 end response end end class Real def delete_vm(id) request(:virtual_guest, id.to_s, :http_method => :DELETE) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/delete_key_pair.rb0000644000076400007640000000152312424143106025747 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def delete_key_pair(id) response = Excon::Response.new response.status = 200 if @key_pairs.reject! { |kp| kp['id'] == id }.nil? response.status = 404 response.body = { "error" => "Unable to find object with id of '#{id}'.", "code" => "SoftLayer_Exception_ObjectNotFound" } else response.body = true end response end end class Real def delete_key_pair(id) request(:security_ssh_key, id, :http_method => :delete) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/create_vms.rb0000644000076400007640000000734212424143106024757 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock # Launch one or more SoftLayer VMs. # # @param [Array] opts # @option opts [Array] :body # HTTP request body parameters # @option opts [String] "hostname" # VM hostname, should be unique within the domain. # @option opts [String] "domain" # VM domain. # @option opts [Integer] "startCpus" # Number of CPU cores provisioned for the VM. # @option opts [Integer] "maxMemory" # Available RAM for the VM in MB. Valid arguments are 1024, 2048, 4096, 6144, 8192, 12288, 16384, 32768, 49152, 65536 # @option opts [Boolean] "hourlyBillingFlag" # Should the VM be billed hourly or monthly (monthly is less expensive, minimum charge of 1 month). # @option opts [Boolean] "localDiskFlag" # Should the root volume be on the machine or on the SAN # @option opts [String] "operatingSystemReferenceCode" # A valid SoftLayer operatingSystemReferenceCode string # @option opts [Boolean] "dedicatedAccountHostOnlyFlag" # Defaults to false, pass true for a single-tenant VM. # @return [Excon::Response] def create_vms(opts) raise ArgumentError, "Fog::Compute::Softlayer#create_vms expects argument of type Array" unless opts.kind_of?(Array) response = Excon::Response.new required = %w{hostname domain startCpus maxMemory hourlyBillingFlag localDiskFlag} begin opts.each {|vm| Fog::Softlayer.valid_request?(required, vm) or raise MissingRequiredParameter} response.status = 200 response.body = [] ## stub some responses fields = { 'accountId' => Fog::Softlayer.mock_account_id, 'createDate' => Time.now.iso8601, 'datacenter' => nil, 'dedicatedAccountHostOnlyFlag' => false, 'domain' => nil, 'fullyQualifiedDomainName' => nil, 'hostname' => nil, 'id' => Fog::Softlayer.mock_vm_id, 'lastPowerStateId' => nil, 'lastVerifiedDate' => nil, 'maxCpu' => nil, 'maxCpuUnits' => "CORE", 'maxMemory' => nil, 'metricPollDate' => nil, 'modifyDate' => nil, 'startCpus' => nil, 'statusId' => 1001, 'globalIdentifier' => Fog::Softlayer.mock_global_identifier, 'operatingSystem' => {}, 'tagReferences' => [] } # clobber stubbed values where applicable response.body = opts.map do |vm| fields.deep_merge(Fog::Softlayer.stringify_keys(opts.first)) # stringify in case :symbols were passed. end rescue MissingRequiredParameter response.status = 500 response.body = { "code" => "SoftLayer_Exception_MissingCreationProperty", "error" => "Properties #{required.join(', ')} ALL must be set to create an instance of 'SoftLayer_Virtual_Guest'." } end @virtual_guests.push(response.body).flatten! response end end class Real def create_vms(opts) raise ArgumentError, "Fog::Compute::Softlayer#create_vms expects argument of type Array" unless opts.kind_of?(Array) request(:virtual_guest, :create_objects, :body => opts, :http_method => :POST) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/get_vms.rb0000644000076400007640000000147112424143106024270 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def get_vms response = Excon::Response.new response.body = @virtual_guests response.status = 200 response end end class Real def get_vms request(:account, :get_virtual_guests, :query => 'objectMask=mask[datacenter,tagReferences,blockDevices,blockDeviceTemplateGroup.globalIdentifier,operatingSystem.softwareLicense.softwareDescription.referenceCode,primaryNetworkComponent.networkVlan,sshKeys.id,privateNetworkOnlyFlag,userData,frontendNetworkComponents,backendNetworkComponents]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/create_key_pair.rb0000644000076400007640000000167312424143106025756 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def create_key_pair(opts) response = Excon::Response.new response.status = 200 response.body = [] response.body = { "createDate" => Time.now.iso8601, "fingerprint" => "1a:1a:1a:1a:1a:1a:1a:1a:1a:1a:1a:1a:1a:1a:1a:1a", "id" => Fog::Mock.random_numbers(5).to_i, "key" => opts[:key], "label" => opts[:label], "modifyDate" => nil } @key_pairs.push(response.body) response end end class Real def create_key_pair(opts) request(:security_ssh_key, :create_object, :body => opts, :http_method => :post) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/get_tag.rb0000644000076400007640000000073512424143106024240 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def get_tag(id) # TODO: Implement end end class Real def get_tag(id) self.request(:tag, "#{id}/get_object", :query => "objectMask=references;references.tagType") end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/create_vm_tags.rb0000644000076400007640000000314712424143106025611 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def create_vm_tags(id, tags = []) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) response = Excon::Response.new response.status = self.get_vm(id).status if response.status != 404 tags.each do |tag| @tags << { 'empRecordId'=>nil, 'id'=>Fog::Mock.random_numbers(7), 'resourceTableId'=>id, 'tagId'=> tagId = Fog::Mock.random_numbers(5), 'tagTypeId'=>1, 'usrRecordId'=>123456, 'tag'=>{'accountId'=>987654, 'id'=>tagId, 'internal'=>0, 'name'=>tag}, 'tagType'=>{'description'=>'CCI', 'keyName'=>'GUEST'} } end response.body = true else response.body = { "error"=>"Unable to find object with id of '#{id}'.", "code"=>"SoftLayer_Exception_ObjectNotFound" } end response end end class Real def create_vm_tags(id, tags = []) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) self.request(:virtual_guest, "#{id}/set_tags", :body => tags.join(','), :http_method => :post) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/delete_bare_metal_server.rb0000644000076400007640000000206712424143106027631 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock # Delete a BMC server # @param [Integer] id # @return [Excon::Response] def delete_bare_metal_server(id) response = Excon::Response.new # Found it and deleted it. response.status = 200 response.body = self.get_bare_metal_servers.body.map{|server| server['id']}.include?(id) # Didn't find it, give the error that the API would give. unless response.body response.body = Fog::JSON.encode({:error => "A billing item is required to process a cancellation.", :code => "SoftLayer_Exception_NotFound"}) response.status = 500 end response end end class Real def delete_bare_metal_server(id) request(:hardware_server, id.to_s, :http_method => :DELETE) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/delete_bare_metal_tags.rb0000644000076400007640000000257612424143106027266 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def delete_bare_metal_tags(id, tags = []) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) response = Excon::Response.new response.status = self.get_bare_metal_server(id).status if response.status != 404 @tags = @tags.reject do |tag| tag['resourceTableId'] == id and tags.include?(tag['tag']['name']) end response.body = true else response.body = { "error"=>"Unable to find object with id of '#{id}'.", "code"=>"SoftLayer_Exception_ObjectNotFound" } end response end end class Real def delete_bare_metal_tags(id, tags = []) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) subset = self.get_bare_metal_tags(id).body['tagReferences'].map do |i| i['tag']['name'] unless tags.include?(i['tag']['name']) end.compact self.create_bare_metal_tags(id, subset) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/get_bare_metal_tags.rb0000644000076400007640000000207712424143106026577 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def get_bare_metal_tags(id) response = Excon::Response.new response.status = self.get_bare_metal_server(id).status bmc = self.get_bare_metal_server(id).body unless bmc['error'] tags = @tags.map do |tag| tag if tag['resourceTableId'] == id end.compact end bmc['tagReferences'] = tags response.body = bmc if response.status == 404 response.body = { "error"=>"Unable to find object with id of '#{id}'.", "code"=>"SoftLayer_Exception_ObjectNotFound" } end response end end class Real def get_bare_metal_tags(id) self.request(:hardware_server, id, :query => 'objectMask=id;tagReferences') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/update_key_pair.rb0000644000076400007640000000176712424143106026001 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def update_key_pair(id, opts) response = Excon::Response.new response.status = 200 key_pair, index = @key_pairs.each_with_index.map { |kp, i| [kp, i] if kp['id'] == id }.compact.flatten if key_pair.nil? response.status = 404 response.body = { "error" => "Unable to find object with id of '#{id}'.", "code" => "SoftLayer_Exception_ObjectNotFound" } else @key_pairs[index] = key_pair.merge(opts) response.body = true end response end end class Real def update_key_pair(id, opts) request(:security_ssh_key, id, :body => opts, :http_method => :put) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/create_bare_metal_server.rb0000644000076400007640000000700512424143106027627 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock # Launch a SoftLayer BMC server. # # @param [Array] opts # @option opts [Array] :body # HTTP request body parameters # @option opts [String] "hostname" # VM hostname, should be unique within the domain. # @option opts [String] "domain" # VM domain. # @option opts [Integer] "processorCoreAmount" # Number of CPU cores provisioned for the VM. # @option opts [Integer] "memoryCapacity" # Available RAM for the server in GB. Valid arguments are 1, 2, 4, 6, 8, 12, 16, 32, 48, 64 # @option opts [Boolean] "hourlyBillingFlag" # Should the VM be billed hourly or monthly (monthly is less expensive, minimum charge of 1 month). # @option opts [Boolean] "localDiskFlag" # Should the root volume be on the machine or on the SAN # @option opts [String] "operatingSystemReferenceCode" # A valid SoftLayer operatingSystemReferenceCode string # @option opts [Boolean] "dedicatedAccountHostOnlyFlag" # Defaults to false, pass true for a single-tenant VM. # @return [Excon::Response] def create_bare_metal_server(opts) raise ArgumentError, "Fog::Compute::Softlayer#create_bare_metal_server expects argument of type Hash" unless opts.kind_of?(Hash) response = Excon::Response.new required = %w{hostname domain processorCoreAmount memoryCapacity hourlyBillingFlag operatingSystemReferenceCode} begin Fog::Softlayer.valid_request?(required, opts) or raise MissingRequiredParameter response.status = 201 # a real response comes back with lots of nil values like this too, it takes 1 - 2 hours for a real BMC server to provision response.body = { 'accountId' => Fog::Softlayer.mock_account_id, 'createDate' => Time.now.iso8601, 'dedicatedAccountHostOnlyFlag' => false, 'domain' => nil, 'fullyQualifiedDomainName' => nil, 'hostname' => nil, 'id' => Fog::Softlayer.mock_vm_id, 'lastPowerStateId' => nil, 'lastVerifiedDate' => nil, 'maxCpu' => nil, 'maxCpuUnits' => "CORE", 'maxMemory' => nil, 'metricPollDate' => nil, 'modifyDate' => nil, 'startCpus' => nil, 'statusId' => 1001, 'globalIdentifier' => Fog::Softlayer.mock_global_identifier } rescue MissingRequiredParameter response.status = 500 response.body = { "code" => "SoftLayer_Exception_MissingCreationProperty", "error" => "Properties #{required.join(', ')} ALL must be set to create an instance of 'SoftLayer_Hardware'." } end @bare_metal_servers.push(response.body).flatten! response end end class Real def create_bare_metal_server(opts) raise ArgumentError, "Fog::Compute::Softlayer#create_bare_metal_server expects argument of type Hash" unless opts.kind_of?(Hash) request(:hardware_server, :create_object, :body => opts, :http_method => :POST) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/get_vm_tags.rb0000644000076400007640000000201612424143106025117 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def get_vm_tags(id) response = Excon::Response.new response.status = self.get_vm(id).status vm = self.get_vm(id).body unless vm['error'] tags = @tags.map do |tag| tag if tag['resourceTableId'] == id end.compact end vm['tagReferences'] = tags response.body = vm if response.status == 404 response.body = { "error"=>"Unable to find object with id of '#{id}'.", "code"=>"SoftLayer_Exception_ObjectNotFound" } end response end end class Real def get_vm_tags(id) self.request(:virtual_guest, id, :query => 'objectMask=mask[tagReferences]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/describe_tags.rb0000644000076400007640000000106312424143106025417 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def describe_tags response = Excon::Response.new response.body = @tags response.status = 200 response end end class Real def describe_tags self.request(:account, :get_tags, :query => 'objectMask=mask[referenceCount]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/create_vm.rb0000644000076400007640000000354112424143106024571 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock # Launch a single SoftLayer VM. # # @param [] opts # @option opts [] :body # HTTP request body parameters # @option opts [String] "hostname" # VM hostname, should be unique within the domain. # @option opts [String] "domain" # VM domain. # @option opts [Integer] "startCpus" # Number of CPU cores provisioned for the VM. # @option opts [Integer] "maxMemory" # Available RAM for the VM in MB. Valid arguments are 1024, 2048, 4096, 6144, 8192, 12288, 16384, 32768, 49152, 65536 # @option opts [Boolean] "hourlyBillingFlag" # Should the VM be billed hourly or monthly (monthly is less expensive, minimum charge of 1 month). # @option opts [Boolean] "localDiskFlag" # Should the root volume be on the machine or on the SAN # @option opts [String] "operatingSystemReferenceCode" # A valid SoftLayer operatingSystemReferenceCode string # @option opts [Boolean] "dedicatedAccountHostOnlyFlag" # Defaults to false, pass true for a single-tenant VM. # @return [Excon::Response] def create_vm(opts) raise ArgumentError, "Fog::Compute::Softlayer#create_vm expects argument of type Hash" unless opts.kind_of?(Hash) opts = [opts] self.create_vms(opts) end end class Real def create_vm(opts) raise ArgumentError, "Fog::Compute::Softlayer#create_vm expects argument of type Hash" unless opts.kind_of?(Hash) opts = [opts] self.create_vms(opts) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/delete_vm_tags.rb0000644000076400007640000000251712424143106025610 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def delete_vm_tags(id, tags = []) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) response = Excon::Response.new response.status = self.get_vm(id).status if response.status != 404 @tags = @tags.reject do |tag| tag['resourceTableId'] == id and tags.include?(tag['tag']['name']) end response.body = true else response.body = { "error"=>"Unable to find object with id of '#{id}'.", "code"=>"SoftLayer_Exception_ObjectNotFound" } end response end end class Real def delete_vm_tags(id, tags = []) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) subset = self.get_vm_tags(id).body['tagReferences'].map do |i| i['tag']['name'] unless tags.include?(i['tag']['name']) end.compact self.create_vm_tags(id, subset) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/get_key_pairs.rb0000644000076400007640000000101112424143106025437 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def get_key_pairs response = Excon::Response.new response.body = @key_pairs response.status = 200 response end end class Real def get_key_pairs request(:account, :get_ssh_keys) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/get_bare_metal_server.rb0000644000076400007640000000230712424143106027143 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def get_bare_metal_server(identifier) response = Excon::Response.new response.body = @bare_metal_servers.map {|vm| vm if vm['id'] == identifier.to_s }.compact.first || {} response.status = response.body.empty? ? 404 : 200 if response.status == 404 response.body = { "error"=>"Unable to find object with id of '#{identifier}'.", "code"=>"SoftLayer_Exception_ObjectNotFound" } end response end end class Real def get_bare_metal_server(identifier) request(:hardware_server, identifier, :expected => [200, 404], :query => 'objectMask=mask[datacenter,tagReferences,memory,provisionDate,processorCoreAmount,hardDrives,datacenter,hourlyBillingFlag,operatingSystem.softwareLicense.softwareDescription.referenceCode,sshKeys.id,privateNetworkOnlyFlag,userData,frontendNetworkComponents,backendNetworkComponents]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/get_vm.rb0000644000076400007640000000220512424143106024101 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def get_vm(identifier) response = Excon::Response.new response.body = @virtual_guests.map {|vm| vm if vm['id'] == identifier.to_s }.compact.first || {} response.status = response.body.empty? ? 404 : 200 if response.status == 404 response.body = { "error"=>"Unable to find object with id of '#{identifier}'.", "code"=>"SoftLayer_Exception_ObjectNotFound" } end response end end class Real def get_vm(identifier) request(:virtual_guest, identifier, :expected => [200, 404], :query => 'objectMask=mask[datacenter,tagReferences,blockDevices,blockDeviceTemplateGroup.globalIdentifier,operatingSystem.softwareLicense.softwareDescription.referenceCode,sshKeys.id,privateNetworkOnlyFlag,userData,frontendNetworkComponents,backendNetworkComponents]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/compute/get_bare_metal_servers.rb0000644000076400007640000000147512424143106027333 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Compute class Softlayer class Mock def get_bare_metal_servers response = Excon::Response.new response.body = @bare_metal_servers response.status = 200 response end end class Real def get_bare_metal_servers request(:account, :get_hardware, :query => 'objectMask=mask[datacenter,tagReferences,memory,processorCoreAmount,hardDrives,datacenter,hourlyBillingFlag,operatingSystem.softwareLicense.softwareDescription.referenceCode,sshKeys.id,privateNetworkOnlyFlag,userData,frontendNetworkComponents,backendNetworkComponents]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/0000755000076400007640000000000012424143106022311 5ustar pravipravifog-softlayer-0.3.17/lib/fog/softlayer/requests/network/delete_network.rb0000644000076400007640000000203612424143106025652 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def delete_network(id) response = Excon::Response.new response.status = 200 if @networks.reject! { |vlan| vlan['id'] == id }.nil? response.status = 404 response.body = "{\"error\":\"Unable to find object with id of '#{id}'.\",\"code\":\"SoftLayer_Exception_ObjectNotFound\"}" else response.body = true end response end end class Real def delete_network(id) billing_id = request(:network_vlan, "#{id}/get_billing_item").body['id'] billing_id.nil? and raise "SoftLayer VLAN with ID #{id} cannot be deleted." # will be automatically deleted when hardware using it is deleted. request(:billing_item, "#{billing_id}/cancel_service").body end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/unroute_global_ip.rb0000644000076400007640000000104312424143106026345 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def unroute_global_ip(global_ip_id) # TODO: Implement. raise Fog::Errors::MockNotImplemented end end class Real def unroute_global_ip(global_ip_id) self.request(:network_subnet_ipaddress_global, "#{global_ip_id}/unroute") end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_references_by_tag_name.rb0000644000076400007640000000202212424143106030137 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_references_by_tag_name(tag_list) response = Excon::Response.new response.status = 200 response.body = tag_list.split(',').map do |tag| refs = @tags.select { |ref| ref['tag']['name'] == tag } unless refs.empty? { 'accountId' => Fog::Softlayer.mock_account_id, 'id'=>Fog::Mock.random_numbers(7), 'internal' => 0, 'name' => tag, 'references' => refs } end end.compact response end end class Real def get_references_by_tag_name(tag_list) self.request(:tag, "get_tag_by_tag_name/#{tag_list}", :query => 'objectMask=references') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_public_vlan_price_code.rb0000644000076400007640000000107112424143106030146 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_public_vlan_price_code 42 end end class Real def get_public_vlan_price_code request(:product_package, '0/get_items').body.map { |item| item['prices'][0]['id'] if item['description'] =~ /vlan/i and item['description'] =~ /public/i }.compact.first end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/create_network_tags.rb0000644000076400007640000000322412424143106026671 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def create_network_tags(id, tags = []) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) response = Excon::Response.new response.status = self.get_network(id).status if response.status == 200 tags.each do |tag| @tags << { 'empRecordId' => nil, 'id' => Fog::Mock.random_numbers(7), 'resourceTableId' => id, 'tagId' => tagId = Fog::Mock.random_numbers(5), 'tagTypeId' => 1, 'usrRecordId' => 123456, 'tag' => { 'accountId' => 987654, 'id' => tagId, 'internal' => 0, 'name' => tag }, 'tagType'=>{'description'=>'Vlan', 'keyName'=>'NETWORK_VLAN'} } end response.body = true else response.body = { "error"=>"Unable to find object with id of '#{id}'.", "code"=>"SoftLayer_Exception_ObjectNotFound" } end response end end class Real def create_network_tags(id, tags = []) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) self.request(:network_vlan, "#{id}/set_tags", :body => tags.join(','), :http_method => :post) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/create_network.rb0000644000076400007640000006420012424143106025654 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def create_network(order) raise ArgumentError, "Order argument for #{self.class.name}##{__method__} must be Hash." unless order.is_a?(Hash) # TODO: make this better, this will never fail... @networks << { 'accountId' => Fog::Softlayer.mock_account_id, 'id' => Fog::Mock.random_numbers(6).to_i, 'modifyDate' => Time.now.iso8601, 'name' => order['name'], 'networkVrfId' => nil, 'primarySubnetId' => Fog::Mock.random_numbers(6).to_i, 'vlanNumber' => Fog::Mock.random_numbers(4).to_i, 'networkSpace' => 'PRIVATE', 'primaryRouter' => { 'bareMetalInstanceFlag' => 0, 'domain' => 'softlayer.com', 'fullyQualifiedDomainName' => order['router'] << '.softlayer.com', 'hostname' => order['router'], 'id' => order['routerId'], 'notes' => '', 'serviceProviderId' => 1, 'serviceProviderResourceId' => Fog::Mock.random_numbers(6).to_i, 'datacenter' => {'id' => order['location'], 'longName' => 'Lilliput 4', 'name' => 'llp04'}, 'primaryIpAddress' => Fog::Mock.random_ip }, 'subnets' => [ { 'broadcastAddress' => Fog::Mock.random_ip, 'cidr' => 30, 'gateway' => Fog::Mock.random_ip, 'id' => Fog::Mock.random_numbers(6).to_i, 'isCustomerOwned' => false, 'isCustomerRoutable' => false, 'modifyDate' => Time.now.iso8601, 'netmask' => '255.255.255.0', 'networkIdentifier' => Fog::Mock.random_ip, 'networkVlanId' => Fog::Mock.random_numbers(6).to_i, 'sortOrder' => '4', 'subnetType' => 'PRIMARY', 'totalIpAddresses' => 4, 'usableIpAddressCount' => 1, 'version' => 4 } ], 'tagReferences' => [], 'type' => { 'description' => 'Standard network VLAN', 'id' => 1, 'keyName' => 'STANDARD', 'name' => 'Standard' } } response = Excon::Response.new response.status = 200 response.body = { 'orderDate' => Time.now.iso8601, 'orderDetails' => { 'bigDataOrderFlag' => false, 'billingInformation' => { 'billingAddressLine1' => '42 Haviture Way.', 'billingCity' => 'Glover', 'billingCountryCode' => 'US', 'billingEmail' => 'donotreply@softlayer.com', 'billingNameCompany' => 'SLayer\'s Inc.', 'billingNameFirst' => 'Mr.', 'billingNameLast' => 'Rogers', 'billingPhoneVoice' => '123.456.7890', 'billingPostalCode' => '90210', 'billingState' => 'VT', 'cardExpirationMonth' => nil, 'cardExpirationYear' => nil, 'taxExempt' => 0 }, 'billingOrderItemId' => nil, 'containerSplHash' => '00000000000000000000000000000000', 'currencyShortName' => 'USD', 'extendedHardwareTesting' => nil, 'imageTemplateId' => nil, 'isManagedOrder' => 0, 'itemCategoryQuestionAnswers' => [], 'location' => Fog::Mock.random_numbers(6).to_i, 'locationObject' => { 'id' => Fog::Mock.random_numbers(6).to_i, 'longName' => 'Amsterdam 1', 'name' => 'ams01', 'activePresaleEvents' => []}, 'packageId' => 0, 'paymentType' => 'PAYPAL', 'postTaxRecurring' => '0', 'postTaxRecurringHourly' => '0', 'postTaxRecurringMonthly' => '0', 'postTaxSetup' => '0', 'preTaxRecurring' => '0', 'preTaxRecurringHourly' => '0', 'preTaxRecurringMonthly' => '0', 'preTaxSetup' => '0', 'presetId' => nil, 'prices' => [ { 'currentPriceFlag' => nil, 'hourlyRecurringFee' => '0', 'id' => Fog::Mock.random_numbers(4).to_i, 'itemId' => Fog::Mock.random_numbers(4).to_i, 'laborFee' => '0', 'onSaleFlag' => nil, 'oneTimeFee' => '0', 'oneTimeFeeTax' => '0', 'proratedRecurringFee' => '0', 'proratedRecurringFeeTax' => '0', 'quantity' => nil, 'recurringFee' => '0', 'recurringFeeTax' => '0', 'setupFee' => '0', 'sort' => 0, 'categories' => [ { 'categoryCode' => 'network_vlan', 'id' => 113, 'name' => 'Network Vlan', 'quantityLimit' => 0}], 'item' => { 'capacity' => '0', 'description' => 'Private Network Vlan', 'id' => Fog::Mock.random_numbers(4).to_i, 'softwareDescriptionId' => nil, 'units' => 'N/A', 'upgradeItemId' => nil, 'bundle' => [], 'itemCategory' => { 'categoryCode' => 'network_vlan', 'id' => 113, 'name' => 'Network Vlan', 'quantityLimit' => 0}}}, { 'currentPriceFlag' => nil, 'hourlyRecurringFee' => '0', 'id' => Fog::Mock.random_numbers(4).to_i, 'itemId' => 577, 'laborFee' => '0', 'onSaleFlag' => nil, 'oneTimeFee' => '0', 'oneTimeFeeTax' => '0', 'proratedRecurringFee' => '0', 'proratedRecurringFeeTax' => '0', 'quantity' => nil, 'recurringFee' => '0', 'recurringFeeTax' => '0', 'setupFee' => '0', 'sort' => 0, 'categories' => [ { 'categoryCode' => 'static_sec_ip_addresses', 'id' => 53, 'name' => 'Public Secondary Static IP Addresses', 'quantityLimit' => 0}], 'item' => { 'capacity' => '4', 'description' => '4 Static Public IP Addresses', 'id' => 577, 'softwareDescriptionId' => nil, 'upgradeItemId' => nil, 'bundle' => [], 'itemCategory' => { 'categoryCode' => 'static_sec_ip_addresses', 'id' => 53, 'name' => 'Public Secondary Static IP Addresses', 'quantityLimit' => 0 } } } ], 'primaryDiskPartitionId' => nil, 'privateCloudOrderFlag' => false, 'properties' => [], 'proratedInitialCharge' => '0', 'proratedOrderTotal' => '0', 'quantity' => 1, 'resourceGroupId' => nil, 'resourceGroupTemplateId' => nil, 'sendQuoteEmailFlag' => nil, 'serverCoreCount' => nil, 'sourceVirtualGuestId' => nil, 'sshKeys' => [], 'stepId' => nil, 'storageGroups' => [], 'totalRecurringTax' => '0', 'totalSetupTax' => '0', 'useHourlyPricing' => false, 'id' => nil, 'name' => 'foobar', 'router' => { 'bareMetalInstanceFlag' => 0, 'domain' => 'softlayer.com', 'fullyQualifiedDomainName' => order['router'] << '.softlayer.com', 'hostname' => order['router'], 'id' => Fog::Mock.random_numbers(6).to_i, 'notes' => '', 'serviceProviderId' => 1, 'serviceProviderResourceId' => Fog::Mock.random_numbers(6).to_i, 'datacenter' => {'id' => order['location'], 'longName' => 'Lilliput 4', 'name' => 'llp04'} }, 'routerId' => order['routerId'], 'vlanNumber' => nil }, 'orderId' => Fog::Mock.random_numbers(7).to_i, 'placedOrder' => { 'accountId' => Fog::Mock.random_numbers(6).to_i, 'createDate' => Time.now.iso8601, 'id' => Fog::Mock.random_numbers(7).to_i, 'impersonatingUserRecordId' => nil, 'modifyDate' => nil, 'orderQuoteId' => nil, 'orderTypeId' => 4, 'presaleEventId' => nil, 'privateCloudOrderFlag' => false, 'status' => 'PENDING_AUTO_APPROVAL', 'userRecordId' => Fog::Mock.random_numbers(6).to_i, 'account' => { 'accountStatusId' => Fog::Mock.random_numbers(4).to_i, 'address1' => '4849 Alpha Rd.', 'allowedPptpVpnQuantity' => 1, 'brandId' => 2, 'city' => 'Dallas', 'claimedTaxExemptTxFlag' => false, 'companyName' => 'SoftLayer Internal - Development Community', 'country' => 'US', 'createDate' => Time.now.iso8601, 'email' => 'pjackson@softlayer.com', 'firstName' => 'Phil', 'id' => Fog::Mock.random_numbers(6).to_i, 'isReseller' => 0, 'lastName' => 'Jackson', 'lateFeeProtectionFlag' => nil, 'modifyDate' => Time.now.iso8601, 'officePhone' => '281.714.3156', 'postalCode' => '75244', 'state' => 'TX', 'statusDate' => nil, 'hardwareCount' => 7, 'canOrderAdditionalVlansFlag' => true, 'hasPendingOrder' => 3}, 'items' => [ { 'categoryCode' => 'network_vlan', 'description' => 'Private Network Vlan', 'id' => Fog::Mock.random_numbers(8).to_i, 'itemId' => Fog::Mock.random_numbers(4).to_i, 'itemPriceId' => '2019', 'laborFee' => '0', 'laborFeeTaxRate' => '.066', 'oneTimeFee' => '0', 'oneTimeFeeTaxRate' => '.066', 'parentId' => nil, 'promoCodeId' => nil, 'quantity' => nil, 'recurringFee' => '0', 'setupFee' => '0', 'setupFeeDeferralMonths' => 12, 'setupFeeTaxRate' => '.066', 'bundledItems' => [], 'category' => { 'categoryCode' => 'network_vlan', 'id' => 113, 'name' => 'Network Vlan', 'quantityLimit' => 0}, 'children' => [ { 'categoryCode' => 'static_sec_ip_addresses', 'description' => '4 Static Public IP Addresses', 'id' => Fog::Mock.random_numbers(8).to_i, 'itemId' => 577, 'itemPriceId' => '1084', 'laborFee' => '0', 'laborFeeTaxRate' => '.066', 'oneTimeFee' => '0', 'oneTimeFeeTaxRate' => '.066', 'parentId' => Fog::Mock.random_numbers(8).to_i, 'promoCodeId' => nil, 'quantity' => nil, 'recurringFee' => '0', 'setupFee' => '0', 'setupFeeDeferralMonths' => 12, 'setupFeeTaxRate' => '.066', 'bundledItems' => [], 'category' => { 'categoryCode' => 'static_sec_ip_addresses', 'id' => 53, 'name' => 'Public Secondary Static IP Addresses', 'quantityLimit' => 0}, 'children' => [], 'order' => nil, 'storageGroups' => [] } ], 'location' => {'id' => Fog::Mock.random_numbers(6).to_i, 'longName' => 'Amsterdam 1', 'name' => 'ams01'}, 'order' => nil, 'storageGroups' => []}, { 'categoryCode' => 'static_sec_ip_addresses', 'description' => '4 Static Public IP Addresses', 'id' => Fog::Mock.random_numbers(8).to_i, 'itemId' => 577, 'itemPriceId' => '1084', 'laborFee' => '0', 'laborFeeTaxRate' => '.066', 'oneTimeFee' => '0', 'oneTimeFeeTaxRate' => '.066', 'parentId' => Fog::Mock.random_numbers(8).to_i, 'promoCodeId' => nil, 'quantity' => nil, 'recurringFee' => '0', 'setupFee' => '0', 'setupFeeDeferralMonths' => 12, 'setupFeeTaxRate' => '.066', 'bundledItems' => [], 'category' => { 'categoryCode' => 'static_sec_ip_addresses', 'id' => 53, 'name' => 'Public Secondary Static IP Addresses', 'quantityLimit' => 0}, 'children' => [], 'order' => nil, 'storageGroups' => [] } ], 'orderTopLevelItems' => [ { 'categoryCode' => 'network_vlan', 'description' => 'Private Network Vlan', 'id' => Fog::Mock.random_numbers(8).to_i, 'itemId' => Fog::Mock.random_numbers(4).to_i, 'itemPriceId' => '2019', 'laborFee' => '0', 'laborFeeTaxRate' => '.066', 'oneTimeFee' => '0', 'oneTimeFeeTaxRate' => '.066', 'parentId' => nil, 'promoCodeId' => nil, 'quantity' => nil, 'recurringFee' => '0', 'setupFee' => '0', 'setupFeeDeferralMonths' => 12, 'setupFeeTaxRate' => '.066', 'bundledItems' => [], 'category' => { 'categoryCode' => 'network_vlan', 'id' => 113, 'name' => 'Network Vlan', 'quantityLimit' => 0}, 'children' => [ { 'categoryCode' => 'static_sec_ip_addresses', 'description' => '4 Static Public IP Addresses', 'id' => Fog::Mock.random_numbers(8).to_i, 'itemId' => 577, 'itemPriceId' => '1084', 'laborFee' => '0', 'laborFeeTaxRate' => '.066', 'oneTimeFee' => '0', 'oneTimeFeeTaxRate' => '.066', 'parentId' => Fog::Mock.random_numbers(8).to_i, 'promoCodeId' => nil, 'quantity' => nil, 'recurringFee' => '0', 'setupFee' => '0', 'setupFeeDeferralMonths' => 12, 'setupFeeTaxRate' => '.066', 'bundledItems' => [], 'category' => { 'categoryCode' => 'static_sec_ip_addresses', 'id' => 53, 'name' => 'Public Secondary Static IP Addresses', 'quantityLimit' => 0}, 'children' => [], 'order' => nil, 'storageGroups' => [] } ], 'location' => {'id' => 265592, 'longName' => 'Amsterdam 1', 'name' => 'ams01'}, 'order' => nil, 'storageGroups' => [] } ], 'userRecord' => { 'accountId' => Fog::Mock.random_numbers(6).to_i, 'address1' => '315 Capitol Street', 'authenticationToken' => { 'hash' => 'd83e82b1c9a04befe6ac48368d9b61f3', 'user' => nil, 'userId' => 184064 }, 'city' => 'Houston', 'companyName' => 'SLayer\'s Inc.', 'country' => 'US', 'createDate' => Time.now.iso8601, 'daylightSavingsTimeFlag' => true, 'denyAllResourceAccessOnCreateFlag' => false, 'displayName' => 'PulseL', 'email' => 'noreply@softlayer.com', 'firstName' => 'Mr.', 'forumPasswordHash' => '000000000000000000000000000000000000000000', 'id' => Fog::Mock.random_numbers(6).to_i, 'lastName' => 'Rogers', 'localeId' => 1, 'modifyDate' => Time.now.iso8601, 'parentId' => Fog::Mock.random_numbers(6).to_i, 'passwordExpireDate' => nil, 'permissionSystemVersion' => 2, 'postalCode' => '77002', 'pptpVpnAllowedFlag' => false, 'savedId' => Fog::Mock.random_numbers(6).to_i, 'secondaryLoginManagementFlag' => nil, 'secondaryLoginRequiredFlag' => nil, 'secondaryPasswordModifyDate' => Time.now.iso8601, 'secondaryPasswordTimeoutDays' => 0, 'sslVpnAllowedFlag' => false, 'state' => 'TX', 'statusDate' => nil, 'timezoneId' => 113, 'userStatusId' => Fog::Mock.random_numbers(4).to_i, 'username' => 'sl307608-meldridge', 'vpnManualConfig' => false, 'hasFullHardwareAccessFlag' => true, 'timezone' => { 'id' => 113, 'longName' => '(GMT-06:00) America/Chicago - CST', 'name' => 'America/Chicago', 'offset' => '-0600', 'shortName' => 'CST' } } } } response end end class Real def create_network(order) raise ArgumentError, "Order argument for #{self.class.name}##{__method__} must be Hash." unless order.is_a?(Hash) self.request(:product_order, :place_order, :body => order, :http_method => :post) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_subnet.rb0000644000076400007640000000120712424143106024775 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_subnet(id) # TODO: Implement. raise Fog::Errors::MockNotImplemented end end class Real def get_subnet(id) self.request(:network_subnet, "#{id}/get_object", :query => 'objectMask=mask[datacenter,ipAddresses.id,virtualGuests.fullyQualifiedDomainName,virtualGuests.id,hardware.fullyQualifiedDomainName,hardware.id]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/list_networks.rb0000644000076400007640000000122512424143106025545 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def list_networks response = Excon::Response.new response.body = @networks response.status = 200 response end end class Real def list_networks self.request(:account, :get_network_vlans, :query => 'objectMask=mask[subnets.id,subnets.note,subnets.subnetType,type,primaryRouter.datacenter,tagReferences,networkSpace]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_ip_address.rb0000644000076400007640000000116712424143106025617 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_ip_address(id) # TODO: Implement. raise Fog::Errors::MockNotImplemented end end class Real def get_ip_address(id) self.request(:network_subnet_IpAddress, id, :query => 'objectMask=mask[hardware.fullyQualifiedDomainName,hardware.id,virtualGuest.id,virtualGuest.fullyQualifiedDomainName,subnet.id]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_subnet_package_id.rb0000644000076400007640000000120712424143106027124 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_subnet_package_id 42 end end class Real def get_subnet_package_id request(:product_package, '0/get_configuration', :query => 'objectMask=mask[isRequired,itemCategory]').body.map do |item| item['itemCategory']['id'] if item['itemCategory']['categoryCode'] == 'static_sec_ip_addresses' end.compact.first end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/list_subnets.rb0000644000076400007640000000113312424143106025352 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def list_subnets # TODO: Implement. raise Fog::Errors::MockNotImplemented end end class Real def list_subnets self.request(:account, :get_subnets, :query => 'objectMask=mask[networkVlan,ipAddresses.id,datacenter,hardware,virtualGuests.id,virtualGuests.fullyQualifiedDomainName]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_datacenter_routers.rb0000644000076400007640000000241712424143106027376 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_datacenter_routers(id) response = Excon::Response.new response.status = 200 dc = @datacenters.select { |dc| dc['id'] == id }.first if dc.nil? response.status = 404 response.body = "{\"error\":\"Unable to find object with id of '#{id}'.\",\"code\":\"SoftLayer_Exception_ObjectNotFound\"}" else response.body = [ { "hostname" => "bcr01a.#{dc['name']}", "id" => Fog::Mock.random_numbers(6).to_i }, { "hostname" => "bcr02a.#{dc['name']}", "id" => Fog::Mock.random_numbers(6).to_i }, { "hostname" => "fcr01a.#{dc['name']}", "id" => Fog::Mock.random_numbers(6).to_i }, { "hostname" => "fcr02a.#{dc['name']}", "id" => Fog::Mock.random_numbers(6).to_i }, ] end response end end class Real def get_datacenter_routers(id) request(:location_datacenter, "#{id}/get_hardware_routers", :query => 'objectMask=id;hostname') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_subnet_price_code.rb0000644000076400007640000000124212424143106027150 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_subnet_price_code 42 end end class Real def get_subnet_price_code subnet_package_id = get_subnet_package_id request(:product_package, '0/get_item_prices', :query => 'objectMask=mask[id,categories.id,item.description]').body.map do |item| item['id'] if item['categories'][0]['id'] == subnet_package_id end.compact.first end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/delete_network_tags.rb0000644000076400007640000000255012424143106026671 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def delete_network_tags(id, tags = []) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) response = Excon::Response.new response.status = self.get_network(id).status if response.status == 200 @tags = @tags.reject do |tag| tag['resourceTableId'] == id and tags.include?(tag['tag']['name']) end response.body = true else response.body = { "error"=>"Unable to find object with id of '#{id}'.", "code"=>"SoftLayer_Exception_ObjectNotFound" } end response end end class Real def delete_network_tags(id, tags = []) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) subset = self.get_network_tags(id).body['tagReferences'].map do |i| i['tag']['name'] unless tags.include?(i['tag']['name']) end.compact self.create_network_tags(id, subset) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_network_tags.rb0000644000076400007640000000207012424143106026203 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_network_tags(id) response = Excon::Response.new response.status = self.get_network(id).status net = self.get_network(id).body unless net['error'] tags = @tags.map do |tag| tag if tag['resourceTableId'] == id end.compact end net['tagReferences'] = tags if net.is_a?(Hash) response.body = net if response.status == 404 response.body = { "error"=>"Unable to find object with id of '#{id}'.", "code"=>"SoftLayer_Exception_ObjectNotFound" } end response end end class Real def get_network_tags(id) self.request(:network_vlan, id, :query => 'objectMask=mask[tagReferences]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_datacenters.rb0000644000076400007640000000103712424143106025773 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_datacenters response = Excon::Response.new response.status = 200 response.body = @datacenters response end end class Real def get_datacenters request(:location_datacenter, :get_datacenters) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/delete_global_ip_address.rb0000644000076400007640000000127512424143106027622 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def delete_global_ip_address(id) # TODO: Implement. raise Fog::Errors::MockNotImplemented end end class Real def delete_global_ip_address(id) billing = self.request(:network_subnet_ipaddress_global, "#{id}/get_billing_item").body billing.nil? and raise "Global IP Address with ID #{id} not found." request(:billing_item, "#{billing['id']}/cancel_service") end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_global_ip_records.rb0000644000076400007640000000076412424143106027155 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_global_ip_records # TODO: Implement. raise Fog::Errors::MockNotImplemented end end class Real def get_global_ip_records self.request(:account, :get_global_ip_records) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_ip_addresses.rb0000644000076400007640000000116112424143106026141 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_ip_addresses # TODO: Implement. raise Fog::Errors::MockNotImplemented end end class Real def get_ip_addresses self.request(:account, :get_ip_addresses, :query => 'objectMask=mask[hardware.fullyQualifiedDomainName,hardware.id,virtualGuest.id,virtualGuest.fullyQualifiedDomainName,subnet.id]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/route_global_ip.rb0000644000076400007640000000117212424143106026005 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def route_global_ip(global_ip, destination_ip) # TODO: Implement. raise Fog::Errors::MockNotImplemented end end class Real def route_global_ip(global_ip_id, destination_ip_address) self.request(:network_subnet_ipaddress_global, "#{global_ip_id}/route", :body => destination_ip_address, :http_method => :post) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_network.rb0000644000076400007640000000157412424143106025175 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_network(id) response = Excon::Response.new response.status = 200 response.body = @networks.select { |vlan| vlan['id'] == id }.first if response.body.nil? response.status = 404 response.body = "{\"error\":\"Unable to find object with id of '#{id}'.\",\"code\":\"SoftLayer_Exception_ObjectNotFound\"}" end response end end class Real def get_network(id) self.request(:network_vlan, "#{id}/get_object", :query => 'objectMask=mask[subnets,tagReferences,type,primaryRouter.datacenter,networkSpace]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_private_vlan_price_code.rb0000644000076400007640000000107412424143106030345 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_private_vlan_price_code 42 end end class Real def get_private_vlan_price_code request(:product_package, '0/get_items').body.map { |item| item['prices'][0]['id'] if item['description'] =~ /vlan/i and item['description'] =~ /private/i }.compact.first end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/network/get_global_ip_address.rb0000644000076400007640000000107512424143106027135 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module Network class Softlayer class Mock def get_global_ip_address(id) # TODO: Implement. raise Fog::Errors::MockNotImplemented end end class Real def get_global_ip_address(id) self.request(:network_subnet_ipaddress_global, id, :query => 'objectMask=mask[ipAddress,destinationIpAddress]') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/dns/0000755000076400007640000000000012424143106021404 5ustar pravipravifog-softlayer-0.3.17/lib/fog/softlayer/requests/dns/get_records.rb0000644000076400007640000000136712424143106024240 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module DNS class Softlayer class Mock def get_records(domain_id) @softlayer_domains.each do |domain| if domain[:id].to_i == domain_id response = Excon::Response.new response.body = domain[:resourceRecords] response.status = 200 return response end end raise Excon::Errors::NotFound end end class Real def get_records(domain_id) request(:dns_domain, domain_id.to_s + '/getResourceRecords') end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/dns/get_record.rb0000644000076400007640000000147112424143106024051 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module DNS class Softlayer class Mock def get_record(id) # Get the record @softlayer_domains.each do |domain| domain[:resourceRecords].each do |record| if record["id"].to_i == id.to_i response = Excon::Response.new response.body = record response.status = 200 return response end end end raise Excon::Errors::NotFound end end class Real def get_record(id) request(:dns_domain_resourceRecord, id) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/dns/create_record.rb0000644000076400007640000000266512424143106024543 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module DNS class Softlayer class Mock def create_record(opts) new_record = { "id" => Fog::Mock.random_numbers(8), "data" => opts[:data], "domainId" => opts[:domainId], "host" => opts[:host], "type" => opts[:type], "minimum" => nil, "expire" => nil, "mxPriority" => nil, "refresh" => nil, "responsiblePerson" => nil, "retry" => nil, "ttl" => nil, } @softlayer_domains.each do |domain| if domain[:id].to_i == opts[:domainId] domain[:serial] = domain[:serial].to_i + 1 domain[:resourceRecords] << new_record response = Excon::Response.new response.body = new_record response.status = 200 return response end end raise Excon::Errors::NotFound end end class Real def create_record(opts) request(:dns_domain_resourceRecord, :create_object, :body => opts, :http_method => :POST) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/dns/create_domain.rb0000644000076400007640000000431212424143106024523 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module DNS class Softlayer class Mock def create_domain(opts) response = Excon::Response.new updated_at = Time.now domain_id = Fog::Mock.random_numbers(7) body = { :id => domain_id, :name => opts["name"], :serial => updated_at.strftime("%Y%m%d")+"00", :updated_at => updated_at, :resourceRecords => [ { "data"=>"ns1."+opts["name"]+".", "domainId"=>domain_id, "expire"=>604800, "host"=>"@", "id"=>Fog::Mock.random_numbers(8), "minimum"=>3600, "mxPriority"=>nil, "refresh"=>3600, "responsiblePerson"=>"admin."+opts["name"]+".", "retry"=>300, "ttl"=>86400, "type"=>"SOA", }, { "data"=>"ns1.softlayer.com.", "domainId"=>domain_id, "expire"=>nil, "host"=>"@", "id"=>Fog::Mock.random_numbers(8), "minimum"=>nil, "mxPriority"=>nil, "refresh"=>nil, "retry"=>nil, "ttl"=>86400, "type"=>"NS", }, { "data"=>"ns2.softlayer.com.", "domainId"=>domain_id, "expire"=>nil, "host"=>"@", "id"=>Fog::Mock.random_numbers(8), "minimum"=>nil, "mxPriority"=>nil, "refresh"=>nil, "retry"=>nil, "ttl"=>86400, "type"=>"NS", } ] } response.body = body @softlayer_domains << body response.status = 200 response end end class Real def create_domain(opts) request(:dns_domain, :create_object, :body => opts, :http_method => :POST) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/dns/get_domain.rb0000644000076400007640000000125212424143106024037 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module DNS class Softlayer class Mock def get_domain(id) @softlayer_domains.each do |domain| if domain[:id].to_i == id response = Excon::Response.new response.body = domain response.status = 200 return response end end raise Excon::Errors::NotFound end end class Real def get_domain(id) request(:dns_domain, id) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/dns/delete_domain.rb0000644000076400007640000000137412424143106024527 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module DNS class Softlayer class Mock def delete_domain(id) @softlayer_domains.each do |domain| if domain[:id].to_i == id @softlayer_domains.delete(domain) response = Excon::Response.new response.body = true response.status = 200 return response end end raise Excon::Errors::NotFound end end class Real def delete_domain(id) request(:dns_domain, id.to_s, :http_method => :DELETE) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/dns/delete_record.rb0000644000076400007640000000160012424143106024526 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module DNS class Softlayer class Mock def delete_record(id) # Get the domain @domain = @softlayer_domains.each do |domain| domain[:resourceRecords].each do |record| if record["id"] == id domain[:serial] = domain[:serial] + 1 domain[:resourceRecords].delete(record) end end end response = Excon::Response.new response.body = true response.status = 200 response end end class Real def delete_record(id) request(:dns_domain_resourceRecord, id.to_s, :http_method => :DELETE) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/dns/get_domains.rb0000644000076400007640000000101512424143106024217 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module DNS class Softlayer class Mock def get_domains response = Excon::Response.new response.body = @softlayer_domains response.status = 200 return response end end class Real def get_domains request(:account, :get_domains) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/dns/get_domain_by_name.rb0000644000076400007640000000151012424143106025526 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module DNS class Softlayer class Mock def get_domain_by_name(name) @softlayer_domains.each do |domain| if domain[:name] == name response = Excon::Response.new response.body = [ domain ] response.status = 200 return response end end response = Excon::Response.new response.body = [ ] response.status = 200 return response end end class Real def get_domain_by_name(name) request(:dns_domain, "getByDomainName/" + URI::encode(name.to_s, "-")) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/dns/update_record.rb0000644000076400007640000000244312424143106024554 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # module Fog module DNS class Softlayer class Mock def update_record(record_id, opts) # Get the domain @domain = @softlayer_domains.each do |domain| if domain[:id].to_i == opts[:domainId] domain end end # Get the record @domain.first[:resourceRecords].each do |record| if record["id"].to_i == record_id.to_i @domain.first[:serial] = (@domain.first[:serial] + 1) @record = record end end # Update the data # ps: Separated the update to make easier future refator @record["data"] = opts[:data] @record["host"] = opts[:host] @record["type"] = opts[:type] response = Excon::Response.new response.body = @domain response.status = 200 return response end end class Real def update_record(record_id, opts) request(:dns_domain_resourceRecord, record_id, :body => opts, :http_method => :PUT) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/0000755000076400007640000000000012424143106022264 5ustar pravipravifog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/get_object_https_url.rb0000644000076400007640000000623612424143106027031 0ustar pravipravimodule Fog module Storage class Softlayer class Mock def get_object_https_url(container, object, expires, options = {}) "https://cluster.objectstorage.softlayer.net:443/v1/AUTH_abcdefghijklmnopqrstuvwxyz/#{container}/#{object}?temp_url_sig=1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a&temp_url_expires=1111111111111" end end class Real # Get an expiring object https url from Cloud Files # # ==== Parameters # * container<~String> - Name of container containing object # * object<~String> - Name of object to get expiring url for # * expires<~Time> - An expiry time for this url # # ==== Returns # * response<~Excon::Response>: # * body<~String> - url for object def get_object_https_url(container, object, expires, options = {}) create_temp_url(container, object, expires, "GET", options.merge(:scheme => "https")) end # creates a temporary url # # ==== Parameters # * container<~String> - Name of container containing object # * object<~String> - Name of object to get expiring url for # * expires<~Time> - An expiry time for this url # * method<~String> - The method to use for accessing the object (GET, PUT, HEAD) # * scheme<~String> - The scheme to use (http, https) # * options<~Hash> - An optional options hash # # ==== Returns # * response<~Excon::Response>: # * body<~String> - url for object # def create_temp_url(container, object, expires, method, options = {}) raise ArgumentError, "Insufficient parameters specified." unless (container && object && expires && method) raise ArgumentError, "Storage must be instantiated with the :temp_url_key option" if @temp_url_key.nil? scheme = options[:scheme] || @scheme # POST not allowed allowed_methods = %w{GET PUT HEAD} unless allowed_methods.include?(method) raise ArgumentError.new("Invalid method '#{method}' specified. Valid methods are: #{allowed_methods.join(', ')}") end expires = expires.to_i object_path_escaped = "#{@path}/#{Fog::Softlayer.escape(container)}/#{Fog::Softlayer.escape(object,"/")}" object_path_unescaped = "#{@path}/#{Fog::Softlayer.escape(container)}/#{object}" string_to_sign = "#{method}\n#{expires}\n#{object_path_unescaped}" hmac = Fog::HMAC.new('sha1', @temp_url_key) sig = sig_to_hex(hmac.sign(string_to_sign)) temp_url_options = { :scheme => scheme, :host => @host, :port => @port, :path => object_path_escaped, :query => URI.encode_www_form( :temp_url_sig => sig, :temp_url_expires => expires ) } URI::Generic.build(temp_url_options).to_s end private def sig_to_hex(str) str.unpack("C*").map { |c| c.to_s(16) }.map { |h| h.size == 1 ? "0#{h}" : h }.join end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/put_dynamic_obj_manifest.rb0000644000076400007640000000423212424143106027646 0ustar pravipravimodule Fog module Storage class Softlayer class Real # Create a new dynamic large object manifest # # Creates an object with a +X-Object-Manifest+ header that specifies the common prefix ("/") # for all uploaded segments. Retrieving the manifest object streams all segments matching this prefix. # Segments must sort in the order they should be concatenated. Note that any future objects stored in the container # along with the segments that match the prefix will be included when retrieving the manifest object. # # All segments must be stored in the same container, but may be in a different container than the manifest object. # The default +X-Object-Manifest+ header is set to "+container+/+object+", but may be overridden in +options+ # to specify the prefix and/or the container where segments were stored. # If overridden, names should be CGI escaped (excluding spaces) if needed (see {Fog::Softlayer.escape}). # # @param container [String] Name for container where +object+ will be stored. Should be < 256 bytes and must not contain '/' # @param object [String] Name for manifest object. # @param options [Hash] Config headers for +object+. # @option options [String] 'X-Object-Manifest' ("container/object") "/" for segment objects. # # @raise [Fog::Storage::Softlayer::NotFound] HTTP 404 # @raise [Excon::Errors::BadRequest] HTTP 400 # @raise [Excon::Errors::Unauthorized] HTTP 401 # @raise [Excon::Errors::HTTPStatusError] # # @see http://docs.openstack.org/api/openstack-object-storage/1.0/content/dynamic-large-object-creation.html def put_dynamic_obj_manifest(container, object, options = {}) path = "#{Fog::Softlayer.escape(container)}/#{Fog::Softlayer.escape(object)}" headers = {'X-Object-Manifest' => path}.merge(options) request( :expects => 201, :headers => headers, :method => 'PUT', :path => path ) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/post_set_meta_temp_url_key.rb0000644000076400007640000000222512424143106030237 0ustar pravipravimodule Fog module Storage class Softlayer class Real # Set the account wide Temp URL Key. This is a secret key that's # used to generate signed expiring URLs. # # Once the key has been set with this request you should create new # Storage objects with the :temp_url_key option then use # the get_object_https_url method to generate expiring URLs. # # *** CAUTION *** changing this secret key will invalidate any expiring # URLS generated with old keys. # # ==== Parameters # * key<~String> - The new Temp URL Key # # ==== Returns # * response<~Excon::Response> # # ==== See Also # http://docs.rackspace.com/files/api/v1/cf-devguide/content/Set_Account_Metadata-d1a4460.html def post_set_meta_temp_url_key(key) response = request( :expects => [201, 202, 204], :method => 'POST', :headers => {'X-Account-Meta-Temp-Url-Key' => key} ) @temp_url_key = get_temp_url_key_for_account response end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/get_containers.rb0000644000076400007640000000272412424143106025622 0ustar pravipravimodule Fog module Storage class Softlayer class Mock def get_containers(options = {}) response = Excon::Response.new response.body = _format_containers(@containers) response.status = 200 response end private def _format_containers(containers) containers.map do |name, container| meta = Memory.analyze(container) {'count' => container.length, 'bytes' => meta.bytes, 'name' => name} end end end class Real # List existing storage containers # # ==== Parameters # * options<~Hash>: # * 'limit'<~Integer> - Upper limit to number of results returned # * 'marker'<~String> - Only return objects with name greater than this value # # ==== Returns # * response<~Excon::Response>: # * body<~Array>: # * container<~Hash>: # * 'bytes'<~Integer>: - Number of bytes used by container # * 'count'<~Integer>: - Number of items in container # * 'name'<~String>: - Name of container def get_containers(options = {}) options = options.reject {|key, value| value.nil?} request( :expects => [200, 204], :method => 'GET', :path => '', :query => {'format' => 'json'}.merge!(options) ) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/head_container.rb0000644000076400007640000000135612424143106025561 0ustar pravipravimodule Fog module Storage class Softlayer class Real # List number of objects and total bytes stored # # ==== Parameters # * container<~String> - Name of container to retrieve info for # # ==== Returns # * response<~Excon::Response>: # * headers<~Hash>: # * 'X-Container-Object-Count'<~String> - Count of containers # * 'X-Container-Bytes-Used'<~String> - Bytes used def head_container(container) request( :expects => 204, :method => 'HEAD', :path => Fog::Softlayer.escape(container), :query => {'format' => 'json'} ) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/delete_static_large_object.rb0000644000076400007640000000362612424143106030131 0ustar pravipravimodule Fog module Storage class Softlayer class Real # Delete a static large object. # # Deletes the SLO manifest +object+ and all segments that it references. # The server will respond with +200 OK+ for all requests. # +response.body+ must be inspected for actual results. # # @param container [String] Name of container. # @param object [String] Name of the SLO manifest object. # @param options [Hash] Additional request headers. # # @return [Excon::Response] # * body [Hash] - Results of the operation. # * "Number Not Found" [Integer] - Number of missing segments. # * "Response Status" [String] - Response code for the subrequest of the last failed operation. # * "Errors" [Array] # * object_name [String] - Object that generated an error when the delete was attempted. # * response_status [String] - Response status from the subrequest for object_name. # * "Number Deleted" [Integer] - Number of segments deleted. # * "Response Body" [String] - Response body for Response Status. # # @see http://docs.openstack.org/api/openstack-object-storage/1.0/content/static-large-objects.html def delete_static_large_object(container, object, options = {}) response = request({ :expects => 200, :method => 'DELETE', :headers => options.merge('Content-Type' => 'text/plain', 'Accept' => 'application/json'), :path => "#{Fog::Softlayer.escape(container)}/#{Fog::Softlayer.escape(object)}", :query => { 'multipart-manifest' => 'delete' } }, false) response.body = Fog::JSON.decode(response.body) response end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/put_container.rb0000644000076400007640000000131512424143106025463 0ustar pravipravimodule Fog module Storage class Softlayer class Mock def put_container(name) @containers[name] = {} unless @containers[name] response = Excon::Response.new response.body = '' response.status = 201 response end end class Real # Create a new container # # ==== Parameters # * name<~String> - Name for container, should be < 256 bytes and must not contain '/' # def put_container(name) request( :expects => [201, 202], :method => 'PUT', :path => Fog::Softlayer.escape(name) ) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/copy_object.rb0000644000076400007640000000311512424143106025111 0ustar pravipravimodule Fog module Storage class Softlayer class Mock def copy_object(source_container, source_object, target_container, target_object, options={}) response = Excon::Response.new if @containers[source_container].nil? || @containers[source_container][source_object].nil? || @containers[target_container].nil? response.body = '

Not Found

The resource could not be found.

' response.status = 404 else # Success @containers[target_container][target_object] = @containers[source_container][source_object] response.body = '' response.status = 201 end response end end class Real # Copy object # # ==== Parameters # * source_container_name<~String> - Name of source bucket # * source_object_name<~String> - Name of source object # * target_container_name<~String> - Name of bucket to create copy in # * target_object_name<~String> - Name for new copy of object # * options<~Hash> - Additional headers def copy_object(source_container, source_object, target_container, target_object, options={}) headers = { 'X-Copy-From' => "/#{source_container}/#{source_object}" }.merge(options) request({ :expects => 201, :headers => headers, :method => 'PUT', :path => "#{Fog::Softlayer.escape(target_container)}/#{Fog::Softlayer.escape(target_object)}" }) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/delete_object.rb0000644000076400007640000000202612424143106025401 0ustar pravipravimodule Fog module Storage class Softlayer class Mock def delete_object(container, object) response = Excon::Response.new if @containers[container].nil? || @containers[container][object].nil? # Container or object doesn't exist. response.body = '

Not Found

The resource could not be found.

' response.status = 404 else # Success response.body = '' response.status = 204 end response end end class Real # Delete an existing object # # ==== Parameters # * container<~String> - Name of container to delete # * object<~String> - Name of object to delete # def delete_object(container, object) request( :expects => 204, :method => 'DELETE', :path => "#{Fog::Softlayer.escape(container)}/#{Fog::Softlayer.escape(object)}" ) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/put_static_obj_manifest.rb0000644000076400007640000000534512424143106027517 0ustar pravipravimodule Fog module Storage class Softlayer class Real # Create a new static large object manifest. # # A static large object is similar to a dynamic large object. Whereas a GET for a dynamic large object manifest # will stream segments based on the manifest's +X-Object-Manifest+ object name prefix, a static large object # manifest streams segments which are defined by the user within the manifest. Information about each segment is # provided in +segments+ as an Array of Hash objects, ordered in the sequence which the segments should be streamed. # # When the SLO manifest is received, each segment's +etag+ and +size_bytes+ will be verified. # The +etag+ for each segment is returned in the response to {#put_object}, but may also be calculated. # e.g. +Digest::MD5.hexdigest(segment_data)+ # # The maximum number of segments for a static large object is 1000, and all segments (except the last) must be # at least 1 MiB in size. Unlike a dynamic large object, segments are not required to be in the same container. # # @example # segments = [ # { :path => 'segments_container/first_segment', # :etag => 'md5 for first_segment', # :size_bytes => 'byte size of first_segment' }, # { :path => 'segments_container/second_segment', # :etag => 'md5 for second_segment', # :size_bytes => 'byte size of second_segment' } # ] # put_static_obj_manifest('my_container', 'my_large_object', segments) # # @param container [String] Name for container where +object+ will be stored. # Should be < 256 bytes and must not contain '/' # @param object [String] Name for manifest object. # @param segments [Array] Segment data for the object. # @param options [Hash] Config headers for +object+. # # @raise [Fog::Storage::Softlayer::NotFound] HTTP 404 # @raise [Excon::Errors::BadRequest] HTTP 400 # @raise [Excon::Errors::Unauthorized] HTTP 401 # @raise [Excon::Errors::HTTPStatusError] # # @see http://docs.openstack.org/api/openstack-object-storage/1.0/content/static-large-objects.html def put_static_obj_manifest(container, object, segments, options = {}) request( :expects => 201, :method => 'PUT', :headers => options, :body => Fog::JSON.encode(segments), :path => "#{Fog::Softlayer.escape(container)}/#{Fog::Softlayer.escape(object)}", :query => { 'multipart-manifest' => 'put' } ) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/delete_container.rb0000644000076400007640000000211012424143106026107 0ustar pravipravimodule Fog module Storage class Softlayer class Mock def delete_container(name) response = Excon::Response.new if @containers[name].nil? # Container doesn't exist. response.body = '

Not Found

The resource could not be found.

' response.status = 404 elsif @containers[name].length > 0 # Container not empty response.body = '

Conflict

There was a conflict when trying to complete your request.

' response.status = 409 else # Success response.body = '' response.status = 204 end response end end class Real # Delete an existing container # # ==== Parameters # * name<~String> - Name of container to delete # def delete_container(name) request( :expects => 204, :method => 'DELETE', :path => Fog::Softlayer.escape(name) ) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/delete_multiple_objects.rb0000644000076400007640000000612612424143106027504 0ustar pravipravimodule Fog module Storage class Softlayer class Real # Deletes multiple objects or containers with a single request. # # To delete objects from a single container, +container+ may be provided # and +object_names+ should be an Array of object names within the container. # # To delete objects from multiple containers or delete containers, # +container+ should be +nil+ and all +object_names+ should be prefixed with a container name. # # Containers must be empty when deleted. +object_names+ are processed in the order given, # so objects within a container should be listed first to empty the container. # # Up to 10,000 objects may be deleted in a single request. # The server will respond with +200 OK+ for all requests. # +response.body+ must be inspected for actual results. # # @example Delete objects from a container # object_names = ['object', 'another/object'] # conn.delete_multiple_objects('my_container', object_names) # # @example Delete objects from multiple containers # object_names = ['container_a/object', 'container_b/object'] # conn.delete_multiple_objects(nil, object_names) # # @example Delete a container and all it's objects # object_names = ['my_container/object_a', 'my_container/object_b', 'my_container'] # conn.delete_multiple_objects(nil, object_names) # # @param container [String,nil] Name of container. # @param object_names [Array] Object names to be deleted. # @param options [Hash] Additional request headers. # # @return [Excon::Response] # * body [Hash] - Results of the operation. # * "Number Not Found" [Integer] - Number of missing objects or containers. # * "Response Status" [String] - Response code for the subrequest of the last failed operation. # * "Errors" [Array] # * object_name [String] - Object that generated an error when the delete was attempted. # * response_status [String] - Response status from the subrequest for object_name. # * "Number Deleted" [Integer] - Number of objects or containers deleted. # * "Response Body" [String] - Response body for "Response Status". def delete_multiple_objects(container, object_names, options = {}) body = object_names.map do |name| object_name = container ? "#{ container }/#{ name }" : name URI.encode(object_name) end.join("\n") response = request({ :expects => 200, :method => 'DELETE', :headers => options.merge('Content-Type' => 'text/plain', 'Accept' => 'application/json'), :body => body, :query => { 'bulk-delete' => true } }, false) response.body = Fog::JSON.decode(response.body) response end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/get_container.rb0000644000076400007640000000530412424143106025434 0ustar pravipravimodule Fog module Storage class Softlayer class Mock def get_container(container, options = {}) if @containers[container] response = Excon::Response.new response.body = @containers[container].map do |name, object| { 'hash' => object.respond_to?(:to_s) ? Digest::MD5.hexdigest(object.to_s) : 'e4d909c290d0fb1ca068ffaddf22cbd0', 'last_modified' => Time.now, 'bytes' => Memory.analyze(container).bytes, 'content/type' => 'application/json' } end response.status = 200 response else response = Excon::Response.new response.body = '

Not Found

The resource could not be found.

' response.status = 404 response.headers = {"Content-Length"=>"70", "Content-Type"=>"text/html; charset=UTF-8", "X-Trans-Id"=>"abcdefghijklmnopqrstuvwx-0123456789", "Date"=>Time.now} response end end end class Real # Get details for container and total bytes stored # # ==== Parameters # * container<~String> - Name of container to retrieve info for # * options<~String>: # * 'limit'<~String> - Maximum number of objects to return # * 'marker'<~String> - Only return objects whose name is greater than marker # * 'prefix'<~String> - Limits results to those starting with prefix # * 'path'<~String> - Return objects nested in the pseudo path # # ==== Returns # * response<~Excon::Response>: # * headers<~Hash>: # * 'X-Account-Container-Count'<~String> - Count of containers # * 'X-Account-Bytes-Used'<~String> - Bytes used # * body<~Array>: # * 'bytes'<~Integer> - Number of bytes used by container # * 'count'<~Integer> - Number of items in container # * 'name'<~String> - Name of container # * item<~Hash>: # * 'bytes'<~String> - Size of object # * 'content_type'<~String> Content-Type of object # * 'hash'<~String> - Hash of object (etag?) # * 'last_modified'<~String> - Last modified timestamp # * 'name'<~String> - Name of object def get_container(container, options = {}) options = options.reject {|key, value| value.nil?} request( :expects => 200, :method => 'GET', :path => Fog::Softlayer.escape(container), :query => {'format' => 'json'}.merge!(options) ) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/head_object.rb0000644000076400007640000000104312424143106025036 0ustar pravipravimodule Fog module Storage class Softlayer class Real # Get headers for object # # ==== Parameters # * container<~String> - Name of container to look in # * object<~String> - Name of object to look for # def head_object(container, object) request({ :expects => 200, :method => 'HEAD', :path => "#{Fog::Softlayer.escape(container)}/#{Fog::Softlayer.escape(object)}" }, false) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/put_object_manifest.rb0000644000076400007640000000060112424143106026632 0ustar pravipravimodule Fog module Storage class Softlayer class Real # Create a new dynamic large object manifest # # This is an alias for {#put_dynamic_obj_manifest} for backward compatibility. def put_object_manifest(container, object, options = {}) put_dynamic_obj_manifest(container, object, options) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/put_object.rb0000644000076400007640000000415412424143106024753 0ustar pravipravimodule Fog module Storage class Softlayer class Mock def put_object(container, object, data, options = {}, &block) if @containers[container] @containers[container][object] = data response = Excon::Response.new response.body = '' response.status = 201 response.headers = {"Last-Modified"=>Time.now, "Content-Length"=>0} response else response = Excon::Response.new response.body = '

Not Found

The resource could not be found.

' response.status = 404 response.headers = {"Content-Length"=>"70", "Content-Type"=>"text/html; charset=UTF-8", "X-Trans-Id"=>"abcdefghijklmnopqrstuvwx-0123456789", "Date"=>Time.now} response end end end class Real # Create a new object # # When passed a block, it will make a chunked request, calling # the block for chunks until it returns an empty string. # In this case the data parameter is ignored. # # ==== Parameters # * container<~String> - Name for container, should be < 256 bytes and must not contain '/' # * object<~String> - Name for object # * data<~String|File> - data to upload # * options<~Hash> - config headers for object. Defaults to {}. # * block<~Proc> - chunker # def put_object(container, object, data, options = {}, &block) if block_given? params = { :request_block => block } headers = options else data = Fog::Storage.parse_data(data) headers = data[:headers].merge!(options) params = { :body => data[:body] } end params.merge!( :expects => 201, :idempotent => !params[:request_block], :headers => headers, :method => 'PUT', :path => "#{Fog::Softlayer.escape(container)}/#{Fog::Softlayer.escape(object)}" ) request(params) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/head_containers.rb0000644000076400007640000000113212424143106025734 0ustar pravipravimodule Fog module Storage class Softlayer class Real # List number of containers and total bytes stored # # ==== Returns # * response<~Excon::Response>: # * headers<~Hash>: # * 'X-Account-Container-Count'<~String> - Count of containers # * 'X-Account-Bytes-Used'<~String> - Bytes used def head_containers request( :expects => 204, :method => 'HEAD', :path => '', :query => {'format' => 'json'} ) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/requests/storage/get_object.rb0000644000076400007640000000254412424143106024723 0ustar pravipravimodule Fog module Storage class Softlayer class Mock def get_object(container, object, &block) if @containers[container] && @containers[container][object] response = Excon::Response.new response.body = @containers[container][object] response.status = 200 response else response = Excon::Response.new response.body = '

Not Found

The resource could not be found.

' response.status = 404 response.headers = {"Content-Length"=>"70", "Content-Type"=>"text/html; charset=UTF-8", "X-Trans-Id"=>"abcdefghijklmnopqrstuvwx-0123456789", "Date"=>Time.now} response end end end class Real # Get details for object # # ==== Parameters # * container<~String> - Name of container to look in # * object<~String> - Name of object to look for # def get_object(container, object, &block) params = { :expects => 200, :method => 'GET', :path => "#{Fog::Softlayer.escape(container)}/#{Fog::Softlayer.escape(object)}" } if block_given? params[:response_block] = block end request(params, false) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/0000755000076400007640000000000012424143106020230 5ustar pravipravifog-softlayer-0.3.17/lib/fog/softlayer/models/compute/0000755000076400007640000000000012424143106021704 5ustar pravipravifog-softlayer-0.3.17/lib/fog/softlayer/models/compute/key_pair.rb0000644000076400007640000000206412424143106024036 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' module Fog module Compute class Softlayer class KeyPair < Fog::Model identity :id attribute :label attribute :create_date, :aliases => 'createDate' attribute :modify_date, :aliases => 'modifyDate' attribute :note, :aliases => 'notes' attribute :key def save identity ? update : create end def create requires :key, :label response = service.create_key_pair(attributes).body merge_attributes(response) self end def update requires :id merge_attributes(service.update_key_pair(self.id, self.attributes).body) self end def destroy requires :id service.delete_key_pair(self.id) true end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/compute/flavor.rb0000644000076400007640000000062412424143106023524 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' module Fog module Compute class Softlayer class Flavor < Fog::Model identity :id attribute :cpu attribute :disk attribute :name attribute :ram end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/compute/key_pairs.rb0000644000076400007640000000141712424143106024222 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/compute/key_pair' module Fog module Compute class Softlayer class KeyPairs < Fog::Collection model Fog::Compute::Softlayer::KeyPair def all data = service.get_key_pairs.body load(data) end def get(id) if key_pair = service.get_key_pair(id).body new(key_pair) end rescue Fog::Network::Softlayer::NotFound nil end def by_label(label) all.select { |key_pair| key_pair.label == label }.first end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/compute/image.rb0000644000076400007640000000143412424143106023315 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' module Fog module Compute class Softlayer class Image < Fog::Model identity :id, :aliases => 'globalIdentifier' attribute :name attribute :note attribute :parent_id, :aliases => 'parentId' attribute :public_flag, :aliases => 'publicFlag' attribute :status_id, :aliases => 'statusId' attribute :summary attribute :transaction_id, :aliases => 'transactionId' attribute :user_record_id, :aliases => 'userRecordId' def public? public_flag == 1 end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/compute/tags.rb0000644000076400007640000000201712424143106023167 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/compute/tag' module Fog module Compute class Softlayer class Tags < Fog::Collection attribute :filters model Fog::Compute::Softlayer::Tag def initialize(attributes) self.filters ||= [] super end def all(filters = filters) raise ArgumentError, "Filters argument for #{self.class.name}##{__method__} must be Array." unless filters.is_a?(Array) self.filters = filters data = service.describe_tags.body data.select! { |tag| filters.include?(tag) } unless filters.empty? load(data) end def get(id) return nil if id.nil? || id == "" response = service.get_tag(id) data = response.body new.merge_attributes(data) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/compute/servers.rb0000644000076400007640000000311612424143106023723 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/compute/server' module Fog module Compute class Softlayer class Servers < Fog::Collection model Fog::Compute::Softlayer::Server def all data = service.list_servers load(data) end ## Get a SoftLayer server. # def get(identifier) return nil if identifier.nil? || identifier == "" response = service.get_vm(identifier) bare_metal = false if response.status == 404 # we didn't find it as a VM, look for a BMC server response = service.get_bare_metal_server(identifier) bare_metal = true end data = response.body data['bare_metal'] = bare_metal new.merge_attributes(data) rescue Excon::Errors::NotFound nil end def bootstrap(options={}) server = service.create(options) server.wait_for { ready? } server end def tagged_with(tags) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) ids = service.get_references_by_tag_name(tags.join(',')).body.map do |tag| tag['references'].map do |ref| ref['resourceTableId'] end end.flatten.uniq ids.map { |id| get(id) } end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/compute/images.rb0000644000076400007640000000141712424143106023501 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/compute/image' module Fog module Compute class Softlayer class Images < Fog::Collection model Fog::Compute::Softlayer::Image # Returns an array of all public images. # # Fog::Softlayer.images.all def all load(service.request(:virtual_guest_block_device_template_group, :get_public_images).body) self end # Used to retrieve an image def get(uuid) self.class.new(:service => service).all.detect {|image| image.id == uuid} end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/compute/server.rb0000644000076400007640000003503312424143106023543 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/compute/models/server' module Fog module Compute class Softlayer class Server < Fog::Compute::Server identity :id, :type => :integer attribute :name, :aliases => 'hostname' attribute :domain attribute :fqdn, :aliases => 'fullyQualifiedDomainName' attribute :cpu, :aliases => ['startCpus', 'processorCoreAmount'] attribute :ram, :aliases => ['maxMemory', 'memory'] attribute :disk, :aliases => ['blockDevices','hardDrives'] attribute :private_ip_address, :aliases => 'primaryBackendIpAddress' attribute :public_ip_address, :aliases => 'primaryIpAddress' attribute :flavor_id attribute :bare_metal, :type => :boolean attribute :os_code attribute :image_id attribute :ephemeral_storage, :aliases => 'localDiskFlag' attribute :key_pairs, :aliases => 'sshKeys' attribute :network_components # Times attribute :created_at, :aliases => ['createDate', 'provisionDate'], :type => :time attribute :last_verified_date, :aliases => 'lastVerifiedDate', :type => :time attribute :metric_poll_date, :aliases => 'metricPollDate', :type => :time attribute :modify_date, :aliases => 'modifyDate', :type => :time # Metadata attribute :account_id, :aliases => 'accountId', :type => :integer attribute :datacenter, :aliases => 'datacenter' attribute :single_tenant, :aliases => 'dedicatedAccountHostOnlyFlag' attribute :global_identifier, :aliases => 'globalIdentifier' attribute :hourly_billing_flag, :aliases => 'hourlyBillingFlag' attribute :tags, :aliases => 'tagReferences' attribute :private_network_only, :aliases => 'privateNetworkOnlyFlag' attribute :user_data, :aliases => 'userData' attribute :uid, :aliases => 'globalIdentifier' def initialize(attributes = {}) # Forces every request inject bare_metal parameter raise Exception if attributes[:collection].nil? and attributes['bare_metal'].nil? super(attributes) set_defaults end def add_tags(tags) requires :id raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) tags.each do |tag| service.tags.new(:resource_id => self.id, :name => tag).save end self.reload true end def bare_metal? bare_metal end def bare_metal @bare_metal end def datacenter=(name) name = name['name'] if name.is_a?(Hash) attributes[:datacenter] = { :name => name } end def datacenter attributes[:datacenter][:name] unless attributes[:datacenter].nil? end def delete_tags(tags) requires :id raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) tags.each do |tag| service.tags.new(:resource_id => self.id, :name => tag).destroy end self.reload true end def destroy requires :id request = bare_metal? ? :delete_bare_metal_server : :delete_vm response = service.send(request, self.id) response.body end def dns_name fqdn end def image_id=(uuid) attributes[:image_id] = {:globalIdentifier => uuid} end def image_id attributes[:image_id][:globalIdentifier] unless attributes[:image_id].nil? end def name=(set) attributes[:hostname] = set end def name attributes[:hostname] end def pre_save extract_flavor validate_attributes if self.vlan attributes[:vlan] = { :networkVlan => { :id => self.vlan.id } } end if self.private_vlan attributes[:private_vlan] = { :networkVlan => { :id => self.private_vlan.id } } end if self.key_pairs attributes[:key_pairs].map! { |key| { :id => key.id } } end if self.network_components self.network_components = self.network_components.map do |component| component[:maxSpeed] = component.delete(:speed) if component[:speed] component[:maxSpeed] = component.delete(:max_speed) if component[:max_speed] component end end remap_attributes(attributes, attributes_mapping) clean_attributes end def private_ip # maintain backward compatibility with <0.3.13 private_ip_address end def public_ip # maintain backward compatibility with <0.3.13 public_ip_address end def os_code attributes['operatingSystem']['softwareLicense']['softwareDescription']['referenceCode'] if attributes['operatingSystem'] end def private_vlan attributes[:private_vlan] ||= _get_private_vlan end def private_vlan=(value) unless value.is_a?(Integer) or value.is_a?(Fog::Network::Softlayer::Network) raise ArgumentError, "vlan argument for #{self.class.name}##{__method__} must be Integer or Fog::Network::Softlayer::Network." end value = Fog::Network[:softlayer].networks.get(value) if value.is_a?(Integer) attributes[:private_vlan] = value end def key_pairs attributes[:key_pairs] end def key_pairs=(keys) raise ArgumentError, "Argument #{local_variables.first.to_s} for #{self.class.name}##{__method__} must be Array." unless keys.is_a?(Array) attributes[:key_pairs] = [] keys.map do |key| key = self.symbolize_keys(key) if key.is_a?(Hash) unless key.is_a?(Fog::Compute::Softlayer::KeyPair) or (key.is_a?(Hash) and key[:id]) raise ArgumentError, "Elements of keys array for #{self.class.name}##{__method__} must be a Hash with key 'id', or Fog::Compute::Softlayer::KeyPair" end key = service.key_pairs.get(key[:id]) unless key.is_a?(Fog::Compute::Softlayer::KeyPair) attributes[:key_pairs] << key end end def vlan attributes[:vlan] ||= _get_vlan end def vlan=(value) unless value.is_a?(Integer) or value.is_a?(Fog::Network::Softlayer::Network) raise ArgumentError, "vlan argument for #{self.class.name}##{__method__} must be Integer or Fog::Network::Softlayer::Network." end value = Fog::Network[:softlayer].networks.get(value) if value.is_a?(Integer) attributes[:vlan] = value end def ram=(set) if set.is_a?(Array) and set.first['hardwareComponentModel'] set = 1024 * set.first['hardwareComponentModel']['capacity'].to_i end attributes[:ram] = set end # @params value [String] def user_data=(value) attributes[:user_data] = [{'value' => value}] end def user_data attributes[:user_data] end def network_components if id (public_network_components << private_network_components).flatten else attributes[:network_components] end end def public_network_components if attributes['frontendNetworkComponents'] attributes['frontendNetworkComponents'].map { |n| Fog::Compute::Softlayer::NetworkComponent.new(n) } else [] end end def private_network_components if attributes['backendNetworkComponents'] attributes['backendNetworkComponents'].map { |n| Fog::Compute::Softlayer::NetworkComponent.new(n) } else [] end end def ready? if bare_metal? state == "on" else state == "Running" end end def reboot(use_hard_reboot = true) # TODO: implement end def ssh_password requires :id service_path = bare_metal? ? :hardware_server : :virtual_guest @sshpass ||= service.request(service_path, id, :query => 'objectMask=mask[id,operatingSystem.passwords[password]]').body @sshpass['operatingSystem']['passwords'][0]['password'] unless @sshpass['operatingSystem'].nil? or @sshpass['operatingSystem']['passwords'].empty? end def snapshot # TODO: implement end def start # TODO: implement #requires :identity #service.start_server(identity) true end def stop # TODO: implement end def shutdown # TODO: implement end def state if bare_metal? service.request(:hardware_server, "#{id}/getServerPowerState").body else service.request(:virtual_guest, "#{id}/getPowerState").body['name'] end end # Creates server # * requires attributes: :name, :domain, and :flavor_id OR (:cpu_count && :ram && :disks) # # @note You should use servers.create to create servers instead calling this method directly # # * State Transitions # * BUILD -> ACTIVE # * BUILD -> ERROR (on error) def save raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if persisted? copy = self.dup copy.pre_save data = if bare_metal? service.create_bare_metal_server(copy.attributes).body else service.create_vm(copy.attributes).body.first end data.delete("bare_metal") merge_attributes(data) true end def tags attributes[:tags].map { |i| i['tag']['name'] } if attributes[:tags] end private def _get_private_vlan if self.id vlan_id = if bare_metal? service.request(:hardware_server, "#{self.id}/get_private_vlan").body['id'] else service.request(:virtual_guest, self.id, :query => 'objectMask=primaryBackendNetworkComponent.networkVlan').body['primaryBackendNetworkComponent']['networkVlan']['id'] end Fog::Network[:softlayer].networks.get(vlan_id) end end def _get_vlan if self.id vlan_id = if bare_metal? service.request(:hardware_server, "#{self.id}/get_public_vlan").body['id'] else service.request(:virtual_guest, self.id, :query => 'objectMask=primaryNetworkComponent.networkVlan').body['primaryNetworkComponent']['networkVlan']['id'] end Fog::Network[:softlayer].networks.get(vlan_id) end end ## # Generate mapping for use with remap_attributes def attributes_mapping common = { :hourly_billing_flag => :hourlyBillingFlag, :os_code => :operatingSystemReferenceCode, :vlan => :primaryNetworkComponent, :private_vlan => :primaryBackendNetworkComponent, :key_pairs => :sshKeys, :private_network_only => :privateNetworkOnlyFlag, :user_data => :userData, :network_components => :networkComponents, } conditional = if bare_metal? { :cpu => :processorCoreAmount, :ram => :memoryCapacity, :disk => :hardDrives, :bare_metal => :bareMetalInstanceFlag } else { :cpu => :startCpus, :ram => :maxMemory, :disk => :blockDevices, :image_id => :blockDeviceTemplateGroup, :ephemeral_storage => :localDiskFlag, } end common.merge(conditional) end def bare_metal=(set) raise Exception, "Bare metal flag has already been set" unless @bare_metal.nil? @bare_metal = case set when false, 'false', 0, nil, '' false else true end end ## # Remove model attributes that aren't expected by the SoftLayer API def clean_attributes attributes.delete(:bare_metal) attributes.delete(:flavor_id) attributes.delete(:ephemeral_storage) end ## # Expand a "flavor" into cpu, ram, and disk attributes def extract_flavor if attributes[:flavor_id] flavor = @service.flavors.get(attributes[:flavor_id]) flavor.nil? and Fog::Errors::Error.new("Unrecognized flavor in #{self.class}##{__method__}") attributes[:cpu] = flavor.cpu attributes[:ram] = flavor.ram attributes[:disk] = flavor.disk unless attributes[:image_id] if bare_metal? value = flavor.disk.first['diskImage']['capacity'] < 500 ? 250 : 500 attributes[:disk] = [{'capacity'=>value}] attributes[:ram] = attributes[:ram] / 1024 if attributes[:ram] > 64 end end end def validate_attributes requires :name, :domain, :cpu, :ram, :datacenter requires_one :os_code, :image_id requires_one :image_id, :disk bare_metal? and image_id and raise ArgumentError, "Bare Metal Cloud does not support booting from Image" end def set_defaults attributes[:hourly_billing_flag] = true if attributes[:hourly_billing_flag].nil? attributes[:ephemeral_storage] = false if attributes[:ephemeral_storage].nil? attributes[:domain] = service.softlayer_default_domain if service.softlayer_default_domain and attributes[:domain].nil? self.datacenter = service.softlayer_default_datacenter if service.softlayer_default_datacenter and attributes[:datacenter].nil? end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/compute/network_component.rb0000644000076400007640000000205312424143106026004 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' module Fog module Compute class Softlayer class NetworkComponent < Fog::Model identity :id attribute :name attribute :port attribute :mac_address, :aliases => 'macAddress' attribute :max_speed, :aliases => 'maxSpeed' attribute :modify_date, :aliases => 'modifyDate' attribute :status attribute :speed attribute :primary_ip_address, :aliases => 'primaryIpAddress' def save raise "#{self.class.name} objects are readonly." end def create raise "#{self.class.name} objects are readonly." end def update raise "#{self.class.name} objects are readonly." end def destroy raise "#{self.class.name} objects are readonly." end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/compute/network_components.rb0000644000076400007640000000066112424143106026172 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/compute/key_pair' module Fog module Compute class Softlayer class NetworkComponents < Fog::Collection model Fog::Compute::Softlayer::NetworkComponent # just a stub end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/compute/flavors.rb0000644000076400007640000000631612424143106023713 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/compute/flavor' module Fog module Compute class Softlayer ## SoftLayer doesn't actually have "flavors", these are just for portability/convenience, # they map directly to OpenStack defaults. # :cores => number of virtual CPUs presented # :disk => size in GB of the virtual root disk # :ram => virtual machine memory in MB FLAVORS = [ { :id => 'm1.tiny', :name => 'Tiny Instance', :cpu => 2, :disk => [{'device' => 0, 'diskImage' => {'capacity' => 25 } }], :ram => 1024 }, { :id => 'm1.small', :name => 'Small Instance', :cpu => 2, :disk => [{'device' => 0, 'diskImage' => {'capacity' => 100 } }], :ram => 2048 }, { :id => 'm1.medium', :name => 'Medium Instance', :cpu => 4, :disk => [{'device' => 0, 'diskImage' => {'capacity' => 500 } }], :ram => 4096 }, { :id => 'm1.large', :name => 'Large Instance', :cpu => 8, :disk => [{'device' => 0, 'diskImage' => {'capacity' => 750 } }], :ram => 8192 }, { :id => 'm1.xlarge', :name => 'Extra Large Instance', :cpu => 16, :disk => [{'device' => 0, 'diskImage' => {'capacity' => 1000 } }], :ram => 16384 } ] class Flavors < Fog::Collection model Fog::Compute::Softlayer::Flavor # Returns an array of all flavors that have been created # # Fog::Softlayer.flavors.all def all load(Fog::Compute::Softlayer::FLAVORS) self end # Used to retrieve a flavor # flavor_id is required to get the associated flavor information. # flavors available currently: # # m1.tiny # # You can run the following command to get the details: # Softlayer.flavors.get("m1.tiny") # # ==== Returns # #>> Softlayer.flavors.get("m1.tiny") # # def get(flavor_id) self.class.new(:service => service).all.detect {|flavor| flavor.id == flavor_id} end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/compute/tag.rb0000644000076400007640000000342112424143106023004 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' module Fog module Compute class Softlayer class Tag < Fog::Model identity :id attribute :name attribute :referenceCount, :type => :integer attribute :resource_id attribute :internal, :type => :boolean def initialize(attributes = {}) super end def destroy requires :name, :resource_id load_server @server.bare_metal? ? destroy_bare_metal_tag : destroy_vm_tag true end def references @servers ||= service.request(:tag, "#{id}", :query => "objectMask=references;references.tagType").body['references'].map do |ref| type = ref['tagType']['keyName'] service.servers.get(ref['resourceTableId']) if type == 'GUEST' || type == 'HARDWARE' end.compact end def save requires :name, :resource_id load_server @server.bare_metal? ? add_bare_metal_tag : add_vm_tag true end private def add_bare_metal_tag service.create_bare_metal_tags(@server.id, @server.tags << self.name) end def add_vm_tag service.create_vm_tags(@server.id, @server.tags << self.name) end def destroy_bare_metal_tag service.delete_bare_metal_tags(@server.id, [self.name]) end def destroy_vm_tag service.delete_vm_tags(@server.id, [self.name]) end def load_server requires :resource_id @server ||= service.servers.get(self.resource_id) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/network/0000755000076400007640000000000012424143106021721 5ustar pravipravifog-softlayer-0.3.17/lib/fog/softlayer/models/network/network.rb0000644000076400007640000000674012424143106023746 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' module Fog module Network class Softlayer class Network < Fog::Model identity :id attribute :name attribute :modify_date, :aliases => 'modifyDate' attribute :note attribute :tags, :aliases => 'tagReferences' attribute :type, :squash => :keyName attribute :datacenter attribute :network_space, :aliases => 'networkSpace' attribute :router, :aliases => 'primaryRouter' #attribute :subnets def add_tags(tags) requires :id raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) tags.each do |tag| service.tags.new(:resource_id => self.id, :name => tag).save end self.reload true end def datacenter @datacenter ||= attributes[:datacenter] or (service.datacenters.new(attributes[:router]['datacenter']) if attributes[:router] and attributes[:router]['datacenter']) end def delete_tags(tags) requires :id raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) tags.each do |tag| service.tags.new(:resource_id => self.id, :name => tag).destroy end self.reload true end def router=(new_data) raise ArgumentError, "Network Router must be a Hash." unless new_data.is_a?(Hash) attributes[:router] = new_data.select { |k,v| ['id', 'hostname', 'datacenter'].include?(k) } end def private? requires :network_space network_space == 'PRIVATE' end def public? requires :network_space network_space == 'PUBLIC' end def save identity ? update : create end def subnets requires :id @subnets ||= attributes['subnets'].map do |subnet| service.subnets.get(subnet['id']) end end def create requires :datacenter, :router, :network_space response = service.create_network(build_order).body merge_attributes(response) self end def update requires :id merge_attributes(service.update_network(self.id, self.attributes).body) self end def destroy requires :id service.delete_network(self.id) true end def tags requires :id attributes[:tags].map { |i| i['tag']['name'] } if attributes[:tags] end private def build_order { 'complexType' => 'SoftLayer_Container_Product_Order_Network_Vlan', 'name' => name, 'routerId' =>router['id'], 'router' => router['hostname'], 'location' => datacenter.id, 'quantity' =>1, 'packageId' =>0, 'prices' =>[ {'id' => public? ? service.get_public_vlan_price_code : service.get_private_vlan_price_code }, {'id' => service.get_subnet_price_code } ] } end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/network/ip.rb0000644000076400007640000000615212424143106022662 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' module Fog module Network class Softlayer class Ip < Fog::Model identity :id attribute :subnet_id, :aliases => 'subnetId' attribute :address, :aliases => 'ipAddress' attribute :broadcast, :aliases => 'isBroadcast' attribute :gateway, :aliases => 'isGateway' attribute :network, :aliases => 'isNetwork' attribute :reserved, :aliases => 'isReserved' attribute :global_id attribute :destination_ip, :aliases => 'destinationIpAddress' attribute :note attribute :assigned_to, :aliases => ['hardware', 'virtualGuest'] def initialize(attributes) @connection = attributes[:connection] super end def save requires :subnet_id identity ? update : create end def create end def update self end def destination_ip=(ip) if ip.is_a?(Hash) attributes[:destination_ip] = Fog::Network::Softlayer::Ip.new(ip) elsif ip.is_a?(Fog::Network::Softlayer::Ip) or ip.nil? attributes[:destination_ip] = ip else raise ArgumentError, "Invalid argument type in #{self.class.name}##{__method__}." end end def destroy raise "Only Global IP Addresses can be destroyed. Regular IP Addresses are part of Fog::Softlayer::Network::Subnet" unless global? service.delete_global_ip_address(self.global_id).status == 200 end def broadcast? !!attributes[:broadcast] end def gateway? !!attributes[:gateway] end def global? !!attributes[:global_id] end def network? !!attributes[:network] end def reserved? !!attributes[:reserved] end def route(dest_ip) requires :global_id raise ArgumentError, "Invalid argument type in #{self.class.name}##{__method__}." unless dest_ip.is_a?(Fog::Network::Softlayer::Ip) raise ArgumentError, "The destination IP may not be the network address of the destination subnet" if dest_ip.network? raise ArgumentError, "The destination IP may not be the gateway address of the destination subnet" if dest_ip.gateway? raise ArgumentError, "The destination IP may not be the broadcast address of the destination subnet" if dest_ip.broadcast? raise ArgumentError, "The destination IP may not be another global IP address" if dest_ip.global? service.route_global_ip(self.global_id, dest_ip.address).status == 200 end def routed? !!self.assigned_to or !!self.destination_ip end def unroute requires :global_id service.unroute_global_ip(self.global_id).status == 200 end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/network/datacenter.rb0000644000076400007640000000202212424143106024354 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' module Fog module Network class Softlayer class Datacenter < Fog::Model identity :id attribute :long_name, :aliases => 'longName' attribute :name def initialize(attributes) @connection = attributes[:connection] super end def routers requires :id @routers ||= service.get_datacenter_routers(id).body end def routable_subnets requires :id @routable_subnets ||= service.request(:location_datacenter, "#{id}/get_bound_subnets").body end def save raise "Not possible." end def create raise "Not possible." end def update raise "Not possible." end def destroy raise "Not possible." end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/network/ips.rb0000644000076400007640000000401612424143106023042 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/network/ip' module Fog module Network class Softlayer class Ips < Fog::Collection attribute :filters model Fog::Network::Softlayer::Ip def initialize(attributes) self.filters ||= {} super end def all(filters = filters) self.filters = filters ips = service.get_ip_addresses.body ips.each_with_index do |ip,i| if global_records.keys.include?(ip['id']) ips[i] = parse_global_ip_record(service.get_global_ip_address(global_records[ip['id']]['id']).body) end end load(ips) end def by_address(address) ip = service.get_ip_addresses.body.select do |ip| ip['ipAddress'] == address end.first new(ip) if ip end def get(id) if global_records.keys.include?(id) response = service.get_global_ip_address(global_records[id]['id']).body ip = parse_global_ip_record(response) else ip = service.get_ip_address(id).body end new(ip) if ip rescue Fog::Network::Softlayer::NotFound nil end def global_records @records ||= {} service.get_global_ip_records.body.each { |record| @records[record['ipAddressId']] = record } if @records.empty? @records end private def parse_global_ip_record(record) response = service.request(:network_subnet_ipaddress_global, record['id'], :query => 'objectMask=mask[ipAddress,destinationIpAddress]').body parsed = response['ipAddress'] parsed['destinationIpAddress'] = response['destinationIpAddress'] parsed[:global_id] = record['id'] parsed end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/network/subnets.rb0000644000076400007640000000123612424143106023733 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/network/subnet' module Fog module Network class Softlayer class Subnets < Fog::Collection attribute :filters model Fog::Network::Softlayer::Subnet def all load(service.list_subnets.body) end def get(id) if subnet = service.get_subnet(id).body new(subnet) end rescue Fog::Network::Softlayer::NotFound nil end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/network/tags.rb0000644000076400007640000000212012424143106023177 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/network/tag' module Fog module Network class Softlayer class Tags < Fog::Collection attribute :filters model Fog::Network::Softlayer::Tag def initialize(attributes) self.filters ||= [] super end def all(filters = filters) raise ArgumentError, "Filters argument for #{self.class.name}##{__method__} must be Array." unless filters.is_a?(Array) self.filters = filters data = service.request(:account, :get_tags, :query => 'objectMask=mask[referenceCount]').body data.select! { |tag| filters.include?(tag) } unless filters.empty? load(data) end def get(id) return nil if id.nil? || id == "" response = service.request(:tag, id) data = response.body new.merge_attributes(data) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/network/networks.rb0000644000076400007640000000223112424143106024120 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/network/network' module Fog module Network class Softlayer class Networks < Fog::Collection model Fog::Network::Softlayer::Network def all data = service.list_networks.body load(data) end def get(id) if network = service.get_network(id).body new(network) end rescue Fog::Network::Softlayer::NotFound nil end def tagged_with(tags) raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array) ids = service.get_references_by_tag_name(tags.join(',')).body.map do |tag| tag['references'].map do |ref| ref['resourceTableId'] end end.flatten.uniq ids.map { |id| get(id) } end def by_name(name) all.select { |vlan| vlan.name == name }.first end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/network/datacenters.rb0000644000076400007640000000170412424143106024545 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/network/datacenter' module Fog module Network class Softlayer class Datacenters < Fog::Collection attribute :filters model Fog::Network::Softlayer::Datacenter def initialize(attributes) self.filters ||= {} super end def all(filters = filters) self.filters = filters load(service.get_datacenters.body) end def get(id) data = service.request(:location_datacenter, "#{id}/get_object").body new.merge_attributes(data) rescue Fog::Network::Softlayer::NotFound nil end def by_name(name) all.map { |dc| dc if dc.name == name }.compact.first end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/network/subnet.rb0000644000076400007640000000354612424143106023556 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' module Fog module Network class Softlayer class Subnet < Fog::Model identity :id attribute :name, :aliases => 'note' attribute :network_id, :aliases => 'networkIdentifier' attribute :vlan_id, :aliases => 'networkVlanId' attribute :cidr attribute :ip_version, :aliases => 'version' attribute :type, :aliases => 'subnetType' attribute :gateway_ip, :aliases => 'gateway' attribute :broadcast, :aliases => 'broadcastAddress' attribute :gateway attribute :datacenter, :squash => :name def addresses @addresses ||= attributes['ipAddresses'].map do |address| service.ips.get(address['id']) end end def save requires :network_id, :cidr, :ip_version identity ? update : create end def create requires :network_id, :cidr, :ip_version merge_attributes(service.create_subnet(self.network_id, self.cidr, self.ip_version, self.attributes).body['subnet']) self end def update requires :id, :network_id, :cidr, :ip_version merge_attributes(service.update_subnet(self.id, self.attributes).body['subnet']) self end def destroy requires :id service.delete_subnet(self.id) true end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/network/tag.rb0000644000076400007640000000256312424143106023027 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' module Fog module Network class Softlayer class Tag < Fog::Model identity :id attribute :name attribute :referenceCount, :type => :integer attribute :resource_id attribute :internal, :type => :boolean def initialize(attributes = {}) super end def destroy requires :name, :resource_id service.delete_network_tags(self.resource_id, [self.name]) #load_network #@network.delete_tags([self.name]) true end def references @networks ||= service.request(:tag, "#{id}", :query => "objectMask=references;references.tagType").body['references'].map do |ref| service.networks.get(ref['resourceTableId']) if ref['tagType']['keyName'] == 'NETWORK_VLAN' end.compact end def save requires :name, :resource_id load_network service.create_network_tags(self.resource_id, @network.tags << self.name) true end private def load_network requires :resource_id @network ||= service.networks.get(self.resource_id) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/dns/0000755000076400007640000000000012424143106021014 5ustar pravipravifog-softlayer-0.3.17/lib/fog/softlayer/models/dns/records.rb0000644000076400007640000000164312424143106023006 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/dns/record' module Fog module DNS class Softlayer class Records < Fog::Collection attribute :domain model Fog::DNS::Softlayer::Record def all requires :domain clear data = service.get_records(domain.id).body load(data) end def get(identifier) return nil if identifier.nil? || identifier == "" response = service.get_record(identifier) data = response.body new.merge_attributes(data) rescue Excon::Errors::NotFound nil end def new(attributes = {}) super({ :domain => domain }.merge!(attributes)) end end end end endfog-softlayer-0.3.17/lib/fog/softlayer/models/dns/record.rb0000644000076400007640000000356512424143106022630 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' module Fog module DNS class Softlayer class Record < Fog::Model identity :id attribute :domain_id, :aliases => "domainId" attribute :name, :aliases => "host" attribute :value, :aliases => "data" attribute :ttl attribute :priority, :aliases => "mxPriority" attribute :type attribute :expire attribute :minimum attribute :refresh attribute :retry def initialize(attributes={}) self.domain_id = attributes[:domain_id] super(attributes) end def destroy response = service.delete_record(identity) response.body end def save requires :name, :type, :value, :domain_id opts = generate_template # to save or to update, thats the question if id.nil? data = service.create_record(opts) merge_attributes(data.body) else data = service.update_record(self.id, opts) end true end private def generate_template template = {} template[:host] = self.name template[:data] = self.value template[:type] = self.type template[:domainId] = self.domain_id template[:ttl] = self.ttl if self.ttl template[:mxPriority] = self.priority if self.priority template[:expire] = self.expire if self.expire template[:minimum] = self.minimum if self.minimum template[:refresh] = self.refresh if self.refresh template[:retry] = self.retry if self.retry template end end end end endfog-softlayer-0.3.17/lib/fog/softlayer/models/dns/domain.rb0000644000076400007640000000244312424143106022613 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' require 'fog/softlayer/models/dns/records' module Fog module DNS class Softlayer class Domain < Fog::Model identity :id, :type => :integer attribute :name, :aliases => 'domain' attribute :serial, :type => :integer # Times attribute :updated_at, :aliases => 'updateDate', :type => :time def initialize(attributes = {}) super(attributes) end def records(reload = false) @records = nil if reload @records ||= begin Fog::DNS::Softlayer::Records.new( :domain => self, :service => service ) end end def create_record(opts = {}) opts.merge!({:domain_id => self.id, :service => service}) record = Fog::DNS::Softlayer::Record.new(opts) record.save records(true) record end def destroy requires :id response = service.delete_domain self.id response.body end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/dns/domains.rb0000644000076400007640000000251312424143106022774 0ustar pravipravi# # Author:: Celso Fernandes () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/compute/server' module Fog module DNS class Softlayer class Domains < Fog::Collection model Fog::DNS::Softlayer::Domain def all data = service.get_domains.body load(data) end def get(identifier) return nil if identifier.nil? || identifier == "" response = service.get_domain(identifier) data = response.body new.merge_attributes(data) rescue Excon::Errors::NotFound nil end def get_by_name(name) return nil if name.nil? || name == "" response = service.get_domain_by_name(name) data = response.body return false if data.empty? new.merge_attributes(data.first) rescue Excon::Errors::NotFound nil end def create(name) template_object = { 'name' => name, 'resourceRecords' => {}, } response = service.create_domain(template_object) data = response.body new.merge_attributes(data) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/storage/0000755000076400007640000000000012424143106021674 5ustar pravipravifog-softlayer-0.3.17/lib/fog/softlayer/models/storage/files.rb0000644000076400007640000000507712424143106023334 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/storage/file' module Fog module Storage class Softlayer class Files < Fog::Collection attribute :directory attribute :limit attribute :marker attribute :path attribute :prefix model Fog::Storage::Softlayer::File def all(options = {}) requires :directory options = { 'limit' => limit, 'marker' => marker, 'path' => path, 'prefix' => prefix }.merge!(options) merge_attributes(options) parent = directory.collection.get( directory.key, options ) if parent load(parent.files.map {|file| file.attributes}) else nil end end alias :each_file_this_page :each def each if !block_given? self else subset = dup.all subset.each_file_this_page {|f| yield f} while subset.length == (subset.limit || 10000) subset = subset.all(:marker => subset.last.key) subset.each_file_this_page {|f| yield f} end self end end def get(key, &block) requires :directory data = service.get_object(directory.key, key, &block) file_data = data.headers.merge({ :body => data.body, :key => key }) new(file_data) rescue Fog::Storage::Softlayer::NotFound nil end def get_url(key) requires :directory if self.directory.public_url "#{self.directory.public_url}/#{Fog::Softlayer.escape(key, '/')}" end end def get_https_url(key, expires, options = {}) requires :directory service.get_object_https_url(directory.key, key, expires, options) end def head(key, options = {}) requires :directory data = service.head_object(directory.key, key) file_data = data.headers.merge({ :key => key }) new(file_data) rescue Fog::Storage::Softlayer::NotFound nil end def new(attributes = {}) requires :directory super({ :directory => directory }.merge!(attributes)) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/storage/directories.rb0000644000076400007640000000220012424143106024527 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/collection' require 'fog/softlayer/models/storage/directory' module Fog module Storage class Softlayer class Directories < Fog::Collection model Fog::Storage::Softlayer::Directory def all data = service.get_containers.body load(data) end def get(key, options = {}) data = service.get_container(key, options) directory = new(:key => key) for key, value in data.headers if ['X-Container-Bytes-Used', 'X-Container-Object-Count'].include?(key) directory.merge_attributes(key => value) end end directory.files.merge_attributes(options) directory.files.instance_variable_set(:@loaded, true) data.body.each do |file| directory.files << directory.files.new(file) end directory rescue Fog::Storage::Softlayer::NotFound nil end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/storage/file.rb0000644000076400007640000001213112424143106023136 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' module Fog module Storage class Softlayer class File < Fog::Model identity :key, :aliases => 'name' attribute :content_length, :aliases => ['bytes', 'Content-Length'], :type => :integer attribute :content_type, :aliases => ['content_type', 'Content-Type'] attribute :content_disposition, :aliases => ['content_disposition', 'Content-Disposition'] attribute :etag, :aliases => ['hash', 'Etag'] attribute :last_modified, :aliases => ['last_modified', 'Last-Modified'], :type => :time attribute :access_control_allow_origin, :aliases => ['Access-Control-Allow-Origin'] attribute :origin, :aliases => ['Origin'] def body attributes[:body] ||= if last_modified collection.get(identity).body else '' end end def body=(new_body) attributes[:body] = new_body end def directory @directory end def copy(target_directory_key, target_file_key, options={}) requires :directory, :key options['Content-Type'] ||= content_type if content_type options['Access-Control-Allow-Origin'] ||= access_control_allow_origin if access_control_allow_origin options['Origin'] ||= origin if origin service.copy_object(directory.key, key, target_directory_key, target_file_key, options) target_directory = service.directories.new(:key => target_directory_key) target_directory.files.get(target_file_key) end def destroy requires :directory, :key service.delete_object(directory.key, key) true end def metadata @metadata ||= headers_to_metadata end def owner=(new_owner) if new_owner attributes[:owner] = { :display_name => new_owner['DisplayName'], :id => new_owner['ID'] } end end def public=(new_public) new_public end # Get a url for file. # # required attributes: key # # @param expires [String] number of seconds (since 1970-01-01 00:00) before url expires # @param options [Hash] # @return [String] url # def url(expires, options = {}) requires :directory, :key self.service.create_temp_url(directory.key, key, expires, "GET", options) end def public_url requires :key self.collection.get_url(self.key) end def save(options = {}) requires :body, :directory, :key options['Content-Type'] = content_type if content_type options['Content-Disposition'] = content_disposition if content_disposition options['Access-Control-Allow-Origin'] = access_control_allow_origin if access_control_allow_origin options['Origin'] = origin if origin options.merge!(metadata_to_headers) data = service.put_object(directory.key, key, body, options) update_attributes_from(data) refresh_metadata self.content_length = Fog::Storage.get_body_size(body) self.content_type ||= Fog::Storage.get_content_type(body) true end private def directory=(new_directory) @directory = new_directory end def refresh_metadata metadata.reject! {|k, v| v.nil? } end def headers_to_metadata key_map = key_mapping Hash[metadata_attributes.map {|k, v| [key_map[k], v] }] end def key_mapping key_map = metadata_attributes key_map.each_pair {|k, v| key_map[k] = header_to_key(k)} end def header_to_key(opt) opt.gsub(metadata_prefix, '').split('-').map {|k| k[0, 1].downcase + k[1..-1]}.join('_').to_sym end def metadata_to_headers header_map = header_mapping Hash[metadata.map {|k, v| [header_map[k], v] }] end def header_mapping header_map = metadata.dup header_map.each_pair {|k, v| header_map[k] = key_to_header(k)} end def key_to_header(key) metadata_prefix + key.to_s.split(/[-_]/).map(&:capitalize).join('-') end def metadata_attributes if last_modified headers = service.head_object(directory.key, self.key).headers headers.reject! {|k, v| !metadata_attribute?(k)} else {} end end def metadata_attribute?(key) key.to_s =~ /^#{metadata_prefix}/ end def metadata_prefix "X-Object-Meta-" end def update_attributes_from(data) merge_attributes(data.headers.reject {|key, value| ['Content-Length', 'Content-Type'].include?(key)}) end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/models/storage/directory.rb0000644000076400007640000000216012424143106024224 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core/model' require 'fog/softlayer/models/storage/files' module Fog module Storage class Softlayer class Directory < Fog::Model identity :key, :aliases => 'name' attribute :bytes, :aliases => 'X-Container-Bytes-Used' attribute :count, :aliases => 'X-Container-Object-Count' def destroy requires :key service.delete_container(key) true rescue Excon::Errors::NotFound false end def files @files ||= begin Fog::Storage::Softlayer::Files.new( :directory => self, :service => service ) end end def public=(new_public) @public = new_public end def public_url raise NotImplementedError end def save requires :key service.put_container(key) true end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/storage.rb0000644000076400007640000002065612424143106020747 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/softlayer/core' module Fog module Storage class Softlayer < Fog::Service requires :softlayer_username, :softlayer_api_key, :softlayer_cluster recognizes :persistent, :softlayer_storage_account, :softlayer_temp_url_key model_path 'fog/softlayer/models/storage' model :directory collection :directories model :file collection :files request_path 'fog/softlayer/requests/storage' request :copy_object request :delete_container request :delete_object request :delete_multiple_objects request :delete_static_large_object request :get_container request :get_containers request :get_object request :get_object_https_url request :head_container request :head_containers request :head_object request :put_container request :put_object request :put_object_manifest request :put_dynamic_obj_manifest request :put_static_obj_manifest request :post_set_meta_temp_url_key class Mock def self.data @data ||= Hash.new do |hash, key| hash[key] = {} end end def self.reset @data = nil end def initialize(options={}) @softlayer_api_key = options[:softlayer_api_key] @softlayer_username = options[:softlayer_username] @path = '/v1/AUTH_1234' @containers = {} end def data self.class.data[@softlayer_username] end def reset_data self.class.data.delete(@softlayer_username) end def change_account(account) @original_path ||= @path version_string = @original_path.split('/')[1] @path = "/#{version_string}/#{account}" end def reset_account_name @path = @original_path end end class Real attr_reader :auth_url attr_accessor :auth_token, :auth_expires def initialize(options={}) @api_key = options[:softlayer_api_key] @username = options[:softlayer_username] @cluster = options[:softlayer_cluster] @storage_account = options[:softlayer_storage_account] || default_storage_account(options[:softlayer_username], options[:softlayer_api_key]) @connection_options = options[:connection_options] || {} authenticate @persistent = options[:persistent] || false @connection = Fog::Core::Connection.new("#{@scheme}://#{@host}:#{@port}", @persistent, @connection_options) @temp_url_key = options[:softlayer_temp_url_key] || get_temp_url_key_for_account end def auth_url "https://#{@cluster}.#{Fog::Softlayer::SL_STORAGE_AUTH_URL}" end def reload @connection.reset end def request(params = {}, parse_json = true) begin params.is_a?(Hash) or raise ArgumentError, "#{self.class}#request params must be a Hash" params = _build_params(params) response = @connection.request(params) if response.status == 401 && !!@auth_token @auth_token = nil; @auth_expires = nil authenticate response = @connection.request(params) end if !response.body.empty? && parse_json && response.get_header('Content-Type') =~ %r{application/json} response.body = Fog::JSON.decode(response.body) end response rescue Excon::Errors::HTTPStatusError => error raise case error when Excon::Errors::NotFound Fog::Storage::Softlayer::NotFound.slurp(error) else error end end end private def _auth_headers { :headers => { 'User-Agent' => "Fog SoftLayer Adapter #{Fog::Softlayer::VERSION}", 'X-Auth-User' => "#{@storage_account}:#{@username}", 'X-Auth-Key' => @api_key } } end def _build_params(params) output = { :method => params.delete(:method) || :get } output[:path] = params[:path] ? "#{@path}/#{params.delete(:path)}".sub(/\/$/, '') : @path output = output.deep_merge(params) output.deep_merge(_headers) end def _headers { :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json', 'X-Auth-Token' => @auth_token } } end def authenticate if requires_auth? connection = Fog::Core::Connection.new(auth_url, false, _auth_headers) response = connection.request(:method => :get) raise Fog::Errors::Error.new("Could not authenticate Object Storage User.") unless response.status.between?(200, 208) @auth_token = response.headers['X-Auth-Token'] @auth_expires = Time.now + response.headers['X-Auth-Token-Expires'].to_i @storage_token = response.headers['X-Storage-Token'] uri = URI.parse(response.headers['X-Storage-Url']) @host = uri.host @path = uri.path @path.sub!(/\/$/, '') @port = uri.port @scheme = uri.scheme end true end def default_storage_account(username, api_key) slapi = Fog::Compute.new(:provider => :softlayer, :softlayer_username => username, :softlayer_api_key => api_key).request(:account, :get_hub_network_storage) slapi.body.map { |store| store['username'] }.first if slapi.body and slapi.body.instance_of? Array end def get_temp_url_key_for_account request.headers['X-Account-Meta-Temp-Url-Key'] end def requires_auth? !@auth_token || !@auth_expires || (@auth_expires.to_i - Time.now.to_i) < 30 end end # Thanks to @camertron! https://gist.github.com/camertron/2939093 module Memory # sizes are a guess, close enough for Mocks REF_SIZE = 4 # ? OBJ_OVERHEAD = 4 # ? FIXNUM_SIZE = 4 # ? # informational output from analysis MemoryInfo = Struct.new :roots, :objects, :bytes, :loops def self.analyze(*roots) an = Analyzer.new an.roots = roots an.analyze end class Analyzer attr_accessor :roots attr_reader :result def analyze @result = MemoryInfo.new roots, 0, 0, 0 @objs = {} queue = roots.dup until queue.empty? obj = queue.shift case obj when IO visit(obj) when String visit(obj) { @result.bytes += obj.size } when Fixnum @result.bytes += FIXNUM_SIZE when Array visit(obj) do @result.bytes += obj.size * REF_SIZE queue.concat(obj) end when Hash visit(obj) do @result.bytes += obj.size * REF_SIZE * 2 obj.each {|k,v| queue.push(k).push(v)} end when Enumerable visit(obj) do obj.each do |o| @result.bytes += REF_SIZE queue.push(o) end end else visit(obj) do obj.instance_variables.each do |var| @result.bytes += REF_SIZE queue.push(obj.instance_variable_get(var)) end end end end @result end private def visit(obj) id = obj.object_id if @objs.has_key? id @result.loops += 1 false else @objs[id] = true @result.bytes += OBJ_OVERHEAD @result.objects += 1 yield obj if block_given? true end end end end end end end fog-softlayer-0.3.17/lib/fog/softlayer/core.rb0000644000076400007640000001217612424143106020231 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/core' require 'fog/json' require 'fog/softlayer/version' require 'time' module Fog module Softlayer module Slapi # Sends the real request to the real SoftLayer service. # # @param [String] service # ...ayer.com/rest/v3/Softlayer_Service_Name... # @param path [String] # ...ayer.com/rest/v3/Softlayer_Service_Name/path.json # @param [Hash] options # @option options [Array] :body # HTTP request body parameters # @option options [String] :softlayer_api_url # Override the default (or configured) API endpoint # @option options [String] :softlayer_username # Email or user identifier for user based authentication # @option options [String] :softlayer_api_key # Password for user based authentication # @return [Excon::Response] def self.slapi_request(service, path, options) # default HTTP method to get if not passed http_method = options[:http_method] || :get # set the target base url @request_url = options[:softlayer_api_url] || Fog::Softlayer::SL_API_URL # tack on the username and password credentialize_url(options[:username], options[:api_key]) # set the SoftLayer Service name set_sl_service(service) # set the request path (known as the "method" in SL docs) set_sl_path(path) # set the query params if any # build request params params = { :headers => user_agent_header } params[:headers]['Content-Type'] = 'application/json' params[:expects] = options[:expected] || [200,201] params[:body] = Fog::JSON.encode({:parameters => [ options[:body] ]}) unless options[:body].nil? params[:query] = options[:query] unless options[:query].nil? # initialize connection object @connection = Fog::Core::Connection.new(@request_url, false, params) # send it response = @connection.request(:method => http_method) # decode it response.body = Fog::JSON.decode(response.body) response end private def self.credentialize_url(username, apikey) @request_url = "https://#{username}:#{apikey}@#{@request_url}" end ## # Prepend "SoftLayer_" to the service name and Snake_Camel_Case the string before appending it to the @request_url. # def self.set_sl_service(service) service = "SoftLayer_" << service.to_s.gsub(/^softlayer_/i, '').split('_').map{|i|i.capitalize}.join('_') service.fix_convention_exceptions @request_url += "/#{service}" end ## # Try to smallCamelCase the path before appending it to the @request_url # def self.set_sl_path(path) path = path.to_s.softlayer_underscore.softlayer_camelize path.fix_convention_exceptions @request_url += "/#{path}.json" end def self.user_agent_header {"User-Agent" => "Fog SoftLayer Adapter #{Fog::Softlayer::VERSION}"} end end extend Fog::Provider SL_API_URL = 'api.softlayer.com/rest/v3' unless defined? SL_API_URL SL_STORAGE_AUTH_URL = 'objectstorage.softlayer.net/auth/v1.0' unless defined? SL_STORAGE_AUTH_URL service(:compute, 'Compute') service(:dns, 'DNS') service(:network, 'Network') service(:storage, 'Storage') def self.mock_account_id Fog.mocking? and @sl_account_id ||= Fog::Mock.random_numbers(7) end def self.mock_vm_id Fog::Mock.random_numbers(7) end def self.mock_global_identifier Fog::UUID.uuid end def self.valid_request?(required, passed) required.all? {|k| k = k.to_sym; passed.key?(k) and !passed[k].nil?} end # CGI.escape, but without special treatment on spaces def self.escape(str,extra_exclude_chars = '') str.gsub(/([^a-zA-Z0-9_.-#{extra_exclude_chars}]+)/) do '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase end end def self.stringify_keys(obj) return obj.inject({}){|memo,(k,v)| memo[k.to_s] = stringify_keys(v); memo} if obj.is_a? Hash return obj.inject([]){|memo,v | memo << stringify_keys(v); memo} if obj.is_a? Array obj end end end unless {}.respond_to? :deep_merge class Hash def deep_merge(second) merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 } self.merge(second, &merger) end end end ## some helpers for some dirty work class String def softlayer_camelize self.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join end def fix_convention_exceptions # SLAPI WHY U No Follow Own Convention!? self.gsub!(/ipaddress/i, 'IpAddress') self.gsub!(/loadbalancer/i, 'LoadBalancer') end def softlayer_underscore self.gsub(/::/, '/'). gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). gsub(/([a-z\d])([A-Z])/,'\1_\2'). tr("-", "_"). downcase end end fog-softlayer-0.3.17/lib/fog/softlayer.rb0000644000076400007640000000045212424143106017273 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require 'fog/softlayer' require 'fog/softlayer/compute' require 'fog/softlayer/dns' require 'fog/softlayer/network' require 'fog/softlayer/storage' fog-softlayer-0.3.17/gemfiles/0000755000076400007640000000000012424143106015207 5ustar pravipravifog-softlayer-0.3.17/gemfiles/Gemfile-ruby-1.8.70000644000076400007640000000053612424143106020136 0ustar pravipravisource "https://rubygems.org" gem 'nokogiri', '~>1.5.11' gem 'mime-types', '~>1.16' group :development, :test do # This is here because gemspec doesn't support require: false gem 'coveralls', :require => false gem "netrc", :require => false gem "octokit", '~> 2.7.2', :require => false gem 'rake', '~> 10.1.0' end gemspec :path => "../" fog-softlayer-0.3.17/gemfiles/Gemfile-edge0000644000076400007640000000055212424143106017406 0ustar pravipravisource "https://rubygems.org" # Shared components gem "fog-core", :github => "fog/fog-core" gem "fog-json", :github => "fog/fog-json" group :development, :test do # This is here because gemspec doesn't support require: false gem "coveralls", :require => false gem "netrc", :require => false gem "octokit", :require => false end gemspec :path => "../" fog-softlayer-0.3.17/Rakefile0000644000076400007640000001323612424143106015066 0ustar pravipravi# # Author:: Matt Eldridge () # © Copyright IBM Corporation 2014. # # LICENSE: MIT (http://opensource.org/licenses/MIT) # require "bundler/gem_tasks" require "rake/testtask" #task :default => :test # #Rake::TestTask.new do |t| # t.pattern = File.join("spec", "**", "*_spec.rb") #end require 'bundler/setup' require 'rake/testtask' require 'date' require 'rubygems' require 'rubygems/package_task' require 'yard' require File.dirname(__FILE__) + '/lib/fog/softlayer' ############################################################################# # # Helper functions # ############################################################################# def name @name ||= Dir['*.gemspec'].first.split('.').first end def version Fog::Softlayer::VERSION end def date Date.today.to_s end def rubyforge_project name end def gemspec_file "#{name}.gemspec" end def gem_file "#{name}-#{version}.gem" end def replace_header(head, header_name) head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"} end ############################################################################# # # Standard tasks # ############################################################################# GEM_NAME = "#{name}" task :default => :test task :travis => ['test', 'test:travis', 'coveralls_push_workaround'] Rake::TestTask.new do |t| t.pattern = File.join("**", "spec", "**", "*_spec.rb") end namespace :test do mock = 'true' || ENV['FOG_MOCK'] task :travis do # jruby coveralls causes an OOM in travis ENV['COVERAGE'] = 'false' if RUBY_PLATFORM == 'java' sh("export FOG_MOCK=#{mock} && bundle exec shindont") end task :vsphere do sh("export FOG_MOCK=#{mock} && bundle exec shindont tests/vsphere") end task :openvz do sh("export FOG_MOCK=#{mock} && bundle exec shindont tests/openvz") end end desc 'Run mocked tests for a specific provider' task :mock, :provider do |t, args| if args.to_a.size != 1 fail 'USAGE: rake mock[]' end provider = args[:provider] sh("export FOG_MOCK=true && bundle exec shindont tests/#{provider}") end desc 'Run live tests against a specific provider' task :live, :provider do |t, args| if args.to_a.size != 1 fail 'USAGE: rake live[]' end provider = args[:provider] sh("export FOG_MOCK=false PROVIDER=#{provider} && bundle exec shindont tests/#{provider}") end task :nuke do Fog.providers.each do |provider| next if ['Vmfusion'].include?(provider) begin compute = Fog::Compute.new(:provider => provider) for server in compute.servers Formatador.display_line("[#{provider}] destroying server #{server.identity}") server.destroy rescue nil end rescue end begin dns = Fog::DNS.new(:provider => provider) for zone in dns.zones for record in zone.records record.destroy rescue nil end Formatador.display_line("[#{provider}] destroying zone #{zone.identity}") zone.destroy rescue nil end rescue end end end desc "Open an irb session preloaded with this library" task :console do sh "irb -rubygems -r ./lib/#{name}.rb" end ############################################################################# # # Packaging tasks # ############################################################################# task :release => ["release:prepare", "release:publish"] namespace :release do task :preflight do unless `git branch` =~ /^\* master$/ puts "You must be on the master branch to release!" exit! end if `git tag` =~ /^\* v#{version}$/ puts "Tag v#{version} already exists!" exit! end end task :prepare => :preflight do Rake::Task[:build].invoke sh "gem install pkg/#{name}-#{version}.gem" Rake::Task[:git_mark_release].invoke end task :publish do Rake::Task[:git_push_release].invoke Rake::Task[:gem_push].invoke end end task :git_mark_release do sh "git commit --allow-empty -a -m 'Release #{version}'" sh "git tag v#{version}" end task :git_push_release do sh "git push origin master" sh "git push origin v#{version}" end task :gem_push do sh "gem push pkg/#{name}-#{version}.gem" end desc "Build fog-#{version}.gem" task :build => :gemspec do sh "mkdir -p pkg" sh "gem build #{gemspec_file}" sh "mv #{gem_file} pkg" end task :gem => :build desc "Updates the gemspec and runs 'validate'" task :gemspec => :validate do # read spec file and split out manifest section spec = File.read(gemspec_file) # replace name version and date replace_header(spec, :name) replace_header(spec, :version) replace_header(spec, :date) #comment this out if your rubyforge_project has a different name #replace_header(spec, :rubyforge_project) File.open(gemspec_file, 'w') { |io| io.write(spec) } puts "Updated #{gemspec_file}" end desc "Run before pushing out the code" task :validate do libfiles = Dir['lib/*'] - ["lib/#{name}.rb", "lib/#{name}", "lib/tasks"] unless libfiles.empty? puts "Directory `lib` should only contain a `#{name}.rb` file and `#{name}` dir." #exit! end unless Dir['VERSION*'].empty? puts "A `VERSION` file at root level violates Gem best practices." exit! end end # Include Yard tasks for rake yard YARDOC_LOCATION = "doc" YARD::Rake::YardocTask.new do |t| t.files = ['lib/**/*.rb', "README"] t.options = ["--output-dir", YARDOC_LOCATION, "--title", "#{name} #{version}"] end task :coveralls_push_workaround do use_coveralls = (Gem::Version.new(RUBY_VERSION) > Gem::Version.new('1.9.2')) if (ENV['COVERAGE'] != 'false') && use_coveralls require 'coveralls/rake/task' Coveralls::RakeTask.new Rake::Task["coveralls:push"].invoke end end fog-softlayer-0.3.17/.gitignore0000644000076400007640000000042412424143106015404 0ustar pravipravi.idea* *~ *.gem *.rbc *.sw? .rbenv .rvmrc .ruby-gemset .ruby-version .bundle .DS_Store .idea .yardoc /tests/.fog bin/* !bin/fog .fog coverage doc/* docs/_site/* docs/about/supported_services.markdown Gemfile.lock gemfiles/*.lock yardoc pkg spec/credentials.yml vendor/* tags