brightbox-cli 0.16.0 → 0.17.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.
- data/README +13 -17
- data/README.rdoc +13 -17
- data/brightbox-cli.gemspec +1 -1
- data/lib/brightbox-cli/accounts.rb +7 -0
- data/lib/brightbox-cli/api.rb +3 -0
- data/lib/brightbox-cli/commands/config-client-list.rb +1 -1
- data/lib/brightbox-cli/commands/firewall-rules-create.rb +4 -0
- data/lib/brightbox-cli/commands/firewall-rules-update.rb +49 -0
- data/lib/brightbox-cli/commands/groups-show.rb +1 -1
- data/lib/brightbox-cli/commands/groups-update.rb +3 -1
- data/lib/brightbox-cli/commands/images-destroy.rb +1 -1
- data/lib/brightbox-cli/commands/images-list.rb +9 -3
- data/lib/brightbox-cli/commands/images-register.rb +1 -1
- data/lib/brightbox-cli/commands/images-update.rb +3 -1
- data/lib/brightbox-cli/commands/lbs-update.rb +4 -2
- data/lib/brightbox-cli/commands/{servers-activate-cloud.rb → servers-activate-console.rb} +2 -1
- data/lib/brightbox-cli/commands/servers-update.rb +2 -1
- data/lib/brightbox-cli/config.rb +17 -2
- data/lib/brightbox-cli/detailed_server.rb +1 -1
- data/lib/brightbox-cli/firewall_rule.rb +6 -0
- data/lib/brightbox-cli/gli_global_hooks.rb +8 -1
- data/lib/brightbox-cli/images.rb +22 -1
- data/lib/brightbox-cli/nilable_hash.rb +7 -0
- data/lib/brightbox-cli/server_groups.rb +0 -6
- data/lib/brightbox-cli/servers.rb +6 -2
- data/lib/brightbox-cli/tables.rb +13 -0
- data/lib/brightbox-cli/vendor/fog/README.rdoc +2 -9
- data/lib/brightbox-cli/vendor/fog/Rakefile +3 -2
- data/lib/brightbox-cli/vendor/fog/changelog.txt +213 -0
- data/lib/brightbox-cli/vendor/fog/docs/_layouts/default.html +1 -1
- data/lib/brightbox-cli/vendor/fog/docs/about/contributing.markdown +1 -1
- data/lib/brightbox-cli/vendor/fog/docs/about/getting_started.markdown +28 -3
- data/lib/brightbox-cli/vendor/fog/docs/dns/index.markdown +1 -1
- data/lib/brightbox-cli/vendor/fog/docs/index.markdown +2 -10
- data/lib/brightbox-cli/vendor/fog/docs/storage/index.markdown +2 -2
- data/lib/brightbox-cli/vendor/fog/fog.gemspec +6 -5
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/auto_scaling.rb +3 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/cloud_formation.rb +3 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/cloud_watch.rb +3 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/compute.rb +5 -3
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/elb.rb +4 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/emr.rb +133 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/models/compute/addresses.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/models/compute/key_pairs.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/models/compute/security_groups.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/models/compute/server.rb +4 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/models/compute/servers.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/models/compute/snapshots.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/models/compute/spot_request.rb +21 -4
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/models/compute/spot_requests.rb +45 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/models/compute/volumes.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/models/elb/load_balancer.rb +2 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/models/storage/file.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/parsers/cdn/get_invalidation_list.rb +0 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/parsers/cloud_formation/update_stack.rb +19 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/parsers/emr/add_instance_groups.rb +28 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/parsers/emr/add_job_flow_steps.rb +17 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/parsers/emr/describe_job_flows.rb +140 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/parsers/emr/modify_instance_groups.rb +17 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/parsers/emr/run_job_flow.rb +19 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/parsers/emr/set_termination_protection.rb +17 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/parsers/emr/terminate_job_flows.rb +17 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/rds.rb +3 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/cloud_formation/create_stack.rb +6 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/cloud_formation/update_stack.rb +62 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/authorize_security_group_ingress.rb +141 -36
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/delete_security_group.rb +25 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/delete_tags.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/describe_addresses.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/describe_availability_zones.rb +5 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/describe_images.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/describe_instances.rb +15 -6
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/describe_key_pairs.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/describe_regions.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/describe_reserved_instances.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/describe_security_groups.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/describe_snapshots.rb +4 -4
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/describe_volumes.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/modify_instance_attribute.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/compute/revoke_security_group_ingress.rb +41 -29
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/elb/describe_load_balancers.rb +3 -3
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/elb/register_instances_with_load_balancer.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/emr/add_instance_groups.rb +46 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/emr/add_job_flow_steps.rb +49 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/emr/describe_job_flows.rb +108 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/emr/modify_instance_groups.rb +40 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/emr/run_job_flow.rb +106 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/emr/set_termination_protection.rb +39 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/emr/terminate_job_flows.rb +37 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/simpledb/get_attributes.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/simpledb/select.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/storage/acl_utils.rb +62 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/storage/get_bucket_acl.rb +7 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/storage/get_object_acl.rb +7 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/storage/get_object_url.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/storage/put_bucket_acl.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/storage/put_object_acl.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/ses.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/simpledb.rb +2 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/sns.rb +3 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/sqs.rb +4 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/storage.rb +10 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws.rb +26 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/aws.rb +8 -4
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/bluebox.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/brightbox.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/dnsimple.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/dnsmadeeasy.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/ecloud.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/glesys.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/go_grid.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/google.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/libvirt.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/linode.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/local.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/new_servers.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/ninefold.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/openstack.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/rackspace.rb +3 -3
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/slicehost.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/stormondemand.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/virtual_box.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/vmfusion.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/voxel.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin/zerigo.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/bin.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/brightbox/compute.rb +2 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/brightbox/models/compute/cloud_ip.rb +10 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/brightbox/models/compute/server.rb +11 -3
- data/lib/brightbox-cli/vendor/fog/lib/fog/brightbox/models/compute/server_group.rb +9 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/brightbox/requests/compute/update_firewall_rule.rb +13 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/core/connection.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/core/credentials.rb +3 -3
- data/lib/brightbox-cli/vendor/fog/lib/fog/core/deprecation.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/core/logger.rb +8 -3
- data/lib/brightbox-cli/vendor/fog/lib/fog/core/mock.rb +4 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/core/provider.rb +7 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/core/service.rb +8 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/dnsmadeeasy/models/dns/record.rb +3 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/dynect/dns.rb +25 -3
- data/lib/brightbox-cli/vendor/fog/lib/fog/ecloud/compute.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/go_grid/requests/compute/grid_server_power.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/google/models/storage/file.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/google/requests/storage/get_object_url.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/google/storage.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/ninefold/models/storage/file.rb +8 -6
- data/lib/brightbox-cli/vendor/fog/lib/fog/ninefold/models/storage/files.rb +3 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/ninefold/requests/storage/head_namespace.rb +20 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/ninefold/storage.rb +4 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/openstack/models/compute/server.rb +7 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/openstack/requests/compute/create_server.rb +6 -11
- data/lib/brightbox-cli/vendor/fog/lib/fog/rackspace/load_balancers.rb +1 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/rackspace/models/dns/callback.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/rackspace/models/dns/record.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/rackspace/models/dns/zone.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/slicehost/dns.rb +1 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/slicehost/models/dns/record.rb +7 -3
- data/lib/brightbox-cli/vendor/fog/lib/fog/slicehost/models/dns/zone.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/slicehost/parsers/dns/create_record.rb +8 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/slicehost/parsers/dns/get_record.rb +17 -5
- data/lib/brightbox-cli/vendor/fog/lib/fog/slicehost/parsers/dns/get_records.rb +10 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/slicehost/requests/dns/get_record.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/slicehost/requests/dns/get_records.rb +7 -8
- data/lib/brightbox-cli/vendor/fog/lib/fog/slicehost/requests/dns/update_record.rb +43 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/storm_on_demand/models/compute/balancers.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/storm_on_demand/models/compute/configs.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/storm_on_demand/models/compute/images.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/storm_on_demand/models/compute/servers.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/storm_on_demand/models/compute/templates.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/terremark/vcloud.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/lib/fog/vsphere/compute.rb +41 -23
- data/lib/brightbox-cli/vendor/fog/lib/fog/vsphere/models/compute/server.rb +19 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/vsphere/models/compute/servers.rb +8 -2
- data/lib/brightbox-cli/vendor/fog/lib/fog/vsphere/requests/compute/datacenters.rb +34 -0
- data/lib/brightbox-cli/vendor/fog/lib/fog/vsphere/requests/compute/list_virtual_machines.rb +83 -10
- data/lib/brightbox-cli/vendor/fog/lib/fog/vsphere/requests/compute/vm_clone.rb +76 -37
- data/lib/brightbox-cli/vendor/fog/lib/fog.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/tests/aws/models/cloud_watch/alarm_data_tests.rb +8 -6
- data/lib/brightbox-cli/vendor/fog/tests/aws/models/cloud_watch/alarm_history_tests.rb +3 -1
- data/lib/brightbox-cli/vendor/fog/tests/aws/models/compute/security_group_tests.rb +15 -10
- data/lib/brightbox-cli/vendor/fog/tests/aws/models/elb/model_tests.rb +4 -4
- data/lib/brightbox-cli/vendor/fog/tests/aws/requests/cloud_formation/stack_tests.rb +14 -0
- data/lib/brightbox-cli/vendor/fog/tests/aws/requests/compute/instance_tests.rb +16 -1
- data/lib/brightbox-cli/vendor/fog/tests/aws/requests/compute/security_group_tests.rb +251 -32
- data/lib/brightbox-cli/vendor/fog/tests/aws/requests/compute/tag_tests.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/tests/aws/requests/emr/helper.rb +172 -0
- data/lib/brightbox-cli/vendor/fog/tests/aws/requests/emr/instance_group_tests.rb +106 -0
- data/lib/brightbox-cli/vendor/fog/tests/aws/requests/emr/job_flow_tests.rb +88 -0
- data/lib/brightbox-cli/vendor/fog/tests/aws/requests/storage/acl_utils_tests.rb +209 -0
- data/lib/brightbox-cli/vendor/fog/tests/aws/requests/storage/bucket_tests.rb +80 -55
- data/lib/brightbox-cli/vendor/fog/tests/aws/requests/storage/object_tests.rb +42 -24
- data/lib/brightbox-cli/vendor/fog/tests/brightbox/requests/compute/account_tests.rb +11 -6
- data/lib/brightbox-cli/vendor/fog/tests/brightbox/requests/compute/api_client_tests.rb +23 -12
- data/lib/brightbox-cli/vendor/fog/tests/brightbox/requests/compute/cloud_ip_tests.rb +29 -20
- data/lib/brightbox-cli/vendor/fog/tests/brightbox/requests/compute/helper.rb +70 -14
- data/lib/brightbox-cli/vendor/fog/tests/brightbox/requests/compute/image_tests.rb +17 -14
- data/lib/brightbox-cli/vendor/fog/tests/brightbox/requests/compute/interface_tests.rb +3 -2
- data/lib/brightbox-cli/vendor/fog/tests/brightbox/requests/compute/load_balancer_tests.rb +57 -11
- data/lib/brightbox-cli/vendor/fog/tests/brightbox/requests/compute/server_group_tests.rb +29 -22
- data/lib/brightbox-cli/vendor/fog/tests/brightbox/requests/compute/server_tests.rb +38 -21
- data/lib/brightbox-cli/vendor/fog/tests/brightbox/requests/compute/server_type_tests.rb +7 -6
- data/lib/brightbox-cli/vendor/fog/tests/brightbox/requests/compute/user_tests.rb +11 -16
- data/lib/brightbox-cli/vendor/fog/tests/brightbox/requests/compute/zone_tests.rb +7 -6
- data/lib/brightbox-cli/vendor/fog/tests/compute/helper.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/tests/core/credential_tests.rb +2 -2
- data/lib/brightbox-cli/vendor/fog/tests/core/mocking_tests.rb +60 -0
- data/lib/brightbox-cli/vendor/fog/tests/dns/models/record_tests.rb +4 -2
- data/lib/brightbox-cli/vendor/fog/tests/dns/models/records_tests.rb +4 -2
- data/lib/brightbox-cli/vendor/fog/tests/dns/models/zone_tests.rb +3 -1
- data/lib/brightbox-cli/vendor/fog/tests/dns/models/zones_tests.rb +4 -2
- data/lib/brightbox-cli/vendor/fog/tests/glesys/requests/compute/helper.rb +4 -2
- data/lib/brightbox-cli/vendor/fog/tests/glesys/requests/compute/server_tests.rb +1 -1
- data/lib/brightbox-cli/vendor/fog/tests/helper.rb +4 -0
- data/lib/brightbox-cli/vendor/fog/tests/rackspace/requests/dns/dns_tests.rb +16 -12
- data/lib/brightbox-cli/vendor/fog/tests/rackspace/requests/dns/records_tests.rb +13 -11
- data/lib/brightbox-cli/vendor/fog/tests/slicehost/requests/dns/dns_tests.rb +58 -11
- data/lib/brightbox-cli/vendor/fog/tests/vsphere/compute_tests.rb +18 -10
- data/lib/brightbox-cli/vendor/fog/tests/vsphere/requests/compute/vm_clone_tests.rb +3 -7
- data/lib/brightbox-cli/version.rb +1 -1
- data/lib/brightbox_cli.rb +1 -0
- data/spec/fixtures/vcr_cassettes/list_server_groups.yml +37 -6
- data/spec/nilable_hash_spec.rb +30 -0
- metadata +48 -18
- data/lib/brightbox-cli/vendor/fog/lib/fog/aws/requests/storage/hash_to_acl.rb +0 -44
|
@@ -21,6 +21,7 @@ module Fog
|
|
|
21
21
|
request :vm_reboot
|
|
22
22
|
request :vm_clone
|
|
23
23
|
request :vm_destroy
|
|
24
|
+
request :datacenters
|
|
24
25
|
|
|
25
26
|
module Shared
|
|
26
27
|
|
|
@@ -29,36 +30,52 @@ module Fog
|
|
|
29
30
|
attr_reader :vsphere_server
|
|
30
31
|
attr_reader :vsphere_username
|
|
31
32
|
|
|
33
|
+
ATTR_TO_PROP = {
|
|
34
|
+
:id => 'config.instanceUuid',
|
|
35
|
+
:name => 'name',
|
|
36
|
+
:uuid => 'config.uuid',
|
|
37
|
+
:instance_uuid => 'config.instanceUuid',
|
|
38
|
+
:hostname => 'summary.guest.hostName',
|
|
39
|
+
:operatingsystem => 'summary.guest.guestFullName',
|
|
40
|
+
:ipaddress => 'guest.ipAddress',
|
|
41
|
+
:power_state => 'runtime.powerState',
|
|
42
|
+
:connection_state => 'runtime.connectionState',
|
|
43
|
+
:hypervisor => 'runtime.host',
|
|
44
|
+
:tools_state => 'guest.toolsStatus',
|
|
45
|
+
:tools_version => 'guest.toolsVersionStatus',
|
|
46
|
+
:is_a_template => 'config.template',
|
|
47
|
+
}
|
|
48
|
+
|
|
32
49
|
# Utility method to convert a VMware managed object into an attribute hash.
|
|
33
50
|
# This should only really be necessary for the real class.
|
|
34
51
|
# This method is expected to be called by the request methods
|
|
35
52
|
# in order to massage VMware Managed Object References into Attribute Hashes.
|
|
36
53
|
def convert_vm_mob_ref_to_attr_hash(vm_mob_ref)
|
|
37
54
|
return nil unless vm_mob_ref
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
55
|
+
|
|
56
|
+
props = vm_mob_ref.collect! *ATTR_TO_PROP.values.uniq
|
|
57
|
+
# NOTE: Object.tap is in 1.8.7 and later.
|
|
58
|
+
# Here we create the hash object that this method returns, but first we need
|
|
59
|
+
# to add a few more attributes that require additional calls to the vSphere
|
|
60
|
+
# API. The hypervisor name and mac_addresses attributes may not be available
|
|
61
|
+
# so we need catch any exceptions thrown during lookup and set them to nil.
|
|
62
|
+
#
|
|
63
|
+
# The use of the "tap" method here is a convience, it allows us to update the
|
|
64
|
+
# hash object without expliclty returning the hash at the end of the method.
|
|
65
|
+
Hash[ATTR_TO_PROP.map { |k,v| [k.to_s, props[v]] }].tap do |attrs|
|
|
66
|
+
attrs['id'] ||= vm_mob_ref._ref
|
|
67
|
+
attrs['mo_ref'] = vm_mob_ref._ref
|
|
68
|
+
# The name method "magically" appears after a VM is ready and
|
|
69
|
+
# finished cloning.
|
|
70
|
+
if attrs['hypervisor'].kind_of?(RbVmomi::VIM::HostSystem) then
|
|
71
|
+
# If it's not ready, set the hypervisor to nil
|
|
72
|
+
attrs['hypervisor'] = attrs['hypervisor'].name rescue nil
|
|
73
|
+
end
|
|
74
|
+
# This inline rescue catches any standard error. While a VM is
|
|
75
|
+
# cloning, a call to the macs method will throw and NoMethodError
|
|
76
|
+
attrs['mac_addresses'] = vm_mob_ref.macs rescue nil
|
|
77
|
+
attrs['path'] = get_folder_path(vm_mob_ref.parent)
|
|
44
78
|
end
|
|
45
|
-
{
|
|
46
|
-
'id' => is_ready ? vm_mob_ref.config.instanceUuid : vm_mob_ref._ref,
|
|
47
|
-
'mo_ref' => vm_mob_ref._ref,
|
|
48
|
-
'name' => vm_mob_ref.name,
|
|
49
|
-
'uuid' => is_ready ? vm_mob_ref.config.uuid : nil,
|
|
50
|
-
'instance_uuid' => is_ready ? vm_mob_ref.config.instanceUuid : nil,
|
|
51
|
-
'hostname' => vm_mob_ref.summary.guest.hostName,
|
|
52
|
-
'operatingsystem' => vm_mob_ref.summary.guest.guestFullName,
|
|
53
|
-
'ipaddress' => vm_mob_ref.summary.guest.ipAddress,
|
|
54
|
-
'power_state' => vm_mob_ref.runtime.powerState,
|
|
55
|
-
'connection_state' => vm_mob_ref.runtime.connectionState,
|
|
56
|
-
'hypervisor' => vm_mob_ref.runtime.host ? vm_mob_ref.runtime.host.name : nil,
|
|
57
|
-
'tools_state' => vm_mob_ref.summary.guest.toolsStatus,
|
|
58
|
-
'tools_version' => vm_mob_ref.summary.guest.toolsVersionStatus,
|
|
59
|
-
'mac_addresses' => is_ready ? vm_mob_ref.macs : nil,
|
|
60
|
-
'is_a_template' => is_ready ? vm_mob_ref.config.template : nil
|
|
61
|
-
}
|
|
62
79
|
end
|
|
63
80
|
|
|
64
81
|
end
|
|
@@ -68,6 +85,7 @@ module Fog
|
|
|
68
85
|
include Shared
|
|
69
86
|
|
|
70
87
|
def initialize(options={})
|
|
88
|
+
require 'rbvmomi'
|
|
71
89
|
@vsphere_username = options[:vsphere_username]
|
|
72
90
|
@vsphere_password = 'REDACTED'
|
|
73
91
|
@vsphere_server = options[:vsphere_server]
|
|
@@ -33,6 +33,7 @@ module Fog
|
|
|
33
33
|
attribute :is_a_template
|
|
34
34
|
attribute :connection_state
|
|
35
35
|
attribute :mo_ref
|
|
36
|
+
attribute :path
|
|
36
37
|
|
|
37
38
|
def start(options = {})
|
|
38
39
|
requires :instance_uuid
|
|
@@ -56,6 +57,24 @@ module Fog
|
|
|
56
57
|
connection.vm_destroy('instance_uuid' => instance_uuid)
|
|
57
58
|
end
|
|
58
59
|
|
|
60
|
+
def clone(options = {})
|
|
61
|
+
requires :name, :path
|
|
62
|
+
# Convert symbols to strings
|
|
63
|
+
req_options = options.inject({}) { |hsh, (k,v)| hsh[k.to_s] = v; hsh }
|
|
64
|
+
# Give our path to the request
|
|
65
|
+
req_options['path'] ="#{path}/#{name}"
|
|
66
|
+
# Perform the actual clone
|
|
67
|
+
clone_results = connection.vm_clone(req_options)
|
|
68
|
+
# Create the new VM model.
|
|
69
|
+
new_vm = self.class.new(clone_results['vm_attributes'])
|
|
70
|
+
# We need to assign the collection and the connection otherwise we
|
|
71
|
+
# cannot reload the model.
|
|
72
|
+
new_vm.collection = self.collection
|
|
73
|
+
new_vm.connection = self.connection
|
|
74
|
+
# Return the new VM model.
|
|
75
|
+
new_vm
|
|
76
|
+
end
|
|
77
|
+
|
|
59
78
|
end
|
|
60
79
|
|
|
61
80
|
end
|
|
@@ -9,8 +9,14 @@ module Fog
|
|
|
9
9
|
|
|
10
10
|
model Fog::Compute::Vsphere::Server
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
# 'path' => '/Datacenters/vm/Jeff/Templates' will be MUCH faster.
|
|
13
|
+
# than simply listing everything.
|
|
14
|
+
def all(filters = {})
|
|
15
|
+
# REVISIT: I'm not sure if this is the best way to implement search
|
|
16
|
+
# filters on a collection but it does work. I need to study the AWS
|
|
17
|
+
# code more to make sure this matches up.
|
|
18
|
+
filters['folder'] ||= attributes['folder']
|
|
19
|
+
response = connection.list_virtual_machines(filters)
|
|
14
20
|
load(response['virtual_machines'])
|
|
15
21
|
end
|
|
16
22
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Vsphere
|
|
4
|
+
class Real
|
|
5
|
+
def datacenters
|
|
6
|
+
@datacenters ||= datacenters_reload
|
|
7
|
+
# Hide the values which are the RbVmomi instances
|
|
8
|
+
@datacenters.keys
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def datacenters_reload
|
|
14
|
+
@rootfolder ||= @connection.rootFolder
|
|
15
|
+
inventory = @rootfolder.inventory(:Datacenter => [ 'name' ])[@rootfolder]
|
|
16
|
+
# Convert the inventory into a Hash of the form: We remove the
|
|
17
|
+
# property selectors. { "<dc_name>" => #<RbVmomi::VIM::Datacenter> }
|
|
18
|
+
# The Datacenter instance itself is at index 0 and the properties we
|
|
19
|
+
# collected are at index 1.
|
|
20
|
+
inventory.inject({}) do |memo, (name,dc_ary)|
|
|
21
|
+
memo[name] = dc_ary[0]
|
|
22
|
+
memo
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class Mock
|
|
28
|
+
def datacenters
|
|
29
|
+
[ "Solutions", "Solutions2", "Solutions3" ]
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
module Fog
|
|
2
2
|
module Compute
|
|
3
3
|
class Vsphere
|
|
4
|
-
|
|
5
4
|
class Real
|
|
6
|
-
|
|
7
5
|
def list_virtual_machines(options = {})
|
|
8
|
-
#
|
|
6
|
+
# Listing all VM's can be quite slow and expensive. Try and optimize
|
|
7
|
+
# based on the available options we have. These conditions are in
|
|
8
|
+
# ascending order of time to complete for large deployments.
|
|
9
9
|
if options['instance_uuid'] then
|
|
10
10
|
list_all_virtual_machines_by_instance_uuid(options)
|
|
11
|
+
elsif options['folder'] then
|
|
12
|
+
list_all_virtual_machines_in_folder(options)
|
|
11
13
|
else
|
|
12
14
|
list_all_virtual_machines
|
|
13
15
|
end
|
|
@@ -15,6 +17,48 @@ module Fog
|
|
|
15
17
|
|
|
16
18
|
private
|
|
17
19
|
|
|
20
|
+
def list_all_virtual_machines_in_folder(options = {})
|
|
21
|
+
# Tap gets rid of the leading empty string and "Datacenters" element
|
|
22
|
+
# and returns the array.
|
|
23
|
+
path_elements = options['folder'].split('/').tap { |ary| ary.shift 2 }
|
|
24
|
+
# The DC name itself.
|
|
25
|
+
dc_name = path_elements.shift
|
|
26
|
+
# If the first path element contains "vm" this denotes the vmFolder
|
|
27
|
+
# and needs to be shifted out since each DC contains only one
|
|
28
|
+
# vmFolder
|
|
29
|
+
path_elements.shift if path_elements[0] = 'vm'
|
|
30
|
+
# Make sure @datacenters is populated (the keys are DataCenter instances)
|
|
31
|
+
self.datacenters.include? dc_name or raise ArgumentError, "Could not find a Datacenter named #{dc_name}"
|
|
32
|
+
# Get the datacenter managed object
|
|
33
|
+
dc = @datacenters[dc_name]
|
|
34
|
+
|
|
35
|
+
# Get the VM Folder (Group) efficiently
|
|
36
|
+
vm_folder = dc.vmFolder
|
|
37
|
+
|
|
38
|
+
# Walk the tree resetting the folder pointer as we go
|
|
39
|
+
folder = path_elements.inject(vm_folder) do |current_folder, sub_folder_name|
|
|
40
|
+
# JJM VIM::Folder#find appears to be quite efficient as it uses the
|
|
41
|
+
# searchIndex It certainly appears to be faster than
|
|
42
|
+
# VIM::Folder#inventory since that returns _all_ managed objects of
|
|
43
|
+
# a certain type _and_ their properties.
|
|
44
|
+
sub_folder = current_folder.find(sub_folder_name, RbVmomi::VIM::Folder)
|
|
45
|
+
raise ArgumentError, "Could not descend into #{sub_folder_name}. Please check your path." unless sub_folder
|
|
46
|
+
sub_folder
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# This should be efficient since we're not obtaining properties
|
|
50
|
+
virtual_machines = folder.children.inject([]) do |ary, child|
|
|
51
|
+
if child.is_a? RbVmomi::VIM::VirtualMachine then
|
|
52
|
+
ary << convert_vm_mob_ref_to_attr_hash(child)
|
|
53
|
+
end
|
|
54
|
+
ary
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Return the managed objects themselves as an array. These may be converted
|
|
58
|
+
# to an attribute has using convert_vm_mob_ref_to_attr_hash
|
|
59
|
+
{ 'virtual_machines' => virtual_machines }
|
|
60
|
+
end
|
|
61
|
+
|
|
18
62
|
def list_all_virtual_machines_by_instance_uuid(options = {})
|
|
19
63
|
uuid = options['instance_uuid']
|
|
20
64
|
search_filter = { :uuid => uuid, 'vmSearch' => true, 'instanceUuid' => true }
|
|
@@ -34,6 +78,7 @@ module Fog
|
|
|
34
78
|
{ 'virtual_machines' => virtual_machines }
|
|
35
79
|
end
|
|
36
80
|
|
|
81
|
+
|
|
37
82
|
# NOTE: This is a private instance method required by the vm_clone
|
|
38
83
|
# request. It's very hard to get the Managed Object Reference
|
|
39
84
|
# of a Template because we can't search for it by instance_uuid
|
|
@@ -45,19 +90,50 @@ module Fog
|
|
|
45
90
|
datacenters = @connection.rootFolder.children.find_all do |child|
|
|
46
91
|
child.kind_of? RbVmomi::VIM::Datacenter
|
|
47
92
|
end
|
|
48
|
-
# Next,
|
|
93
|
+
# Next, search the "vmFolder" inventory of each data center:
|
|
49
94
|
datacenters.each do |dc|
|
|
50
|
-
dc.vmFolder.
|
|
51
|
-
|
|
95
|
+
inventory = dc.vmFolder.inventory( 'VirtualMachine' => :all )
|
|
96
|
+
virtual_machines << find_all_in_inventory(inventory, :type => RbVmomi::VIM::VirtualMachine, :property => 'name' )
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
virtual_machines.flatten
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def find_all_in_inventory(inventory, properties = { :type => RbVmomi::VIM::VirtualMachine, :property => nil } )
|
|
103
|
+
results = Array.new
|
|
104
|
+
|
|
105
|
+
inventory.each do |k,v|
|
|
106
|
+
|
|
107
|
+
# If we have a VMware folder we need to traverse the directory
|
|
108
|
+
# to ensure we pick VMs inside folders. So we do a bit of recursion
|
|
109
|
+
# here.
|
|
110
|
+
results << find_all_in_inventory(v) if k.is_a? RbVmomi::VIM::Folder
|
|
111
|
+
|
|
112
|
+
if v[0].is_a? properties[:type]
|
|
113
|
+
if properties[:property].nil?
|
|
114
|
+
results << v[0]
|
|
115
|
+
else
|
|
116
|
+
results << v[1][properties[:property]]
|
|
117
|
+
end
|
|
52
118
|
end
|
|
53
119
|
end
|
|
54
|
-
|
|
120
|
+
results.flatten
|
|
55
121
|
end
|
|
56
122
|
|
|
123
|
+
def get_folder_path(folder, root = nil)
|
|
124
|
+
if ( not folder.methods.include?('parent') ) or ( folder == root )
|
|
125
|
+
return
|
|
126
|
+
end
|
|
127
|
+
"#{get_folder_path(folder.parent)}/#{folder.name}"
|
|
128
|
+
end
|
|
57
129
|
end
|
|
58
130
|
|
|
59
131
|
class Mock
|
|
60
132
|
|
|
133
|
+
def get_folder_path(folder, root = nil)
|
|
134
|
+
nil
|
|
135
|
+
end
|
|
136
|
+
|
|
61
137
|
def list_virtual_machines(options = {})
|
|
62
138
|
case options['instance_uuid']
|
|
63
139
|
when nil
|
|
@@ -154,10 +230,7 @@ module Fog
|
|
|
154
230
|
{ 'virtual_machines' => [] }
|
|
155
231
|
end
|
|
156
232
|
end
|
|
157
|
-
|
|
158
233
|
end
|
|
159
|
-
|
|
160
234
|
end
|
|
161
235
|
end
|
|
162
236
|
end
|
|
163
|
-
|
|
@@ -6,14 +6,19 @@ module Fog
|
|
|
6
6
|
private
|
|
7
7
|
def vm_clone_check_options(options)
|
|
8
8
|
options = { 'force' => false }.merge(options)
|
|
9
|
-
required_options = %w{
|
|
9
|
+
required_options = %w{ path name }
|
|
10
10
|
required_options.each do |param|
|
|
11
11
|
raise ArgumentError, "#{required_options.join(', ')} are required" unless options.has_key? param
|
|
12
12
|
end
|
|
13
|
-
#
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
# The tap removes the leading empty string
|
|
14
|
+
path_elements = options['path'].split('/').tap { |o| o.shift }
|
|
15
|
+
first_folder = path_elements.shift
|
|
16
|
+
if first_folder != 'Datacenters' then
|
|
17
|
+
raise ArgumentError, "vm_clone path option must start with /Datacenters. Got: #{options['path']}"
|
|
18
|
+
end
|
|
19
|
+
dc_name = path_elements.shift
|
|
20
|
+
if not self.datacenters.include? dc_name then
|
|
21
|
+
raise ArgumentError, "Datacenter #{dc_name} does not exist, only datacenters #{self.dacenters.join(",")} are accessible."
|
|
17
22
|
end
|
|
18
23
|
options
|
|
19
24
|
end
|
|
@@ -25,23 +30,47 @@ module Fog
|
|
|
25
30
|
# Option handling
|
|
26
31
|
options = vm_clone_check_options(options)
|
|
27
32
|
|
|
28
|
-
notfound = lambda { raise Fog::Compute::Vsphere::NotFound, "
|
|
33
|
+
notfound = lambda { raise Fog::Compute::Vsphere::NotFound, "Could not find VM template" }
|
|
29
34
|
|
|
30
|
-
#
|
|
31
|
-
#
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
# Find the template in the folder. This is more efficient than
|
|
36
|
+
# searching ALL VM's looking for the template.
|
|
37
|
+
# Tap gets rid of the leading empty string and "Datacenters" element
|
|
38
|
+
# and returns the array.
|
|
39
|
+
path_elements = options['path'].split('/').tap { |ary| ary.shift 2 }
|
|
40
|
+
# The DC name itself.
|
|
41
|
+
template_dc = path_elements.shift
|
|
42
|
+
# If the first path element contains "vm" this denotes the vmFolder
|
|
43
|
+
# and needs to be shifted out
|
|
44
|
+
path_elements.shift if path_elements[0] = 'vm'
|
|
45
|
+
# The template name. The remaining elements are the folders in the
|
|
46
|
+
# datacenter.
|
|
47
|
+
template_name = path_elements.pop
|
|
48
|
+
# Make sure @datacenters is populated. We need the instances from the Hash keys.
|
|
49
|
+
self.datacenters
|
|
50
|
+
# Get the datacenter managed object from the hash
|
|
51
|
+
dc = @datacenters[template_dc]
|
|
52
|
+
# Get the VM Folder (Group) efficiently
|
|
53
|
+
vm_folder = dc.vmFolder
|
|
54
|
+
# Walk the tree resetting the folder pointer as we go
|
|
55
|
+
folder = path_elements.inject(vm_folder) do |current_folder, sub_folder_name|
|
|
56
|
+
# JJM VIM::Folder#find appears to be quite efficient as it uses the
|
|
57
|
+
# searchIndex It certainly appears to be faster than
|
|
58
|
+
# VIM::Folder#inventory since that returns _all_ managed objects of
|
|
59
|
+
# a certain type _and_ their properties.
|
|
60
|
+
sub_folder = current_folder.find(sub_folder_name, RbVmomi::VIM::Folder)
|
|
61
|
+
raise ArgumentError, "Could not descend into #{sub_folder_name}. Please check your path." unless sub_folder
|
|
62
|
+
sub_folder
|
|
34
63
|
end
|
|
35
64
|
|
|
36
|
-
#
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
65
|
+
# Now find the template itself using the efficient find method
|
|
66
|
+
vm_mob_ref = folder.find(template_name, RbVmomi::VIM::VirtualMachine)
|
|
67
|
+
|
|
68
|
+
# Now find _a_ resource pool of the template's host (REVISIT: We need
|
|
69
|
+
# to support cloning into a specific RP)
|
|
70
|
+
esx_host = vm_mob_ref.collect!('runtime.host')['runtime.host']
|
|
71
|
+
# The parent of the ESX host itself is a ComputeResource which has a resourcePool
|
|
72
|
+
resource_pool = esx_host.parent.resourcePool
|
|
73
|
+
|
|
45
74
|
# Next, create a Relocation Spec instance
|
|
46
75
|
relocation_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(:pool => resource_pool,
|
|
47
76
|
:transform => options['transform'] || 'sparse')
|
|
@@ -50,27 +79,37 @@ module Fog
|
|
|
50
79
|
:powerOn => options['power_on'] || true,
|
|
51
80
|
:template => false)
|
|
52
81
|
task = vm_mob_ref.CloneVM_Task(:folder => vm_mob_ref.parent, :name => options['name'], :spec => clone_spec)
|
|
53
|
-
|
|
54
|
-
#
|
|
55
|
-
#
|
|
56
|
-
#
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
82
|
+
|
|
83
|
+
# Waiting for the VM to complete allows us to get the VirtulMachine
|
|
84
|
+
# object of the new machine when it's done. It is HIGHLY recommended
|
|
85
|
+
# to set 'wait' => true if your app wants to wait. Otherwise, you're
|
|
86
|
+
# going to have to reload the server model over and over which
|
|
87
|
+
# generates a lot of time consuming API calls to vmware.
|
|
88
|
+
if options['wait'] then
|
|
89
|
+
# REVISIT: It would be awesome to call a block passed to this
|
|
90
|
+
# request to notify the application how far along in the process we
|
|
91
|
+
# are. I'm thinking of updating a progress bar, etc...
|
|
92
|
+
new_vm = task.wait_for_completion
|
|
93
|
+
else
|
|
94
|
+
tries = 0
|
|
95
|
+
new_vm = begin
|
|
96
|
+
# Try and find the new VM (folder.find is quite efficient)
|
|
97
|
+
folder.find(options['name'], RbVmomi::VIM::VirtualMachine) or raise Fog::Vsphere::Errors::NotFound
|
|
98
|
+
rescue Fog::Vsphere::Errors::NotFound
|
|
99
|
+
tries += 1
|
|
100
|
+
if tries <= 10 then
|
|
101
|
+
sleep 15
|
|
102
|
+
retry
|
|
103
|
+
end
|
|
104
|
+
nil
|
|
67
105
|
end
|
|
68
|
-
nil
|
|
69
106
|
end
|
|
107
|
+
|
|
70
108
|
# Return hash
|
|
71
109
|
{
|
|
72
|
-
'vm_ref'
|
|
73
|
-
'
|
|
110
|
+
'vm_ref' => new_vm ? new_vm._ref : nil,
|
|
111
|
+
'vm_attributes' => new_vm ? convert_vm_mob_ref_to_attr_hash(new_vm) : {},
|
|
112
|
+
'task_ref' => task._ref
|
|
74
113
|
}
|
|
75
114
|
end
|
|
76
115
|
|
|
@@ -83,7 +122,7 @@ module Fog
|
|
|
83
122
|
options = vm_clone_check_options(options)
|
|
84
123
|
notfound = lambda { raise Fog::Compute::Vsphere::NotFound, "Cloud not find VM template" }
|
|
85
124
|
vm_mob_ref = list_virtual_machines['virtual_machines'].find(notfound) do |vm|
|
|
86
|
-
vm['
|
|
125
|
+
vm['name'] == options['path'].split("/")[-1]
|
|
87
126
|
end
|
|
88
127
|
{
|
|
89
128
|
'vm_ref' => 'vm-123',
|
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
Shindo.tests("AWS::CloudWatch | alarm_data", ['aws', 'cloudwatch']) do
|
|
2
2
|
|
|
3
|
+
pending if Fog.mocking?
|
|
4
|
+
|
|
3
5
|
tests('success') do
|
|
4
6
|
tests("#all").succeeds do
|
|
5
7
|
Fog::AWS[:cloud_watch].alarm_data.all
|
|
6
8
|
end
|
|
7
|
-
|
|
9
|
+
|
|
8
10
|
alarm_name_prefix = {'AlarmNamePrefix'=>'tmp'}
|
|
9
|
-
|
|
11
|
+
tests("#all_by_prefix").succeeds do
|
|
10
12
|
Fog::AWS[:cloud_watch].alarm_data.all(alarm_name_prefix)
|
|
11
13
|
end
|
|
12
|
-
|
|
14
|
+
|
|
13
15
|
namespace = 'AWS/EC2'
|
|
14
16
|
metric_name = 'CPUUtilization'
|
|
15
17
|
|
|
16
18
|
tests("#get").succeeds do
|
|
17
19
|
Fog::AWS[:cloud_watch].alarm_data.get(namespace, metric_name).to_json
|
|
18
20
|
end
|
|
19
|
-
|
|
21
|
+
|
|
20
22
|
new_attributes = {
|
|
21
23
|
:alarm_name => 'tmp-alarm',
|
|
22
24
|
:comparison_operator => 'GreaterThanOrEqualToThreshold',
|
|
@@ -30,11 +32,11 @@ Shindo.tests("AWS::CloudWatch | alarm_data", ['aws', 'cloudwatch']) do
|
|
|
30
32
|
tests('#new').returns(new_attributes) do
|
|
31
33
|
Fog::AWS[:cloud_watch].alarm_data.new(new_attributes).attributes
|
|
32
34
|
end
|
|
33
|
-
|
|
35
|
+
|
|
34
36
|
tests('#create').returns(new_attributes) do
|
|
35
37
|
Fog::AWS[:cloud_watch].alarm_data.create(new_attributes).attributes
|
|
36
38
|
end
|
|
37
|
-
|
|
39
|
+
|
|
38
40
|
end
|
|
39
41
|
|
|
40
42
|
end
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
Shindo.tests("AWS::CloudWatch | alarm_histories", ['aws', 'cloudwatch']) do
|
|
2
2
|
|
|
3
|
+
pending if Fog.mocking?
|
|
4
|
+
|
|
3
5
|
tests('success') do
|
|
4
6
|
tests("#all").succeeds do
|
|
5
7
|
Fog::AWS[:cloud_watch].alarm_histories.all
|
|
6
8
|
end
|
|
7
|
-
|
|
9
|
+
|
|
8
10
|
new_attributes = {
|
|
9
11
|
:alarm_name => 'tmp-alarm',
|
|
10
12
|
:end_date => '',
|
|
@@ -2,17 +2,10 @@ Shindo.tests("Fog::Compute[:aws] | security_group", ['aws']) do
|
|
|
2
2
|
|
|
3
3
|
model_tests(Fog::Compute[:aws].security_groups, {:description => 'foggroupdescription', :name => 'foggroupname'}, true)
|
|
4
4
|
|
|
5
|
-
tests("
|
|
6
|
-
@group = Fog::Compute[:aws].security_groups.create(:name => "foggroup
|
|
7
|
-
test("name is correct") do
|
|
8
|
-
@group.name == "foggroup with spaces "
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
test("description is correct") do
|
|
12
|
-
@group.description == " fog group desc "
|
|
13
|
-
end
|
|
5
|
+
tests("authorize and revoke helpers") do
|
|
6
|
+
@group = Fog::Compute[:aws].security_groups.create(:name => "foggroup", :description => "fog group desc")
|
|
14
7
|
|
|
15
|
-
@other_group = Fog::Compute[:aws].security_groups.create(:name => 'other group', :description => 'another group')
|
|
8
|
+
@other_group = Fog::Compute[:aws].security_groups.create(:name => 'fog other group', :description => 'another fog group')
|
|
16
9
|
|
|
17
10
|
test("authorize access by another security group") do
|
|
18
11
|
@group.authorize_group_and_owner(@other_group.name)
|
|
@@ -26,6 +19,18 @@ Shindo.tests("Fog::Compute[:aws] | security_group", ['aws']) do
|
|
|
26
19
|
@group.ip_permissions.empty?
|
|
27
20
|
end
|
|
28
21
|
|
|
22
|
+
test("authorize access to a port range") do
|
|
23
|
+
@group.authorize_port_range(5000..6000)
|
|
24
|
+
@group.reload
|
|
25
|
+
@group.ip_permissions.size == 1
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
test("revoke access to a port range") do
|
|
29
|
+
@group.revoke_port_range(5000..6000)
|
|
30
|
+
@group.reload
|
|
31
|
+
@group.ip_permissions.empty?
|
|
32
|
+
end
|
|
33
|
+
|
|
29
34
|
@other_group.destroy
|
|
30
35
|
@group.destroy
|
|
31
36
|
end
|
|
@@ -33,7 +33,7 @@ Shindo.tests('AWS::ELB | models', ['aws', 'elb']) do
|
|
|
33
33
|
|
|
34
34
|
tests('create') do
|
|
35
35
|
tests('without availability zones') do
|
|
36
|
-
elb = Fog::AWS[:elb].load_balancers.create(:id => elb_id)
|
|
36
|
+
elb = Fog::AWS[:elb].load_balancers.create(:id => elb_id, :availability_zones => @availability_zones)
|
|
37
37
|
tests("availability zones are correct").returns(@availability_zones.sort) { elb.availability_zones.sort }
|
|
38
38
|
tests("dns names is set").returns(true) { elb.dns_name.is_a?(String) }
|
|
39
39
|
tests("created_at is set").returns(true) { Time === elb.created_at }
|
|
@@ -54,7 +54,7 @@ Shindo.tests('AWS::ELB | models', ['aws', 'elb']) do
|
|
|
54
54
|
# Need to sleep here for IAM changes to propgate
|
|
55
55
|
tests('with ListenerDescriptions') do
|
|
56
56
|
@certificate = Fog::AWS[:iam].upload_server_certificate(AWS::IAM::SERVER_CERT_PUBLIC_KEY, AWS::IAM::SERVER_CERT_PRIVATE_KEY, @key_name).body['Certificate']
|
|
57
|
-
sleep(
|
|
57
|
+
sleep(10) unless Fog.mocking?
|
|
58
58
|
listeners = [{
|
|
59
59
|
'Listener' => {
|
|
60
60
|
'LoadBalancerPort' => 2030, 'InstancePort' => 2030, 'Protocol' => 'HTTP'
|
|
@@ -67,7 +67,7 @@ Shindo.tests('AWS::ELB | models', ['aws', 'elb']) do
|
|
|
67
67
|
},
|
|
68
68
|
'PolicyNames' => []
|
|
69
69
|
}]
|
|
70
|
-
elb3 = Fog::AWS[:elb].load_balancers.create(:id => "#{elb_id}-3", 'ListenerDescriptions' => listeners)
|
|
70
|
+
elb3 = Fog::AWS[:elb].load_balancers.create(:id => "#{elb_id}-3", 'ListenerDescriptions' => listeners, :availability_zones => @availability_zones)
|
|
71
71
|
tests('there are 2 listeners').returns(2) { elb3.listeners.count }
|
|
72
72
|
tests('instance_port is 2030').returns(2030) { elb3.listeners.first.instance_port }
|
|
73
73
|
tests('lb_port is 2030').returns(2030) { elb3.listeners.first.lb_port }
|
|
@@ -81,7 +81,7 @@ Shindo.tests('AWS::ELB | models', ['aws', 'elb']) do
|
|
|
81
81
|
'Listener' => {
|
|
82
82
|
'LoadBalancerPort' => 443, 'InstancePort' => 80, 'Protocol' => 'HTTPS', "SSLCertificateId" => "fakecert"}
|
|
83
83
|
}]
|
|
84
|
-
Fog::AWS[:elb].load_balancers.create(:id => "#{elb_id}-4", "ListenerDescriptions" => listeners)
|
|
84
|
+
Fog::AWS[:elb].load_balancers.create(:id => "#{elb_id}-4", "ListenerDescriptions" => listeners, :availability_zones => @availability_zones)
|
|
85
85
|
end
|
|
86
86
|
end
|
|
87
87
|
|
|
@@ -18,6 +18,11 @@ Shindo.tests('AWS::CloudFormation | stack requests', ['aws', 'cloudformation'])
|
|
|
18
18
|
'StackId' => String
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
@update_stack_format = {
|
|
22
|
+
'RequestId' => String,
|
|
23
|
+
'StackId' => String
|
|
24
|
+
}
|
|
25
|
+
|
|
21
26
|
@get_template_format = {
|
|
22
27
|
'RequestId' => String,
|
|
23
28
|
'TemplateBody' => String
|
|
@@ -103,6 +108,15 @@ Shindo.tests('AWS::CloudFormation | stack requests', ['aws', 'cloudformation'])
|
|
|
103
108
|
).body
|
|
104
109
|
end
|
|
105
110
|
|
|
111
|
+
tests("update_stack('#{@stack_name}', 'TemplateURL' => '#{@template_url}', Parameters => {'KeyName' => 'cloudformation'})").formats(@update_stack_format) do
|
|
112
|
+
pending if Fog.mocking?
|
|
113
|
+
Fog::AWS[:cloud_formation].update_stack(
|
|
114
|
+
@stack_name,
|
|
115
|
+
'TemplateURL' => @template_url,
|
|
116
|
+
'Parameters' => {'KeyName' => 'cloudformation'}
|
|
117
|
+
).body
|
|
118
|
+
end
|
|
119
|
+
|
|
106
120
|
tests("get_template('#{@stack_name})").formats(@get_template_format) do
|
|
107
121
|
pending if Fog.mocking?
|
|
108
122
|
Fog::AWS[:cloud_formation].get_template(@stack_name).body
|