fog-vsphere 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/.travis.yml +32 -0
- data/CONTRIBUTING.md +18 -0
- data/CONTRIBUTORS.md +59 -0
- data/Gemfile +5 -0
- data/LICENSE.md +20 -0
- data/README.md +31 -0
- data/Rakefile +8 -0
- data/fog-vsphere.gemspec +32 -0
- data/gemfiles/Gemfile.1.9.2+ +8 -0
- data/gemfiles/Gemfile.1.9.2- +11 -0
- data/lib/fog/vsphere.rb +41 -0
- data/lib/fog/vsphere/compute.rb +473 -0
- data/lib/fog/vsphere/models/compute/cluster.rb +28 -0
- data/lib/fog/vsphere/models/compute/clusters.rb +22 -0
- data/lib/fog/vsphere/models/compute/customfield.rb +16 -0
- data/lib/fog/vsphere/models/compute/customfields.rb +23 -0
- data/lib/fog/vsphere/models/compute/customvalue.rb +14 -0
- data/lib/fog/vsphere/models/compute/customvalues.rb +33 -0
- data/lib/fog/vsphere/models/compute/datacenter.rb +44 -0
- data/lib/fog/vsphere/models/compute/datacenters.rb +19 -0
- data/lib/fog/vsphere/models/compute/datastore.rb +21 -0
- data/lib/fog/vsphere/models/compute/datastores.rb +21 -0
- data/lib/fog/vsphere/models/compute/folder.rb +24 -0
- data/lib/fog/vsphere/models/compute/folders.rb +23 -0
- data/lib/fog/vsphere/models/compute/interface.rb +91 -0
- data/lib/fog/vsphere/models/compute/interfaces.rb +66 -0
- data/lib/fog/vsphere/models/compute/interfacetype.rb +22 -0
- data/lib/fog/vsphere/models/compute/interfacetypes.rb +34 -0
- data/lib/fog/vsphere/models/compute/network.rb +18 -0
- data/lib/fog/vsphere/models/compute/networks.rb +22 -0
- data/lib/fog/vsphere/models/compute/process.rb +17 -0
- data/lib/fog/vsphere/models/compute/resource_pool.rb +19 -0
- data/lib/fog/vsphere/models/compute/resource_pools.rb +22 -0
- data/lib/fog/vsphere/models/compute/scsicontroller.rb +16 -0
- data/lib/fog/vsphere/models/compute/server.rb +325 -0
- data/lib/fog/vsphere/models/compute/servers.rb +36 -0
- data/lib/fog/vsphere/models/compute/servertype.rb +36 -0
- data/lib/fog/vsphere/models/compute/servertypes.rb +23 -0
- data/lib/fog/vsphere/models/compute/snapshot.rb +35 -0
- data/lib/fog/vsphere/models/compute/snapshots.rb +27 -0
- data/lib/fog/vsphere/models/compute/template.rb +11 -0
- data/lib/fog/vsphere/models/compute/templates.rb +19 -0
- data/lib/fog/vsphere/models/compute/volume.rb +99 -0
- data/lib/fog/vsphere/models/compute/volumes.rb +53 -0
- data/lib/fog/vsphere/requests/compute/cloudinit_to_customspec.rb +65 -0
- data/lib/fog/vsphere/requests/compute/create_folder.rb +22 -0
- data/lib/fog/vsphere/requests/compute/create_vm.rb +169 -0
- data/lib/fog/vsphere/requests/compute/current_time.rb +18 -0
- data/lib/fog/vsphere/requests/compute/get_cluster.rb +25 -0
- data/lib/fog/vsphere/requests/compute/get_compute_resource.rb +41 -0
- data/lib/fog/vsphere/requests/compute/get_datacenter.rb +31 -0
- data/lib/fog/vsphere/requests/compute/get_datastore.rb +30 -0
- data/lib/fog/vsphere/requests/compute/get_folder.rb +74 -0
- data/lib/fog/vsphere/requests/compute/get_interface_type.rb +15 -0
- data/lib/fog/vsphere/requests/compute/get_network.rb +59 -0
- data/lib/fog/vsphere/requests/compute/get_resource_pool.rb +26 -0
- data/lib/fog/vsphere/requests/compute/get_server_type.rb +32 -0
- data/lib/fog/vsphere/requests/compute/get_template.rb +16 -0
- data/lib/fog/vsphere/requests/compute/get_virtual_machine.rb +57 -0
- data/lib/fog/vsphere/requests/compute/get_vm_first_scsi_controller.rb +26 -0
- data/lib/fog/vsphere/requests/compute/list_child_snapshots.rb +71 -0
- data/lib/fog/vsphere/requests/compute/list_clusters.rb +72 -0
- data/lib/fog/vsphere/requests/compute/list_compute_resources.rb +92 -0
- data/lib/fog/vsphere/requests/compute/list_customfields.rb +21 -0
- data/lib/fog/vsphere/requests/compute/list_datacenters.rb +53 -0
- data/lib/fog/vsphere/requests/compute/list_datastores.rb +40 -0
- data/lib/fog/vsphere/requests/compute/list_folders.rb +44 -0
- data/lib/fog/vsphere/requests/compute/list_interface_types.rb +25 -0
- data/lib/fog/vsphere/requests/compute/list_networks.rb +38 -0
- data/lib/fog/vsphere/requests/compute/list_processes.rb +40 -0
- data/lib/fog/vsphere/requests/compute/list_resource_pools.rb +38 -0
- data/lib/fog/vsphere/requests/compute/list_server_types.rb +54 -0
- data/lib/fog/vsphere/requests/compute/list_templates.rb +48 -0
- data/lib/fog/vsphere/requests/compute/list_virtual_machines.rb +80 -0
- data/lib/fog/vsphere/requests/compute/list_vm_customvalues.rb +20 -0
- data/lib/fog/vsphere/requests/compute/list_vm_interfaces.rb +63 -0
- data/lib/fog/vsphere/requests/compute/list_vm_snapshots.rb +66 -0
- data/lib/fog/vsphere/requests/compute/list_vm_volumes.rb +52 -0
- data/lib/fog/vsphere/requests/compute/modify_vm_interface.rb +59 -0
- data/lib/fog/vsphere/requests/compute/modify_vm_volume.rb +25 -0
- data/lib/fog/vsphere/requests/compute/revert_to_snapshot.rb +30 -0
- data/lib/fog/vsphere/requests/compute/set_vm_customvalue.rb +17 -0
- data/lib/fog/vsphere/requests/compute/vm_clone.rb +727 -0
- data/lib/fog/vsphere/requests/compute/vm_config_vnc.rb +45 -0
- data/lib/fog/vsphere/requests/compute/vm_destroy.rb +23 -0
- data/lib/fog/vsphere/requests/compute/vm_execute.rb +47 -0
- data/lib/fog/vsphere/requests/compute/vm_migrate.rb +33 -0
- data/lib/fog/vsphere/requests/compute/vm_power_off.rb +39 -0
- data/lib/fog/vsphere/requests/compute/vm_power_on.rb +26 -0
- data/lib/fog/vsphere/requests/compute/vm_reboot.rb +31 -0
- data/lib/fog/vsphere/requests/compute/vm_reconfig_cpus.rb +23 -0
- data/lib/fog/vsphere/requests/compute/vm_reconfig_hardware.rb +24 -0
- data/lib/fog/vsphere/requests/compute/vm_reconfig_memory.rb +23 -0
- data/lib/fog/vsphere/requests/compute/vm_take_snapshot.rb +37 -0
- data/lib/fog/vsphere/version.rb +5 -0
- data/tests/compute_tests.rb +53 -0
- data/tests/helper.rb +8 -0
- data/tests/helpers/mock_helper.rb +9 -0
- data/tests/helpers/succeeds_helper.rb +9 -0
- data/tests/models/compute/server_tests.rb +70 -0
- data/tests/models/compute/servers_tests.rb +15 -0
- data/tests/requests/compute/current_time_tests.rb +12 -0
- data/tests/requests/compute/get_network_tests.rb +50 -0
- data/tests/requests/compute/list_child_snapshots_tests.rb +10 -0
- data/tests/requests/compute/list_clusters_tests.rb +11 -0
- data/tests/requests/compute/list_virtual_machines_tests.rb +38 -0
- data/tests/requests/compute/list_vm_snapshots_tests.rb +10 -0
- data/tests/requests/compute/revert_to_snapshot_tests.rb +15 -0
- data/tests/requests/compute/set_vm_customvalue_tests.rb +20 -0
- data/tests/requests/compute/vm_clone_tests.rb +50 -0
- data/tests/requests/compute/vm_config_vnc_tests.rb +19 -0
- data/tests/requests/compute/vm_destroy_tests.rb +17 -0
- data/tests/requests/compute/vm_migrate_tests.rb +16 -0
- data/tests/requests/compute/vm_power_off_tests.rb +26 -0
- data/tests/requests/compute/vm_power_on_tests.rb +17 -0
- data/tests/requests/compute/vm_reboot_tests.rb +26 -0
- data/tests/requests/compute/vm_reconfig_cpus_tests.rb +19 -0
- data/tests/requests/compute/vm_reconfig_hardware_tests.rb +19 -0
- data/tests/requests/compute/vm_reconfig_memory_tests.rb +19 -0
- data/tests/requests/compute/vm_take_snapshot_tests.rb +19 -0
- metadata +289 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cfe6e1cbbfc4227977c73a8745a21b95dc3620bb
|
4
|
+
data.tar.gz: b8affb28c374525ca1c7672b8ba41b872dffd46a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 42468d362477c2f717de36467569278bbd9d6936f6f56809d2c6e968da8e206f73dc051d8dde82c0308645a0aed406f0bfbfac4aecaaecc19e55a72942e5469e
|
7
|
+
data.tar.gz: 8d7dfb60c5849b2bd1865a1ffd8e5823e6a3904d578682d3c8e4e922a17625591db912458b2a27f210d6d8e7d966320a50d133f859b84dbcad56015431c4519f
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
23
|
+
gemfiles/*.lock
|
data/.travis.yml
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
language: ruby
|
2
|
+
sudo: false
|
3
|
+
before_install: gem install bundler
|
4
|
+
matrix:
|
5
|
+
allow_failures:
|
6
|
+
- rvm: jruby-head
|
7
|
+
fast_finish: true
|
8
|
+
include:
|
9
|
+
- rvm: 1.8.7
|
10
|
+
gemfile: gemfiles/Gemfile.1.9.2-
|
11
|
+
- rvm: 1.9.3
|
12
|
+
gemfile: gemfiles/Gemfile.1.9.2+
|
13
|
+
- rvm: 2.0.0
|
14
|
+
gemfile: Gemfile
|
15
|
+
- rvm: 2.1.0
|
16
|
+
gemfile: Gemfile
|
17
|
+
- rvm: 2.1.1
|
18
|
+
gemfile: Gemfile
|
19
|
+
- rvm: 2.2.0
|
20
|
+
gemfile: Gemfile
|
21
|
+
- rvm: jruby-18mode
|
22
|
+
gemfile: gemfiles/Gemfile.1.9.2-
|
23
|
+
- rvm: jruby-19mode
|
24
|
+
gemfile: gemfiles/Gemfile.1.9.2+
|
25
|
+
- rvm: jruby-head
|
26
|
+
gemfile: Gemfile
|
27
|
+
notifications:
|
28
|
+
email: false
|
29
|
+
addons:
|
30
|
+
code_climate:
|
31
|
+
repo_token: 44bcd04b60228fc94f2be3a5e0346441b5ea156e94e89a17fc24c5d3de483721
|
32
|
+
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
## Getting Involved
|
2
|
+
|
3
|
+
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.
|
4
|
+
|
5
|
+
### Coding
|
6
|
+
|
7
|
+
* Pick a task:
|
8
|
+
* Offer feedback on open [pull requests](https://github.com/fog/fog-vsphere/pulls).
|
9
|
+
* Review open [issues](https://github.com/fog/fog-vsphere/issues) for things to help on.
|
10
|
+
* [Create an issue](https://github.com/fog/fog-vsphere/issues/new) to start a discussion on additions or features.
|
11
|
+
* Fork the project, add your changes and tests to cover them in a topic branch.
|
12
|
+
* Commit your changes and rebase against `fog/fog-vsphere` to ensure everything is up to date.
|
13
|
+
* [Submit a pull request](https://github.com/fog/fog-vsphere/compare/)
|
14
|
+
|
15
|
+
### Non-Coding
|
16
|
+
|
17
|
+
* Offer feedback on open [issues](https://github.com/fog/fog-vsphere/issues).
|
18
|
+
* Organize or volunteer at events.
|
data/CONTRIBUTORS.md
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
* Ahmed Elsabbahy <aelsabbahy@promnetwork.com>
|
2
|
+
* Alan Sebastian <asebastian2@gmail.com>
|
3
|
+
* Carl Caum <carl@carlcaum.com>
|
4
|
+
* Carlos Sanchez <csanchez@maestrodev.com>
|
5
|
+
* Chris Thompson <chris.thompson@govdelivery.com>
|
6
|
+
* Chris Thompson <teaforthecat@gmail.com>
|
7
|
+
* Cyrus Team <cyrusteam@cyruslists.com>
|
8
|
+
* Darren Foo <stonith@users.noreply.github.com>
|
9
|
+
* Dominic Cleal <dcleal@redhat.com>
|
10
|
+
* Eric Stonfer <ericstonfer@yahoo.com>
|
11
|
+
* Ewoud Kohl van Wijngaarden <ewoud@kohlvanwijngaarden.nl>
|
12
|
+
* Francois Herbert <F.Herbert@massey.ac.nz>
|
13
|
+
* Francois Herbert <fherbert@oss.co.nz>
|
14
|
+
* Francois Herbert <francois@herbert.org.nz>
|
15
|
+
* Ivan Nečas <inecas@redhat.com>
|
16
|
+
* Ivo Reznicek <ireznice@googlemail.com>
|
17
|
+
* James Herdman <james.herdman@me.com>
|
18
|
+
* Jeff McCune <jeff@puppetlabs.com>
|
19
|
+
* Justin Clayton <justin.clayton@gettyimages.com>
|
20
|
+
* Justin Pratt <github@justinpratt.me>
|
21
|
+
* Justin Pratt <jpratt@liveramp.com>
|
22
|
+
* Karan Misra <karan@erodov.com>
|
23
|
+
* Kelsey Hightower <kelsey@puppetlabs.com>
|
24
|
+
* Kevin Menard <kevin@nirvdrum.com>
|
25
|
+
* Kevin Menard <nirvdrum@gmail.com>
|
26
|
+
* Lance Ivy <lance@cainlevy.net>
|
27
|
+
* Lukas Zapletal <lzap+git@redhat.com>
|
28
|
+
* Marc Grimme <grimme@atix.de>
|
29
|
+
* Marc Grimme <marc.grimme@googlemail.com>
|
30
|
+
* Martin Matuska <martin@matuska.org>
|
31
|
+
* Matt Darby <matt.darby@rackspace.com>
|
32
|
+
* Matthew Black <matthew.black@sap.com>
|
33
|
+
* Matthew Black <matthewblack@successfactors.com>
|
34
|
+
* Michael Moll <kvedulv@kvedulv.de>
|
35
|
+
* Mick Pollard <aussielunix@gmail.com>
|
36
|
+
* Ming Jin <skyairmj@gmail.com>
|
37
|
+
* Nick Huanca <nhuanca@pingidentity.com>
|
38
|
+
* Nick Huanca <nick.huanca@gmail.com>
|
39
|
+
* Nick Huanuca <nhuanca@pingidentity.com>
|
40
|
+
* Ohad Levy <ohadlevy@gmail.com>
|
41
|
+
* Ohad Levy <ohadlevy@redhat.com>
|
42
|
+
* Oscar Elfving <sofam84@gmail.com>
|
43
|
+
* Paul Thornthwaite <paul@brightbox.co.uk>
|
44
|
+
* Paul Thornthwaite <tokengeek@gmail.com>
|
45
|
+
* Rich Lane <rlane@club.cc.cmu.edu>
|
46
|
+
* Samuel Keeley <samuel@dropbox.com>
|
47
|
+
* Shlomi Zadok <shlomi@ben-hanna.com>
|
48
|
+
* Simon Josi <me@yokto.net>
|
49
|
+
* Tejas Ravindra Mandke <tejas@identified.com>
|
50
|
+
* Timur Alperovich <timur@maginatics.com>
|
51
|
+
* Wesley Beary <geemus+github@gmail.com>
|
52
|
+
* Wesley Beary <geemus@gmail.com>
|
53
|
+
* Xavier Fontrodona <xavier.fontrodona@safelayer.com>
|
54
|
+
* alan <asebastian2@gmail.com>
|
55
|
+
* endzyme <nick.huanca@gmail.com>
|
56
|
+
* geemus <geemus@gmail.com>
|
57
|
+
* karmab <karimboumedhel@gmail.com>
|
58
|
+
* slivik <jakub.sliva@gmail.com>
|
59
|
+
* tipt0e <topo-2@charter.net>
|
data/Gemfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014-2015 [CONTRIBUTORS.md](CONTRIBUTORS.md)
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
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, FITNESS
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# Fog::Vsphere
|
2
|
+
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/fog-vsphere.svg)](http://badge.fury.io/rb/fog-vsphere) [![Build Status](https://travis-ci.org/fog/fog-vsphere.svg?branch=master)](https://travis-ci.org/fog/fog-vsphere) [![Dependency Status](https://gemnasium.com/fog/fog-vsphere.svg)](https://gemnasium.com/fog/fog-vsphere) [![Test Coverage](https://codeclimate.com/github/fog/fog-vsphere/badges/coverage.svg)](https://codeclimate.com/github/fog/fog-vsphere/coverage) [![Code Climate](https://codeclimate.com/github/fog/fog-vsphere.png)](https://codeclimate.com/github/fog/fog-vsphere) [![Stories in Ready](https://badge.waffle.io/fog/fog-vsphere.png?label=ready&title=Ready)](https://waffle.io/fog/fog-vsphere)
|
4
|
+
|
5
|
+
TODO: Write a gem description
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'fog-vsphere'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install fog-vsphere
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
TODO: Write usage instructions here
|
24
|
+
|
25
|
+
## Contributing
|
26
|
+
|
27
|
+
1. Fork it ( https://github.com/fog/fog-vsphere/fork )
|
28
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
29
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
30
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
31
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/fog-vsphere.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'fog/vsphere/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'fog-vsphere'
|
8
|
+
spec.version = Fog::Vsphere::VERSION
|
9
|
+
spec.authors = ['J.R. Garcia']
|
10
|
+
spec.email = ['jrg@vmware.com']
|
11
|
+
|
12
|
+
spec.summary = "Module for the 'fog' gem to support VMware vSphere."
|
13
|
+
spec.description = 'This library can be used as a module for `fog` or as standalone provider to use vSphere in applications.'
|
14
|
+
spec.homepage = 'https://github.com/fog/fog-vsphere'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0")
|
18
|
+
spec.test_files = spec.files.grep(%r{^tests\/})
|
19
|
+
|
20
|
+
spec.require_paths = ['lib']
|
21
|
+
|
22
|
+
spec.required_ruby_version = '>= 1.8.7'
|
23
|
+
|
24
|
+
spec.add_runtime_dependency 'fog-core', '~> 1.32'
|
25
|
+
spec.add_runtime_dependency 'rbvmomi', '~> 1.8'
|
26
|
+
|
27
|
+
spec.add_development_dependency 'bundler', '~> 1.10'
|
28
|
+
spec.add_development_dependency 'pry', '~> 0.10'
|
29
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
30
|
+
spec.add_development_dependency 'rubocop', '~> 0.34'
|
31
|
+
spec.add_development_dependency 'shindo', '~> 0.3'
|
32
|
+
end
|
data/lib/fog/vsphere.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'fog/core'
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module Vsphere
|
5
|
+
autoload :Compute, File.expand_path('../vsphere/compute', __FILE__)
|
6
|
+
|
7
|
+
extend Fog::Provider
|
8
|
+
|
9
|
+
module Errors
|
10
|
+
class ServiceError < Fog::Errors::Error; end
|
11
|
+
class SecurityError < ServiceError; end
|
12
|
+
class NotFound < ServiceError; end
|
13
|
+
end
|
14
|
+
|
15
|
+
service(:compute, 'Compute')
|
16
|
+
|
17
|
+
# This helper was originally added as Fog.class_as_string and moved to core but only used here
|
18
|
+
def self.class_from_string classname, defaultpath=""
|
19
|
+
if classname and classname.is_a? String then
|
20
|
+
chain = classname.split("::")
|
21
|
+
klass = Kernel
|
22
|
+
chain.each do |klass_string|
|
23
|
+
klass = klass.const_get klass_string
|
24
|
+
end
|
25
|
+
if klass.is_a? Class then
|
26
|
+
klass
|
27
|
+
elsif defaultpath != nil then
|
28
|
+
class_from_string((defaultpath.split("::")+chain).join("::"), nil)
|
29
|
+
else
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
elsif classname and classname.is_a? Class then
|
33
|
+
classname
|
34
|
+
else
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
rescue NameError
|
38
|
+
defaultpath != nil ? class_from_string((defaultpath.split("::")+chain).join("::"), nil) : nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,473 @@
|
|
1
|
+
require 'digest/sha2'
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module Compute
|
5
|
+
class Vsphere < Fog::Service
|
6
|
+
requires :vsphere_username, :vsphere_password, :vsphere_server
|
7
|
+
recognizes :vsphere_port, :vsphere_path, :vsphere_ns
|
8
|
+
recognizes :vsphere_rev, :vsphere_ssl, :vsphere_expected_pubkey_hash
|
9
|
+
recognizes :vsphere_debug
|
10
|
+
|
11
|
+
model_path 'fog/vsphere/models/compute'
|
12
|
+
model :server
|
13
|
+
collection :servers
|
14
|
+
model :servertype
|
15
|
+
collection :servertypes
|
16
|
+
model :datacenter
|
17
|
+
collection :datacenters
|
18
|
+
model :interface
|
19
|
+
collection :interfaces
|
20
|
+
model :interfacetype
|
21
|
+
collection :interfacetypes
|
22
|
+
model :volume
|
23
|
+
collection :volumes
|
24
|
+
model :snapshot
|
25
|
+
collection :snapshots
|
26
|
+
model :template
|
27
|
+
collection :templates
|
28
|
+
model :cluster
|
29
|
+
collection :clusters
|
30
|
+
model :resource_pool
|
31
|
+
collection :resource_pools
|
32
|
+
model :network
|
33
|
+
collection :networks
|
34
|
+
model :datastore
|
35
|
+
collection :datastores
|
36
|
+
model :folder
|
37
|
+
collection :folders
|
38
|
+
model :customvalue
|
39
|
+
collection :customvalues
|
40
|
+
model :customfield
|
41
|
+
collection :customfields
|
42
|
+
model :scsicontroller
|
43
|
+
model :process
|
44
|
+
|
45
|
+
request_path 'fog/vsphere/requests/compute'
|
46
|
+
request :current_time
|
47
|
+
request :cloudinit_to_customspec
|
48
|
+
request :list_virtual_machines
|
49
|
+
request :vm_power_off
|
50
|
+
request :vm_power_on
|
51
|
+
request :vm_reboot
|
52
|
+
request :vm_clone
|
53
|
+
request :vm_destroy
|
54
|
+
request :vm_migrate
|
55
|
+
request :vm_execute
|
56
|
+
request :list_datacenters
|
57
|
+
request :get_datacenter
|
58
|
+
request :list_clusters
|
59
|
+
request :get_cluster
|
60
|
+
request :list_resource_pools
|
61
|
+
request :get_resource_pool
|
62
|
+
request :list_networks
|
63
|
+
request :get_network
|
64
|
+
request :list_datastores
|
65
|
+
request :get_datastore
|
66
|
+
request :list_compute_resources
|
67
|
+
request :get_compute_resource
|
68
|
+
request :list_templates
|
69
|
+
request :get_template
|
70
|
+
request :get_folder
|
71
|
+
request :list_folders
|
72
|
+
request :create_vm
|
73
|
+
request :list_vm_interfaces
|
74
|
+
request :modify_vm_interface
|
75
|
+
request :modify_vm_volume
|
76
|
+
request :list_vm_volumes
|
77
|
+
request :get_virtual_machine
|
78
|
+
request :vm_reconfig_hardware
|
79
|
+
request :vm_reconfig_memory
|
80
|
+
request :vm_reconfig_cpus
|
81
|
+
request :vm_config_vnc
|
82
|
+
request :create_folder
|
83
|
+
request :list_server_types
|
84
|
+
request :get_server_type
|
85
|
+
request :list_interface_types
|
86
|
+
request :get_interface_type
|
87
|
+
request :list_vm_customvalues
|
88
|
+
request :list_customfields
|
89
|
+
request :get_vm_first_scsi_controller
|
90
|
+
request :set_vm_customvalue
|
91
|
+
request :vm_take_snapshot
|
92
|
+
request :list_vm_snapshots
|
93
|
+
request :list_child_snapshots
|
94
|
+
request :revert_to_snapshot
|
95
|
+
request :list_processes
|
96
|
+
|
97
|
+
module Shared
|
98
|
+
attr_reader :vsphere_is_vcenter
|
99
|
+
attr_reader :vsphere_rev
|
100
|
+
attr_reader :vsphere_server
|
101
|
+
attr_reader :vsphere_username
|
102
|
+
|
103
|
+
protected
|
104
|
+
|
105
|
+
ATTR_TO_PROP = {
|
106
|
+
:id => 'config.instanceUuid',
|
107
|
+
:name => 'name',
|
108
|
+
:uuid => 'config.uuid',
|
109
|
+
:template => 'config.template',
|
110
|
+
:parent => 'parent',
|
111
|
+
:hostname => 'summary.guest.hostName',
|
112
|
+
:operatingsystem => 'summary.guest.guestFullName',
|
113
|
+
:ipaddress => 'guest.ipAddress',
|
114
|
+
:power_state => 'runtime.powerState',
|
115
|
+
:connection_state => 'runtime.connectionState',
|
116
|
+
:hypervisor => 'runtime.host',
|
117
|
+
:tools_state => 'guest.toolsStatus',
|
118
|
+
:tools_version => 'guest.toolsVersionStatus',
|
119
|
+
:memory_mb => 'config.hardware.memoryMB',
|
120
|
+
:cpus => 'config.hardware.numCPU',
|
121
|
+
:corespersocket => 'config.hardware.numCoresPerSocket',
|
122
|
+
:overall_status => 'overallStatus',
|
123
|
+
:guest_id => 'config.guestId',
|
124
|
+
:hardware_version => 'config.version',
|
125
|
+
:cpuHotAddEnabled => 'config.cpuHotAddEnabled',
|
126
|
+
:memoryHotAddEnabled => 'config.memoryHotAddEnabled',
|
127
|
+
:firmware => 'config.firmware',
|
128
|
+
}
|
129
|
+
|
130
|
+
def convert_vm_view_to_attr_hash(vms)
|
131
|
+
vms = @connection.serviceContent.propertyCollector.collectMultiple(vms,*ATTR_TO_PROP.values.uniq)
|
132
|
+
vms.map { |vm| props_to_attr_hash(*vm) }
|
133
|
+
end
|
134
|
+
|
135
|
+
# Utility method to convert a VMware managed object into an attribute hash.
|
136
|
+
# This should only really be necessary for the real class.
|
137
|
+
# This method is expected to be called by the request methods
|
138
|
+
# in order to massage VMware Managed Object References into Attribute Hashes.
|
139
|
+
def convert_vm_mob_ref_to_attr_hash(vm_mob_ref)
|
140
|
+
return nil unless vm_mob_ref
|
141
|
+
|
142
|
+
props = vm_mob_ref.collect!(*ATTR_TO_PROP.values.uniq)
|
143
|
+
props_to_attr_hash vm_mob_ref, props
|
144
|
+
end
|
145
|
+
|
146
|
+
def props_to_attr_hash vm_mob_ref, props
|
147
|
+
# NOTE: Object.tap is in 1.8.7 and later.
|
148
|
+
# Here we create the hash object that this method returns, but first we need
|
149
|
+
# to add a few more attributes that require additional calls to the vSphere
|
150
|
+
# API. The hypervisor name and mac_addresses attributes may not be available
|
151
|
+
# so we need catch any exceptions thrown during lookup and set them to nil.
|
152
|
+
#
|
153
|
+
# The use of the "tap" method here is a convenience, it allows us to update the
|
154
|
+
# hash object without explicitly returning the hash at the end of the method.
|
155
|
+
Hash[ATTR_TO_PROP.map { |k,v| [k.to_s, props[v]] }].tap do |attrs|
|
156
|
+
attrs['id'] ||= vm_mob_ref._ref
|
157
|
+
attrs['mo_ref'] = vm_mob_ref._ref
|
158
|
+
# The name method "magically" appears after a VM is ready and
|
159
|
+
# finished cloning.
|
160
|
+
if attrs['hypervisor'].kind_of?(RbVmomi::VIM::HostSystem)
|
161
|
+
host = attrs['hypervisor']
|
162
|
+
attrs['datacenter'] = Proc.new { parent_attribute(host.path, :datacenter)[1] rescue nil }
|
163
|
+
attrs['cluster'] = Proc.new { parent_attribute(host.path, :cluster)[1] rescue nil }
|
164
|
+
attrs['hypervisor'] = Proc.new { host.name rescue nil }
|
165
|
+
attrs['resource_pool'] = Proc.new {(vm_mob_ref.resourcePool || host.resourcePool).name rescue nil}
|
166
|
+
end
|
167
|
+
# This inline rescue catches any standard error. While a VM is
|
168
|
+
# cloning, a call to the macs method will throw and NoMethodError
|
169
|
+
attrs['mac_addresses'] = Proc.new {vm_mob_ref.macs rescue nil}
|
170
|
+
# Rescue nil to catch testing while vm_mob_ref isn't reaL??
|
171
|
+
attrs['path'] = "/"+attrs['parent'].path.map(&:last).join('/') rescue nil
|
172
|
+
end
|
173
|
+
end
|
174
|
+
# returns the parent object based on a type
|
175
|
+
# provides both real RbVmomi object and its name.
|
176
|
+
# e.g.
|
177
|
+
#[Datacenter("datacenter-2"), "dc-name"]
|
178
|
+
def parent_attribute path, type
|
179
|
+
element = case type
|
180
|
+
when :datacenter
|
181
|
+
RbVmomi::VIM::Datacenter
|
182
|
+
when :cluster
|
183
|
+
RbVmomi::VIM::ClusterComputeResource
|
184
|
+
when :host
|
185
|
+
RbVmomi::VIM::HostSystem
|
186
|
+
else
|
187
|
+
raise "Unknown type"
|
188
|
+
end
|
189
|
+
path.select {|x| x[0].is_a? element}.flatten
|
190
|
+
rescue
|
191
|
+
nil
|
192
|
+
end
|
193
|
+
|
194
|
+
# returns vmware managed obj id string
|
195
|
+
def managed_obj_id obj
|
196
|
+
obj.to_s.match(/\("([^"]+)"\)/)[1]
|
197
|
+
end
|
198
|
+
|
199
|
+
def is_uuid?(id)
|
200
|
+
!(id =~ /[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}/).nil?
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
class Mock
|
205
|
+
include Shared
|
206
|
+
|
207
|
+
def self.data
|
208
|
+
@data ||= Hash.new do |hash, key|
|
209
|
+
hash[key] = {
|
210
|
+
:servers => {
|
211
|
+
"5032c8a5-9c5e-ba7a-3804-832a03e16381" => {
|
212
|
+
"resource_pool" => "Resources",
|
213
|
+
"memory_mb" => 2196,
|
214
|
+
"mac_addresses" => { "Network adapter 1" => "00:50:56:a9:00:28" },
|
215
|
+
"power_state" => "poweredOn",
|
216
|
+
"cpus" => 1,
|
217
|
+
"hostname" => "dhcp75-197.virt.bos.redhat.com",
|
218
|
+
"mo_ref" => "vm-562",
|
219
|
+
"connection_state" => "connected",
|
220
|
+
"overall_status" => "green",
|
221
|
+
"datacenter" => "Solutions",
|
222
|
+
"volumes" =>
|
223
|
+
[{
|
224
|
+
"id" => "6000C29c-a47d-4cd9-5249-c371de775f06",
|
225
|
+
"datastore" => "Storage1",
|
226
|
+
"mode" => "persistent",
|
227
|
+
"size" => 8388608,
|
228
|
+
"thin" => true,
|
229
|
+
"name" => "Hard disk 1",
|
230
|
+
"filename" => "[Storage1] rhel6-mfojtik/rhel6-mfojtik.vmdk",
|
231
|
+
"size_gb" => 8
|
232
|
+
}],
|
233
|
+
"interfaces" =>
|
234
|
+
[{"mac" => "00:50:56:a9:00:28",
|
235
|
+
"network" => "VM Network",
|
236
|
+
"name" => "Network adapter 1",
|
237
|
+
"status" => "ok",
|
238
|
+
"summary" => "VM Network",
|
239
|
+
}],
|
240
|
+
"hypervisor" => "gunab.puppetlabs.lan",
|
241
|
+
"guest_id" => "rhel6_64Guest",
|
242
|
+
"tools_state" => "toolsOk",
|
243
|
+
"cluster" => "Solutionscluster",
|
244
|
+
"name" => "rhel64",
|
245
|
+
"operatingsystem" => "Red Hat Enterprise Linux 6 (64-bit)",
|
246
|
+
"path" => "/Datacenters/Solutions/vm",
|
247
|
+
"uuid" => "4229f0e9-bfdc-d9a7-7bac-12070772e6dc",
|
248
|
+
"instance_uuid" => "5032c8a5-9c5e-ba7a-3804-832a03e16381",
|
249
|
+
"id" => "5032c8a5-9c5e-ba7a-3804-832a03e16381",
|
250
|
+
"tools_version" => "guestToolsUnmanaged",
|
251
|
+
"ipaddress" => "192.168.100.184",
|
252
|
+
"template" => false
|
253
|
+
},
|
254
|
+
"502916a3-b42e-17c7-43ce-b3206e9524dc" => {
|
255
|
+
"resource_pool" => "Resources",
|
256
|
+
"memory_mb" => 512,
|
257
|
+
"power_state" => "poweredOn",
|
258
|
+
"mac_addresses" => { "Network adapter 1" => "00:50:56:a9:00:00" },
|
259
|
+
"hostname" => nil,
|
260
|
+
"cpus" => 1,
|
261
|
+
"connection_state" => "connected",
|
262
|
+
"mo_ref" => "vm-621",
|
263
|
+
"overall_status" => "green",
|
264
|
+
"datacenter" => "Solutions",
|
265
|
+
"volumes" =>
|
266
|
+
[{"thin" => false,
|
267
|
+
"size_gb" => 10,
|
268
|
+
"datastore" => "datastore1",
|
269
|
+
"filename" => "[datastore1] i-1342439683/i-1342439683.vmdk",
|
270
|
+
"size" => 10485762,
|
271
|
+
"name" => "Hard disk 1",
|
272
|
+
"mode" => "persistent",
|
273
|
+
"id" => "6000C29b-f364-d073-8316-8e98ac0a0eae" }],
|
274
|
+
"interfaces" =>
|
275
|
+
[{ "summary" => "VM Network",
|
276
|
+
"mac" => "00:50:56:a9:00:00",
|
277
|
+
"status" => "ok",
|
278
|
+
"network" => "VM Network",
|
279
|
+
"name" => "Network adapter 1" }],
|
280
|
+
"hypervisor" => "gunab.puppetlabs.lan",
|
281
|
+
"guest_id" => nil,
|
282
|
+
"cluster" => "Solutionscluster",
|
283
|
+
"tools_state" => "toolsNotInstalled",
|
284
|
+
"name" => "i-1342439683",
|
285
|
+
"operatingsystem" => nil,
|
286
|
+
"path" => "/",
|
287
|
+
"tools_version" => "guestToolsNotInstalled",
|
288
|
+
"uuid" => "4229e0de-30cb-ceb2-21f9-4d8d8beabb52",
|
289
|
+
"instance_uuid" => "502916a3-b42e-17c7-43ce-b3206e9524dc",
|
290
|
+
"id" => "502916a3-b42e-17c7-43ce-b3206e9524dc",
|
291
|
+
"ipaddress" => nil,
|
292
|
+
"template" => false
|
293
|
+
},
|
294
|
+
"5029c440-85ee-c2a1-e9dd-b63e39364603" => {
|
295
|
+
"resource_pool" => "Resources",
|
296
|
+
"memory_mb" => 2196,
|
297
|
+
"power_state" => "poweredOn",
|
298
|
+
"mac_addresses" => { "Network adapter 1" => "00:50:56:b2:00:af" },
|
299
|
+
"hostname" => "centos56gm.localdomain",
|
300
|
+
"cpus" => 1,
|
301
|
+
"connection_state" => "connected",
|
302
|
+
"mo_ref" => "vm-715",
|
303
|
+
"overall_status" => "green",
|
304
|
+
"datacenter" => "Solutions",
|
305
|
+
"hypervisor" => "gunab.puppetlabs.lan",
|
306
|
+
"guest_id" => "rhel6_64Guest",
|
307
|
+
"cluster" => "Solutionscluster",
|
308
|
+
"tools_state" => "toolsOk",
|
309
|
+
"name" => "jefftest",
|
310
|
+
"operatingsystem" => "Red Hat Enterprise Linux 6 (64-bit)",
|
311
|
+
"path" => "/",
|
312
|
+
"tools_version" => "guestToolsUnmanaged",
|
313
|
+
"ipaddress" => "192.168.100.187",
|
314
|
+
"uuid" => "42329da7-e8ab-29ec-1892-d6a4a964912a",
|
315
|
+
"instance_uuid" => "5029c440-85ee-c2a1-e9dd-b63e39364603",
|
316
|
+
"id" => "5029c440-85ee-c2a1-e9dd-b63e39364603",
|
317
|
+
"template" => false
|
318
|
+
}
|
319
|
+
},
|
320
|
+
:datacenters => {
|
321
|
+
"Solutions" => {:name => "Solutions", :status => "grey"}
|
322
|
+
},
|
323
|
+
:clusters =>
|
324
|
+
[{:id => "1d4d9a3f-e4e8-4c40-b7fc-263850068fa4",
|
325
|
+
:name => "Solutionscluster",
|
326
|
+
:num_host => "4",
|
327
|
+
:num_cpu_cores => "16",
|
328
|
+
:overall_status => "green",
|
329
|
+
:datacenter => "Solutions",
|
330
|
+
:klass => "RbVmomi::VIM::ComputeResource"
|
331
|
+
},
|
332
|
+
{:id => "e4195973-102b-4096-bbd6-5429ff0b35c9",
|
333
|
+
:name => "Problemscluster",
|
334
|
+
:num_host => "4",
|
335
|
+
:num_cpu_cores => "32",
|
336
|
+
:overall_status => "green",
|
337
|
+
:datacenter => "Solutions",
|
338
|
+
:klass => "RbVmomi::VIM::ComputeResource"
|
339
|
+
},
|
340
|
+
{
|
341
|
+
:klass => "RbVmomi::VIM::Folder",
|
342
|
+
:clusters => [{:id => "03616b8d-b707-41fd-b3b5-The first",
|
343
|
+
:name => "Problemscluster",
|
344
|
+
:num_host => "4",
|
345
|
+
:num_cpu_cores => "32",
|
346
|
+
:overall_status => "green",
|
347
|
+
:datacenter => "Solutions",
|
348
|
+
:klass => "RbVmomi::VIM::ComputeResource"
|
349
|
+
},
|
350
|
+
{:id => "03616b8d-b707-41fd-b3b5-the Second",
|
351
|
+
:name => "Lastcluster",
|
352
|
+
:num_host => "8",
|
353
|
+
:num_cpu_cores => "32",
|
354
|
+
:overall_status => "green",
|
355
|
+
:datacenter => "Solutions",
|
356
|
+
:klass => "RbVmomi::VIM::ComputeResource"}
|
357
|
+
]
|
358
|
+
}
|
359
|
+
]
|
360
|
+
}
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
def initialize(options={})
|
365
|
+
require 'rbvmomi'
|
366
|
+
@vsphere_username = options[:vsphere_username]
|
367
|
+
@vsphere_password = 'REDACTED'
|
368
|
+
@vsphere_server = options[:vsphere_server]
|
369
|
+
@vsphere_expected_pubkey_hash = options[:vsphere_expected_pubkey_hash]
|
370
|
+
@vsphere_is_vcenter = true
|
371
|
+
@vsphere_rev = '4.0'
|
372
|
+
end
|
373
|
+
|
374
|
+
def data
|
375
|
+
self.class.data[@vsphere_username]
|
376
|
+
end
|
377
|
+
|
378
|
+
def reset_data
|
379
|
+
self.class.data.delete(@vsphere_username)
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
class Real
|
384
|
+
include Shared
|
385
|
+
|
386
|
+
def initialize(options={})
|
387
|
+
require 'rbvmomi'
|
388
|
+
@vsphere_username = options[:vsphere_username]
|
389
|
+
@vsphere_password = options[:vsphere_password]
|
390
|
+
@vsphere_server = options[:vsphere_server]
|
391
|
+
@vsphere_port = options[:vsphere_port] || 443
|
392
|
+
@vsphere_path = options[:vsphere_path] || '/sdk'
|
393
|
+
@vsphere_ns = options[:vsphere_ns] || 'urn:vim25'
|
394
|
+
@vsphere_rev = options[:vsphere_rev] || '4.0'
|
395
|
+
@vsphere_ssl = options[:vsphere_ssl] || true
|
396
|
+
@vsphere_debug = options[:vsphere_debug] || false
|
397
|
+
@vsphere_expected_pubkey_hash = options[:vsphere_expected_pubkey_hash]
|
398
|
+
@vsphere_must_reauthenticate = false
|
399
|
+
@vsphere_is_vcenter = nil
|
400
|
+
@connection = nil
|
401
|
+
connect
|
402
|
+
negotiate_revision(options[:vsphere_rev])
|
403
|
+
authenticate
|
404
|
+
end
|
405
|
+
|
406
|
+
def reload
|
407
|
+
connect
|
408
|
+
# Check if the negotiation was ever run
|
409
|
+
if @vsphere_is_vcenter.nil?
|
410
|
+
negotiate
|
411
|
+
end
|
412
|
+
authenticate
|
413
|
+
end
|
414
|
+
|
415
|
+
private
|
416
|
+
def negotiate_revision(revision = nil)
|
417
|
+
# Negotiate the API revision
|
418
|
+
if not revision
|
419
|
+
rev = @connection.serviceContent.about.apiVersion
|
420
|
+
@connection.rev = [ rev, ENV['FOG_VSPHERE_REV'] || '4.1' ].min
|
421
|
+
end
|
422
|
+
|
423
|
+
@vsphere_is_vcenter = @connection.serviceContent.about.apiType == "VirtualCenter"
|
424
|
+
@vsphere_rev = @connection.rev
|
425
|
+
end
|
426
|
+
|
427
|
+
def connect
|
428
|
+
# This is a state variable to allow digest validation of the SSL cert
|
429
|
+
bad_cert = false
|
430
|
+
loop do
|
431
|
+
begin
|
432
|
+
@connection = RbVmomi::VIM.new :host => @vsphere_server,
|
433
|
+
:port => @vsphere_port,
|
434
|
+
:path => @vsphere_path,
|
435
|
+
:ns => @vsphere_ns,
|
436
|
+
:rev => @vsphere_rev,
|
437
|
+
:ssl => @vsphere_ssl,
|
438
|
+
:insecure => bad_cert,
|
439
|
+
:debug => @vsphere_debug
|
440
|
+
break
|
441
|
+
rescue OpenSSL::SSL::SSLError
|
442
|
+
raise if bad_cert
|
443
|
+
bad_cert = true
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
447
|
+
if bad_cert then
|
448
|
+
validate_ssl_connection
|
449
|
+
end
|
450
|
+
end
|
451
|
+
|
452
|
+
def authenticate
|
453
|
+
begin
|
454
|
+
@connection.serviceContent.sessionManager.Login :userName => @vsphere_username,
|
455
|
+
:password => @vsphere_password
|
456
|
+
rescue RbVmomi::VIM::InvalidLogin => e
|
457
|
+
raise Fog::Vsphere::Errors::ServiceError, e.message
|
458
|
+
end
|
459
|
+
end
|
460
|
+
|
461
|
+
# Verify a SSL certificate based on the hashed public key
|
462
|
+
def validate_ssl_connection
|
463
|
+
pubkey = @connection.http.peer_cert.public_key
|
464
|
+
pubkey_hash = Digest::SHA2.hexdigest(pubkey.to_s)
|
465
|
+
expected_pubkey_hash = @vsphere_expected_pubkey_hash
|
466
|
+
if pubkey_hash != expected_pubkey_hash then
|
467
|
+
raise Fog::Vsphere::Errors::SecurityError, "The remote system presented a public key with hash #{pubkey_hash} but we're expecting a hash of #{expected_pubkey_hash || '<unset>'}. If you are sure the remote system is authentic set vsphere_expected_pubkey_hash: <the hash printed in this message> in ~/.fog"
|
468
|
+
end
|
469
|
+
end
|
470
|
+
end
|
471
|
+
end
|
472
|
+
end
|
473
|
+
end
|