vagrant-service-manager 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.ci/ansible/roles/centos/tasks/main.yml +3 -2
  3. data/.ci/jenkins-execute-script.py +6 -4
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +13 -0
  6. data/.rubocop_todo.yml +55 -0
  7. data/CHANGELOG.md +22 -1
  8. data/CONTRIBUTING.adoc +6 -6
  9. data/Gemfile +12 -4
  10. data/README.adoc +104 -70
  11. data/Rakefile +235 -66
  12. data/features/box-command.feature +26 -1
  13. data/features/env-command.feature +20 -3
  14. data/features/help-command.feature +4 -1
  15. data/features/install-cli.feature +58 -0
  16. data/features/openshift.feature +2 -1
  17. data/features/service-operation.feature +76 -3
  18. data/features/support/env.rb +26 -10
  19. data/lib/vagrant-service-manager.rb +7 -2
  20. data/lib/vagrant-service-manager/action/setup_network.rb +0 -2
  21. data/lib/vagrant-service-manager/archive_handlers/tar_handler.rb +26 -0
  22. data/lib/vagrant-service-manager/archive_handlers/zip_handler.rb +25 -0
  23. data/lib/vagrant-service-manager/binary_handlers/adb_binary_handler.rb +55 -0
  24. data/lib/vagrant-service-manager/binary_handlers/adb_docker_binary_handler.rb +38 -0
  25. data/lib/vagrant-service-manager/binary_handlers/adb_openshift_binary_handler.rb +49 -0
  26. data/lib/vagrant-service-manager/binary_handlers/binary_handler.rb +119 -0
  27. data/lib/vagrant-service-manager/binary_handlers/cdk_binary_handler.rb +33 -0
  28. data/lib/vagrant-service-manager/binary_handlers/cdk_docker_binary_handler.rb +9 -0
  29. data/lib/vagrant-service-manager/binary_handlers/cdk_openshift_binary_handler.rb +9 -0
  30. data/lib/vagrant-service-manager/command.rb +90 -15
  31. data/lib/vagrant-service-manager/config.rb +8 -8
  32. data/lib/vagrant-service-manager/installer.rb +49 -0
  33. data/lib/vagrant-service-manager/plugin.rb +2 -2
  34. data/lib/vagrant-service-manager/plugin_logger.rb +2 -2
  35. data/lib/vagrant-service-manager/plugin_util.rb +29 -6
  36. data/lib/vagrant-service-manager/service.rb +4 -3
  37. data/lib/vagrant-service-manager/service_base.rb +11 -0
  38. data/lib/vagrant-service-manager/services/docker.rb +29 -29
  39. data/lib/vagrant-service-manager/services/kubernetes.rb +7 -7
  40. data/lib/vagrant-service-manager/services/open_shift.rb +42 -41
  41. data/lib/vagrant-service-manager/version.rb +1 -1
  42. data/locales/en.yml +42 -4
  43. data/plugins/guests/redhat/cap/machine_ip.rb +2 -1
  44. data/plugins/guests/redhat/plugin.rb +1 -1
  45. data/plugins/hosts/darwin/cap/os_arch.rb +11 -0
  46. data/plugins/hosts/darwin/plugin.rb +13 -0
  47. data/plugins/hosts/linux/cap/os_arch.rb +11 -0
  48. data/plugins/hosts/linux/plugin.rb +13 -0
  49. data/plugins/hosts/windows/cap/os_arch.rb +18 -0
  50. data/plugins/hosts/windows/plugin.rb +13 -0
  51. data/test/test_data/docker-1.10.0.tar.gz +0 -0
  52. data/test/test_data/docker-1.11.0.tgz +0 -0
  53. data/test/test_data/docker-1.9.1.zip +0 -0
  54. data/test/test_data/openshift-origin-client-tools-v1.2.0-2e62fab-linux-64bit.tar.gz +0 -0
  55. data/test/test_data/openshift-origin-client-tools-v1.2.0-2e62fab-linux-64bit.zip +0 -0
  56. data/test/test_data/openshift-origin-client-tools-v1.2.0-2e62fab-mac.zip +0 -0
  57. data/test/test_helper.rb +121 -0
  58. data/test/vagrant-service-manager/archive_handler_test.rb +49 -0
  59. data/test/vagrant-service-manager/binary_handlers/adb_docker_binary_handler_test.rb +111 -0
  60. data/test/vagrant-service-manager/binary_handlers/adb_openshift_binary_handler_test.rb +107 -0
  61. data/test/vagrant-service-manager/installer_test.rb +96 -0
  62. data/vagrant-service-manager.gemspec +4 -3
  63. metadata +43 -16
  64. data/TODO +0 -24
  65. data/Vagrantfile +0 -29
  66. data/lib/vagrant-service-manager/os.rb +0 -22
  67. data/vagrant-service-manager.spec +0 -215
@@ -0,0 +1,49 @@
1
+ module VagrantPlugins
2
+ module ServiceManager
3
+ class ADBOpenshiftBinaryHandler < ADBBinaryHandler
4
+ OC_BINARY_BASE_URL = 'https://github.com/openshift/origin/releases'.freeze
5
+ OC_FILE_PREFIX = 'openshift-origin-client-tools'.freeze
6
+
7
+ def initialize(machine, env, options)
8
+ super(machine, env, options)
9
+ end
10
+
11
+ def build_download_url
12
+ download_base_path = "#{OC_BINARY_BASE_URL}/download/v#{@version}/"
13
+ file = "#{OC_FILE_PREFIX}-v#{@version}-#{version_sha}-#{archive_ext}"
14
+ @url = download_base_path + file
15
+ end
16
+
17
+ private
18
+
19
+ def version_sha
20
+ tag_url = "#{OC_BINARY_BASE_URL}/tag/v#{@version}"
21
+ data = Net::HTTP.get(URI(tag_url))
22
+ tokens = data.match("-v#{@version}-(.*)-#{archive_ext}").captures
23
+ tokens.first unless tokens.empty?
24
+ rescue StandardError => e
25
+ @ui.error e.message
26
+ exit 126
27
+ end
28
+
29
+ def os_type
30
+ if Vagrant::Util::Platform.windows?
31
+ 'windows'
32
+ elsif Vagrant::Util::Platform.linux?
33
+ 'linux'
34
+ elsif Vagrant::Util::Platform.darwin?
35
+ 'mac'
36
+ end
37
+ end
38
+
39
+ def arch
40
+ arch = @machine.env.host.capability(:os_arch)
41
+ arch == 'x86_64' ? '64' : '32'
42
+ end
43
+
44
+ def archive_ext
45
+ os_type + (os_type == 'linux' ? "-#{arch}bit.tar.gz" : '.zip')
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,119 @@
1
+ require 'net/http'
2
+
3
+ module VagrantPlugins
4
+ module ServiceManager
5
+ class URLValidationError < Vagrant::Errors::VagrantError
6
+ error_key(:url_validation_error)
7
+ end
8
+
9
+ class BinaryHandler
10
+ BINARY_ARCHIVE_FORMATS = ['.tgz', '.tar.gz', '.gz', '.zip'].freeze
11
+ BINARY_NAME = {
12
+ docker: 'docker', openshift: 'oc'
13
+ }.freeze
14
+ VERSION_CMD = {
15
+ docker: "docker version --format '{{.Server.Version}}'",
16
+ openshift: "oc version | grep 'oc' | grep -oE '[0-9.]+'"
17
+ }.freeze
18
+ BINARY_REGEX = {
19
+ windows: { docker: %r{\/docker.exe$}, openshift: /oc.exe$/ },
20
+ unix: { docker: %r{\/docker$}, openshift: /oc$/ }
21
+ }.freeze
22
+ ARCHIVE_MAP = {
23
+ '.tgz' => 'Tar', '.tar.gz' => 'Tar', '.gz' => 'Tar', '.zip' => 'Zip'
24
+ }.freeze
25
+ LABEL = 'servicemanager.commands.install_cli.message'.freeze
26
+
27
+ attr_accessor :path, :version, :type, :url,
28
+ :binary_exists, :skip_download, :archive_file_path
29
+
30
+ def initialize(machine, env, options)
31
+ @machine = machine
32
+ @ui = env.ui
33
+ @url = ''
34
+ @binary_exists = true
35
+ @skip_download = false
36
+ @archive_file_path = ''
37
+ @options = options
38
+ @type = options[:type]
39
+ @version = options['--cli-version'] || PluginUtil.execute_once(@machine, @ui, VERSION_CMD[@type])
40
+ @path = options['--path'] || binary_path
41
+ @temp_bin_dir = "#{ServiceManager.temp_dir}/#{@type}"
42
+ end
43
+
44
+ def install
45
+ build_download_url
46
+ validate_url
47
+ build_archive_path
48
+ ensure_binary_and_temp_directories
49
+ download_archive
50
+ prepare_binary
51
+ end
52
+
53
+ def build_download_url
54
+ end
55
+
56
+ def build_archive_path
57
+ end
58
+
59
+ def ensure_binary_and_temp_directories
60
+ end
61
+
62
+ def download_archive
63
+ end
64
+
65
+ def prepare_binary
66
+ end
67
+
68
+ def print_message
69
+ end
70
+
71
+ def archive_dir_name
72
+ @archive_file_path.sub(Regexp.new(BINARY_ARCHIVE_FORMATS.join('|')), '')
73
+ end
74
+
75
+ def archive_handler_class
76
+ Object.const_get("#{ServiceManager.name}::#{archive_handler_name}")
77
+ end
78
+
79
+ def binary_name
80
+ BINARY_NAME[@type] + binary_ext
81
+ end
82
+
83
+ def binary_ext
84
+ Vagrant::Util::Platform.windows? ? '.exe' : ''
85
+ end
86
+
87
+ def bin_dir
88
+ File.dirname(@path)
89
+ end
90
+
91
+ def file_regex
92
+ os_type = Vagrant::Util::Platform.windows? ? :windows : :unix
93
+ BINARY_REGEX[os_type][@type]
94
+ end
95
+
96
+ # Checks if url is accessible or not
97
+ def validate_url
98
+ url = URI.parse(@url)
99
+ req = Net::HTTP.new(url.host, url.port)
100
+ req.use_ssl = true if url.scheme == 'https'
101
+ res = req.request_head(url.path)
102
+
103
+ unless res.code == '200'
104
+ raise URLValidationError, I18n.t('servicemanager.commands.install_cli.url_validation_error')
105
+ end
106
+ end
107
+
108
+ private
109
+
110
+ def archive_handler_name
111
+ ARCHIVE_MAP[File.extname(@url)] + 'Handler'
112
+ end
113
+
114
+ def binary_path
115
+ "#{ServiceManager.bin_dir}/#{@type}/#{@version}/#{binary_name}"
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,33 @@
1
+ module VagrantPlugins
2
+ module ServiceManager
3
+ class CDKBinaryHandler < BinaryHandler
4
+ def initialize(machine, env, options = {})
5
+ super(machine, env, options)
6
+ end
7
+
8
+ # TODO
9
+ def build_download_url
10
+ end
11
+
12
+ # TODO
13
+ def build_archive_path
14
+ end
15
+
16
+ # TODO
17
+ def ensure_binary_and_temp_directories
18
+ end
19
+
20
+ # TODO
21
+ def download_archive
22
+ end
23
+
24
+ # TODO
25
+ def prepare_binary
26
+ end
27
+
28
+ # TODO
29
+ def print_message
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,9 @@
1
+ module VagrantPlugins
2
+ module ServiceManager
3
+ class CDKDockerBinaryHandler < CDKBinaryHandler
4
+ def initialize(machine, env, options)
5
+ super(machine, env, options)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module VagrantPlugins
2
+ module ServiceManager
3
+ class CDKOpenshiftBinaryHandler < CDKBinaryHandler
4
+ def initialize(machine, env, options)
5
+ super(machine, env, options)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,25 +1,50 @@
1
- require_relative 'os'
2
1
  require 'digest'
3
2
  require_relative 'plugin_util'
4
3
  require_relative 'plugin_logger'
4
+ require_relative 'installer'
5
+ require_relative 'archive_handlers/tar_handler'
6
+ require_relative 'archive_handlers/zip_handler'
7
+ require_relative 'binary_handlers/binary_handler'
8
+ require_relative 'binary_handlers/adb_binary_handler'
9
+ require_relative 'binary_handlers/cdk_binary_handler'
10
+ require_relative 'binary_handlers/adb_docker_binary_handler'
11
+ require_relative 'binary_handlers/adb_openshift_binary_handler'
12
+ require_relative 'binary_handlers/cdk_docker_binary_handler'
13
+ require_relative 'binary_handlers/cdk_openshift_binary_handler'
5
14
 
6
15
  module VagrantPlugins
7
16
  module ServiceManager
8
- DOCKER_PATH = '/home/vagrant/.docker'
9
- SUPPORTED_SERVICES = ['docker', 'openshift', 'kubernetes']
17
+ DOCKER_PATH = '/home/vagrant/.docker'.freeze
18
+ SUPPORTED_SERVICES = %w(docker openshift kubernetes).freeze
10
19
  KUBE_SERVICES = [
11
20
  'etcd', 'kube-apiserver', 'kube-controller-manager', 'kube-scheduler',
12
21
  'kubelet', 'kube-proxy', 'docker'
13
- ]
22
+ ].freeze
14
23
  # NOTE: SERVICES_MAP[<service>] will give fully-qualified service class name
15
24
  # Eg: SERVICES_MAP['docker'] gives Vagrant::ServiceManager::Docker
16
25
  SERVICES_MAP = {
17
26
  'docker' => Docker, 'openshift' => OpenShift,
18
27
  'kubernetes' => Kubernetes
19
- }
28
+ }.freeze
29
+
30
+ def self.bin_dir
31
+ @bin_dir
32
+ end
33
+
34
+ def self.temp_dir
35
+ @temp_dir
36
+ end
37
+
38
+ def self.bin_dir=(path)
39
+ @bin_dir = path
40
+ end
41
+
42
+ def self.temp_dir=(path)
43
+ @temp_dir = path
44
+ end
20
45
 
21
46
  class Command < Vagrant.plugin(2, :command)
22
- OS_RELEASE_FILE = '/etc/os-release'
47
+ OS_RELEASE_FILE = '/etc/os-release'.freeze
23
48
 
24
49
  def self.synopsis
25
50
  I18n.t('servicemanager.synopsis')
@@ -37,11 +62,14 @@ module VagrantPlugins
37
62
  end
38
63
 
39
64
  def execute
65
+ ServiceManager.bin_dir = "#{@env.data_dir}/service-manager/bin"
66
+ ServiceManager.temp_dir = "#{@env.data_dir}/service-manager/tmp"
67
+
40
68
  argv = ARGV.dup
41
69
  # Don't propagate --debug argument to case operation
42
70
  if ARGV.include? '--debug'
43
71
  PluginLogger.enable_debug_mode
44
- PluginLogger.set_logger(@logger)
72
+ PluginLogger.logger = @logger
45
73
  argv.delete('--debug')
46
74
  end
47
75
 
@@ -100,6 +128,8 @@ module VagrantPlugins
100
128
  case option
101
129
  when nil
102
130
  display_box_ip
131
+ when '--script-readable'
132
+ display_box_ip(true)
103
133
  when '--help', '-h'
104
134
  print_help(type: command)
105
135
  else
@@ -118,6 +148,19 @@ module VagrantPlugins
118
148
  else
119
149
  perform_service(command, subcommand)
120
150
  end
151
+ when 'install-cli'
152
+ exit_if_machine_not_running
153
+ # Transform hyphen into underscore which is valid char in method
154
+ command = command.tr('-', '_')
155
+ # Get options as Hash which are preceeded with -- like --version
156
+ options = Hash[ARGV.drop(3).each_slice(2).to_a]
157
+
158
+ case subcommand
159
+ when '--help', '-h'
160
+ print_help(type: command)
161
+ else
162
+ execute_install_cli(subcommand, options)
163
+ end
121
164
  when '--help', '-h', 'help'
122
165
  print_help
123
166
  else
@@ -127,7 +170,7 @@ module VagrantPlugins
127
170
 
128
171
  def execute_service(name, options = {})
129
172
  with_target_vms(nil, single_target: true) do |machine|
130
- PluginUtil.service_class(name).info(machine, @env.ui, options)
173
+ PluginUtil.service_class(name).new(machine, @env).info(options)
131
174
  end
132
175
  end
133
176
 
@@ -142,16 +185,15 @@ module VagrantPlugins
142
185
  def execute_status_display(service = nil)
143
186
  with_target_vms(nil, single_target: true) do |machine|
144
187
  if service && SUPPORTED_SERVICES.include?(service)
145
- PluginUtil.service_class(service).status(machine, @env.ui, service)
188
+ PluginUtil.service_class(service).new(machine, @env).status
146
189
  elsif service.nil?
147
190
  @env.ui.info I18n.t('servicemanager.commands.status.nil')
148
191
  SUPPORTED_SERVICES.each do |s|
149
- PluginUtil.service_class(s).status(machine, @env.ui, s)
192
+ PluginUtil.service_class(s).new(machine, @env).status
150
193
  end
151
194
  else
152
195
  @env.ui.error I18n.t('servicemanager.commands.status.unsupported_service',
153
- service: service,
154
- services: SUPPORTED_SERVICES.join(', ') + ' etc')
196
+ service: service, services: SUPPORTED_SERVICES.join(', ') + ' etc')
155
197
  exit 126
156
198
  end
157
199
  end
@@ -169,7 +211,7 @@ module VagrantPlugins
169
211
  end
170
212
  # since we do not have feature to show the Kube connection information
171
213
  unless service == 'kubernetes'
172
- service_class.info(machine, @env.ui, options)
214
+ service_class.new(machine, @env).info(options)
173
215
  end
174
216
  end
175
217
 
@@ -207,9 +249,42 @@ module VagrantPlugins
207
249
  end
208
250
  end
209
251
 
210
- def display_box_ip
252
+ def display_box_ip(script_readable = false)
253
+ options = { script_readable: script_readable }
254
+
255
+ with_target_vms(nil, single_target: true) do |machine|
256
+ @env.ui.info machine.guest.capability(:machine_ip, options)
257
+ end
258
+ end
259
+
260
+ def execute_install_cli(service, options = {})
261
+ help_msg = I18n.t('servicemanager.commands.help.install_cli')
262
+
263
+ if service.nil?
264
+ service_missing_msg = I18n.t('servicemanager.commands.operation.service_missing')
265
+ @env.ui.error help_msg.gsub(/Install the client side tool for the service/, service_missing_msg)
266
+ exit 126
267
+ end
268
+
269
+ unless SUPPORTED_SERVICES.include?(service)
270
+ @env.ui.error "Unknown service '#{service}'."
271
+ @env.ui.error help_msg.gsub(/Install the client side tool for the service\n/, '')
272
+ exit 126
273
+ end
274
+
211
275
  with_target_vms(nil, single_target: true) do |machine|
212
- @env.ui.info machine.guest.capability(:machine_ip)
276
+ args = [service.to_sym, machine, @env, options]
277
+
278
+ begin
279
+ args.last[:box_version] = machine.guest.capability(:os_variant)
280
+ Installer.new(*args).install
281
+ rescue Vagrant::Errors::GuestCapabilityNotFound
282
+ @env.ui.info 'Not a supported box.'
283
+ exit 126
284
+ rescue StandardError => e
285
+ @env.ui.error e.message
286
+ exit 126
287
+ end
213
288
  end
214
289
  end
215
290
  end
@@ -2,18 +2,18 @@ require 'set'
2
2
 
3
3
  module VagrantPlugins
4
4
  module ServiceManager
5
- SERVICES = ['docker', 'openshift']
6
- CONFIG_KEYS = [
5
+ SERVICES = %w(docker openshift).freeze
6
+ CONFIG_KEYS = [
7
7
  :services, :openshift_docker_registry,
8
8
  :openshift_image_name, :openshift_image_tag
9
- ]
9
+ ].freeze
10
10
 
11
11
  class Config < Vagrant.plugin('2', :config)
12
12
  attr_accessor(*CONFIG_KEYS)
13
13
 
14
14
  DEFAULTS = {
15
15
  services: ''
16
- }
16
+ }.freeze
17
17
 
18
18
  def initialize
19
19
  super
@@ -28,10 +28,10 @@ module VagrantPlugins
28
28
  end
29
29
  end
30
30
 
31
- def validate(machine)
31
+ def validate(_machine)
32
32
  errors = _detected_errors
33
33
  errors.concat(validate_services)
34
- { "servicemanager" => errors }
34
+ { 'servicemanager' => errors }
35
35
  end
36
36
 
37
37
  private
@@ -39,7 +39,7 @@ module VagrantPlugins
39
39
  def validate_services
40
40
  errors = []
41
41
 
42
- unless is_supported_services?
42
+ unless supported_services?
43
43
  errors << I18n.t('servicemanager.config.supported_devices',
44
44
  services: SERVICES.inspect)
45
45
  end
@@ -47,7 +47,7 @@ module VagrantPlugins
47
47
  errors
48
48
  end
49
49
 
50
- def is_supported_services?
50
+ def supported_services?
51
51
  @services.split(',').map(&:strip).to_set.subset?(SERVICES.to_set)
52
52
  end
53
53
  end