tcr-vagrant-google 0.1.4

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.
@@ -0,0 +1,35 @@
1
+ # Copyright 2013 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'rubygems'
16
+ require 'bundler/setup'
17
+ require 'rspec/core/rake_task'
18
+
19
+ # Immediately sync all stdout so that tools like buildbot can
20
+ # immediately load in the output.
21
+ $stdout.sync = true
22
+ $stderr.sync = true
23
+
24
+ # Change to the directory of this file.
25
+ Dir.chdir(File.expand_path("../", __FILE__))
26
+
27
+ # This installs the tasks that help with gem creation and
28
+ # publishing.
29
+ Bundler::GemHelper.install_tasks
30
+
31
+ # Install the `spec` task so that we can run tests.
32
+ RSpec::Core::RakeTask.new
33
+
34
+ # Default task is to run the unit tests
35
+ task :default => "spec"
@@ -0,0 +1,13 @@
1
+ # Vagrant Google Example Box
2
+
3
+ Vagrant providers each require a custom provider-specific box format.
4
+ This folder shows the example contents of a box for the `google` provider.
5
+ To turn this into a box:
6
+
7
+ ```
8
+ $ tar cvzf ../google.box ./metadata.json ./Vagrantfile
9
+ ```
10
+
11
+ This box works by using Vagrant's built-in Vagrantfile merging to setup
12
+ defaults for Google. These defaults can easily be overwritten by higher-level
13
+ Vagrantfiles (such as project root Vagrantfiles).
@@ -0,0 +1,3 @@
1
+ {
2
+ "provider": "google"
3
+ }
Binary file
@@ -0,0 +1,31 @@
1
+ # Copyright 2013 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require "pathname"
16
+ require "vagrant-google/plugin"
17
+
18
+ module VagrantPlugins
19
+ module Google
20
+ lib_path = Pathname.new(File.expand_path("../vagrant-google", __FILE__))
21
+ autoload :Action, lib_path.join("action")
22
+ autoload :Errors, lib_path.join("errors")
23
+
24
+ # This returns the path to the source of this plugin.
25
+ #
26
+ # @return [Pathname]
27
+ def self.source_root
28
+ @source_root ||= Pathname.new(File.expand_path("../../", __FILE__))
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,140 @@
1
+ # Copyright 2013 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ require "vagrant/action/builder"
15
+
16
+ module VagrantPlugins
17
+ module Google
18
+ module Action
19
+ # Include the built-in modules so we can use them as top-level things.
20
+ include Vagrant::Action::Builtin
21
+
22
+ # This action is called to terminate the remote machine.
23
+ def self.action_destroy
24
+ Vagrant::Action::Builder.new.tap do |b|
25
+ b.use Call, DestroyConfirm do |env, b2|
26
+ if env[:result]
27
+ b2.use ConfigValidate
28
+ b2.use ConnectGoogle
29
+ b2.use TerminateInstance
30
+ else
31
+ b2.use MessageWillNotDestroy
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ # This action is called when `vagrant provision` is called.
38
+ def self.action_provision
39
+ Vagrant::Action::Builder.new.tap do |b|
40
+ b.use ConfigValidate
41
+ b.use Call, IsCreated do |env, b2|
42
+ if !env[:result]
43
+ b2.use MessageNotCreated
44
+ next
45
+ end
46
+
47
+ b2.use Provision
48
+ b2.use SyncFolders
49
+ end
50
+ end
51
+ end
52
+
53
+ # This action is called to read the SSH info of the machine. The
54
+ # resulting state is expected to be put into the `:machine_ssh_info`
55
+ # key.
56
+ def self.action_read_ssh_info
57
+ Vagrant::Action::Builder.new.tap do |b|
58
+ b.use ConfigValidate
59
+ b.use ConnectGoogle
60
+ b.use ReadSSHInfo
61
+ end
62
+ end
63
+
64
+ # This action is called to read the state of the machine. The
65
+ # resulting state is expected to be put into the `:machine_state_id`
66
+ # key.
67
+ def self.action_read_state
68
+ Vagrant::Action::Builder.new.tap do |b|
69
+ b.use ConfigValidate
70
+ b.use ConnectGoogle
71
+ b.use ReadState
72
+ end
73
+ end
74
+
75
+ # This action is called to SSH into the machine.
76
+ def self.action_ssh
77
+ Vagrant::Action::Builder.new.tap do |b|
78
+ b.use ConfigValidate
79
+ b.use Call, IsCreated do |env, b2|
80
+ if !env[:result]
81
+ b2.use MessageNotCreated
82
+ next
83
+ end
84
+
85
+ b2.use SSHExec
86
+ end
87
+ end
88
+ end
89
+
90
+ def self.action_ssh_run
91
+ Vagrant::Action::Builder.new.tap do |b|
92
+ b.use ConfigValidate
93
+ b.use Call, IsCreated do |env, b2|
94
+ if !env[:result]
95
+ b2.use MessageNotCreated
96
+ next
97
+ end
98
+
99
+ b2.use SSHRun
100
+ end
101
+ end
102
+ end
103
+
104
+ # This action is called to bring the box up from nothing.
105
+ def self.action_up
106
+ Vagrant::Action::Builder.new.tap do |b|
107
+ b.use HandleBox
108
+ b.use ConfigValidate
109
+ b.use ConnectGoogle
110
+ b.use Call, IsCreated do |env, b2|
111
+ if env[:result]
112
+ b2.use MessageAlreadyCreated
113
+ next
114
+ end
115
+
116
+ b2.use Provision
117
+ b2.use SyncFolders
118
+ b2.use WarnNetworks
119
+ b2.use RunInstance
120
+ end
121
+ end
122
+ end
123
+
124
+ # The autoload farm
125
+ action_root = Pathname.new(File.expand_path("../action", __FILE__))
126
+ autoload :ConnectGoogle, action_root.join("connect_google")
127
+ autoload :IsCreated, action_root.join("is_created")
128
+ autoload :MessageAlreadyCreated, action_root.join("message_already_created")
129
+ autoload :MessageNotCreated, action_root.join("message_not_created")
130
+ autoload :MessageWillNotDestroy, action_root.join("message_will_not_destroy")
131
+ autoload :ReadSSHInfo, action_root.join("read_ssh_info")
132
+ autoload :ReadState, action_root.join("read_state")
133
+ autoload :RunInstance, action_root.join("run_instance")
134
+ autoload :SyncFolders, action_root.join("sync_folders")
135
+ autoload :TimedProvision, action_root.join("timed_provision")
136
+ autoload :WarnNetworks, action_root.join("warn_networks")
137
+ autoload :TerminateInstance, action_root.join("terminate_instance")
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,49 @@
1
+ # Copyright 2013 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ require "fog"
15
+ require "log4r"
16
+
17
+ module VagrantPlugins
18
+ module Google
19
+ module Action
20
+ # This action connects to Google, verifies credentials work, and
21
+ # puts the Google connection object into the `:google_compute` key
22
+ # in the environment.
23
+ class ConnectGoogle
24
+ def initialize(app, env)
25
+ @app = app
26
+ @logger = Log4r::Logger.new("vagrant_google::action::connect_google")
27
+ end
28
+
29
+ def call(env)
30
+ provider_config = env[:machine].provider_config
31
+
32
+ # Build the fog config
33
+ fog_config = {
34
+ :provider => :google,
35
+ :google_project => provider_config.google_project_id,
36
+ :google_client_email => provider_config.google_client_email,
37
+ :google_key_location => provider_config.google_key_location
38
+ }
39
+
40
+ @logger.info("Connecting to Google...")
41
+ env[:google_compute] = Fog::Compute.new(fog_config)
42
+
43
+ @app.call(env)
44
+ @logger.info("...Connected!")
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,31 @@
1
+ # Copyright 2013 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ module VagrantPlugins
15
+ module Google
16
+ module Action
17
+ # This can be used with "Call" built-in to check if the machine
18
+ # is created and branch in the middleware.
19
+ class IsCreated
20
+ def initialize(app, env)
21
+ @app = app
22
+ end
23
+
24
+ def call(env)
25
+ env[:result] = env[:machine].state.id != :not_created
26
+ @app.call(env)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ # Copyright 2013 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ module VagrantPlugins
15
+ module Google
16
+ module Action
17
+ class MessageAlreadyCreated
18
+ def initialize(app, env)
19
+ @app = app
20
+ end
21
+
22
+ def call(env)
23
+ env[:ui].info(I18n.t("vagrant_google.already_created"))
24
+ @app.call(env)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # Copyright 2013 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ module VagrantPlugins
15
+ module Google
16
+ module Action
17
+ class MessageNotCreated
18
+ def initialize(app, env)
19
+ @app = app
20
+ end
21
+
22
+ def call(env)
23
+ env[:ui].info(I18n.t("vagrant_google.not_created"))
24
+ @app.call(env)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # Copyright 2013 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ module VagrantPlugins
15
+ module Google
16
+ module Action
17
+ class MessageWillNotDestroy
18
+ def initialize(app, env)
19
+ @app = app
20
+ end
21
+
22
+ def call(env)
23
+ env[:ui].info(I18n.t("vagrant_google.will_not_destroy", name: env[:machine].name))
24
+ @app.call(env)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,54 @@
1
+ # Copyright 2013 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ require "log4r"
15
+
16
+ module VagrantPlugins
17
+ module Google
18
+ module Action
19
+ # This action reads the SSH info for the machine and puts it into the
20
+ # `:machine_ssh_info` key in the environment.
21
+ class ReadSSHInfo
22
+ def initialize(app, env)
23
+ @app = app
24
+ @logger = Log4r::Logger.new("vagrant_google::action::read_ssh_info")
25
+ end
26
+
27
+ def call(env)
28
+ env[:machine_ssh_info] = read_ssh_info(env[:google_compute], env[:machine])
29
+
30
+ @app.call(env)
31
+ end
32
+
33
+ def read_ssh_info(google, machine)
34
+ return nil if machine.id.nil?
35
+ # Find the machine
36
+ zone = machine.provider_config.zone
37
+ server = google.servers.get(machine.id, zone)
38
+ if server.nil?
39
+ # The machine can't be found
40
+ @logger.info("Machine '#{zone}:#{machine.id}'couldn't be found, assuming it got destroyed.")
41
+ machine.id = nil
42
+ return nil
43
+ end
44
+
45
+ # Read SSH network info
46
+ return {
47
+ :host => server.public_ip_address,
48
+ :port => 22
49
+ }
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end