vagrant-orchestrate 0.5.3 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +2 -0
- data/lib/vagrant-managed-servers/action.rb +31 -0
- data/lib/vagrant-managed-servers/action/download_status.rb +38 -0
- data/lib/vagrant-managed-servers/action/upload_status.rb +41 -0
- data/lib/vagrant-orchestrate/command/init.rb +1 -1
- data/lib/vagrant-orchestrate/command/push.rb +14 -35
- data/lib/vagrant-orchestrate/command/status.rb +17 -25
- data/lib/vagrant-orchestrate/repo_status.rb +7 -0
- data/lib/vagrant-orchestrate/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: daf8bdc44383203b8cc60e708fbd4ef931c88897
|
4
|
+
data.tar.gz: 2917a0107512412d3c210c78fd1ba0c10e895d19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90e979ed582054c9f26c9458779103ca7f30230b5733843e57f46f4cae8932f8024abc00aa9eaf02c7042996761554842afeb99a04c7fe652c0a2f816b8db146
|
7
|
+
data.tar.gz: cf23917f10e5672b2372690dcf57ee61d6a1135ee44a503d709c8753475e4d944d6da01e7227b027612dfc15cb59152fd4b5c3b44b40f194af7861906c215f90
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
0.6.0 (May 15th, 2015)
|
2
|
+
|
3
|
+
- Refactor the push command to compose middleware actions rather than performing
|
4
|
+
a bunch of work in the command itself. This means that a push using the `parallel`
|
5
|
+
strategy will truly be parallel per box, as opposed to the old implementation where
|
6
|
+
the `up`, `provision`, `upload_stats`, and `destroy` phases would each happen in
|
7
|
+
parallel, but the phases would be done in series.
|
8
|
+
- Change the `vagrant orchestrate status` command so that it will run in parallel.
|
9
|
+
- Add `vagrant-orchestrate` as a default required plugin. Someone will have to
|
10
|
+
install it "by hand" to access the init functionality, but other users pulling
|
11
|
+
down a repo with a committed Vagrantfile will not, making each repo more self-contained.
|
12
|
+
|
1
13
|
0.5.3 (May 13th, 2015)
|
2
14
|
|
3
15
|
- Fix a bug where the VAGRANT_ORCHESTRATE_USERNAME and VAGRANT_ORCHESTRATE_PASSWORD
|
data/README.md
CHANGED
@@ -205,6 +205,8 @@ You'll need to bootstrap the target machine. The following script should get you
|
|
205
205
|
winrm quickconfig
|
206
206
|
winrm set winrm/config/service/auth @{Negotiate="true"}
|
207
207
|
winrm set winrm/config/service @{AllowUnencrypted="false"}
|
208
|
+
winrm set winrm/config/winrs @{MaxShellsPerUser="25"}
|
209
|
+
winrm set winrm/config/winrs @{MaxConcurrentUsers="25"}
|
208
210
|
sc config winrm start= auto
|
209
211
|
sc config winrm type= own
|
210
212
|
```
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# It is useful to be able to call up, provision, reload, and destroy as a single
|
2
|
+
# unit - it makes things like parallel provisioning more seamless and provides
|
3
|
+
# a useful action hook for the push command.
|
4
|
+
module VagrantPlugins
|
5
|
+
module ManagedServers
|
6
|
+
module Action
|
7
|
+
include Vagrant::Action::Builtin
|
8
|
+
|
9
|
+
def self.action_push
|
10
|
+
Vagrant::Action::Builder.new.tap do |b|
|
11
|
+
b.use action_up
|
12
|
+
b.use Call, action_provision do |env, b2|
|
13
|
+
if env[:reboot]
|
14
|
+
b2.use Call, action_reload do |_env, _b3|
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
b.use UploadStatus
|
19
|
+
b.use action_destroy
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.action_download_status
|
24
|
+
Vagrant::Action::Builder.new.tap do |b|
|
25
|
+
b.use ConfigValidate
|
26
|
+
b.use DownloadStatus
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module ManagedServers
|
5
|
+
module Action
|
6
|
+
class DownloadStatus
|
7
|
+
def initialize(app, _env)
|
8
|
+
@app = app
|
9
|
+
@logger = Log4r::Logger.new("vagrant_managed_servers::action::print_status")
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
download_status(env[:machine], env[:local_file_path], env[:remote_file_path], env[:ui])
|
14
|
+
|
15
|
+
@app.call(env)
|
16
|
+
end
|
17
|
+
|
18
|
+
def download_status(machine, local, remote, ui)
|
19
|
+
machine.communicate.wait_for_ready(5)
|
20
|
+
@logger.debug("Downloading orchestrate status for #{machine.name}")
|
21
|
+
@logger.debug(" remote file: #{remote}")
|
22
|
+
@logger.debug(" local file: #{local}")
|
23
|
+
machine.communicate.download(remote, local)
|
24
|
+
content = File.read(local)
|
25
|
+
@logger.debug("File content:")
|
26
|
+
@logger.debug(content)
|
27
|
+
status = JSON.parse(content)
|
28
|
+
ENV["VAGRANT_ORCHESTRATE_STATUS"] += machine.name.to_s + " " + status["last_sync"] + \
|
29
|
+
" " + status["ref"] + " " + status["user"] + "\n"
|
30
|
+
rescue => ex
|
31
|
+
ui.warn("Error downloading status for #{machine.name}.")
|
32
|
+
ui.warn(ex.message)
|
33
|
+
ENV["VAGRANT_ORCHESTRATE_STATUS"] += machine.name.to_s + " Status unavailable.\n"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module ManagedServers
|
5
|
+
module Action
|
6
|
+
class UploadStatus
|
7
|
+
def initialize(app, _env)
|
8
|
+
@app = app
|
9
|
+
@logger = Log4r::Logger.new("vagrant_managed_servers::action::upload_status")
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
upload_status(env[:status], env[:machine], env[:ui])
|
14
|
+
|
15
|
+
@app.call(env)
|
16
|
+
end
|
17
|
+
|
18
|
+
def upload_status(status, machine, ui)
|
19
|
+
source = status.local_path
|
20
|
+
destination = status.remote_path(machine.config.vm.communicator)
|
21
|
+
parent_folder = File.split(destination)[0]
|
22
|
+
machine.communicate.wait_for_ready(5)
|
23
|
+
@logger.debug("Ensuring vagrant_orchestrate status directory exists")
|
24
|
+
machine.communicate.sudo("mkdir -p #{parent_folder}")
|
25
|
+
machine.communicate.sudo("chmod 777 #{parent_folder}")
|
26
|
+
ui.info("Uploading vagrant orchestrate status")
|
27
|
+
@logger.debug("Uploading vagrant_orchestrate status")
|
28
|
+
@logger.debug(" source: #{source}")
|
29
|
+
@logger.debug(" dest: #{destination}")
|
30
|
+
machine.communicate.upload(source, destination)
|
31
|
+
@logger.debug("Setting uploaded file world-writable")
|
32
|
+
machine.communicate.sudo("chmod 777 #{destination}")
|
33
|
+
rescue => ex
|
34
|
+
@logger.error(ex)
|
35
|
+
ui.warn("An error occurred when trying to upload status to #{machine.name}. Continuing")
|
36
|
+
ui.warn(ex.message)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -13,7 +13,7 @@ module VagrantPlugins
|
|
13
13
|
DEFAULT_WINRM_PASSWORD = "{{YOUR_WINRM_PASSWORD}}"
|
14
14
|
DEFAULT_SSH_USERNAME = "{{YOUR_SSH_USERNAME}}"
|
15
15
|
DEFAULT_SSH_PRIVATE_KEY_PATH = "{{YOUR_SSH_PRIVATE_KEY_PATH}}"
|
16
|
-
DEFAULT_PLUGINS = ["vagrant-managed-servers"]
|
16
|
+
DEFAULT_PLUGINS = ["vagrant-orchestrate", "vagrant-managed-servers"]
|
17
17
|
|
18
18
|
# rubocop:disable Metrics/AbcSize, MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
19
19
|
def execute
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require "English"
|
2
2
|
require "optparse"
|
3
3
|
require "vagrant"
|
4
|
+
require "vagrant-managed-servers/action/upload_status"
|
5
|
+
require_relative "../../vagrant-managed-servers/action"
|
4
6
|
require "vagrant-orchestrate/action/setcredentials"
|
5
7
|
require "vagrant-orchestrate/repo_status"
|
6
8
|
require_relative "command_mixins"
|
@@ -60,6 +62,12 @@ module VagrantPlugins
|
|
60
62
|
|
61
63
|
retrieve_creds(machines) if @env.vagrantfile.config.orchestrate.credentials
|
62
64
|
|
65
|
+
# Write the status file to disk so that it can be used as part of the
|
66
|
+
# push action.
|
67
|
+
status = RepoStatus.new
|
68
|
+
status.write(@env.tmp_path)
|
69
|
+
options[:status] = status
|
70
|
+
|
63
71
|
options[:parallel] = true
|
64
72
|
strategy = options[:strategy] || @env.vagrantfile.config.orchestrate.strategy
|
65
73
|
@env.ui.info("Pushing to managed servers using #{strategy} strategy.")
|
@@ -115,13 +123,11 @@ module VagrantPlugins
|
|
115
123
|
end
|
116
124
|
ENV["VAGRANT_ORCHESTRATE_COMMAND"] = "PUSH"
|
117
125
|
begin
|
118
|
-
batchify(machines, :
|
119
|
-
batchify(machines, :provision, options) if options[:provision]
|
120
|
-
upload_status_all(machines)
|
121
|
-
batchify(machines, :reload, options) if options[:reboot]
|
126
|
+
batchify(machines, :push, options)
|
122
127
|
ensure
|
123
|
-
batchify(machines, :destroy, options)
|
124
128
|
@logger.debug("Finished orchestrating push to group number #{index + 1} of #{groups.size}.")
|
129
|
+
status_source = options[:status].local_path
|
130
|
+
super_delete(status_source) if File.exist?(status_source)
|
125
131
|
ENV.delete "VAGRANT_ORCHESTRATE_COMMAND"
|
126
132
|
end
|
127
133
|
|
@@ -147,6 +153,9 @@ module VagrantPlugins
|
|
147
153
|
def batchify(machines, action, options)
|
148
154
|
@env.batch(options[:parallel]) do |batch|
|
149
155
|
machines.each do |machine|
|
156
|
+
# This is necessary to disable the low level provisioning in the
|
157
|
+
# Vagrant builtin provisioner.
|
158
|
+
options[:provision_enabled] = false unless options[:provision]
|
150
159
|
batch.action(machine, action, options)
|
151
160
|
end
|
152
161
|
end
|
@@ -170,36 +179,6 @@ module VagrantPlugins
|
|
170
179
|
message = "ERROR!\nThere are files that need to be committed first."
|
171
180
|
RepoStatus.clean? && RepoStatus.committed? && !RepoStatus.untracked? || abort(message)
|
172
181
|
end
|
173
|
-
|
174
|
-
def upload_status_all(machines)
|
175
|
-
status = RepoStatus.new
|
176
|
-
source = File.join(@env.tmp_path, "vagrant_orchestrate_status")
|
177
|
-
File.write(source, status.to_json)
|
178
|
-
machines.each do |machine|
|
179
|
-
upload_status_one(source, status, machine)
|
180
|
-
end
|
181
|
-
ensure
|
182
|
-
super_delete(source) if File.exist?(source)
|
183
|
-
end
|
184
|
-
|
185
|
-
def upload_status_one(source, status, machine)
|
186
|
-
destination = status.remote_path(machine.config.vm.communicator)
|
187
|
-
parent_folder = File.split(destination)[0]
|
188
|
-
machine.communicate.wait_for_ready(5)
|
189
|
-
@logger.debug("Ensuring vagrant_orchestrate status directory exists")
|
190
|
-
machine.communicate.sudo("mkdir -p #{parent_folder}")
|
191
|
-
machine.communicate.sudo("chmod 777 #{parent_folder}")
|
192
|
-
@logger.debug("Uploading vagrant_orchestrate status file")
|
193
|
-
@logger.debug(" source: #{source}")
|
194
|
-
@logger.debug(" dest: #{destination}")
|
195
|
-
machine.communicate.upload(source, destination)
|
196
|
-
@logger.debug("Setting uploaded file world-writable")
|
197
|
-
machine.communicate.sudo("chmod 777 #{destination}")
|
198
|
-
rescue => ex
|
199
|
-
@logger.error(ex)
|
200
|
-
@env.ui.warn("An error occurred when trying to upload status to #{machine.name}. Continuing")
|
201
|
-
@env.ui.warn(ex.message)
|
202
|
-
end
|
203
182
|
end
|
204
183
|
end
|
205
184
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require "json"
|
2
2
|
require "optparse"
|
3
3
|
require "vagrant"
|
4
|
+
require "vagrant-managed-servers/action/download_status"
|
5
|
+
require_relative "../../vagrant-managed-servers/action"
|
4
6
|
require "vagrant-orchestrate/repo_status"
|
5
7
|
require_relative "command_mixins"
|
6
8
|
|
@@ -32,36 +34,26 @@ module VagrantPlugins
|
|
32
34
|
# There is some detail output fromt he communicator.download that I
|
33
35
|
# don't want to suppress, but I also don't want it to be interspersed
|
34
36
|
# with the actual status information. Let's buffer the status output.
|
35
|
-
|
37
|
+
ENV["VAGRANT_ORCHESTRATE_STATUS"] = ""
|
36
38
|
@logger.debug("About to download machine status")
|
37
|
-
|
38
|
-
|
39
|
+
options = {}
|
40
|
+
parallel = true
|
41
|
+
local_files = []
|
42
|
+
@env.batch(parallel) do |batch|
|
43
|
+
machines.each do |machine|
|
44
|
+
options[:remote_file_path] = RepoStatus.new.remote_path(machine.config.vm.communicator)
|
45
|
+
options[:local_file_path] = File.join(@env.tmp_path, "#{machine.name}_status")
|
46
|
+
local_files << options[:local_file_path]
|
47
|
+
batch.action(machine, :download_status, options)
|
48
|
+
end
|
39
49
|
end
|
40
50
|
@env.ui.info("Current managed server states:")
|
41
51
|
@env.ui.info("")
|
42
|
-
|
43
|
-
@env.ui.info line
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def get_status(remote, machine)
|
48
|
-
machine.communicate.wait_for_ready(5)
|
49
|
-
local = File.join(@env.tmp_path, "#{machine.name}_status")
|
50
|
-
@logger.debug("Downloading orchestrate status for #{machine.name}")
|
51
|
-
@logger.debug(" remote file: #{remote}")
|
52
|
-
@logger.debug(" local file: #{local}")
|
53
|
-
machine.communicate.download(remote, local)
|
54
|
-
content = File.read(local)
|
55
|
-
@logger.debug("File content:")
|
56
|
-
@logger.debug(content)
|
57
|
-
status = JSON.parse(content)
|
58
|
-
return machine.name.to_s + " " + status["last_sync"] + " " + status["ref"] + " " + status["user"]
|
59
|
-
rescue => ex
|
60
|
-
@env.ui.warn("Error downloading status for #{machine.name}.")
|
61
|
-
@env.ui.warn(ex.message)
|
62
|
-
return machine.name.to_s + " Status unavailable."
|
52
|
+
@env.ui.info(ENV["VAGRANT_ORCHESTRATE_STATUS"].split("\n").sort.join("\n"))
|
63
53
|
ensure
|
64
|
-
|
54
|
+
local_files.each do |local|
|
55
|
+
super_delete(local) if File.exist?(local)
|
56
|
+
end
|
65
57
|
end
|
66
58
|
end
|
67
59
|
end
|
@@ -4,9 +4,11 @@ module VagrantPlugins
|
|
4
4
|
module Orchestrate
|
5
5
|
class RepoStatus
|
6
6
|
attr_reader :last_sync
|
7
|
+
attr_accessor :local_path
|
7
8
|
|
8
9
|
def initialize
|
9
10
|
@last_sync = Time.now.utc # Managed servers could be in different timezones
|
11
|
+
@local_path = nil
|
10
12
|
end
|
11
13
|
|
12
14
|
def ref
|
@@ -47,6 +49,11 @@ module VagrantPlugins
|
|
47
49
|
JSON.pretty_generate(contents)
|
48
50
|
end
|
49
51
|
|
52
|
+
def write(tmp_path)
|
53
|
+
@local_path = File.join(tmp_path, "vagrant_orchestrate_status")
|
54
|
+
File.write(@local_path, to_json)
|
55
|
+
end
|
56
|
+
|
50
57
|
# The path to where this should be stored on a remote machine, inclusive
|
51
58
|
# of the file name.
|
52
59
|
def remote_path(communicator)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-orchestrate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Baldauf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -97,6 +97,9 @@ files:
|
|
97
97
|
- docs/puppet.md
|
98
98
|
- docs/strategy.md
|
99
99
|
- dummy.box
|
100
|
+
- lib/vagrant-managed-servers/action.rb
|
101
|
+
- lib/vagrant-managed-servers/action/download_status.rb
|
102
|
+
- lib/vagrant-managed-servers/action/upload_status.rb
|
100
103
|
- lib/vagrant-orchestrate.rb
|
101
104
|
- lib/vagrant-orchestrate/action/filtermanaged.rb
|
102
105
|
- lib/vagrant-orchestrate/action/setcredentials.rb
|