fog-google 0.5.2 → 0.5.3
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 +4 -4
- data/.fog.example +27 -0
- data/.rubocop.yml +10 -0
- data/.travis.yml +4 -3
- data/README.md +6 -18
- data/examples/bootstrap.rb +0 -1
- data/examples/network.rb +24 -4
- data/examples/precreated_client.rb +13 -0
- data/lib/fog/compute/google.rb +14 -2
- data/lib/fog/compute/google/models/firewall.rb +9 -0
- data/lib/fog/compute/google/models/instance_group.rb +15 -1
- data/lib/fog/compute/google/models/network.rb +10 -1
- data/lib/fog/compute/google/models/server.rb +6 -0
- data/lib/fog/compute/google/models/snapshots.rb +9 -3
- data/lib/fog/compute/google/models/subnetwork.rb +5 -0
- data/lib/fog/compute/google/requests/insert_instance_group.rb +9 -2
- data/lib/fog/compute/google/requests/insert_server.rb +40 -24
- data/lib/fog/compute/google/requests/list_snapshots.rb +3 -2
- data/lib/fog/compute/google/requests/update_firewall.rb +43 -0
- data/lib/fog/dns/google.rb +11 -2
- data/lib/fog/google/monitoring.rb +11 -2
- data/lib/fog/google/pubsub.rb +11 -2
- data/lib/fog/google/requests/pubsub/create_subscription.rb +1 -1
- data/lib/fog/google/sql.rb +11 -2
- data/lib/fog/google/version.rb +1 -1
- data/lib/fog/storage/google_json.rb +11 -2
- data/lib/fog/storage/google_json/models/files.rb +0 -4
- data/lib/fog/storage/google_json/requests/get_bucket.rb +0 -2
- data/tasks/console.rake +7 -0
- data/tasks/test.rake +1 -0
- data/test/integration/compute/test_compute_addresses_collection.rb +1 -1
- data/test/integration/compute/test_compute_networks_collection.rb +78 -0
- metadata +7 -4
- data/tasks/smoke.rake +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 10a8ac12072ce29979f949f17a52e6abe869066a
|
4
|
+
data.tar.gz: 2b605bd25340566ef987a53dd4630af3d04cddb0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a01b577b14ecf8c6393a2736f846e1057adefebbdae28ce999ca50868a03d2edd71d7e2363ec7c9dca30b137a64926eb3686bd9ad9c939385d27b9e1c81d4884
|
7
|
+
data.tar.gz: e3945cdfa27edeff1badc22cf32cb43dd68fbeb159673e83684e4dc539dd6a4af2f3aeca453b5fb64741c0903b18d40854dfc6b05c9c4eab348e2684dba64461
|
data/.fog.example
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
##################################################################
|
2
|
+
# This is configuration snippet to configure Google Cloud Platform
|
3
|
+
# for fog library.
|
4
|
+
#
|
5
|
+
# 1. Copy this file into your home dir: "~/.fog":
|
6
|
+
#
|
7
|
+
# $ cat .fog.example >> ~/.fog
|
8
|
+
#
|
9
|
+
# 2. Follow instructions to generate a private key:
|
10
|
+
# https://cloud.google.com/storage/docs/authentication#generating-a-private-key
|
11
|
+
#
|
12
|
+
# 3. Edit the new file accordingly.
|
13
|
+
#
|
14
|
+
##################################################################
|
15
|
+
# START GOOGLE CONFIG
|
16
|
+
my_google_credentials:
|
17
|
+
google_project: my-project-id
|
18
|
+
google_client_email: xxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com
|
19
|
+
google_json_key_location: /path/to/my-project-xxxxxxxxxxxx.json
|
20
|
+
# You can also provide service account credentials with `google_json_key_string` or
|
21
|
+
# with `google_key_location` and `google_key_string` for P12 private keys.
|
22
|
+
# If so, uncomment the two following lines.
|
23
|
+
# HMAC credentials follow a similar format:
|
24
|
+
#google_storage_access_key_id: GOOGXXXXXXXXXXXXXXXX
|
25
|
+
#google_storage_secret_access_key: XXXX+XXX/XXXXXXXX+XXXXXXXXXXXXXXXXXXXXX
|
26
|
+
# /END GOOGLE CONFIG
|
27
|
+
#################################################################
|
data/.rubocop.yml
CHANGED
@@ -2,12 +2,22 @@
|
|
2
2
|
Metrics/LineLength:
|
3
3
|
Enabled: false
|
4
4
|
|
5
|
+
Style/ConditionalAssignment:
|
6
|
+
SingleLineConditionsOnly: true
|
7
|
+
|
5
8
|
Style/Encoding:
|
6
9
|
EnforcedStyle: when_needed
|
7
10
|
|
8
11
|
Style/FormatString:
|
9
12
|
Enabled: false
|
10
13
|
|
14
|
+
Style/RegexpLiteral:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
#TODO: this needs to be adressed not through the linter
|
18
|
+
Style/FrozenStringLiteralComment:
|
19
|
+
Enabled: false
|
20
|
+
|
11
21
|
Style/HashSyntax:
|
12
22
|
EnforcedStyle: hash_rockets
|
13
23
|
|
data/.travis.yml
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
language: ruby
|
2
2
|
cache: bundler
|
3
3
|
sudo: false
|
4
|
+
dist: trusty
|
4
5
|
matrix:
|
5
6
|
fast_finish: true
|
6
7
|
include:
|
7
8
|
- rvm: 2.1
|
8
9
|
- rvm: 2.2
|
9
|
-
- rvm: 2.3
|
10
|
-
- rvm: 2.3.1
|
10
|
+
- rvm: 2.3
|
11
11
|
- rvm: 2.4.0
|
12
|
+
- rvm: 2.4.1
|
12
13
|
- rvm: jruby-head
|
13
14
|
allow_failures:
|
14
15
|
- rvm: jruby-head
|
15
|
-
- rvm: 2.4.
|
16
|
+
- rvm: 2.4.1
|
16
17
|
notifications:
|
17
18
|
email: false
|
data/README.md
CHANGED
@@ -67,24 +67,12 @@ $ gem install fog-google
|
|
67
67
|
|
68
68
|
#### Credentials
|
69
69
|
|
70
|
-
Follow the [instructions to generate a private key](https://cloud.google.com/storage/docs/authentication#generating-a-private-key).
|
70
|
+
Follow the [instructions to generate a private key](https://cloud.google.com/storage/docs/authentication#generating-a-private-key). A sample credentials file can be found in `.fog.example` in this directory:
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
google_client_email: xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com
|
76
|
-
google_json_key_location: /path/to/my-project-xxxxxxxxxxxx.json
|
77
|
-
```
|
78
|
-
|
79
|
-
You can also provide service account credentials with `google_json_key_string` or with `google_key_location` and `google_key_string` for P12 private keys.
|
72
|
+
cat .fog.example >> ~/.fog # appends the sample configuration
|
73
|
+
vim ~/.fog # edit file with yout config
|
74
|
+
|
80
75
|
|
81
|
-
HMAC credentials follow a similar format:
|
82
|
-
|
83
|
-
```
|
84
|
-
my_credentials:
|
85
|
-
google_storage_access_key_id: GOOGXXXXXXXXXXXXXXXX
|
86
|
-
google_storage_secret_access_key: XXXX+XXX/XXXXXXXX+XXXXXXXXXXXXXXXXXXXXX
|
87
|
-
```
|
88
76
|
|
89
77
|
#### SSH-ing into instances
|
90
78
|
|
@@ -94,7 +82,7 @@ If you want to be able to bootstrap SSH-able instances, (using `servers.bootstra
|
|
94
82
|
|
95
83
|
Once you've specified your credentials, you should be good to go!
|
96
84
|
```
|
97
|
-
|
85
|
+
$ bundle exec pry
|
98
86
|
[1] pry(main)> require 'fog/google'
|
99
87
|
=> true
|
100
88
|
[2] pry(main)> connection = Fog::Compute::Google.new
|
@@ -106,4 +94,4 @@ Once you've specified your credentials, you should be good to go!
|
|
106
94
|
|
107
95
|
## Contributing
|
108
96
|
|
109
|
-
See `CONTRIBUTING.md` in this repository.
|
97
|
+
See `CONTRIBUTING.md` in this repository.
|
data/examples/bootstrap.rb
CHANGED
@@ -10,7 +10,6 @@ def test
|
|
10
10
|
connection = Fog::Compute.new(:provider => "Google")
|
11
11
|
|
12
12
|
server = connection.servers.bootstrap
|
13
|
-
server.wait_for { sshable? }
|
14
13
|
|
15
14
|
raise "Could not bootstrap sshable server." unless server.ssh("whoami")
|
16
15
|
raise "Could not delete server." unless server.destroy
|
data/examples/network.rb
CHANGED
@@ -1,11 +1,25 @@
|
|
1
|
+
# All examples presume that you have a ~/.fog credentials file set up.
|
2
|
+
# More info on it can be found here: http://fog.io/about/getting_started.html
|
3
|
+
|
4
|
+
require "bundler"
|
5
|
+
Bundler.require(:default, :development)
|
6
|
+
# Uncomment this if you want to make real requests to GCE (you _will_ be billed!)
|
7
|
+
# WebMock.disable!
|
8
|
+
|
1
9
|
def test
|
2
10
|
connection = Fog::Compute.new(:provider => "Google")
|
3
11
|
|
4
|
-
|
5
|
-
|
12
|
+
puts "Creating a new private network..."
|
13
|
+
puts "---------------------------------"
|
14
|
+
network = connection.networks.create(
|
15
|
+
:name => "test-private-network",
|
16
|
+
:ipv4_range => "10.240.0.0/16"
|
17
|
+
)
|
6
18
|
|
7
19
|
name = "fog-smoke-test-#{Time.now.to_i}"
|
8
20
|
|
21
|
+
puts "Creating a disk for an instance..."
|
22
|
+
puts "---------------------------------"
|
9
23
|
disk = connection.disks.create(
|
10
24
|
:name => name,
|
11
25
|
:size_gb => 10,
|
@@ -15,6 +29,8 @@ def test
|
|
15
29
|
|
16
30
|
disk.wait_for { disk.ready? }
|
17
31
|
|
32
|
+
puts "Spinning up an instance with private network config..."
|
33
|
+
puts "------------------------------------------------------"
|
18
34
|
server = connection.servers.create(
|
19
35
|
:name => name,
|
20
36
|
:disks => [disk],
|
@@ -22,14 +38,18 @@ def test
|
|
22
38
|
:zone_name => "us-central1-a",
|
23
39
|
:private_key_path => File.expand_path("~/.ssh/id_rsa"),
|
24
40
|
:public_key_path => File.expand_path("~/.ssh/id_rsa.pub"),
|
25
|
-
:network =>
|
41
|
+
:network => network,
|
26
42
|
:external_ip => false,
|
27
|
-
:
|
43
|
+
:username => ENV["USER"]
|
44
|
+
)
|
28
45
|
|
29
46
|
# The network won't have any firewall rules, so we won't be able to ssh in.
|
30
47
|
server.wait_for { ready? }
|
31
48
|
|
32
49
|
raise "Could not delete server." unless server.destroy
|
50
|
+
raise "Could not delete network." unless network.destroy
|
33
51
|
rescue StandardError => e
|
34
52
|
p e.message
|
35
53
|
end
|
54
|
+
|
55
|
+
test
|
@@ -1,3 +1,14 @@
|
|
1
|
+
# All examples presume that you have a ~/.fog credentials file set up.
|
2
|
+
# More info on it can be found here: http://fog.io/about/getting_started.html
|
3
|
+
|
4
|
+
require "bundler"
|
5
|
+
Bundler.require(:default, :development)
|
6
|
+
# Uncomment this if you want to make real requests to GCE (you _will_ be billed!)
|
7
|
+
# WebMock.disable!
|
8
|
+
|
9
|
+
# This example shows how to work with fog using a pre-created Google API client
|
10
|
+
# with specific parameters, should you want to for any reason.
|
11
|
+
|
1
12
|
def test
|
2
13
|
client = Google::APIClient.new(:application_name => "supress")
|
3
14
|
connection = Fog::Compute.new(:provider => "Google", :google_client => client)
|
@@ -9,3 +20,5 @@ def test
|
|
9
20
|
p e.message
|
10
21
|
end
|
11
22
|
end
|
23
|
+
|
24
|
+
test
|
data/lib/fog/compute/google.rb
CHANGED
@@ -5,8 +5,18 @@ module Fog
|
|
5
5
|
autoload :Real, File.expand_path("../google/real", __FILE__)
|
6
6
|
|
7
7
|
requires :google_project
|
8
|
-
recognizes
|
9
|
-
|
8
|
+
recognizes(
|
9
|
+
:app_name,
|
10
|
+
:app_version,
|
11
|
+
:google_client,
|
12
|
+
:google_client_email,
|
13
|
+
:google_client_options,
|
14
|
+
:google_extra_global_projects,
|
15
|
+
:google_key_location,
|
16
|
+
:google_key_string,
|
17
|
+
:google_json_key_location,
|
18
|
+
:google_json_key_string
|
19
|
+
)
|
10
20
|
|
11
21
|
GOOGLE_COMPUTE_API_VERSION = "v1"
|
12
22
|
GOOGLE_COMPUTE_BASE_URL = "https://www.googleapis.com/compute/"
|
@@ -16,6 +26,7 @@ module Fog
|
|
16
26
|
https://www.googleapis.com/auth/cloud-platform)
|
17
27
|
GOOGLE_COMPUTE_DEFAULT_NETWORK = "default"
|
18
28
|
RUNNING = "RUNNING".freeze
|
29
|
+
PROVISIONING = "PROVISIONING".freeze
|
19
30
|
|
20
31
|
request_path "fog/compute/google/requests"
|
21
32
|
request :add_backend_service_backends
|
@@ -90,6 +101,7 @@ module Fog
|
|
90
101
|
request :insert_backend_service
|
91
102
|
request :insert_disk
|
92
103
|
request :insert_firewall
|
104
|
+
request :update_firewall
|
93
105
|
request :insert_forwarding_rule
|
94
106
|
request :insert_global_forwarding_rule
|
95
107
|
request :insert_http_health_check
|
@@ -28,6 +28,15 @@ module Fog
|
|
28
28
|
reload
|
29
29
|
end
|
30
30
|
|
31
|
+
def update
|
32
|
+
requires :identity, :allowed, :network
|
33
|
+
|
34
|
+
data = service.update_firewall(identity, allowed, network, attributes)
|
35
|
+
operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"])
|
36
|
+
operation.wait_for { !pending? }
|
37
|
+
reload
|
38
|
+
end
|
39
|
+
|
31
40
|
def destroy(async = true)
|
32
41
|
requires :identity
|
33
42
|
|
@@ -11,6 +11,7 @@ module Fog
|
|
11
11
|
attribute :fingerprint
|
12
12
|
attribute :namedPorts
|
13
13
|
attribute :network
|
14
|
+
attribute :subnetwork
|
14
15
|
attribute :self_link, :aliases => "selfLink"
|
15
16
|
attribute :size
|
16
17
|
attribute :zone, :aliases => :zone_name
|
@@ -18,7 +19,12 @@ module Fog
|
|
18
19
|
def save
|
19
20
|
requires :name, :zone
|
20
21
|
|
21
|
-
|
22
|
+
options = {
|
23
|
+
"network" => network_name,
|
24
|
+
"subnetwork" => subnetwork_name
|
25
|
+
}
|
26
|
+
|
27
|
+
service.insert_instance_group(name, zone, options)
|
22
28
|
end
|
23
29
|
|
24
30
|
def destroy(_async = true)
|
@@ -60,6 +66,14 @@ module Fog
|
|
60
66
|
zone.nil? ? nil : zone.split("/")[-1]
|
61
67
|
end
|
62
68
|
|
69
|
+
def network_name
|
70
|
+
network.nil? ? nil : network.split("/")[-1]
|
71
|
+
end
|
72
|
+
|
73
|
+
def subnetwork_name
|
74
|
+
subnetwork.nil? ? nil : subnetwork.split("/")[-1]
|
75
|
+
end
|
76
|
+
|
63
77
|
private
|
64
78
|
|
65
79
|
def format_instance_list(instance_list)
|
@@ -21,7 +21,9 @@ module Fog
|
|
21
21
|
|
22
22
|
data = service.insert_network(identity, ipv4_range, attributes)
|
23
23
|
operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"])
|
24
|
-
operation
|
24
|
+
# Since network has no "state" we can query, we have to wait for the operation to finish
|
25
|
+
# TODO: change back to async when there's a proper state API
|
26
|
+
operation.wait_for { ready? }
|
25
27
|
reload
|
26
28
|
end
|
27
29
|
|
@@ -33,6 +35,13 @@ module Fog
|
|
33
35
|
operation.wait_for { ready? } unless async
|
34
36
|
operation
|
35
37
|
end
|
38
|
+
|
39
|
+
# Returns a ready API structure for insert_instance, used in insert_server request.
|
40
|
+
def get_as_interface_config(access_config = nil)
|
41
|
+
network_interface = { "network" => self_link }
|
42
|
+
network_interface["accessConfigs"] = [access_config] if access_config
|
43
|
+
network_interface
|
44
|
+
end
|
36
45
|
end
|
37
46
|
end
|
38
47
|
end
|
@@ -26,6 +26,7 @@ module Fog
|
|
26
26
|
# These attributes are not available in the representation of an 'instance' returned by the GCE API.
|
27
27
|
# They are useful only for the create process
|
28
28
|
attribute :network, :aliases => "network"
|
29
|
+
attribute :subnetwork, :aliases => "subnetwork"
|
29
30
|
attribute :external_ip, :aliases => "externalIP"
|
30
31
|
attribute :auto_restart
|
31
32
|
attribute :on_host_maintenance
|
@@ -198,6 +199,10 @@ module Fog
|
|
198
199
|
Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
|
199
200
|
end
|
200
201
|
|
202
|
+
def provisioning?
|
203
|
+
state == PROVISIONING
|
204
|
+
end
|
205
|
+
|
201
206
|
def ready?
|
202
207
|
state == RUNNING
|
203
208
|
end
|
@@ -251,6 +256,7 @@ module Fog
|
|
251
256
|
"machineType" => machine_type,
|
252
257
|
"networkInterfaces" => network_interfaces,
|
253
258
|
"network" => network,
|
259
|
+
"subnetwork" => subnetwork,
|
254
260
|
"externalIp" => external_ip,
|
255
261
|
"disks" => disks,
|
256
262
|
"metadata" => metadata,
|
@@ -5,9 +5,15 @@ module Fog
|
|
5
5
|
model Fog::Compute::Google::Snapshot
|
6
6
|
|
7
7
|
def all
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
items = []
|
9
|
+
next_page_token = nil
|
10
|
+
loop do
|
11
|
+
data = service.list_snapshots(nil, next_page_token)
|
12
|
+
items.concat(data.body["items"])
|
13
|
+
next_page_token = data.body["nextPageToken"]
|
14
|
+
break if next_page_token.nil? || next_page_token.empty?
|
15
|
+
end
|
16
|
+
load(items)
|
11
17
|
end
|
12
18
|
|
13
19
|
def get(snap_id)
|
@@ -18,10 +18,17 @@ module Fog
|
|
18
18
|
id = Fog::Mock.random_numbers(19).to_s
|
19
19
|
|
20
20
|
body = {
|
21
|
-
"name" => group_name
|
22
|
-
"network" => "https://www.googleapis.com/compute/#{api_version}/projects/#{@project}/global/networks/default"
|
21
|
+
"name" => group_name
|
23
22
|
}
|
23
|
+
|
24
24
|
body["description"] = options["description"] if options["description"]
|
25
|
+
network_name = options["network"] ? options["network"].split("/")[-1] : GOOGLE_COMPUTE_DEFAULT_NETWORK
|
26
|
+
body["network"] = "https://www.googleapis.com/compute/#{api_version}/projects/#{@project}/global/networks/#{network_name}"
|
27
|
+
|
28
|
+
unless options["subnetwork"].nil?
|
29
|
+
subnetwork_name = options["subnetwork"].split("/")[-1]
|
30
|
+
body["subnetwork"] = "https://www.googleapis.com/compute/#{api_version}/projects/#{@project}/regions/#{@region}/subnetworks/#{subnetwork_name}"
|
31
|
+
end
|
25
32
|
|
26
33
|
request(api_method, parameters, body)
|
27
34
|
end
|
@@ -110,6 +110,44 @@ module Fog
|
|
110
110
|
disks
|
111
111
|
end
|
112
112
|
|
113
|
+
def handle_networks(options, region_name)
|
114
|
+
# Only one access config, ONE_TO_ONE_NAT, is supported per instance.
|
115
|
+
# If there are no accessConfigs specified, then this instance will have no external internet access.
|
116
|
+
access_config = { "type" => "ONE_TO_ONE_NAT", "name" => "External NAT" }
|
117
|
+
# If natIP is undefined VM will get an IP from a shared ephemeral IP address pool
|
118
|
+
if options.key? "externalIp"
|
119
|
+
access_config["natIP"] = options.delete "externalIp"
|
120
|
+
# If :external_ip is set to 'false', do not allow _any_ external networking
|
121
|
+
access_config = nil if access_config["natIP"] == false
|
122
|
+
end
|
123
|
+
|
124
|
+
# If no networking options are specified, assume default network
|
125
|
+
if options.key? "network"
|
126
|
+
network = options.delete "network"
|
127
|
+
else
|
128
|
+
network = GOOGLE_COMPUTE_DEFAULT_NETWORK
|
129
|
+
end
|
130
|
+
|
131
|
+
# Objectify the network if needed
|
132
|
+
unless network.is_a?(Network)
|
133
|
+
network = networks.get(network)
|
134
|
+
end
|
135
|
+
|
136
|
+
network_interfaces = network.get_as_interface_config(access_config)
|
137
|
+
|
138
|
+
if options.key? "subnetwork"
|
139
|
+
subnetwork = options.delete "subnetwork"
|
140
|
+
# Objectify the subnetwork if needed
|
141
|
+
unless subnetwork.is_a?(Subnetwork)
|
142
|
+
subnetwork = subnetworks.get(subnetwork, region_name)
|
143
|
+
end
|
144
|
+
network_interfaces = subnetwork.update_interface_config(network_interfaces)
|
145
|
+
end
|
146
|
+
|
147
|
+
# Return a networkInterfaces array
|
148
|
+
[network_interfaces]
|
149
|
+
end
|
150
|
+
|
113
151
|
def format_metadata(metadata)
|
114
152
|
{ "items" => metadata.map { |k, v| { "key" => k, "value" => v } } }
|
115
153
|
end
|
@@ -170,7 +208,7 @@ module Fog
|
|
170
208
|
# more information.
|
171
209
|
# @return [Excon::Response] response object that represents the result.
|
172
210
|
def insert_server(server_name, zone_name, options = {}, *deprecated_args)
|
173
|
-
if deprecated_args.
|
211
|
+
if !deprecated_args.empty? || !options.is_a?(Hash)
|
174
212
|
raise ArgumentError.new "Too many parameters specified. This may be the cause of code written for an outdated"\
|
175
213
|
" version of fog. Usage: server_name, zone_name, [options]"
|
176
214
|
end
|
@@ -182,28 +220,6 @@ module Fog
|
|
182
220
|
body_object = { :name => server_name }
|
183
221
|
|
184
222
|
body_object["machineType"] = @api_url + @project + "/zones/#{zone_name}/machineTypes/#{options.delete 'machineType'}"
|
185
|
-
network = nil
|
186
|
-
if options.key? "network"
|
187
|
-
network = options.delete "network"
|
188
|
-
else
|
189
|
-
network = GOOGLE_COMPUTE_DEFAULT_NETWORK
|
190
|
-
end
|
191
|
-
|
192
|
-
# ExternalIP is default value for server creation
|
193
|
-
access_config = { "type" => "ONE_TO_ONE_NAT", "name" => "External NAT" }
|
194
|
-
# leave natIP undefined to use an IP from a shared ephemeral IP address pool
|
195
|
-
if options.key? "externalIp"
|
196
|
-
access_config["natIP"] = options.delete "externalIp"
|
197
|
-
# If set to 'false', that would mean user does no want to allocate an external IP
|
198
|
-
access_config = nil if access_config["natIP"] == false
|
199
|
-
end
|
200
|
-
|
201
|
-
networkInterfaces = []
|
202
|
-
unless network.nil?
|
203
|
-
networkInterface = { "network" => @api_url + @project + "/global/networks/#{network}" }
|
204
|
-
networkInterface["accessConfigs"] = [access_config] if access_config
|
205
|
-
networkInterfaces << networkInterface
|
206
|
-
end
|
207
223
|
|
208
224
|
scheduling = {
|
209
225
|
"automaticRestart" => false,
|
@@ -235,7 +251,7 @@ module Fog
|
|
235
251
|
end
|
236
252
|
|
237
253
|
# TODO: add other networks
|
238
|
-
body_object["networkInterfaces"] =
|
254
|
+
body_object["networkInterfaces"] = handle_networks(options, get_zone(zone_name).body["region"].split("/")[-1])
|
239
255
|
|
240
256
|
if options["disks"].nil? || options["disks"].empty?
|
241
257
|
raise ArgumentError.new "Empty value for field 'disks'. Boot disk must be specified"
|
@@ -8,11 +8,12 @@ module Fog
|
|
8
8
|
end
|
9
9
|
|
10
10
|
class Real
|
11
|
-
def list_snapshots(project = nil)
|
11
|
+
def list_snapshots(project = nil, next_page_token = nil)
|
12
12
|
api_method = @compute.snapshots.list
|
13
13
|
project = @project if project.nil?
|
14
14
|
parameters = {
|
15
|
-
"project" => project
|
15
|
+
"project" => project,
|
16
|
+
"pageToken" => next_page_token
|
16
17
|
}
|
17
18
|
|
18
19
|
request(api_method, parameters)
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class Google
|
4
|
+
class Mock
|
5
|
+
def update_firewall(_firewall_name, _allowed, _network = GOOGLE_COMPUTE_DEFAULT_NETWORK, _options = {})
|
6
|
+
Fog::Mock.not_implemented
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class Real
|
11
|
+
def update_firewall(firewall_name, allowed, network = GOOGLE_COMPUTE_DEFAULT_NETWORK, options = {})
|
12
|
+
unless network.start_with? "http"
|
13
|
+
network = "#{@api_url}#{@project}/global/networks/#{network}"
|
14
|
+
end
|
15
|
+
|
16
|
+
api_method = @compute.firewalls.update
|
17
|
+
parameters = {
|
18
|
+
"project" => @project,
|
19
|
+
"firewall" => firewall_name
|
20
|
+
}
|
21
|
+
body_object = {
|
22
|
+
"allowed" => allowed,
|
23
|
+
"network" => network
|
24
|
+
}
|
25
|
+
unless options[:description].nil?
|
26
|
+
body_object["description"] = options[:description]
|
27
|
+
end
|
28
|
+
unless options[:source_ranges].nil? || options[:source_ranges].empty?
|
29
|
+
body_object["sourceRanges"] = options[:source_ranges]
|
30
|
+
end
|
31
|
+
unless options[:source_tags].nil? || options[:source_tags].empty?
|
32
|
+
body_object["sourceTags"] = options[:source_tags]
|
33
|
+
end
|
34
|
+
unless options[:target_tags].nil? || options[:target_tags].empty?
|
35
|
+
body_object["targetTags"] = options[:target_tags]
|
36
|
+
end
|
37
|
+
|
38
|
+
request(api_method, parameters, body_object)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/fog/dns/google.rb
CHANGED
@@ -5,8 +5,17 @@ module Fog
|
|
5
5
|
autoload :Real, File.expand_path("../google/real", __FILE__)
|
6
6
|
|
7
7
|
requires :google_project
|
8
|
-
recognizes
|
9
|
-
|
8
|
+
recognizes(
|
9
|
+
:app_name,
|
10
|
+
:app_version,
|
11
|
+
:google_client,
|
12
|
+
:google_client_email,
|
13
|
+
:google_client_options,
|
14
|
+
:google_key_location,
|
15
|
+
:google_key_string,
|
16
|
+
:google_json_key_location,
|
17
|
+
:google_json_key_string
|
18
|
+
)
|
10
19
|
|
11
20
|
GOOGLE_DNS_API_VERSION = "v1"
|
12
21
|
GOOGLE_DNS_BASE_URL = "https://www.googleapis.com/dns/"
|
@@ -5,8 +5,17 @@ module Fog
|
|
5
5
|
autoload :Real, File.expand_path("../monitoring/real", __FILE__)
|
6
6
|
|
7
7
|
requires :google_project
|
8
|
-
recognizes
|
9
|
-
|
8
|
+
recognizes(
|
9
|
+
:app_name,
|
10
|
+
:app_version,
|
11
|
+
:google_client,
|
12
|
+
:google_client_email,
|
13
|
+
:google_client_options,
|
14
|
+
:google_key_location,
|
15
|
+
:google_key_string,
|
16
|
+
:google_json_key_location,
|
17
|
+
:google_json_key_string
|
18
|
+
)
|
10
19
|
|
11
20
|
GOOGLE_MONITORING_API_VERSION = "v2beta2".freeze
|
12
21
|
GOOGLE_MONITORING_BASE_URL = "https://www.googleapis.com/cloudmonitoring/"
|
data/lib/fog/google/pubsub.rb
CHANGED
@@ -5,8 +5,17 @@ module Fog
|
|
5
5
|
autoload :Real, File.expand_path("../pubsub/real", __FILE__)
|
6
6
|
|
7
7
|
requires :google_project
|
8
|
-
recognizes
|
9
|
-
|
8
|
+
recognizes(
|
9
|
+
:app_name,
|
10
|
+
:app_version,
|
11
|
+
:google_client,
|
12
|
+
:google_client_email,
|
13
|
+
:google_client_options,
|
14
|
+
:google_json_key_location,
|
15
|
+
:google_json_key_string,
|
16
|
+
:google_key_location,
|
17
|
+
:google_key_string
|
18
|
+
)
|
10
19
|
|
11
20
|
GOOGLE_PUBSUB_API_VERSION = "v1".freeze
|
12
21
|
GOOGLE_PUBSUB_BASE_URL = "https://www.googleapis.com/pubsub".freeze
|
data/lib/fog/google/sql.rb
CHANGED
@@ -5,8 +5,17 @@ module Fog
|
|
5
5
|
autoload :Real, File.expand_path("../sql/real", __FILE__)
|
6
6
|
|
7
7
|
requires :google_project
|
8
|
-
recognizes
|
9
|
-
|
8
|
+
recognizes(
|
9
|
+
:app_name,
|
10
|
+
:app_version,
|
11
|
+
:google_client,
|
12
|
+
:google_client_email,
|
13
|
+
:google_client_options,
|
14
|
+
:google_key_location,
|
15
|
+
:google_key_string,
|
16
|
+
:google_json_key_location,
|
17
|
+
:google_json_key_string
|
18
|
+
)
|
10
19
|
|
11
20
|
GOOGLE_SQL_API_VERSION = "v1beta3"
|
12
21
|
GOOGLE_SQL_BASE_URL = "https://www.googleapis.com/sql/"
|
data/lib/fog/google/version.rb
CHANGED
@@ -6,8 +6,17 @@ module Fog
|
|
6
6
|
autoload :Utils, File.expand_path("../google_json/utils", __FILE__)
|
7
7
|
|
8
8
|
requires :google_project
|
9
|
-
recognizes
|
10
|
-
|
9
|
+
recognizes(
|
10
|
+
:app_name,
|
11
|
+
:app_version,
|
12
|
+
:google_client,
|
13
|
+
:google_client_email,
|
14
|
+
:google_client_options,
|
15
|
+
:google_key_location,
|
16
|
+
:google_key_string,
|
17
|
+
:google_json_key_location,
|
18
|
+
:google_json_key_string
|
19
|
+
)
|
11
20
|
|
12
21
|
# https://cloud.google.com/storage/docs/json_api/v1/
|
13
22
|
GOOGLE_STORAGE_JSON_API_VERSION = "v1"
|
@@ -61,13 +61,11 @@ module Fog
|
|
61
61
|
response.body = {
|
62
62
|
"CommonPrefixes" => [],
|
63
63
|
"Contents" => truncated_contents,
|
64
|
-
"IsTruncated" => truncated_contents.size != contents.size,
|
65
64
|
"Marker" => options["marker"],
|
66
65
|
"Name" => bucket["Name"],
|
67
66
|
"Prefix" => options["prefix"]
|
68
67
|
}
|
69
68
|
if options["max-keys"] && options["max-keys"] < response.body["Contents"].length
|
70
|
-
response.body["IsTruncated"] = true
|
71
69
|
response.body["Contents"] = response.body["Contents"][0...options["max-keys"]]
|
72
70
|
end
|
73
71
|
else
|
data/tasks/console.rake
CHANGED
@@ -5,6 +5,13 @@ desc "Project IRB console"
|
|
5
5
|
task :console do
|
6
6
|
require "bundler"
|
7
7
|
Bundler.require(:default, :development)
|
8
|
+
|
9
|
+
# Reload helper to avoid resetting the environment when debugging
|
10
|
+
def reload!
|
11
|
+
files = $LOADED_FEATURES.select { |feat| feat =~ /\/fog-google\// }
|
12
|
+
files.each { |file| load file }
|
13
|
+
end
|
14
|
+
|
8
15
|
ARGV.clear
|
9
16
|
Pry.start
|
10
17
|
end
|
data/tasks/test.rake
CHANGED
@@ -50,7 +50,7 @@ class TestComputeAddressesCollection < FogIntegrationTest
|
|
50
50
|
],
|
51
51
|
:external_ip => my_address.address
|
52
52
|
)
|
53
|
-
my_server.wait_for {
|
53
|
+
my_server.wait_for { provisioning? }
|
54
54
|
|
55
55
|
# And verify that it's correctly assigned
|
56
56
|
assert_equal(
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require "helpers/integration_test_helper"
|
2
|
+
require "securerandom"
|
3
|
+
|
4
|
+
class TestComputeNetworksCollection < FogIntegrationTest
|
5
|
+
DEFAULT_REGION = "us-central1".freeze
|
6
|
+
DEFAULT_ZONE = "us-central1-b".freeze
|
7
|
+
RESOURCE_PREFIX = "fog-test-networkscol".freeze
|
8
|
+
|
9
|
+
# Ensure we clean up any created resources
|
10
|
+
Minitest.after_run do
|
11
|
+
client = Fog::Compute::Google.new
|
12
|
+
client.networks.each { |a| a.destroy if a.name.start_with?(RESOURCE_PREFIX) }
|
13
|
+
client.servers.each { |s| s.destroy if s.name.start_with?(RESOURCE_PREFIX) }
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_network_workflow
|
17
|
+
client = Fog::Compute::Google.new
|
18
|
+
|
19
|
+
my_network_name = new_resource_name
|
20
|
+
# An address can be created by specifying a name and a region
|
21
|
+
my_network = client.networks.create(
|
22
|
+
:name => my_network_name,
|
23
|
+
:ipv4_range => "10.240.#{rand(255)}.0/24"
|
24
|
+
)
|
25
|
+
|
26
|
+
assert_equal(my_network_name, my_network.name, "My network should have the provided name")
|
27
|
+
|
28
|
+
# It should also be visible when listing addresses
|
29
|
+
assert_includes(client.networks.all.map(&:name), my_network_name)
|
30
|
+
|
31
|
+
# Be aware that although the address resource is created, it might not yet
|
32
|
+
# have an ip address. You can poll until the address has been assigned.
|
33
|
+
my_network.wait_for { !my_network.ipv4_range.nil? }
|
34
|
+
assert_match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}/,
|
35
|
+
my_network.ipv4_range,
|
36
|
+
"My address's address should have a valid ipv4 address")
|
37
|
+
|
38
|
+
# Now that we have an address, we can create a server using the static ip
|
39
|
+
my_server = client.servers.create(
|
40
|
+
:name => new_resource_name,
|
41
|
+
:machine_type => "f1-micro",
|
42
|
+
:zone_name => DEFAULT_ZONE,
|
43
|
+
:disks => [
|
44
|
+
:boot => true,
|
45
|
+
:autoDelete => true,
|
46
|
+
:initializeParams => {
|
47
|
+
:sourceImage => "projects/debian-cloud/global/images/family/debian-8"
|
48
|
+
}
|
49
|
+
],
|
50
|
+
:network => my_network
|
51
|
+
)
|
52
|
+
my_server.wait_for { provisioning? }
|
53
|
+
|
54
|
+
# We need to verify that the network has been correctly assigned
|
55
|
+
assert_equal(
|
56
|
+
my_network.self_link,
|
57
|
+
my_server.network_interfaces[0]["network"],
|
58
|
+
"My created server should have the network specified as the network"
|
59
|
+
)
|
60
|
+
|
61
|
+
# Access config needs to be correctly populated
|
62
|
+
assert_equal(
|
63
|
+
"ONE_TO_ONE_NAT",
|
64
|
+
my_server.network_interfaces[0]["accessConfigs"][0]["type"],
|
65
|
+
"Access config type matches the correct default"
|
66
|
+
)
|
67
|
+
|
68
|
+
assert_equal(
|
69
|
+
"External NAT",
|
70
|
+
my_server.network_interfaces[0]["accessConfigs"][0]["name"],
|
71
|
+
"Access config name matches the correct default"
|
72
|
+
)
|
73
|
+
end
|
74
|
+
|
75
|
+
def new_resource_name
|
76
|
+
"#{RESOURCE_PREFIX}-#{SecureRandom.uuid}"
|
77
|
+
end
|
78
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fog-google
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nat Welch
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2017-
|
14
|
+
date: 2017-06-02 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: fog-core
|
@@ -208,6 +208,7 @@ extensions: []
|
|
208
208
|
extra_rdoc_files: []
|
209
209
|
files:
|
210
210
|
- ".editorconfig"
|
211
|
+
- ".fog.example"
|
211
212
|
- ".gitignore"
|
212
213
|
- ".hound.yml"
|
213
214
|
- ".rubocop.yml"
|
@@ -440,6 +441,7 @@ files:
|
|
440
441
|
- lib/fog/compute/google/requests/set_target_http_proxy_url_map.rb
|
441
442
|
- lib/fog/compute/google/requests/start_server.rb
|
442
443
|
- lib/fog/compute/google/requests/stop_server.rb
|
444
|
+
- lib/fog/compute/google/requests/update_firewall.rb
|
443
445
|
- lib/fog/compute/google/requests/update_url_map.rb
|
444
446
|
- lib/fog/compute/google/requests/validate_url_map.rb
|
445
447
|
- lib/fog/dns/google.rb
|
@@ -598,7 +600,6 @@ files:
|
|
598
600
|
- tasks/bundler.rake
|
599
601
|
- tasks/console.rake
|
600
602
|
- tasks/lint.rake
|
601
|
-
- tasks/smoke.rake
|
602
603
|
- tasks/test.rake
|
603
604
|
- test/helpers/client_helper.rb
|
604
605
|
- test/helpers/integration_test_helper.rb
|
@@ -607,6 +608,7 @@ files:
|
|
607
608
|
- test/integration/compute/requests/test_compute_address_requests.rb
|
608
609
|
- test/integration/compute/test_backend_services.rb
|
609
610
|
- test/integration/compute/test_compute_addresses_collection.rb
|
611
|
+
- test/integration/compute/test_compute_networks_collection.rb
|
610
612
|
- test/integration/compute/test_disk_types.rb
|
611
613
|
- test/integration/compute/test_disks.rb
|
612
614
|
- test/integration/compute/test_forwarding_rules.rb
|
@@ -725,7 +727,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
725
727
|
version: '0'
|
726
728
|
requirements: []
|
727
729
|
rubyforge_project:
|
728
|
-
rubygems_version: 2.
|
730
|
+
rubygems_version: 2.6.10
|
729
731
|
signing_key:
|
730
732
|
specification_version: 4
|
731
733
|
summary: Module for the 'fog' gem to support Google.
|
@@ -737,6 +739,7 @@ test_files:
|
|
737
739
|
- test/integration/compute/requests/test_compute_address_requests.rb
|
738
740
|
- test/integration/compute/test_backend_services.rb
|
739
741
|
- test/integration/compute/test_compute_addresses_collection.rb
|
742
|
+
- test/integration/compute/test_compute_networks_collection.rb
|
740
743
|
- test/integration/compute/test_disk_types.rb
|
741
744
|
- test/integration/compute/test_disks.rb
|
742
745
|
- test/integration/compute/test_forwarding_rules.rb
|
data/tasks/smoke.rake
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
desc "Run smoke tests from examples directory"
|
2
|
-
namespace :google do
|
3
|
-
namespace :smoke do
|
4
|
-
desc "Smoke tests for Google Compute Engine."
|
5
|
-
task :compute do
|
6
|
-
puts "These smoke tests assume you have a file at ~/.fog which has your credentials for connecting to GCE."
|
7
|
-
|
8
|
-
Dir.glob("./examples/*.rb").each do |file|
|
9
|
-
puts "Running #{file}:"
|
10
|
-
require file
|
11
|
-
test
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|