vcloud-walker 3.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +9 -0
- data/Gemfile +12 -0
- data/LICENSE +20 -0
- data/README.md +55 -0
- data/Rakefile +21 -0
- data/bin/vcloud-walk +41 -0
- data/docs/examples/catalogs.json +40 -0
- data/docs/examples/edgegateways.json +285 -0
- data/docs/examples/networks.json +53 -0
- data/docs/examples/vdcs.json +221 -0
- data/jenkins.sh +9 -0
- data/jenkins_integration_tests.sh +11 -0
- data/lib/vcloud/walker/fog_interface.rb +48 -0
- data/lib/vcloud/walker/resource/catalog.rb +29 -0
- data/lib/vcloud/walker/resource/catalog_item.rb +25 -0
- data/lib/vcloud/walker/resource/collection.rb +13 -0
- data/lib/vcloud/walker/resource/entity.rb +27 -0
- data/lib/vcloud/walker/resource/gateway_ipsec_vpn_service.rb +46 -0
- data/lib/vcloud/walker/resource/network.rb +38 -0
- data/lib/vcloud/walker/resource/organization.rb +45 -0
- data/lib/vcloud/walker/resource/vapp.rb +46 -0
- data/lib/vcloud/walker/resource/vdc.rb +35 -0
- data/lib/vcloud/walker/resource/vm.rb +85 -0
- data/lib/vcloud/walker/resource.rb +11 -0
- data/lib/vcloud/walker/vcloud_session.rb +13 -0
- data/lib/vcloud/walker/version.rb +5 -0
- data/lib/vcloud/walker.rb +23 -0
- data/scripts/configure_walker_ci_vse.rb +31 -0
- data/scripts/data/walker_ci/carrenza.yaml +17 -0
- data/scripts/data/walker_ci/skyscape.yaml +17 -0
- data/scripts/generate_fog_conf_file.sh +6 -0
- data/spec/fog_interface_spec.rb +93 -0
- data/spec/integration/vcloud_walker_spec.rb +74 -0
- data/spec/spec_helper.rb +45 -0
- data/spec/stubs/service_layer_stub.rb +109 -0
- data/spec/stubs/stubs.rb +46 -0
- data/spec/vcloud/walker_spec.rb +59 -0
- data/spec/walk/catalogs_spec.rb +31 -0
- data/spec/walk/entity_spec.rb +69 -0
- data/spec/walk/gateway_ipsec_vpn_service_spec.rb +157 -0
- data/spec/walk/network_spec.rb +70 -0
- data/spec/walk/organization_spec.rb +53 -0
- data/spec/walk/vapp_spec.rb +24 -0
- data/spec/walk/vdcs_spec.rb +30 -0
- data/spec/walk/vm_spec.rb +122 -0
- data/vcloud-walker.gemspec +31 -0
- metadata +274 -0
@@ -0,0 +1,85 @@
|
|
1
|
+
module Vcloud
|
2
|
+
module Walker
|
3
|
+
module Resource
|
4
|
+
class Vms < Collection
|
5
|
+
def initialize fog_vms
|
6
|
+
fog_vms = [fog_vms] unless fog_vms.is_a? Array
|
7
|
+
fog_vms.each do |vm|
|
8
|
+
self << Resource::Vm.new(vm)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
class Vm < Entity
|
15
|
+
|
16
|
+
attr_reader :id, :status, :cpu, :memory, :operating_system, :disks,
|
17
|
+
:primary_network_connection_index, :vmware_tools,
|
18
|
+
:virtual_system_type, :network_connections, :storage_profile,
|
19
|
+
:network_cards, :metadata
|
20
|
+
|
21
|
+
HARDWARE_RESOURCE_TYPES = {
|
22
|
+
:cpu => '3',
|
23
|
+
:memory => '4',
|
24
|
+
:hard_disk => '17',
|
25
|
+
:network_adapter => '10'
|
26
|
+
}
|
27
|
+
|
28
|
+
def initialize fog_vm
|
29
|
+
@id = extract_id(fog_vm[:href])
|
30
|
+
@status = fog_vm[:status]
|
31
|
+
@operating_system = fog_vm[:'ovf:OperatingSystemSection'][:'ovf:Description']
|
32
|
+
@network_connections = fog_vm[:NetworkConnectionSection][:NetworkConnection] if fog_vm[:NetworkConnectionSection]
|
33
|
+
@primary_network_connection_index = fog_vm[:NetworkConnectionSection][:PrimaryNetworkConnectionIndex]
|
34
|
+
extract_compute_capacity fog_vm[:'ovf:VirtualHardwareSection'][:'ovf:Item']
|
35
|
+
@vmware_tools = fog_vm[:RuntimeInfoSection][:VMWareTools]
|
36
|
+
@virtual_system_type = extract_virtual_system_type(fog_vm[:'ovf:VirtualHardwareSection'])
|
37
|
+
@storage_profile = {
|
38
|
+
:id => fog_vm[:StorageProfile][:href].split('/').last,
|
39
|
+
:name => fog_vm[:StorageProfile][:name],
|
40
|
+
}
|
41
|
+
@metadata = Vcloud::Core::Vm.get_metadata(id)
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
private
|
46
|
+
def extract_compute_capacity ovf_resources
|
47
|
+
%w(cpu memory disks network_cards).each { |resource| send("extract_#{resource}", ovf_resources) } unless ovf_resources.empty?
|
48
|
+
end
|
49
|
+
|
50
|
+
def extract_cpu(resources)
|
51
|
+
@cpu = resources.detect { |element| element[:'rasd:ResourceType']== HARDWARE_RESOURCE_TYPES[:cpu] }[:'rasd:ElementName']
|
52
|
+
end
|
53
|
+
|
54
|
+
def extract_memory(resources)
|
55
|
+
@memory = resources.detect { |element| element[:'rasd:ResourceType']== HARDWARE_RESOURCE_TYPES[:memory] }[:'rasd:ElementName']
|
56
|
+
end
|
57
|
+
|
58
|
+
def extract_disks(resources)
|
59
|
+
disk_resources = resources.select { |element| element[:'rasd:ResourceType']== HARDWARE_RESOURCE_TYPES[:hard_disk] }
|
60
|
+
@disks = disk_resources.collect do |d|
|
61
|
+
{:name => d[:'rasd:ElementName'], :size => d[:'rasd:HostResource'][:'ns12_capacity'].to_i}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def extract_network_cards(resources)
|
66
|
+
resources = resources.select {
|
67
|
+
|element| element[:'rasd:ResourceType'] == HARDWARE_RESOURCE_TYPES[:network_adapter]
|
68
|
+
}
|
69
|
+
@network_cards = resources.collect do |r|
|
70
|
+
{:name => r[:'rasd:ElementName'],
|
71
|
+
:type => r[:'rasd:ResourceSubType'],
|
72
|
+
:mac_address => r[:'rasd:Address'],
|
73
|
+
}
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def extract_virtual_system_type virtual_hardware_section
|
78
|
+
virtual_system = virtual_hardware_section[:"ovf:System"]
|
79
|
+
virtual_system[:"vssd:VirtualSystemType"] if virtual_system
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'vcloud/walker/resource/entity'
|
2
|
+
require 'vcloud/walker/resource/organization'
|
3
|
+
require 'vcloud/walker/resource/collection'
|
4
|
+
require 'vcloud/walker/resource/catalog_item'
|
5
|
+
require 'vcloud/walker/resource/catalog'
|
6
|
+
require 'vcloud/walker/resource/network'
|
7
|
+
require 'vcloud/walker/resource/vapp'
|
8
|
+
require 'vcloud/walker/resource/vdc'
|
9
|
+
require 'vcloud/walker/resource/vm'
|
10
|
+
require 'vcloud/walker/resource/gateway_ipsec_vpn_service'
|
11
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'fog'
|
2
|
+
|
3
|
+
require 'vcloud/core'
|
4
|
+
require 'vcloud/walker/vcloud_session'
|
5
|
+
require 'vcloud/walker/fog_interface'
|
6
|
+
require 'vcloud/walker/resource'
|
7
|
+
require 'vcloud/walker/version'
|
8
|
+
|
9
|
+
module Vcloud
|
10
|
+
module Walker
|
11
|
+
|
12
|
+
def self.walk(resource_to_walk)
|
13
|
+
valid_options = ['catalogs', 'vdcs', 'networks',
|
14
|
+
'edgegateways', 'organization']
|
15
|
+
if valid_options.include? resource_to_walk
|
16
|
+
Vcloud::Walker::Resource::Organization.send(resource_to_walk)
|
17
|
+
else
|
18
|
+
puts "Possible options are '#{valid_options.join("','")}'."
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'fog'
|
2
|
+
|
3
|
+
edge_gateway_id = ARGV[0]
|
4
|
+
raise "please provide edgegateway id. usage: bx ruby ./configure_walker_ci_vse.rb <edgegateway-id>" unless edge_gateway_id
|
5
|
+
|
6
|
+
lb_config = {
|
7
|
+
:IsEnabled => "true",
|
8
|
+
:Pool => [],
|
9
|
+
:VirtualServer => []
|
10
|
+
}
|
11
|
+
|
12
|
+
configuration = {
|
13
|
+
:FirewallService =>
|
14
|
+
{
|
15
|
+
:IsEnabled => true,
|
16
|
+
:DefaultAction => 'allow',
|
17
|
+
:LogDefaultAction => false,
|
18
|
+
:FirewallRule => []
|
19
|
+
},
|
20
|
+
:LoadBalancerService => lb_config,
|
21
|
+
:NatService => {
|
22
|
+
:IsEnabled => true,
|
23
|
+
:nat_type => 'portForwarding',
|
24
|
+
:Policy => 'allowTraffic',
|
25
|
+
:NatRule => []
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
vcloud = Fog::Compute::VcloudDirector.new
|
30
|
+
task = vcloud.post_configure_edge_gateway_services edge_gateway_id, configuration
|
31
|
+
vcloud.process_task(task.body)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
---
|
2
|
+
vapps:
|
3
|
+
- name: vcloud-walker-contract-testing-vapp
|
4
|
+
vdc_name: 0e7t-vcloud_tools_ci-OVDC-001
|
5
|
+
catalog: walker-ci
|
6
|
+
catalog_item: walker-ci-template
|
7
|
+
vm:
|
8
|
+
hardware_config:
|
9
|
+
memory: '1024'
|
10
|
+
cpu: '1'
|
11
|
+
extra_disks:
|
12
|
+
- size: '8192'
|
13
|
+
network_connections:
|
14
|
+
- name: walker-ci-network
|
15
|
+
ip_address: 192.168.254.100
|
16
|
+
metadata:
|
17
|
+
is_webserver: true
|
@@ -0,0 +1,17 @@
|
|
1
|
+
---
|
2
|
+
vapps:
|
3
|
+
- name: vcloud-walker-contract-testing-vapp
|
4
|
+
vdc_name: 'vCloud CI (IL2-DEVTEST-BASIC)'
|
5
|
+
catalog: walker-ci
|
6
|
+
catalog_item: ubuntu-precise-201310041515
|
7
|
+
vm:
|
8
|
+
hardware_config:
|
9
|
+
memory: '1024'
|
10
|
+
cpu: '1'
|
11
|
+
extra_disks:
|
12
|
+
- size: '8192'
|
13
|
+
network_connections:
|
14
|
+
- name: Default
|
15
|
+
ip_address: 192.168.254.100
|
16
|
+
metadata:
|
17
|
+
is_webserver: true
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rspec/mocks'
|
3
|
+
|
4
|
+
describe Vcloud::Walker::FogInterface do
|
5
|
+
context "GET entities" do
|
6
|
+
let(:org) { double(:fog_org, :id => 'org-123') }
|
7
|
+
let(:organizations) { double(:orgs) }
|
8
|
+
let(:session) { double(:fog_session, :org_name => 'org-123', :organizations => organizations) }
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
Vcloud::Walker::VcloudSession.should_receive(:instance).with(any_args()).at_least(:once).and_return(session)
|
12
|
+
organizations.should_receive(:get_by_name).and_return(org)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should get catalogs for given org id" do
|
16
|
+
mock_catalogs = [double(:catalog1), double(:catalog2)]
|
17
|
+
org.should_receive(:catalogs).and_return(double(:catalogs, :all => mock_catalogs))
|
18
|
+
|
19
|
+
catalogs = Vcloud::Walker::FogInterface.get_catalogs
|
20
|
+
|
21
|
+
catalogs.count.should == 2
|
22
|
+
catalogs.should == mock_catalogs
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should get networks for given org id" do
|
27
|
+
mock_networks = [double(:network1), double(:network2)]
|
28
|
+
org.should_receive(:networks).and_return(double(:networks, :all => mock_networks))
|
29
|
+
|
30
|
+
networks = Vcloud::Walker::FogInterface.get_networks
|
31
|
+
networks.count.should == 2
|
32
|
+
networks.should == mock_networks
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should get vdcs for given org id" do
|
36
|
+
mock_vdcs = [double(:vdc1), double(:vdc2), double(:vdc3)]
|
37
|
+
org.should_receive(:vdcs).and_return(double(:vdcs, :all => mock_vdcs))
|
38
|
+
|
39
|
+
vdcs = Vcloud::Walker::FogInterface.get_vdcs
|
40
|
+
vdcs.count.should == 3
|
41
|
+
vdcs.should == mock_vdcs
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should get edge gateways for given org" do
|
45
|
+
mock_vdc1 = double(:vdc, :id => 1)
|
46
|
+
get_edge_gateway_result = double('Excon::Response', :body => {:EdgeGatewayRecord => {:href => '/sausage'}})
|
47
|
+
|
48
|
+
org.should_receive(:vdcs).and_return(double(:vdcs, :all => [ mock_vdc1 ]))
|
49
|
+
session.should_receive(:get_org_vdc_gateways).with(1).and_return(get_edge_gateway_result)
|
50
|
+
session.should_receive(:get_edge_gateway).with('sausage').and_return(double(:eg, :body => :eg1))
|
51
|
+
|
52
|
+
edge_gateways = Vcloud::Walker::FogInterface.get_edge_gateways
|
53
|
+
|
54
|
+
edge_gateways.count.should == 1
|
55
|
+
edge_gateways.should == [:eg1]
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should get edge gateways for given org with complex set up of 2 vdcs and 3 edge gateways" do
|
59
|
+
mock_vdc1 = double(:vdc, :id => 1)
|
60
|
+
get_edge_gateway_vdc_1_result = double('Excon::Response', :body => {:EdgeGatewayRecord => {:href => '/sausage'}})
|
61
|
+
mock_vdc2 = double(:vdc, :id => 2)
|
62
|
+
get_edge_gateway_vdc_2_result = double('Excon::Response', :body => {:EdgeGatewayRecord => [{:href => '/beans'}, {:href => '/hashbrown'}]})
|
63
|
+
|
64
|
+
org.should_receive(:vdcs).and_return(double(:vdcs, :all => [ mock_vdc1, mock_vdc2 ]))
|
65
|
+
|
66
|
+
session.should_receive(:get_org_vdc_gateways).with(1).and_return(get_edge_gateway_vdc_1_result)
|
67
|
+
session.should_receive(:get_org_vdc_gateways).with(2).and_return(get_edge_gateway_vdc_2_result)
|
68
|
+
session.should_receive(:get_edge_gateway).with('sausage').and_return(double(:eg, :body => :eg1))
|
69
|
+
session.should_receive(:get_edge_gateway).with('beans').and_return(double(:eg, :body => :eg2))
|
70
|
+
session.should_receive(:get_edge_gateway).with('hashbrown').and_return(double(:eg, :body => :eg3))
|
71
|
+
|
72
|
+
edge_gateways = Vcloud::Walker::FogInterface.get_edge_gateways
|
73
|
+
|
74
|
+
edge_gateways.count.should == 3
|
75
|
+
edge_gateways.should == [:eg1, :eg2, :eg3]
|
76
|
+
end
|
77
|
+
|
78
|
+
it "get_edge_gateways should be happy if there are no edge gateways" do
|
79
|
+
mock_vdc1 = double(:vdc, :id => 1)
|
80
|
+
|
81
|
+
# no edge gateways means no entries to find in the results, just some other noise
|
82
|
+
vdc_1_search_result = double('Excon::Response', :body => {:Link => {:href => 's'}})
|
83
|
+
|
84
|
+
org.should_receive(:vdcs).and_return(double(:vdcs, :all => [ mock_vdc1 ]))
|
85
|
+
session.should_receive(:get_org_vdc_gateways).with(1).and_return(vdc_1_search_result)
|
86
|
+
|
87
|
+
edge_gateways = Vcloud::Walker::FogInterface.get_edge_gateways
|
88
|
+
|
89
|
+
edge_gateways.count.should == 0
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fog'
|
3
|
+
require 'stringio'
|
4
|
+
require 'vcloud/walker'
|
5
|
+
|
6
|
+
#######################################################################################
|
7
|
+
# The intention of these tests are to ensure we have confdence that our tooling will
|
8
|
+
# function when used, and as integration tests to cover the areas that get mocked
|
9
|
+
# and so to uncover assumptions on how we use the fog libraries.
|
10
|
+
#
|
11
|
+
# They are not there to test fog - that is the job of the fog tests, though
|
12
|
+
# this can be reconsidered if we get a of undetected bugs.
|
13
|
+
#
|
14
|
+
# Most if not all edge cases should be caught by the unit tests or the Fog tests.
|
15
|
+
#
|
16
|
+
# NB: These tests require that all EdgeGateways in the organization have the
|
17
|
+
# following services configured with at least one rule:
|
18
|
+
# NatService
|
19
|
+
# LoadBalancerService
|
20
|
+
#
|
21
|
+
# NB: Integration test also requires that at least one vApp is configured in
|
22
|
+
# the organization, otherwise tests fail with insufficient coverage.
|
23
|
+
#
|
24
|
+
|
25
|
+
|
26
|
+
describe Vcloud::Walker do
|
27
|
+
context 'walk an organization' do
|
28
|
+
|
29
|
+
it 'should integrate with fog to get vdcs' do
|
30
|
+
|
31
|
+
vdc_summaries = Vcloud::Walker.walk('vdcs').to_json
|
32
|
+
|
33
|
+
# assert that there are atleast one item and that includes the essencial sections
|
34
|
+
vdc_summaries.should have_json_path('0/id')
|
35
|
+
vdc_summaries.should have_json_path('0/name')
|
36
|
+
vdc_summaries.should have_json_path('0/vapps')
|
37
|
+
vdc_summaries.should have_json_path('0/quotas')
|
38
|
+
vdc_summaries.should have_json_path('0/compute_capacity')
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should integrate with fog to get networks" do
|
42
|
+
|
43
|
+
network_summary = Vcloud::Walker.walk('networks').to_json
|
44
|
+
|
45
|
+
# assert that there are atleast one item and that includes the essencial sections
|
46
|
+
network_summary.should have_json_path('0/id')
|
47
|
+
network_summary.should have_json_path('0/name')
|
48
|
+
network_summary.should have_json_path('0/ip_ranges')
|
49
|
+
network_summary.should have_json_path('0/gateway')
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should integrate with fog to get catalogs" do
|
53
|
+
|
54
|
+
catalogs_summary = Vcloud::Walker.walk('catalogs')
|
55
|
+
catalog_summary = catalogs_summary.detect{|c| !c[:items].empty? }.to_json
|
56
|
+
|
57
|
+
# assert that there are atleast one item and that includes the essencial sections
|
58
|
+
catalog_summary.should have_json_path('id')
|
59
|
+
catalog_summary.should have_json_path('name')
|
60
|
+
catalog_summary.should have_json_path('items')
|
61
|
+
catalog_summary.should have_json_path('items/0/vapp_template_id')
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should integrate with fog to get edge gateway data" do
|
65
|
+
|
66
|
+
result = Vcloud::Walker.walk('edgegateways').to_json
|
67
|
+
# assert that there are atleast one item and that includes the essencial sections
|
68
|
+
result.should have_json_path('0/Configuration/EdgeGatewayServiceConfiguration/FirewallService')
|
69
|
+
result.should have_json_path('0/Configuration/EdgeGatewayServiceConfiguration/NatService')
|
70
|
+
result.should have_json_path('0/Configuration/EdgeGatewayServiceConfiguration/LoadBalancerService')
|
71
|
+
result.should have_json_path('0/Configuration/GatewayInterfaces/GatewayInterface')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
if ENV['COVERAGE']
|
2
|
+
require 'simplecov'
|
3
|
+
|
4
|
+
SimpleCov.profiles.define 'gem' do
|
5
|
+
add_filter '/spec/'
|
6
|
+
add_filter '/features/'
|
7
|
+
add_filter '/vendor/'
|
8
|
+
|
9
|
+
add_group 'Libraries', '/lib/'
|
10
|
+
end
|
11
|
+
|
12
|
+
SimpleCov.start 'gem'
|
13
|
+
end
|
14
|
+
|
15
|
+
$:.unshift File.expand_path("../../lib", __FILE__)
|
16
|
+
|
17
|
+
require 'rspec'
|
18
|
+
require 'rspec/mocks'
|
19
|
+
require 'json_spec'
|
20
|
+
require 'vcloud/walker'
|
21
|
+
require_relative 'stubs/stubs'
|
22
|
+
require_relative 'stubs/service_layer_stub'
|
23
|
+
|
24
|
+
|
25
|
+
def set_login_credential username = 'some-username', password = 'some-password'
|
26
|
+
ENV['API_USERNAME'] = username
|
27
|
+
ENV['API_PASSWORD'] = password
|
28
|
+
end
|
29
|
+
|
30
|
+
RSpec.configure do |config|
|
31
|
+
config.include JsonSpec::Helpers
|
32
|
+
end
|
33
|
+
|
34
|
+
if ENV['COVERAGE']
|
35
|
+
ACCEPTED_COVERAGE = 97
|
36
|
+
SimpleCov.at_exit do
|
37
|
+
SimpleCov.result.format!
|
38
|
+
# do not change the coverage percentage, instead add more unit tests to fix coverage failures.
|
39
|
+
if SimpleCov.result.covered_percent < ACCEPTED_COVERAGE
|
40
|
+
print "ERROR::BAD_CODE_COVERAGE\n"
|
41
|
+
print "Coverage is less than acceptable limit(#{ACCEPTED_COVERAGE}%). Please add more tests to improve the coverage"
|
42
|
+
exit(1)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module Fog
|
2
|
+
module ServiceLayerStub
|
3
|
+
def self.vapp_body
|
4
|
+
{:name => "vapp-atomic-centre",
|
5
|
+
:id => "urn:vcloud:vm:aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
6
|
+
:href => 'https://myvdc.carrenza.net/api/vApp/vapp-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee',
|
7
|
+
:status => "on",
|
8
|
+
:description => "hosts the atomic centre app",
|
9
|
+
:deployed => true,
|
10
|
+
:NetworkConfigSection => {:NetworkConfig => [{:networkName => "Default", :IsDeployed => true, :Description => "default network",
|
11
|
+
:Configuration => {:IpScopes => 'abc'}, :ParentNetwork => nil}]},
|
12
|
+
:"ovf:NetworkSection" => {:'ovf:Network' => 'network'},
|
13
|
+
:Children =>
|
14
|
+
{
|
15
|
+
:Vm =>
|
16
|
+
{
|
17
|
+
:needsCustomization => "true",
|
18
|
+
:deployed => "true",
|
19
|
+
:status => "4", :name => "ubuntu-precise-201309091031",
|
20
|
+
:id => "urn:vcloud:vm:d19d84a5-c950-4497-a638-23eccc4226a5",
|
21
|
+
:type => "application/vnd.vmware.vcloud.vm+xml",
|
22
|
+
:href => "https://api.vcd.portal.examplecloud.com/api/vApp/vm-d19d84a5-c950-4497-a638-23eccc4226a5",
|
23
|
+
:Description => "ubuntu-precise | Version: 1.0 | Built using BoxGrinder",
|
24
|
+
:"ovf:OperatingSystemSection" =>
|
25
|
+
{
|
26
|
+
:"ovf:Description" => "Ubuntu Linux (64-bit)"
|
27
|
+
},
|
28
|
+
:NetworkConnectionSection =>
|
29
|
+
{
|
30
|
+
:ovf_required => "false",
|
31
|
+
:"ovf:Info" => "Specifies the available VM network connections",
|
32
|
+
:PrimaryNetworkConnectionIndex => "0",
|
33
|
+
:NetworkConnection =>
|
34
|
+
{
|
35
|
+
:network => "Default",
|
36
|
+
:needsCustomization => "true",
|
37
|
+
:NetworkConnectionIndex => "0",
|
38
|
+
:IpAddress => "192.168.2.2",
|
39
|
+
:IsConnected => "true",
|
40
|
+
:MACAddress => "00:50:56:01:0b:1a",
|
41
|
+
:IpAddressAllocationMode => "MANUAL"
|
42
|
+
},
|
43
|
+
},
|
44
|
+
:'ovf:VirtualHardwareSection' =>
|
45
|
+
{
|
46
|
+
:'ovf:Item' => [],
|
47
|
+
:"ovf:System" =>
|
48
|
+
{:"vssd:ElementName" => "Virtual Hardware Family", :"vssd:VirtualSystemType" => "vmx-08"}
|
49
|
+
},
|
50
|
+
:RuntimeInfoSection =>
|
51
|
+
{
|
52
|
+
:VMWareTools => {:version => "2147483647"}
|
53
|
+
},
|
54
|
+
:StorageProfile =>
|
55
|
+
{
|
56
|
+
:type => "application/vnd.vmware.vcloud.vdcStorageProfile+xml",
|
57
|
+
:name => "TEST-STORAGE-PROFILE",
|
58
|
+
:href => "https://api.vcd.portal.examplecloud.com/api/vdcStorageProfile/00000000-aaaa-bbbb-aaaa-000000000000"
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.mock_vapp
|
66
|
+
RSpec::Mocks::Mock.new(:fog_vapp, :body => vapp_body)
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.hardware_resources
|
70
|
+
[
|
71
|
+
{
|
72
|
+
:'rasd:ResourceType' =>:: Vcloud::Walker::Resource::Vm::HARDWARE_RESOURCE_TYPES[:hard_disk],
|
73
|
+
:"rasd:AddressOnParent" => "0",
|
74
|
+
:"rasd:Description" => "Hard disk",
|
75
|
+
:"rasd:ElementName" => "Hard disk 1",
|
76
|
+
:"rasd:HostResource" => {:ns12_capacity => "11265", :ns12_busSubType => "lsilogic", :ns12_busType => "6"},
|
77
|
+
},
|
78
|
+
|
79
|
+
{
|
80
|
+
:'rasd:ResourceType' => ::Vcloud::Walker::Resource::Vm::HARDWARE_RESOURCE_TYPES[:hard_disk],
|
81
|
+
:"rasd:AddressOnParent" => "1",
|
82
|
+
:"rasd:Description" => "Hard disk",
|
83
|
+
:"rasd:ElementName" => "Hard disk 2",
|
84
|
+
:"rasd:HostResource" => {:ns12_capacity => "307200", :ns12_busSubType => "lsilogic", :ns12_busType => "6"}
|
85
|
+
},
|
86
|
+
{
|
87
|
+
:'rasd:ResourceType' => ::Vcloud::Walker::Resource::Vm::HARDWARE_RESOURCE_TYPES[:cpu],
|
88
|
+
:"rasd:Description" => "Number of Virtual CPUs",
|
89
|
+
:"rasd:ElementName" => "2 virtual CPU(s)"
|
90
|
+
},
|
91
|
+
{
|
92
|
+
:'rasd:ResourceType' => ::Vcloud::Walker::Resource::Vm::HARDWARE_RESOURCE_TYPES[:memory],
|
93
|
+
:"rasd:Description" => "Memory Size",
|
94
|
+
:"rasd:ElementName" => "4096 MB of memory"
|
95
|
+
},
|
96
|
+
{
|
97
|
+
:'rasd:ResourceType' => ::Vcloud::Walker::Resource::Vm::HARDWARE_RESOURCE_TYPES[:network_adapter],
|
98
|
+
:'rasd:Address' => '00:50:56:00:00:01',
|
99
|
+
:'rasd:AddressOnParent' => '0',
|
100
|
+
:'rasd:AutomaticAllocation' => true,
|
101
|
+
:'rasd:Description' => 'E1000 ethernet adapter on "Default"',
|
102
|
+
:'rasd:ElementName' => 'Network adapter 0',
|
103
|
+
:'rasd:InstanceID' => '0',
|
104
|
+
:'rasd:ResourceSubType' => 'E1000',
|
105
|
+
},
|
106
|
+
]
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
data/spec/stubs/stubs.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
class StubVdc
|
2
|
+
@edge_gateways
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@edge_gateways = []
|
6
|
+
@vapps = []
|
7
|
+
@description = 'vdc-1-description'
|
8
|
+
end
|
9
|
+
|
10
|
+
def edge_gateways(edge_gateways)
|
11
|
+
@edge_gateways = edge_gateways
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
15
|
+
def vapps(vapps)
|
16
|
+
@vapps = vapps
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def desc(desc)
|
21
|
+
@description = desc
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def build
|
26
|
+
vdc = RSpec::Mocks::Mock.new(:vdc,
|
27
|
+
:id => 'vdc-1',
|
28
|
+
:description => @description,
|
29
|
+
:name => 'atomic reactor data centre',
|
30
|
+
:network_quota => 20,
|
31
|
+
:nic_quota => 0,
|
32
|
+
:vm_quota => 150,
|
33
|
+
:compute_capacity => {:storage => '200'}
|
34
|
+
)
|
35
|
+
vdc.stub(:edgeGateways).and_return( @edge_gateways )
|
36
|
+
vdc.stub(:vapps).and_return( @vapps)
|
37
|
+
vdc
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
class StubCollectionBuilders
|
43
|
+
def self.vdcs(vdc)
|
44
|
+
[vdc]
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Vcloud
|
4
|
+
module Walker
|
5
|
+
|
6
|
+
describe "walk" do
|
7
|
+
|
8
|
+
context "pass correct resource calls" do
|
9
|
+
|
10
|
+
it "should correctly pass catalogs" do
|
11
|
+
test_array = [ "name" => "catalogs" ]
|
12
|
+
Vcloud::Walker::Resource::Organization.stub(:catalogs).and_return(test_array)
|
13
|
+
result_array = Vcloud::Walker.walk("catalogs")
|
14
|
+
result_array.should include("name" => "catalogs")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should correctly pass vdcs" do
|
18
|
+
test_array = [ "name" => "vdcs" ]
|
19
|
+
Vcloud::Walker::Resource::Organization.stub(:vdcs).and_return(test_array)
|
20
|
+
result_array = Vcloud::Walker.walk("vdcs")
|
21
|
+
result_array.should include("name" => "vdcs")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should correctly pass networks" do
|
25
|
+
test_array = [ "name" => "networks" ]
|
26
|
+
Vcloud::Walker::Resource::Organization.stub(:networks).and_return(test_array)
|
27
|
+
result_array = Vcloud::Walker.walk("networks")
|
28
|
+
result_array.should include("name" => "networks")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should correctly pass edgegateways" do
|
32
|
+
test_array = [ "name" => "edgegateways" ]
|
33
|
+
Vcloud::Walker::Resource::Organization.stub(:edgegateways).and_return(test_array)
|
34
|
+
result_array = Vcloud::Walker.walk("edgegateways")
|
35
|
+
result_array.should include("name" => "edgegateways")
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should correctly pass organization" do
|
39
|
+
test_array = [ "name" => "organization" ]
|
40
|
+
Vcloud::Walker::Resource::Organization.stub(:organization).and_return(test_array)
|
41
|
+
result_array = Vcloud::Walker.walk("organization")
|
42
|
+
result_array.should include("name" => "organization")
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
context "invalid resources" do
|
48
|
+
|
49
|
+
it "should reject input that is not a valid resouce" do
|
50
|
+
result_array = Vcloud::Walker.walk("invalid")
|
51
|
+
result_array.should be_nil
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|