vcloud-cli-utils 0.8.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 84c5b9217176679b341cb302c9334855492961dc
4
+ data.tar.gz: c137de0353479909bda37f65e3c222c43abc35e3
5
+ SHA512:
6
+ metadata.gz: 8d400391d4f33f95fb10e77ab64354255444b6d5471f578427e5aabf10a9b43903c7d75be8d1ff253afc97ace4a7f6cd5a0f58cde3a919fa154048867a7db260
7
+ data.tar.gz: b2d81d529fd2aedb50b01ffc561392c91fd3c969ff40cd02a00cc7a3ddf52e5098cd5973ab2fd290fdac09b812252c22ff8bc7ccc96e31dd942ff9264b94f3f0
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+ Gemfile.lock
15
+
16
+ # YARD artifacts
17
+ .yardoc
18
+ _yardoc
19
+ doc/
data/CHANGELOG.md ADDED
@@ -0,0 +1,6 @@
1
+ v0.8.0
2
+
3
+ * Disk management tools implemented
4
+ * Better vcloud-get-entity docs
5
+ * vApp stop/start utils
6
+
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ if ENV['VCLOUD_CORE_DEV_MASTER']
6
+ gem 'vcloud-core', :git => 'git@github.com:alphagov/vcloud-core.git', :branch => 'master'
7
+ elsif ENV['VCLOUD_CORE_DEV_LOCAL']
8
+ gem 'vcloud-core', :path => '../vcloud-core'
9
+ end
10
+
11
+ if ENV['FOG_DEV_MASTER']
12
+ gem 'fog', :git => 'git@github.com:fog/fog.git', :branch => 'master'
13
+ elsif ENV['FOG_DEV_LOCAL']
14
+ gem 'fog', :path => '../fog'
15
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Mike Pountney
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,72 @@
1
+ vcloud-cli-utils
2
+ ================
3
+
4
+ Simple CLI utils to talk to the vCloud Director API
5
+
6
+ These are very hacky utils that I've found handy whilst helping develop
7
+ a more rich toolchain for GOV.UK:
8
+
9
+ * https://github.com/alphagov/vcloud-core
10
+ * https://github.com/alphagov/vcloud-edge_gateway
11
+ * https://github.com/alphagov/vcloud-tools
12
+ * https://github.com/alphagov/vcloud-walker
13
+
14
+ ... which in turn depend on the vcloud_director provider in Fog:
15
+
16
+ * https://github.com/fog/fog
17
+
18
+ If you find any of these utilities useful, please let me know, so a sured up
19
+ version can be created.
20
+
21
+ The tools
22
+ ----
23
+
24
+ ### vcloud-get-entity
25
+
26
+ Designed to retrieve a complete entity from vCloud via the Fog request layer. Useful
27
+ for seeing what is available from the raw requests, as Fog sees it (which can
28
+ be slightly, or completely, different from the raw XML returned from the API).
29
+
30
+ bx vcloud-get-entity {entity} {entity_id}
31
+
32
+ {entity} can be 'vm', 'vApp', 'orgVdc', 'edgeGateway', etc. Or alternatively,
33
+ any fog service request that takes a single ID as a parameter (eg
34
+ 'get_vm_capabilities')
35
+
36
+ ### vcloud-curl
37
+
38
+ Wrapper around curl to use Fog credentials & vcloud-login. Very useful for
39
+ getting the complete XML response from the API, for comparison against the data
40
+ returned by the Fog request layer
41
+
42
+ ### vcloud-delete-vapp
43
+
44
+ Deletes a vApp by name or id. --force option stops the vApp first, as vCloud
45
+ sensibly prevents running vApps from being deleted.
46
+
47
+ ### vcloud-delete-disk
48
+
49
+ Deletes an Independent Disk by ID.
50
+
51
+ ### vcloud-delete-network
52
+
53
+ Deletes an orgVdcNetwork by ID
54
+
55
+ ### vcloud-attach-disk
56
+
57
+ Attaches an independent disk to a stopped or running VM.
58
+
59
+ NB: To create a disk, see vcloud-disk_launcher Gem/tool.
60
+
61
+ ### vcloud-detach-disk
62
+
63
+ Detaches an independent disk from a stopped or running VM. NB: this can cause
64
+ problems within the guest OS - beware!
65
+
66
+ ### vcloud-start-vapp
67
+
68
+ Start a stopped vApp by name or ID.
69
+
70
+ ### vcloud-stop-vapp
71
+
72
+ Stop a started vApp by name or ID.
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require 'rspec/core/rake_task'
2
+ require 'gem_publisher'
3
+
4
+ task :default => [:rubocop]
5
+
6
+ task :publish_gem do
7
+ gem = GemPublisher.publish_if_updated("vcloud-cli-utils.gemspec", :rubygems)
8
+ puts "Published #{gem}" if gem
9
+ end
10
+
11
+ require 'rubocop/rake_task'
12
+ RuboCop::RakeTask.new(:rubocop) do |task|
13
+ task.options = ['--lint']
14
+ end
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'vcloud/cli/utils'
7
+
8
+ Vcloud::CLI::Utils::AttachDisk.run
data/bin/vcloud-curl ADDED
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+ require 'pp'
6
+ require 'vcloud/core'
7
+ require 'methadone'
8
+
9
+ ENV['FOG_MOCK'] && Fog.mock!
10
+
11
+ class App
12
+
13
+ include Methadone::Main
14
+ include Methadone::CLILogging
15
+
16
+ main do
17
+
18
+ fsi = Vcloud::Fog::ServiceInterface.new()
19
+ token = fsi.vcloud_token
20
+ end_point = fsi.end_point
21
+
22
+ rel_url = ARGV.shift
23
+ url = end_point + rel_url
24
+
25
+ system("/usr/bin/curl #{options[:curl_base_opts]} \
26
+ -H 'Accept:#{options[:content_type]}' \
27
+ -H 'x-vcloud-authorization: #{token}' \
28
+ #{ARGV.join(' ')} #{url}")
29
+
30
+ end
31
+
32
+ options[:content_type] = "application/*+xml;version=5.1"
33
+ options[:curl_base_opts] = '-s'
34
+
35
+ on("--content_type", "=ATTRIBUTE",
36
+ "Override default content_type (#{options[:content_type]})" ) do |v|
37
+ options[:content_type] = v
38
+ end
39
+
40
+ on("--curl_base_opts", "=ATTRIBUTE",
41
+ "Override base curl options (#{options[:curl_base_opts]})" ) do |v|
42
+ options[:curl_base_opts] = v
43
+ end
44
+
45
+ on("--verbose", "Verbose output")
46
+ on("--debug", "Debugging output")
47
+
48
+ arg :relative_url, :optional
49
+
50
+ description '
51
+ vcloud-curl takes a relative URL for a query (to the base api url), then
52
+ shells out to cURL with the remainder of ARGV
53
+
54
+ See https://github.com/alphagov/vcloud-tools for more info'
55
+
56
+ go!
57
+ end
58
+
59
+
@@ -0,0 +1,66 @@
1
+ #!/bin/sh
2
+
3
+ # This is an illustrative (functional) example of how to use just curl
4
+ # to talk to the vCloud API.
5
+ #
6
+ # The rest of the tools in vcloud-tools use Fog and hence have a unified
7
+ # credential/session handling system - and should as a result be used instead
8
+ # of this example.
9
+ #
10
+
11
+ usage() {
12
+ echo "vcloud-curl: simple curl wrapper to allow GET requests to vcloud API"
13
+ echo
14
+ echo "Usage:"
15
+ echo " vcloud-curl-example.sh {request}"
16
+ echo
17
+ echo "where {request} is the resource required after the /api end point"
18
+ echo "eg: vcloud-curl-example.sh vApp/{vm-id}/virtualHardwareSection/cpu"
19
+ echo
20
+ echo "You must set in environment:"
21
+ echo " VCLOUD_HOST"
22
+ echo " VCLOUD_ORG"
23
+ echo " VCLOUD_USER"
24
+ echo " VCLOUD_PASS"
25
+ exit 1
26
+ }
27
+
28
+ [ -z "$VCLOUD_HOST" ] && usage
29
+ [ -z "$VCLOUD_ORG" ] && usage
30
+ [ -z "$VCLOUD_USER" ] && usage
31
+ [ -z "$VCLOUD_PASS" ] && usage
32
+
33
+ CURL_OPTS=${CURL_OPTS-'--silent'}
34
+ MAIN_QUERY_CURL_OPTS=${MAIN_QUERY_CURL_OPTS-''}
35
+
36
+ api_version=${VCLOUD_API_VERSION-'5.1'}
37
+
38
+ MAIN_QUERY_CONTENT_TYPE=${MAIN_QUERY_CONTENT_TYPE-"application/*+xml;version=${api_version}"}
39
+
40
+ SESSION_KEY=`curl --include $CURL_OPTS \
41
+ -H "Accept:application/*+xml;version=${api_version}" \
42
+ -u "${VCLOUD_USER}@${VCLOUD_ORG}:${VCLOUD_PASS}" \
43
+ -X POST \
44
+ "https://${VCLOUD_HOST}/api/sessions" \
45
+ | grep '^x-vcloud-authorization:' \
46
+ | tr -d '\r' \
47
+ | awk '{print $2}'
48
+ `
49
+
50
+ if [ -z "${SESSION_KEY}" ]; then
51
+ echo "Failed to get vCloud session. Bailing"
52
+ exit 2
53
+ fi
54
+
55
+ curl $CURL_OPTS $MAIN_QUERY_CURL_OPTS \
56
+ -H "Accept:${MAIN_QUERY_CONTENT_TYPE}" \
57
+ -H "x-vcloud-authorization: ${SESSION_KEY}" \
58
+ "https://${VCLOUD_HOST}/api/$1"
59
+
60
+ # Log out
61
+ curl $CURL_OPTS \
62
+ -H "Accept:application/*+xml;version=${api_version}" \
63
+ -H "x-vcloud-authorization: ${SESSION_KEY}" \
64
+ -X DELETE \
65
+ "https://${VCLOUD_HOST}/api/session"
66
+
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'vcloud/cli/utils'
7
+
8
+ Vcloud::CLI::Utils::DeleteDisk.run
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'vcloud/cli/utils'
7
+
8
+ Vcloud::CLI::Utils::DeleteNetwork.run
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'vcloud/cli/utils'
7
+
8
+ Vcloud::CLI::Utils::DeleteVapp.run
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'vcloud/cli/utils'
7
+
8
+ Vcloud::CLI::Utils::DetachDisk.run
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'vcloud/cli/utils'
7
+
8
+ Vcloud::CLI::Utils::GetEntity.run
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'vcloud/cli/utils'
7
+
8
+ Vcloud::CLI::Utils::GetVmsAttachedToDisk.run
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'vcloud/cli/utils'
7
+
8
+ Vcloud::CLI::Utils::MakeVappTemplate.run
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'vcloud/cli/utils'
7
+
8
+ Vcloud::CLI::Utils::StartVapp.run
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'vcloud/cli/utils'
7
+
8
+ Vcloud::CLI::Utils::StopVapp.run
@@ -0,0 +1,16 @@
1
+
2
+ require 'methadone'
3
+ require 'fog'
4
+ require 'vcloud/core'
5
+ require 'pp'
6
+
7
+ require 'vcloud/cli/utils/get_entity'
8
+ require 'vcloud/cli/utils/stop_vapp'
9
+ require 'vcloud/cli/utils/start_vapp'
10
+ require 'vcloud/cli/utils/delete_vapp'
11
+ require 'vcloud/cli/utils/delete_network'
12
+ require 'vcloud/cli/utils/make_vapp_template'
13
+ require 'vcloud/cli/utils/attach_disk'
14
+ require 'vcloud/cli/utils/detach_disk'
15
+ require 'vcloud/cli/utils/delete_disk'
16
+ require 'vcloud/cli/utils/get_vms_attached_to_disk'
@@ -0,0 +1,35 @@
1
+ require 'methadone'
2
+ require 'vcloud/core'
3
+ require 'pp'
4
+
5
+ module Vcloud
6
+ module CLI
7
+ module Utils
8
+ class AttachDisk
9
+
10
+ include Methadone::Main
11
+ include Methadone::CLILogging
12
+
13
+ def self.run
14
+
15
+ main do |vm_id, disk_id|
16
+ vcloud = ::Fog::Compute::VcloudDirector.new
17
+ Fog.mock! if ENV['FOG_MOCK']
18
+ task = vcloud.post_attach_disk(vm_id, disk_id).body
19
+ vcloud.process_task(task)
20
+ end
21
+
22
+ arg :vm_id
23
+ arg :disk_id
24
+
25
+ description "
26
+ "
27
+
28
+ go!
29
+
30
+ end
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ module Vcloud
2
+ module CLI
3
+ module Utils
4
+ class DeleteDisk
5
+
6
+ include Methadone::Main
7
+ include Methadone::CLILogging
8
+
9
+ def self.run
10
+
11
+ main do |disk_id|
12
+ Fog.mock! if ENV['FOG_MOCK']
13
+ disk = Vcloud::Core::IndependentDisk.new(disk_id)
14
+ disk.destroy
15
+ end
16
+
17
+ arg :disk_id
18
+
19
+ description "
20
+ "
21
+
22
+ go!
23
+
24
+ end
25
+ end
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,39 @@
1
+ require 'methadone'
2
+ require 'vcloud/core'
3
+ require 'pp'
4
+
5
+ module Vcloud
6
+ module CLI
7
+ module Utils
8
+ class DeleteNetwork
9
+
10
+ include Methadone::Main
11
+ include Methadone::CLILogging
12
+
13
+ def self.run
14
+
15
+ main do |identifier|
16
+ vcloud = ::Fog::Compute::VcloudDirector.new
17
+ if identifier =~ /^[-0-9a-f]+/
18
+ net = Vcloud::Core::OrgVdcNetwork.new(identifier)
19
+ end
20
+ Fog.mock! if ENV['FOG_MOCK']
21
+ task = vcloud.delete_network(net.id).body
22
+ vcloud.process_task(task)
23
+ end
24
+
25
+ arg :identifier
26
+
27
+ on("-f", "--force", "Force deletion of running vapp")
28
+
29
+ description "
30
+ "
31
+
32
+ go!
33
+
34
+ end
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,45 @@
1
+ require 'methadone'
2
+ require 'vcloud/core'
3
+ require 'pp'
4
+
5
+ module Vcloud
6
+ module CLI
7
+ module Utils
8
+ class DeleteVapp
9
+
10
+ include Methadone::Main
11
+ include Methadone::CLILogging
12
+
13
+ def self.run
14
+
15
+ main do |identifier|
16
+ vcloud = ::Fog::Compute::VcloudDirector.new
17
+ if identifier =~ /^vapp-[-0-9a-f]+/
18
+ vapp = Vcloud::Core::Vapp.new(identifier)
19
+ else
20
+ vapp = Vcloud::Core::Vapp.get_by_name(identifier)
21
+ end
22
+ Fog.mock! if ENV['FOG_MOCK']
23
+ if options[:force]
24
+ task = vcloud.post_undeploy_vapp(vapp.id).body
25
+ vcloud.process_task(task)
26
+ end
27
+ task = vcloud.delete_vapp(vapp.id).body
28
+ vcloud.process_task(task)
29
+ end
30
+
31
+ arg :identifier
32
+
33
+ on("-f", "--force", "Force deletion of running vapp")
34
+
35
+ description "
36
+ "
37
+
38
+ go!
39
+
40
+ end
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,35 @@
1
+ require 'methadone'
2
+ require 'vcloud/core'
3
+ require 'pp'
4
+
5
+ module Vcloud
6
+ module CLI
7
+ module Utils
8
+ class DetachDisk
9
+
10
+ include Methadone::Main
11
+ include Methadone::CLILogging
12
+
13
+ def self.run
14
+
15
+ main do |vm_id, disk_id|
16
+ vcloud = ::Fog::Compute::VcloudDirector.new
17
+ Fog.mock! if ENV['FOG_MOCK']
18
+ task = vcloud.post_detach_disk(vm_id, disk_id).body
19
+ vcloud.process_task(task)
20
+ end
21
+
22
+ arg :vm_id
23
+ arg :disk_id
24
+
25
+ description "
26
+ "
27
+
28
+ go!
29
+
30
+ end
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,61 @@
1
+ require 'methadone'
2
+ require 'vcloud/core'
3
+ require 'pp'
4
+
5
+ module Vcloud
6
+ module CLI
7
+ module Utils
8
+ class GetEntity
9
+
10
+ include Methadone::Main
11
+ include Methadone::CLILogging
12
+
13
+ def self.run
14
+
15
+ main do |entity_type, identifier|
16
+ vcloud = ::Fog::Compute::VcloudDirector.new
17
+ case entity_type
18
+ when 'vm'
19
+ pp vcloud.get_vapp(identifier).body
20
+ when 'vApp'
21
+ pp vcloud.get_vapp(identifier).body
22
+ when 'edgeGateway'
23
+ pp vcloud.get_edge_gateway(identifier).body
24
+ when 'orgVdcNetwork'
25
+ pp vcloud.get_network_complete(identifier).body
26
+ when 'orgVdc'
27
+ pp vcloud.get_vdc(identifier).body
28
+ when /^get_/
29
+ pp vcloud.send(entity_type.to_s, identifier).body
30
+ else
31
+ help_now!("Invalid argument #{entity_type}")
32
+ end
33
+ end
34
+
35
+ arg :entity_type
36
+ arg :identifier
37
+
38
+ description "
39
+ vcloud-get-entity retreives the raw Fog body for key entity types in vCD.
40
+
41
+ It can also call any Fog request method beginning with 'get_', that takes a single
42
+ argument -- generally the id of the entity. There are many of these.
43
+
44
+ Supported entities can usually be retreived by name as well:
45
+
46
+ * vm
47
+ * vApp
48
+ * edgeGateway
49
+ * orgVdcNetwork
50
+ * orgVdc
51
+
52
+ "
53
+
54
+ go!
55
+
56
+ end
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,32 @@
1
+ module Vcloud
2
+ module CLI
3
+ module Utils
4
+ class GetVmsAttachedToDisk
5
+
6
+ include Methadone::Main
7
+ include Methadone::CLILogging
8
+
9
+ def self.run
10
+
11
+ main do |disk_id|
12
+ Fog.mock! if ENV['FOG_MOCK']
13
+ disk = Vcloud::Core::IndependentDisk.new(disk_id)
14
+ disk.attached_vms.each do |vm|
15
+ puts vm.name + " " + vm.id
16
+ end
17
+ end
18
+
19
+ arg :disk_id
20
+
21
+ description "
22
+ "
23
+
24
+ go!
25
+
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,85 @@
1
+ require 'methadone'
2
+ require 'vcloud/core'
3
+ require 'pp'
4
+
5
+ module Vcloud
6
+ module CLI
7
+ module Utils
8
+ class MakeVappTemplate
9
+
10
+ include Methadone::Main
11
+ include Methadone::CLILogging
12
+
13
+ def self.run
14
+
15
+ main do |vdc_name, blank_vapp_template_id, iso_id, template_name|
16
+
17
+ vcloud = ::Fog::Compute::VcloudDirector.new
18
+ Fog.mock! if ENV['FOG_MOCK']
19
+
20
+ vdc = Vcloud::Core::Vdc.get_by_name(vdc_name)
21
+
22
+ # Instantiate a 'blank vApp':
23
+ # * contains one VM
24
+ # * this VM has a single HDD
25
+ # * the VM HDD is blank
26
+ puts "Instantiating blank vApp/VM"
27
+ vapp = Vcloud::Core::Vapp.instantiate(
28
+ 'make_vapp_template_temp_vapp',
29
+ ['VappCreationTesting'],
30
+ blank_vapp_template_id,
31
+ vdc_name,
32
+ )
33
+
34
+ child_vm_id = vapp.fog_vms.first[:href].split('/').last
35
+ vm = Vcloud::Core::Vm.new(child_vm_id, vapp)
36
+ puts "Found child VM id: #{vm.id}"
37
+
38
+ # Add our ISO to the VM inside the vApp
39
+ puts "Inserting ISO into VM"
40
+ task = vcloud.post_insert_cd_rom(vm.id, iso_id).body
41
+ vcloud.process_task(task)
42
+
43
+ puts "Powering on vApp to install OS"
44
+ vapp.power_on
45
+
46
+ # vapp will now boot. VM will be shut down at the end
47
+ puts "Waiting for OS to install"
48
+ while vapp.vcloud_attributes[:status].to_i == 4
49
+ # vapp is in RUNNING state, so OS is still installing
50
+ printf('.')
51
+ sleep(5)
52
+ end
53
+ puts ""
54
+
55
+ puts "Removing ISO from VM"
56
+ task = vcloud.post_eject_cd_rom(vm.id, iso_id).body
57
+ vcloud.process_task(task)
58
+
59
+ puts "Stopping vApp completely"
60
+ task = vcloud.post_undeploy_vapp(vapp.id).body
61
+ vcloud.process_task(task)
62
+
63
+ puts "Turn the newly provisioned vApp into a vAppTemplate (in vDC #{vdc_name})"
64
+ capture_body = vcloud.post_capture_vapp(vdc.id, template_name, vapp.id).body
65
+ #vcloud.process_task(task)
66
+ pp capture_body
67
+
68
+ end
69
+
70
+ arg :vdc_id
71
+ arg :empty_vapp_template_id
72
+ arg :iso_name
73
+ arg :template_name
74
+
75
+ description "
76
+ "
77
+
78
+ go!
79
+
80
+ end
81
+ end
82
+
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,39 @@
1
+ require 'methadone'
2
+ require 'vcloud/core'
3
+ require 'pp'
4
+
5
+ module Vcloud
6
+ module CLI
7
+ module Utils
8
+ class StartVapp
9
+
10
+ include Methadone::Main
11
+ include Methadone::CLILogging
12
+
13
+ def self.run
14
+
15
+ main do |identifier|
16
+ vcloud = ::Fog::Compute::VcloudDirector.new
17
+ if identifier =~ /^vapp-[-0-9a-f]+/
18
+ vapp = Vcloud::Core::Vapp.new(identifier)
19
+ else
20
+ vapp = Vcloud::Core::Vapp.get_by_name(identifier)
21
+ end
22
+ Fog.mock! if ENV['FOG_MOCK']
23
+ task = vcloud.post_deploy_vapp(vapp.id).body
24
+ vcloud.process_task(task)
25
+ end
26
+
27
+ arg :identifier
28
+
29
+ description "
30
+ "
31
+
32
+ go!
33
+
34
+ end
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ require 'methadone'
2
+ require 'vcloud/core'
3
+ require 'pp'
4
+
5
+ module Vcloud
6
+ module CLI
7
+ module Utils
8
+ class StopVapp
9
+
10
+ include Methadone::Main
11
+ include Methadone::CLILogging
12
+
13
+ def self.run
14
+
15
+ main do |identifier|
16
+ vcloud = ::Fog::Compute::VcloudDirector.new
17
+ if identifier =~ /^vapp-[-0-9a-f]+/
18
+ vapp = Vcloud::Core::Vapp.new(identifier)
19
+ else
20
+ vapp = Vcloud::Core::Vapp.get_by_name(identifier)
21
+ end
22
+ Fog.mock! if ENV['FOG_MOCK']
23
+ task = vcloud.post_undeploy_vapp(vapp.id).body
24
+ vcloud.process_task(task)
25
+ end
26
+
27
+ arg :identifier
28
+
29
+ description "
30
+ "
31
+
32
+ go!
33
+
34
+ end
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,7 @@
1
+ module Vcloud
2
+ module CLI
3
+ module Utils
4
+ VERSION = '0.8.0'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ lib = File.expand_path('../lib/', __FILE__)
4
+ $LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'vcloud/cli/utils/version'
7
+ Gem::Specification.new do |s|
8
+ s.name = 'vcloud-cli-utils'
9
+ s.version = Vcloud::CLI::Utils::VERSION
10
+ s.authors = ['Mike Pountney']
11
+ s.email = ['Mike.Pountney@gmail.com']
12
+ s.summary = 'Various simple CLI utilities to communicate with the vCloud Director API'
13
+ s.description = 'Various simple CLI utilities to communicate with the vCloud Director API. Uses vcloud-core and fog.'
14
+ s.homepage = 'http://github.com/mikepea/vcloud-cli-utils'
15
+ s.license = 'MIT'
16
+
17
+ s.files = `git ls-files`.split($/)
18
+ s.executables = s.files.grep(%r{^bin/}) {|f| File.basename(f)}
19
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
20
+ s.require_paths = ['lib']
21
+
22
+ s.required_ruby_version = '>= 1.9.2'
23
+
24
+ s.add_runtime_dependency 'fog', '>= 1.20.0'
25
+ s.add_runtime_dependency 'methadone'
26
+ s.add_runtime_dependency 'vcloud-core', '>= 0.15.0'
27
+ s.add_development_dependency 'rake'
28
+ s.add_development_dependency 'rspec', '~> 2.14.1'
29
+ s.add_development_dependency 'rubocop', '~> 0.23.0'
30
+ s.add_development_dependency 'simplecov', '~> 0.8.2'
31
+ s.add_development_dependency 'gem_publisher', '1.2.0'
32
+ end
metadata ADDED
@@ -0,0 +1,200 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vcloud-cli-utils
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.0
5
+ platform: ruby
6
+ authors:
7
+ - Mike Pountney
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fog
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.20.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.20.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: methadone
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: vcloud-core
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 0.15.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 0.15.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 2.14.1
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.14.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.23.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.23.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.8.2
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.8.2
111
+ - !ruby/object:Gem::Dependency
112
+ name: gem_publisher
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 1.2.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 1.2.0
125
+ description: Various simple CLI utilities to communicate with the vCloud Director
126
+ API. Uses vcloud-core and fog.
127
+ email:
128
+ - Mike.Pountney@gmail.com
129
+ executables:
130
+ - vcloud-attach-disk
131
+ - vcloud-curl
132
+ - vcloud-curl-example.sh
133
+ - vcloud-delete-disk
134
+ - vcloud-delete-network
135
+ - vcloud-delete-vapp
136
+ - vcloud-detach-disk
137
+ - vcloud-get-entity
138
+ - vcloud-get_vms_attached_to-disk
139
+ - vcloud-make-vapp-template
140
+ - vcloud-start-vapp
141
+ - vcloud-stop-vapp
142
+ extensions: []
143
+ extra_rdoc_files: []
144
+ files:
145
+ - ".gitignore"
146
+ - CHANGELOG.md
147
+ - Gemfile
148
+ - LICENSE
149
+ - README.md
150
+ - Rakefile
151
+ - bin/vcloud-attach-disk
152
+ - bin/vcloud-curl
153
+ - bin/vcloud-curl-example.sh
154
+ - bin/vcloud-delete-disk
155
+ - bin/vcloud-delete-network
156
+ - bin/vcloud-delete-vapp
157
+ - bin/vcloud-detach-disk
158
+ - bin/vcloud-get-entity
159
+ - bin/vcloud-get_vms_attached_to-disk
160
+ - bin/vcloud-make-vapp-template
161
+ - bin/vcloud-start-vapp
162
+ - bin/vcloud-stop-vapp
163
+ - lib/vcloud/cli/utils.rb
164
+ - lib/vcloud/cli/utils/attach_disk.rb
165
+ - lib/vcloud/cli/utils/delete_disk.rb
166
+ - lib/vcloud/cli/utils/delete_network.rb
167
+ - lib/vcloud/cli/utils/delete_vapp.rb
168
+ - lib/vcloud/cli/utils/detach_disk.rb
169
+ - lib/vcloud/cli/utils/get_entity.rb
170
+ - lib/vcloud/cli/utils/get_vms_attached_to_disk.rb
171
+ - lib/vcloud/cli/utils/make_vapp_template.rb
172
+ - lib/vcloud/cli/utils/start_vapp.rb
173
+ - lib/vcloud/cli/utils/stop_vapp.rb
174
+ - lib/vcloud/cli/utils/version.rb
175
+ - vcloud-cli-utils.gemspec
176
+ homepage: http://github.com/mikepea/vcloud-cli-utils
177
+ licenses:
178
+ - MIT
179
+ metadata: {}
180
+ post_install_message:
181
+ rdoc_options: []
182
+ require_paths:
183
+ - lib
184
+ required_ruby_version: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: 1.9.2
189
+ required_rubygems_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ requirements: []
195
+ rubyforge_project:
196
+ rubygems_version: 2.2.2
197
+ signing_key:
198
+ specification_version: 4
199
+ summary: Various simple CLI utilities to communicate with the vCloud Director API
200
+ test_files: []