vcloud-walker 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|