vagrant-openstack-plugin 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +17 -0
- data/README.md +25 -0
- data/lib/vagrant-openstack-plugin/action.rb +41 -6
- data/lib/vagrant-openstack-plugin/action/connect_openstack.rb +13 -8
- data/lib/vagrant-openstack-plugin/action/create_orchestration_stack.rb +97 -0
- data/lib/vagrant-openstack-plugin/action/create_server.rb +2 -0
- data/lib/vagrant-openstack-plugin/action/delete_orchestration_stack.rb +78 -0
- data/lib/vagrant-openstack-plugin/action/delete_server.rb +0 -1
- data/lib/vagrant-openstack-plugin/action/is_snapshoting.rb +24 -0
- data/lib/vagrant-openstack-plugin/action/message_already_created.rb +1 -1
- data/lib/vagrant-openstack-plugin/action/message_snapshot_done.rb +16 -0
- data/lib/vagrant-openstack-plugin/action/message_snapshot_in_progress.rb +16 -0
- data/lib/vagrant-openstack-plugin/action/sync_folders.rb +9 -3
- data/lib/vagrant-openstack-plugin/action/take_snapshot.rb +26 -0
- data/lib/vagrant-openstack-plugin/action/wait_for_task.rb +44 -0
- data/lib/vagrant-openstack-plugin/command.rb +70 -0
- data/lib/vagrant-openstack-plugin/command/command_snapshot.rb +43 -0
- data/lib/vagrant-openstack-plugin/config.rb +21 -0
- data/lib/vagrant-openstack-plugin/errors.rb +8 -0
- data/lib/vagrant-openstack-plugin/plugin.rb +23 -15
- data/lib/vagrant-openstack-plugin/version.rb +1 -1
- data/locales/en.yml +22 -1
- data/vagrant-openstack-plugin.gemspec +1 -1
- metadata +13 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 986c84ac3194d14ea6318c89ff6266e26535afa9
|
4
|
+
data.tar.gz: d78d410acf7bec163dd902a614b3dedafcbe3101
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 643ff0ffe7ab2c7f9ac797ffc48a6bbb6b32786141e8d4d264f8167820699692c38584feb872b555564beb3fc5b91028910ab35ebb72aca816551e5559773078
|
7
|
+
data.tar.gz: b995f34d40199ec3a153cb5d63776b5cca113fd81eac5b6a498742a883cbd3dd129644e7494a293497874237d73da4aea904bd355614d2e7d649df9005f5581b
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# Changelog for vagrant-openstack-plugin
|
2
2
|
|
3
|
+
## 0.8.0
|
4
|
+
|
5
|
+
- Merge pull request #67 from pradels/master [view commit](http://github.com///commit/15f5b5531622376df952bccc0512a6de50d7a92f)
|
6
|
+
- Merge pull request #66 from matope/use-execute-to-make-synced_folder [view commit](http://github.com///commit/96f64a846d40e5c7f0355def17189e38895e29f3)
|
7
|
+
- Merge pull request #72 from mathuin/fix-handlebox [view commit](http://github.com///commit/3396e33e54d2527d28a70f1487da6221cd2316e2)
|
8
|
+
- Merge pull request #64 from bewiwi/reboot [view commit](http://github.com///commit/24bec035508853be871ed8ed73b1d33f15beff76)
|
9
|
+
- Merge pull request #63 from bewiwi/status [view commit](http://github.com///commit/79a8c341501461a0d5ef1ce4f11cc0a1810d38f3)
|
10
|
+
- Merge pull request #71 from bewiwi/add_openstack_snapshot_commmand [view commit](http://github.com///commit/bf4eedd6eb5e29aefe4c0e156b932b4f4a81e1f5)
|
11
|
+
- Merge pull request #73 from detiber/configNetworks [view commit](http://github.com///commit/5e17c5aaeee7bebc4991e440565f2ee4c1b6f191)
|
12
|
+
- Set config.networks to [] if unset [view commit](http://github.com///commit/5aad087358792bee0bd1a6a026820b04bb8ca68f)
|
13
|
+
- Changed HandleBoxUrl to HandleBox. [view commit](http://github.com///commit/ad7b2acdea81fe6f4b50e4658ecd36762a849f74)
|
14
|
+
- Add command snapshot [view commit](http://github.com///commit/2d207ced7e70fe206fa309ed43a8ace3eb86b327)
|
15
|
+
- Orchestration support added. [view commit](http://github.com///commit/d4e098db8517d491adfeb826500ac3ec5384d237)
|
16
|
+
- Avoid using sudo to make synced_folder if possible [view commit](http://github.com///commit/b5b6205fbc34e95b4dbd9c13f974b728cb27c76e)
|
17
|
+
- Add some status messages [view commit](http://github.com///commit/0c9287bc765e074eac104e02d7a64b36bd122034)
|
18
|
+
- Modify reload action to be a real reboot [view commit](http://github.com///commit/91f5dc65a781d062d156b912bfd9d4b84db82e44)
|
19
|
+
|
3
20
|
## 0.7.0
|
4
21
|
|
5
22
|
- Merge pull request #35 from johnbellone/master [view commit](http://github.com///commit/5969261f11585e19348e903eec15617634c3c899)
|
data/README.md
CHANGED
@@ -77,6 +77,12 @@ Vagrant.configure("2") do |config|
|
|
77
77
|
os.security_groups = ['ssh', 'http'] # optional
|
78
78
|
os.tenant = "YOUR TENANT_NAME" # optional
|
79
79
|
os.floating_ip = "33.33.33.33" # optional (The floating IP to assign for this instance)
|
80
|
+
|
81
|
+
os.orchestration_stack_name = 'stack01' # optional
|
82
|
+
os.orchestration_cfn_template_file = '/tmp/cfn_heat_template.json' # optional
|
83
|
+
os.orchestration_cfn_template_parameters = { # optional
|
84
|
+
'NetworkName' => 'net_01'
|
85
|
+
}
|
80
86
|
end
|
81
87
|
end
|
82
88
|
```
|
@@ -140,6 +146,18 @@ This provider exposes quite a few provider-specific configuration options:
|
|
140
146
|
* `ssl_verify_peer` - sets the ssl_verify_peer on the underlying excon connection - useful for self signed certs etc.
|
141
147
|
* `floating_ip` - Floating ip. The floating IP to assign for this instance. If
|
142
148
|
set to :auto, then this assigns any available floating IP to the instance.
|
149
|
+
* `orchestration_stack_name` - Name for orchestration stack. Mandatory
|
150
|
+
parameter when creating new stack. One of parameters for template should be
|
151
|
+
set with this parameter.
|
152
|
+
* `orchestration_stack_destroy` - If stack created by vagrant should be deleted
|
153
|
+
when destroy action is invoked. Default value is `false`.
|
154
|
+
* `orchestration_cfn_template` - AWS CloudFormation Template specified as a string.
|
155
|
+
* `orchestration_cfn_template_file` - AWS CloudFormation Template file path
|
156
|
+
accessible for vagrant.
|
157
|
+
* `orchestration_cfn_template_url` - AWS CloudFormation Template URL.
|
158
|
+
* `orchestration_cfn_template_parameters` - AWS CloudFormation Template
|
159
|
+
parameters specified in ruby hash (take a look at example Vagrantfile).
|
160
|
+
This parameter is optional.
|
143
161
|
|
144
162
|
These can be set like typical provider-specific configuration:
|
145
163
|
|
@@ -171,6 +189,13 @@ the remote machine over SSH.
|
|
171
189
|
This is good enough for all built-in Vagrant provisioners (shell,
|
172
190
|
chef, and puppet) to work!
|
173
191
|
|
192
|
+
## Command
|
193
|
+
|
194
|
+
### Snapshot
|
195
|
+
`vagrant openstack snapshot <vmname> -n <snapshotname>`
|
196
|
+
|
197
|
+
Take snapshot of ***vmname*** with name ***snapshotname***
|
198
|
+
|
174
199
|
## Contributors
|
175
200
|
|
176
201
|
- [mitchellh](https://github.com/mitchellh)
|
@@ -16,6 +16,7 @@ module VagrantPlugins
|
|
16
16
|
if env[:result]
|
17
17
|
b1.use ConnectOpenStack
|
18
18
|
b1.use DeleteServer
|
19
|
+
b1.use DeleteOrchestrationStack
|
19
20
|
else
|
20
21
|
b1.use MessageWillNotDestroy
|
21
22
|
end
|
@@ -86,12 +87,13 @@ module VagrantPlugins
|
|
86
87
|
# This action is called when `vagrant up` is executed.
|
87
88
|
def self.action_up
|
88
89
|
Vagrant::Action::Builder.new.tap do |b|
|
89
|
-
b.use
|
90
|
+
b.use HandleBox
|
90
91
|
b.use ConfigValidate
|
91
92
|
b.use Call, IsCreated do |env, b1|
|
92
93
|
unless env[:result]
|
93
94
|
b1.use action_prepare_boot
|
94
95
|
b1.use ConnectOpenStack
|
96
|
+
b1.use CreateOrchestrationStack
|
95
97
|
b1.use CreateServer
|
96
98
|
else
|
97
99
|
b1.use action_resume
|
@@ -125,14 +127,12 @@ module VagrantPlugins
|
|
125
127
|
b.use Call, IsPaused do |env, b1|
|
126
128
|
unless env[:result]
|
127
129
|
b1.use Call, IsSuspended do |env2, b2|
|
128
|
-
|
130
|
+
b2.use RebootServer
|
129
131
|
end
|
130
132
|
end
|
131
133
|
|
132
|
-
b1.use Call, WaitForState, [:
|
133
|
-
|
134
|
-
b2.use action_up
|
135
|
-
else
|
134
|
+
b1.use Call, WaitForState, [:active], 120 do |env2, b2|
|
135
|
+
unless env2[:result]
|
136
136
|
b2.use HardRebootServer
|
137
137
|
end
|
138
138
|
end
|
@@ -198,6 +198,34 @@ module VagrantPlugins
|
|
198
198
|
end
|
199
199
|
end
|
200
200
|
|
201
|
+
def self.action_take_snapshot
|
202
|
+
Vagrant::Action::Builder.new.tap do |b|
|
203
|
+
b.use ConfigValidate
|
204
|
+
b.use Call, IsCreated do |env, b1|
|
205
|
+
if env[:result]
|
206
|
+
b1.use ConnectOpenStack
|
207
|
+
b1.use Call, IsSnapshoting do |env,b2|
|
208
|
+
if env[:result]
|
209
|
+
b2.use MessageSnapshotInProgress
|
210
|
+
else
|
211
|
+
b2.use TakeSnapshot
|
212
|
+
end
|
213
|
+
|
214
|
+
b2.use Call, WaitForTask, [nil], 1200 do |env3, b3|
|
215
|
+
if env3[:result]
|
216
|
+
b3.use MessageSnapshotDone
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
end
|
222
|
+
else
|
223
|
+
b1.use MessageNotCreated
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
201
229
|
# The autoload farm
|
202
230
|
action_root = Pathname.new(File.expand_path("../action", __FILE__))
|
203
231
|
autoload :ConnectOpenStack, action_root.join("connect_openstack")
|
@@ -206,12 +234,15 @@ module VagrantPlugins
|
|
206
234
|
autoload :HardRebootServer, action_root.join("hard_reboot_server")
|
207
235
|
autoload :IsCreated, action_root.join("is_created")
|
208
236
|
autoload :IsPaused, action_root.join("is_paused")
|
237
|
+
autoload :IsSnapshoting, action_root.join("is_snapshoting")
|
209
238
|
autoload :IsSuspended, action_root.join("is_suspended")
|
210
239
|
autoload :MessageAlreadyCreated, action_root.join("message_already_created")
|
211
240
|
autoload :MessageAlreadyPaused, action_root.join("message_already_paused")
|
212
241
|
autoload :MessageAlreadySuspended, action_root.join("message_already_suspended")
|
213
242
|
autoload :MessageNotCreated, action_root.join("message_not_created")
|
214
243
|
autoload :MessageNotSuspended, action_root.join("message_not_suspended")
|
244
|
+
autoload :MessageSnapshotDone, action_root.join("message_snapshot_done")
|
245
|
+
autoload :MessageSnapshotInProgress, action_root.join("message_snapshot_in_progress")
|
215
246
|
autoload :MessageWillNotDestroy, action_root.join("message_will_not_destroy")
|
216
247
|
autoload :MessageServerRunning, action_root.join("message_server_running")
|
217
248
|
autoload :PauseServer, action_root.join("pause_server")
|
@@ -221,8 +252,12 @@ module VagrantPlugins
|
|
221
252
|
autoload :ResumeServer, action_root.join("resume_server")
|
222
253
|
autoload :SuspendServer, action_root.join("suspend_server")
|
223
254
|
autoload :SyncFolders, action_root.join("sync_folders")
|
255
|
+
autoload :TakeSnapshot, action_root.join("take_snapshot")
|
224
256
|
autoload :WaitForState, action_root.join("wait_for_state")
|
257
|
+
autoload :WaitForTask, action_root.join("wait_for_task")
|
225
258
|
autoload :WarnNetworks, action_root.join("warn_networks")
|
259
|
+
autoload :CreateOrchestrationStack, action_root.join("create_orchestration_stack")
|
260
|
+
autoload :DeleteOrchestrationStack, action_root.join("delete_orchestration_stack")
|
226
261
|
end
|
227
262
|
end
|
228
263
|
end
|
@@ -29,17 +29,22 @@ module VagrantPlugins
|
|
29
29
|
:ssl_verify_peer => config.ssl_verify_peer
|
30
30
|
}
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
env[:
|
35
|
-
:provider
|
32
|
+
# Prepare connection parameters for use with fog service
|
33
|
+
# initialization (compute, storage, orchestration, ...).
|
34
|
+
env[:fog_openstack_params] = {
|
35
|
+
:provider => :openstack,
|
36
36
|
:connection_options => connection_options,
|
37
37
|
:openstack_username => username,
|
38
|
-
:openstack_api_key
|
38
|
+
:openstack_api_key => api_key,
|
39
39
|
:openstack_auth_url => endpoint,
|
40
|
-
:openstack_tenant
|
41
|
-
:openstack_region
|
42
|
-
}
|
40
|
+
:openstack_tenant => tenant,
|
41
|
+
:openstack_region => region
|
42
|
+
}
|
43
|
+
|
44
|
+
@logger.info("Connecting to OpenStack...")
|
45
|
+
@logger.debug("API connection params: #{connection_options.inspect}")
|
46
|
+
env[:openstack_compute] = Fog::Compute.new(
|
47
|
+
env[:fog_openstack_params])
|
43
48
|
|
44
49
|
if config.networks && !config.networks.empty?
|
45
50
|
env[:openstack_network] = Fog::Network.new({
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require "fog"
|
2
|
+
require "log4r"
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module OpenStack
|
6
|
+
module Action
|
7
|
+
class CreateOrchestrationStack
|
8
|
+
|
9
|
+
def initialize(app, env)
|
10
|
+
@app = app
|
11
|
+
@logger = Log4r::Logger.new(
|
12
|
+
"vagrant_openstack::action::create_orchestration_stack")
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
# Get the config.
|
17
|
+
config = env[:machine].provider_config
|
18
|
+
|
19
|
+
# Are we going to handle orchestration stacks?
|
20
|
+
if not config.orchestration_stack_name
|
21
|
+
return @app.call(env)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Create new fog orchestration service.
|
25
|
+
env[:openstack_orchestration] = Fog::Orchestration.new(
|
26
|
+
env[:fog_openstack_params])
|
27
|
+
|
28
|
+
# Check if stack is already created.
|
29
|
+
env[:openstack_orchestration].list_stacks.body['stacks'].each do |stack|
|
30
|
+
if config.orchestration_stack_name == stack['stack_name']
|
31
|
+
return @app.call(env)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# To avoid confusion, only one source for orchestration template
|
36
|
+
# should be set.
|
37
|
+
if [config.orchestration_cfn_template,
|
38
|
+
config.orchestration_cfn_template_file,
|
39
|
+
config.orchestration_cfn_template_url].count(nil) != 2
|
40
|
+
raise Errors::OrchestrationTemplateError,
|
41
|
+
:err => 'One source for orchestration template should be specified.'
|
42
|
+
end
|
43
|
+
|
44
|
+
# Prepare parameters for new orchestration stack.
|
45
|
+
# TODO: configurable parameters
|
46
|
+
stack_params = {
|
47
|
+
:disable_rollback => false,
|
48
|
+
:timeout_in_minutes => 5,
|
49
|
+
}
|
50
|
+
|
51
|
+
# Set template source.
|
52
|
+
if config.orchestration_cfn_template
|
53
|
+
stack_params[:template] = config.orchestration_cfn_template
|
54
|
+
elsif config.orchestration_cfn_template_file
|
55
|
+
if not File.exist?(config.orchestration_cfn_template_file)
|
56
|
+
raise Errors::OrchestrationNoTemplateFileError,
|
57
|
+
:fname => config.orchestration_cfn_template_file
|
58
|
+
end
|
59
|
+
|
60
|
+
# Load template file content. Newlines can cause parse error of
|
61
|
+
# input JSON string.
|
62
|
+
stack_params[:template] = ''
|
63
|
+
File.open(config.orchestration_cfn_template_file) { |file|
|
64
|
+
file.each_line do |line|
|
65
|
+
stack_params[:template] << line
|
66
|
+
end
|
67
|
+
}
|
68
|
+
else
|
69
|
+
stack_params[:template_url] = config.orchestration_cfn_template_url
|
70
|
+
end
|
71
|
+
|
72
|
+
# Set template parameters.
|
73
|
+
stack_params[:parameters] = config.orchestration_cfn_template_parameters
|
74
|
+
|
75
|
+
# Create new stack.
|
76
|
+
env[:ui].info(I18n.t("vagrant_openstack.creating_orchestration_stack"))
|
77
|
+
stack = env[:openstack_orchestration].create_stack(
|
78
|
+
config.orchestration_stack_name, stack_params)
|
79
|
+
|
80
|
+
# Write UUID of newly created stack into file for later use (stack removal).
|
81
|
+
created_stacks_fname = env[:machine].data_dir + 'orchestration_stacks'
|
82
|
+
message = 'Saving information about created orchestration stack '
|
83
|
+
message << "#{config.orchestration_stack_name}, "
|
84
|
+
message << "UUID=#{stack.body['stack']['id']} "
|
85
|
+
message << "to file #{created_stacks_fname}."
|
86
|
+
@logger.info(message)
|
87
|
+
|
88
|
+
File.open(created_stacks_fname, 'a') do |file|
|
89
|
+
file.puts stack.body['stack']['id']
|
90
|
+
end
|
91
|
+
|
92
|
+
@app.call(env)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require "fog"
|
2
|
+
require "log4r"
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module OpenStack
|
6
|
+
module Action
|
7
|
+
class DeleteOrchestrationStack
|
8
|
+
|
9
|
+
def initialize(app, env)
|
10
|
+
@app = app
|
11
|
+
@logger = Log4r::Logger.new(
|
12
|
+
"vagrant_openstack::action::delete_orchestration_stack")
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
# Get the config.
|
17
|
+
config = env[:machine].provider_config
|
18
|
+
|
19
|
+
# Load IDs for orchestration stacks created by vagrant and this
|
20
|
+
# project.
|
21
|
+
created_stacks_fname = env[:machine].data_dir + 'orchestration_stacks'
|
22
|
+
|
23
|
+
# Return if no action is needed.
|
24
|
+
if not config.orchestration_stack_destroy or not File.exist?(created_stacks_fname)
|
25
|
+
env[:machine].id = nil
|
26
|
+
return @app.call(env)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Create new fog orchestration service.
|
30
|
+
env[:openstack_orchestration] = Fog::Orchestration.new(
|
31
|
+
env[:fog_openstack_params])
|
32
|
+
|
33
|
+
# Load IDs of stacks to be deleted.
|
34
|
+
available_stacks = env[:openstack_orchestration].list_stacks.body['stacks']
|
35
|
+
stacks_to_delete = []
|
36
|
+
File.open(created_stacks_fname) { |file|
|
37
|
+
file.each_line do |stack_id|
|
38
|
+
stack = find_stack(available_stacks, stack_id.chomp!)
|
39
|
+
next if not stack
|
40
|
+
stacks_to_delete << stack
|
41
|
+
end
|
42
|
+
}
|
43
|
+
|
44
|
+
# Delete stacks.
|
45
|
+
if stacks_to_delete.length > 0
|
46
|
+
env[:ui].info(I18n.t("vagrant_openstack.deleting_orchestration_stacks"))
|
47
|
+
end
|
48
|
+
|
49
|
+
stacks_to_delete.each do |stack|
|
50
|
+
@logger.info("Removing orchestration stack #{stack['stack_name']} (#{stack['id']}).")
|
51
|
+
env[:openstack_orchestration].delete_stack(
|
52
|
+
stack['stack_name'], stack['id'])
|
53
|
+
|
54
|
+
stacks_from_file.delete(stack)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Delete file holding created stack IDs.
|
58
|
+
@logger.info("Deleting file #{created_stacks_fname}.")
|
59
|
+
File.delete(created_stacks_fname)
|
60
|
+
|
61
|
+
env[:machine].id = nil
|
62
|
+
@app.call(env)
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def find_stack(available_stacks, stack_id)
|
68
|
+
available_stacks.each do |stack|
|
69
|
+
if stack['id'] == stack_id
|
70
|
+
return stack
|
71
|
+
end
|
72
|
+
end
|
73
|
+
false
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module OpenStack
|
3
|
+
module Action
|
4
|
+
class IsSnapshoting
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
if env[:machine].id
|
11
|
+
infos = env[:openstack_compute].get_server_details(env[:machine].id)
|
12
|
+
task = infos.body['server']['OS-EXT-STS:task_state']
|
13
|
+
if task == 'image_snapshot' || task == 'image_pending_upload'
|
14
|
+
env[:result] = true
|
15
|
+
else
|
16
|
+
env[:result] = false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
@app.call(env)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module OpenStack
|
3
|
+
module Action
|
4
|
+
class MessageSnapshotDone
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
env[:ui].info(I18n.t("vagrant_openstack.snapshot_done"))
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module OpenStack
|
3
|
+
module Action
|
4
|
+
class MessageSnapshotInProgress
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
env[:ui].info(I18n.t("vagrant_openstack.snapshot_in_progress"))
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -37,9 +37,15 @@ module VagrantPlugins
|
|
37
37
|
:guestpath => guestpath))
|
38
38
|
|
39
39
|
# Create the guest path
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
# Use sudo only when it is necessary
|
41
|
+
cmd_mkdir = "mkdir -p '#{guestpath}'"
|
42
|
+
cmd_chown = "chown #{ssh_info[:username]} '#{guestpath}'"
|
43
|
+
if env[:machine].communicate.execute(cmd_mkdir, :error_check => false) != 0 then
|
44
|
+
env[:machine].communicate.sudo(cmd_mkdir)
|
45
|
+
end
|
46
|
+
if env[:machine].communicate.execute(cmd_chown, :error_check => false) != 0 then
|
47
|
+
env[:machine].communicate.sudo(cmd_chown)
|
48
|
+
end
|
43
49
|
|
44
50
|
#collect rsync excludes specified :rsync_excludes=>['path1',...] in synced_folder options
|
45
51
|
excludes = ['.vagrant/', 'Vagrantfile', *Array(data[:rsync_excludes])].uniq
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module OpenStack
|
5
|
+
module Action
|
6
|
+
# This reboots a running server, if there is one.
|
7
|
+
class TakeSnapshot
|
8
|
+
def initialize(app, env)
|
9
|
+
@app = app
|
10
|
+
@logger = Log4r::Logger.new("vagrant_openstack::action::take_snapshot")
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
if env[:machine].id
|
15
|
+
env[:ui].info(I18n.t("vagrant_openstack.snapshoting_server"))
|
16
|
+
infos = env[:openstack_compute].get_server_details(env[:machine].id)
|
17
|
+
env[:openstack_compute].create_image(env[:machine].id,env[:openstack_snapshot_name] || 'snapshot')
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
@app.call(env)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'log4r'
|
3
|
+
require 'timeout'
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module OpenStack
|
7
|
+
module Action
|
8
|
+
# This action will wait for a machine to reach a specific state or quit by timeout.
|
9
|
+
class WaitForTask
|
10
|
+
def initialize(app, env, task, timeout)
|
11
|
+
@app = app
|
12
|
+
@logger = Log4r::Logger.new('vagrant_openstack::action::wait_for_task')
|
13
|
+
@task = Array.new(task).flatten
|
14
|
+
@timeout = timeout
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
env[:result] = true
|
19
|
+
task = get_task(env)
|
20
|
+
|
21
|
+
if @task.include?(task)
|
22
|
+
@logger.info("Machine already at task #{ task.to_s }")
|
23
|
+
else
|
24
|
+
@logger.info("Waiting for machine to reach task...")
|
25
|
+
begin
|
26
|
+
Timeout.timeout(@timeout) do
|
27
|
+
sleep 5 until @task.include?(get_task(env))
|
28
|
+
end
|
29
|
+
rescue Timeout::Error
|
30
|
+
env[:result] = false
|
31
|
+
end
|
32
|
+
|
33
|
+
@app.call(env)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_task(env)
|
38
|
+
infos = env[:openstack_compute].get_server_details(env[:machine].id)
|
39
|
+
infos.body['server']['OS-EXT-STS:task_state']
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require "vagrant"
|
2
|
+
require "vagrant/action/builder"
|
3
|
+
require "pathname"
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module OpenStack
|
7
|
+
module Action
|
8
|
+
|
9
|
+
class Command < Vagrant.plugin(2, :command)
|
10
|
+
|
11
|
+
include Vagrant::Action::Builtin
|
12
|
+
# include VagrantPlugins::OpenStack::Action
|
13
|
+
|
14
|
+
def initialize(argv, env)
|
15
|
+
super
|
16
|
+
|
17
|
+
@main_args, @sub_command, @sub_args = split_main_and_subcommand(argv)
|
18
|
+
|
19
|
+
@subcommands = Vagrant::Registry.new
|
20
|
+
@subcommands.register(:snapshot) do
|
21
|
+
require_relative 'command/command_snapshot'
|
22
|
+
CommandTakeSnapshot
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
def execute
|
29
|
+
if @main_args.include?("-h") || @main_args.include?("--help")
|
30
|
+
# Print the help for all the sub-commands.
|
31
|
+
return help
|
32
|
+
end
|
33
|
+
|
34
|
+
# If we reached this far then we must have a subcommand. If not,
|
35
|
+
# then we also just print the help and exit.
|
36
|
+
command_class = @subcommands.get(@sub_command.to_sym) if @sub_command
|
37
|
+
return help if !command_class || !@sub_command
|
38
|
+
@logger.debug("Invoking command class: #{command_class} #{@sub_args.inspect}")
|
39
|
+
|
40
|
+
# Initialize and execute the command class
|
41
|
+
command_class.new(@sub_args, @env).execute
|
42
|
+
end
|
43
|
+
|
44
|
+
# Prints the help out for this command
|
45
|
+
def help
|
46
|
+
opts = OptionParser.new do |o|
|
47
|
+
o.banner = "Usage: vagrant openstack <command> [<args>]"
|
48
|
+
o.separator ""
|
49
|
+
o.separator "Available subcommands:"
|
50
|
+
|
51
|
+
# Add the available subcommands as separators in order to print them
|
52
|
+
# out as well.
|
53
|
+
keys = []
|
54
|
+
@subcommands.each { |key, value| keys << key.to_s }
|
55
|
+
|
56
|
+
keys.sort.each do |key|
|
57
|
+
o.separator " #{key}"
|
58
|
+
end
|
59
|
+
|
60
|
+
o.separator ""
|
61
|
+
o.separator "For help on any individual command run `vagrant openstack <command> -h`"
|
62
|
+
end
|
63
|
+
|
64
|
+
@env.ui.info(opts.help, :prefix => false)
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "vagrant"
|
2
|
+
require "vagrant/action/builder"
|
3
|
+
require "pathname"
|
4
|
+
require "vagrant-openstack-plugin/action"
|
5
|
+
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module OpenStack
|
9
|
+
module Action
|
10
|
+
class CommandTakeSnapshot < Vagrant.plugin("2", :command)
|
11
|
+
include Vagrant::Action::Builtin
|
12
|
+
|
13
|
+
def execute
|
14
|
+
options = {:openstack_snapshot_name => 'snapshot'}
|
15
|
+
opts = OptionParser.new do |opts|
|
16
|
+
opts.banner = "Enters openstack"
|
17
|
+
opts.separator ""
|
18
|
+
opts.separator "Usage: vagrant openstack snapshot <vmname> -n <snapshotname>"
|
19
|
+
|
20
|
+
|
21
|
+
opts.on( '-n', '--name NAME', 'snapshotname' ) do |name|
|
22
|
+
options[:openstack_snapshot_name] = name
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
# Parse the options
|
28
|
+
argv = parse_options(opts)
|
29
|
+
|
30
|
+
return if !argv
|
31
|
+
|
32
|
+
|
33
|
+
with_target_vms(argv, :reverse => true) do |vm|
|
34
|
+
if vm.provider.to_s == VagrantPlugins::OpenStack::Provider.new(nil).to_s
|
35
|
+
vm.action(:take_snapshot,options)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -103,6 +103,14 @@ module VagrantPlugins
|
|
103
103
|
# signed ssl certificate
|
104
104
|
attr_accessor :ssl_verify_peer
|
105
105
|
|
106
|
+
# Heat orchestration configuration parameters.
|
107
|
+
attr_accessor :orchestration_stack_name
|
108
|
+
attr_accessor :orchestration_stack_destroy
|
109
|
+
attr_accessor :orchestration_cfn_template
|
110
|
+
attr_accessor :orchestration_cfn_template_file
|
111
|
+
attr_accessor :orchestration_cfn_template_url
|
112
|
+
attr_accessor :orchestration_cfn_template_parameters
|
113
|
+
|
106
114
|
def initialize
|
107
115
|
@api_key = UNSET_VALUE
|
108
116
|
@endpoint = UNSET_VALUE
|
@@ -125,6 +133,12 @@ module VagrantPlugins
|
|
125
133
|
@region = UNSET_VALUE
|
126
134
|
@proxy = UNSET_VALUE
|
127
135
|
@ssl_verify_peer = UNSET_VALUE
|
136
|
+
@orchestration_stack_name = UNSET_VALUE
|
137
|
+
@orchestration_stack_destroy = UNSET_VALUE
|
138
|
+
@orchestration_cfn_template = UNSET_VALUE
|
139
|
+
@orchestration_cfn_template_file = UNSET_VALUE
|
140
|
+
@orchestration_cfn_template_url = UNSET_VALUE
|
141
|
+
@orchestration_cfn_template_parameters = UNSET_VALUE
|
128
142
|
end
|
129
143
|
|
130
144
|
def finalize!
|
@@ -157,6 +171,13 @@ module VagrantPlugins
|
|
157
171
|
@region = nil if @region == UNSET_VALUE
|
158
172
|
@proxy = nil if @proxy == UNSET_VALUE
|
159
173
|
@ssl_verify_peer = nil if @ssl_verify_peer == UNSET_VALUE
|
174
|
+
|
175
|
+
@orchestration_stack_name = nil if @orchestration_stack_name == UNSET_VALUE
|
176
|
+
@orchestration_stack_destroy = false if @orchestration_stack_destroy == UNSET_VALUE
|
177
|
+
@orchestration_cfn_template = nil if @orchestration_cfn_template == UNSET_VALUE
|
178
|
+
@orchestration_cfn_template_file = nil if @orchestration_cfn_template_file == UNSET_VALUE
|
179
|
+
@orchestration_cfn_template_url = nil if @orchestration_cfn_template_url == UNSET_VALUE
|
180
|
+
@orchestration_cfn_template_parameters = nil if @orchestration_cfn_template_parameters == UNSET_VALUE
|
160
181
|
end
|
161
182
|
|
162
183
|
def validate(machine)
|
@@ -34,6 +34,14 @@ module VagrantPlugins
|
|
34
34
|
class FloatingIPNotFound < VagrantOpenStackError
|
35
35
|
error_key(:floating_ip_not_found)
|
36
36
|
end
|
37
|
+
|
38
|
+
class OrchestrationTemplateError < VagrantOpenStackError
|
39
|
+
error_key(:orchestration_template_error)
|
40
|
+
end
|
41
|
+
|
42
|
+
class OrchestrationNoTemplateFileError < VagrantOpenStackError
|
43
|
+
error_key(:orchestration_no_template_file_error)
|
44
|
+
end
|
37
45
|
end
|
38
46
|
end
|
39
47
|
end
|
@@ -12,25 +12,33 @@ end
|
|
12
12
|
|
13
13
|
module VagrantPlugins
|
14
14
|
module OpenStack
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
module Action
|
16
|
+
class Plugin < Vagrant.plugin("2")
|
17
|
+
name "OpenStack Cloud"
|
18
|
+
description <<-DESC
|
18
19
|
This plugin enables Vagrant to manage machines in OpenStack Cloud.
|
19
|
-
|
20
|
+
DESC
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
config(:openstack, :provider) do
|
23
|
+
require_relative "config"
|
24
|
+
Config
|
25
|
+
end
|
26
|
+
|
27
|
+
provider(:openstack, parallel: true) do
|
28
|
+
# Setup some things
|
29
|
+
OpenStack.init_i18n
|
30
|
+
OpenStack.init_logging
|
31
|
+
|
32
|
+
# Load the actual provider
|
33
|
+
require_relative "provider"
|
34
|
+
Provider
|
35
|
+
end
|
25
36
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
37
|
+
command "openstack" do
|
38
|
+
require_relative "command"
|
39
|
+
Command
|
40
|
+
end
|
30
41
|
|
31
|
-
# Load the actual provider
|
32
|
-
require_relative "provider"
|
33
|
-
Provider
|
34
42
|
end
|
35
43
|
end
|
36
44
|
end
|
data/locales/en.yml
CHANGED
@@ -26,6 +26,12 @@ en:
|
|
26
26
|
The server is ready!
|
27
27
|
rebooting_server: |-
|
28
28
|
This server instance is rebooting!
|
29
|
+
snapshoting_server: |-
|
30
|
+
This server instance is snapshoting!
|
31
|
+
snapshot_done: |-
|
32
|
+
Snapshot is ok
|
33
|
+
snapshot_in_progress: |-
|
34
|
+
Snapshot is in progress
|
29
35
|
resuming_server: |-
|
30
36
|
The server instance has been resumed.
|
31
37
|
rsync_folder: |-
|
@@ -45,7 +51,10 @@ en:
|
|
45
51
|
will_not_destroy: |-
|
46
52
|
The instance '%{name}' will not be destroyed, since the confirmation
|
47
53
|
was declined.
|
48
|
-
|
54
|
+
creating_orchestration_stack: |-
|
55
|
+
Creating orchestration stack...
|
56
|
+
deleting_orchestration_stacks: |-
|
57
|
+
Deleting orchestration stacks...
|
49
58
|
config:
|
50
59
|
api_key_required: |-
|
51
60
|
An API key is required.
|
@@ -84,6 +93,12 @@ en:
|
|
84
93
|
floating_ip_not_found: |-
|
85
94
|
A floating IP could not be allocated, as no available floating
|
86
95
|
IPs were found in OpenStack
|
96
|
+
orchestration_template_error: |-
|
97
|
+
There was an error while reading orchestration template.
|
98
|
+
Error: %{err}
|
99
|
+
orchestration_no_template_file_error: |-
|
100
|
+
Orchestration template file not found (%{fname}).
|
101
|
+
|
87
102
|
states:
|
88
103
|
short_active: |-
|
89
104
|
active
|
@@ -91,6 +106,12 @@ en:
|
|
91
106
|
The server is up and running. Run `vagrant ssh` to access it.
|
92
107
|
short_build: |-
|
93
108
|
building
|
109
|
+
short_suspended: |-
|
110
|
+
suspended
|
111
|
+
short_paused: |-
|
112
|
+
paused
|
113
|
+
short_shutoff: |-
|
114
|
+
shutdown
|
94
115
|
long_build: |-
|
95
116
|
The server is currently being built. You must wait for this to
|
96
117
|
complete before you can access it. You can delete the server, however,
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |gem|
|
|
12
12
|
gem.summary = "Enables Vagrant to manage machines in OpenStack Cloud."
|
13
13
|
gem.homepage = "http://www.vagrantup.com"
|
14
14
|
|
15
|
-
gem.add_runtime_dependency "fog", ">= 1.
|
15
|
+
gem.add_runtime_dependency "fog", ">= 1.16.0"
|
16
16
|
|
17
17
|
gem.add_development_dependency "rake"
|
18
18
|
gem.add_development_dependency "rspec", "~> 2.13.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-openstack-plugin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Edmund Haselwanter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fog
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.16.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.16.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,17 +73,22 @@ files:
|
|
73
73
|
- lib/vagrant-openstack-plugin.rb
|
74
74
|
- lib/vagrant-openstack-plugin/action.rb
|
75
75
|
- lib/vagrant-openstack-plugin/action/connect_openstack.rb
|
76
|
+
- lib/vagrant-openstack-plugin/action/create_orchestration_stack.rb
|
76
77
|
- lib/vagrant-openstack-plugin/action/create_server.rb
|
78
|
+
- lib/vagrant-openstack-plugin/action/delete_orchestration_stack.rb
|
77
79
|
- lib/vagrant-openstack-plugin/action/delete_server.rb
|
78
80
|
- lib/vagrant-openstack-plugin/action/hard_reboot_server.rb
|
79
81
|
- lib/vagrant-openstack-plugin/action/is_created.rb
|
80
82
|
- lib/vagrant-openstack-plugin/action/is_paused.rb
|
83
|
+
- lib/vagrant-openstack-plugin/action/is_snapshoting.rb
|
81
84
|
- lib/vagrant-openstack-plugin/action/is_suspended.rb
|
82
85
|
- lib/vagrant-openstack-plugin/action/message_already_created.rb
|
83
86
|
- lib/vagrant-openstack-plugin/action/message_already_paused.rb
|
84
87
|
- lib/vagrant-openstack-plugin/action/message_already_suspended.rb
|
85
88
|
- lib/vagrant-openstack-plugin/action/message_not_created.rb
|
86
89
|
- lib/vagrant-openstack-plugin/action/message_server_running.rb
|
90
|
+
- lib/vagrant-openstack-plugin/action/message_snapshot_done.rb
|
91
|
+
- lib/vagrant-openstack-plugin/action/message_snapshot_in_progress.rb
|
87
92
|
- lib/vagrant-openstack-plugin/action/message_will_not_destroy.rb
|
88
93
|
- lib/vagrant-openstack-plugin/action/pause_server.rb
|
89
94
|
- lib/vagrant-openstack-plugin/action/read_ssh_info.rb
|
@@ -92,8 +97,12 @@ files:
|
|
92
97
|
- lib/vagrant-openstack-plugin/action/resume_server.rb
|
93
98
|
- lib/vagrant-openstack-plugin/action/suspend_server.rb
|
94
99
|
- lib/vagrant-openstack-plugin/action/sync_folders.rb
|
100
|
+
- lib/vagrant-openstack-plugin/action/take_snapshot.rb
|
95
101
|
- lib/vagrant-openstack-plugin/action/wait_for_state.rb
|
102
|
+
- lib/vagrant-openstack-plugin/action/wait_for_task.rb
|
96
103
|
- lib/vagrant-openstack-plugin/action/warn_networks.rb
|
104
|
+
- lib/vagrant-openstack-plugin/command.rb
|
105
|
+
- lib/vagrant-openstack-plugin/command/command_snapshot.rb
|
97
106
|
- lib/vagrant-openstack-plugin/config.rb
|
98
107
|
- lib/vagrant-openstack-plugin/errors.rb
|
99
108
|
- lib/vagrant-openstack-plugin/plugin.rb
|