vagrant-kubevirt 1.0.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 (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.travis.yml +12 -0
  4. data/CHANGELOG.md +3 -0
  5. data/Gemfile +12 -0
  6. data/LICENSE +13 -0
  7. data/README.md +109 -0
  8. data/Rakefile +22 -0
  9. data/example_box/README.md +9 -0
  10. data/example_box/Vagrantfile +20 -0
  11. data/example_box/kubevirt.box +0 -0
  12. data/example_box/metadata.json +3 -0
  13. data/lib/vagrant-kubevirt.rb +18 -0
  14. data/lib/vagrant-kubevirt/action.rb +176 -0
  15. data/lib/vagrant-kubevirt/action/connect_kubevirt.rb +37 -0
  16. data/lib/vagrant-kubevirt/action/create_vm.rb +133 -0
  17. data/lib/vagrant-kubevirt/action/destroy_vm.rb +30 -0
  18. data/lib/vagrant-kubevirt/action/is_created.rb +18 -0
  19. data/lib/vagrant-kubevirt/action/is_stopped.rb +18 -0
  20. data/lib/vagrant-kubevirt/action/read_ssh_info.rb +54 -0
  21. data/lib/vagrant-kubevirt/action/read_state.rb +44 -0
  22. data/lib/vagrant-kubevirt/action/set_domain_name.rb +33 -0
  23. data/lib/vagrant-kubevirt/action/start_vm.rb +35 -0
  24. data/lib/vagrant-kubevirt/action/stop_vm.rb +37 -0
  25. data/lib/vagrant-kubevirt/action/wait_for_state.rb +64 -0
  26. data/lib/vagrant-kubevirt/config.rb +60 -0
  27. data/lib/vagrant-kubevirt/errors.rb +39 -0
  28. data/lib/vagrant-kubevirt/plugin.rb +73 -0
  29. data/lib/vagrant-kubevirt/provider.rb +50 -0
  30. data/lib/vagrant-kubevirt/version.rb +5 -0
  31. data/locales/en.yml +69 -0
  32. data/spec/spec_helper.rb +6 -0
  33. data/spec/support/environment_helper.rb +18 -0
  34. data/spec/support/kubevirt_context.rb +15 -0
  35. data/spec/support/sharedcontext.rb +33 -0
  36. data/spec/unit/action/create_vm_spec.rb +122 -0
  37. data/spec/unit/action/destroy_vm_spec.rb +33 -0
  38. data/spec/unit/action/read_ssh_info_spec.rb +45 -0
  39. data/spec/unit/action/read_state_spec.rb +44 -0
  40. data/spec/unit/action/start_vm_spec.rb +44 -0
  41. data/spec/unit/action/stop_vm_spec.rb +57 -0
  42. data/spec/unit/action/wait_for_state_spec.rb +57 -0
  43. data/spec/unit/config_spec.rb +41 -0
  44. data/vagrant-kubevirt.gemspec +26 -0
  45. metadata +161 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 13a3b9fb5dbac6f1fbb7774ad9d2a0232bd7a33ee17ab52ea41bf2f7079f1a63
4
+ data.tar.gz: 3259c02f3b97c69a59ed1bc76db83b07ce4d476eec7977f250d87e13d67efdb5
5
+ SHA512:
6
+ metadata.gz: 7a04ca4cc72aa446a003d9edbe3df6dbde20624ba3d8dbbdd3ee7e3dc113245fb780242c86b610203769dc862ceae0d504237a3e62dae5d682cdb5ee603582ad
7
+ data.tar.gz: b5a1d70120aa19c1fd311ed623f8f6948d07abe279ef1cddb097672d6a00a8c3e0560004927440e3f1b365c4e539582d70febd1a181c488e6feb1ac1dc6675b3
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ Vagrantfile
19
+ !example_box/Vagrantfile
20
+ .vagrant
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ before_install:
3
+ - gem update --system
4
+ - gem install bundler
5
+ install: bundle install
6
+ script: bundle exec rspec
7
+ rvm:
8
+ - 2.3
9
+ - 2.4
10
+ - 2.5
11
+ notifications:
12
+ email: false
@@ -0,0 +1,3 @@
1
+ # 0.1.0 (In progress)
2
+
3
+ * Initial release.
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ # We depend on Vagrant for development, but we don't add it as a
7
+ # gem dependency because we expect to be installed within the
8
+ # Vagrant environment itself using `vagrant plugin`.
9
+ gem "vagrant", :git => "https://github.com/hashicorp/vagrant.git"
10
+
11
+ gem 'vagrant-spec', :github => 'hashicorp/vagrant-spec'
12
+ end
data/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright (c) 2018 Red Hat, Inc.
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.
@@ -0,0 +1,109 @@
1
+ # Vagrant KubeVirt Provider
2
+
3
+
4
+ This is a [Vagrant](http://www.vagrantup.com) 1.2+ plugin that adds an [KubeVirt](http://kubevirt.io)
5
+ provider to Vagrant, allowing Vagrant to control and provision virtual machines using Kubernetes add-on.
6
+
7
+ **NOTE:** This plugin requires Vagrant 2.2.3+. Due to the issue in net-ssh fixed [here](https://github.com/net-ssh/net-ssh/pull/641).
8
+
9
+ ## Features
10
+ * Vagrant `up`, `halt`, `status` and `destroy` commands.
11
+ * Create and boot virtual machines using templates, registry image or pvc.
12
+ * Provision the virtual machines with any built-in Vagrant provisioner.
13
+ * SSH into the VMIs
14
+ * Synced folder support
15
+
16
+ ## Future work
17
+ * Package running virtual machines into new vagrant-kubevirt friendly boxes
18
+ * Manage networks for virtual machines
19
+
20
+ ## Usage
21
+
22
+ Install using standard Vagrant 1.2+ plugin installation methods. After
23
+ installing, `vagrant up` and specify the `kubevirt` provider. An example is
24
+ shown below.
25
+
26
+ ```
27
+ $ vagrant plugin install vagrant-kubevirt
28
+ ...
29
+ $ vagrant up --provider=kubevirt
30
+ ...
31
+ ```
32
+
33
+ ## Quick Start
34
+
35
+ After installing the plugin (instructions above), the quickest way to get
36
+ started is to actually use a Kubevirt box and specify all the details
37
+ manually within a `config.vm.provider` block. So first, add the box using
38
+ any name you want:
39
+
40
+ ```
41
+ $ vagrant box add kubevirt https://raw.githubusercontent.com/pkliczewski/vagrant-kubevirt/master/example_box/kubevirt.box
42
+ ...
43
+ ```
44
+
45
+ And then make a Vagrantfile that looks like the following, filling in
46
+ your information where necessary.
47
+
48
+ ```ruby
49
+ Vagrant.configure("2") do |config|
50
+ config.vm.box = 'kubevirt'
51
+ config.vm.boot_timeout = 30
52
+
53
+ config.vm.provision "shell" do |s|
54
+ s.inline = "touch example.txt"
55
+ end
56
+
57
+ config.vm.provider :kubevirt do |kubevirt|
58
+ # kubevirt.template = 'working'
59
+ kubevirt.cpus = 2
60
+ kubevirt.memory = 512
61
+ kubevirt.image = 'kubevirt/fedora-cloud-registry-disk-demo'
62
+ # kubevirt.pvc = 'my_pvc'
63
+
64
+ # kubevirt.hostname = '<kubevirt-host>'
65
+ # kubevirt.port = '<kubevirt port>'
66
+ # kubevirt.token = '<token>'
67
+ end
68
+
69
+ config.ssh.username = 'vagrant'
70
+ config.ssh.password = 'vagrant'
71
+ config.ssh.private_key_path = ['~/.ssh/id_rsa']
72
+ end
73
+ ```
74
+
75
+ And then run `vagrant up --provider=kubevirt`.
76
+
77
+ ## Box Format
78
+
79
+ Every provider in Vagrant must introduce a custom box format. This
80
+ provider introduces `kubevirt` boxes. You can view an example box in
81
+ the [example_box/ directory](https://github.com/pkliczewski/vagrant-kubevirt/tree/master/example_box).
82
+ That directory also contains instructions on how to build a box.
83
+
84
+ The box format is basically just the required `metadata.json` file
85
+ along with a `Vagrantfile` that does default settings for the
86
+ provider-specific configuration for this provider.
87
+
88
+ ## Configuration
89
+
90
+ There are 2 options to configure provider:
91
+
92
+ # Kubevirt provider configuration options:
93
+
94
+ * `hostname` - Hostname where Kubevirt is deployed
95
+ * `port` - Port on which Kubevirt is listening
96
+ * `token` - Token used to authenticate any requests
97
+
98
+ # kubeconfig file
99
+
100
+ User can provide path to config file using `KUBECONFIG` environemnt variable or have it in
101
+ well known location such as `~/.kube/config`.
102
+
103
+ ### Domain Specific Options
104
+
105
+ * `cpus` - Number of virtual cpus. Defaults to 1 if not set.
106
+ * `memory` - Amount of memory in MBytes. Defaults to 512 if not set.
107
+ * `template` - Name of template from which new VM will be created.
108
+ * `image` - Name of image which will be used to create new VM.
109
+ * `pvc` - Name of persistent volume claim which will be used to create new VM.
@@ -0,0 +1,22 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'rspec/core/rake_task'
4
+
5
+ # Immediately sync all stdout so that tools like buildbot can
6
+ # immediately load in the output.
7
+ $stdout.sync = true
8
+ $stderr.sync = true
9
+
10
+ # Change to the directory of this file.
11
+ Dir.chdir(File.expand_path("../", __FILE__))
12
+
13
+ # This installs the tasks that help with gem creation and
14
+ # publishing.
15
+ Bundler::GemHelper.install_tasks
16
+
17
+ # Install the `spec` task so that we can run tests.
18
+ RSpec::Core::RakeTask.new(:spec) do |t|
19
+ t.rspec_opts = "--order defined"
20
+ end
21
+ # Default task is to run the unit tests
22
+ task :default => :spec
@@ -0,0 +1,9 @@
1
+ # Vagrant Kubevirt 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 `kubevirt` provider.
5
+ To turn this into a box:
6
+
7
+ ```
8
+ $ tar cvzf kubevirt.box ./metadata.json ./Vagrantfile
9
+ ```
@@ -0,0 +1,20 @@
1
+ Vagrant.configure("2") do |config|
2
+ config.vm.box = 'kubevirt'
3
+
4
+ # config.vm.synced_folder ".", "/vagrant", disabled: true
5
+ # config.vm.synced_folder "/home/pkliczewski/git/vagrant-kubevirt/example_box/src", "/srv/website", type: "rsync"
6
+
7
+ # config.vm.provision "shell" do |s|
8
+ # s.inline = "touch example.txt"
9
+ # end
10
+
11
+ config.vm.provider :kubevirt do |kubevirt|
12
+ kubevirt.cpus = 2
13
+ kubevirt.memory = 512
14
+ kubevirt.image = 'kubevirt/fedora-cloud-registry-disk-demo'
15
+ end
16
+
17
+ config.ssh.username = 'vagrant'
18
+ config.ssh.password = 'vagrant'
19
+ config.ssh.private_key_path = ['~/.ssh/id_rsa']
20
+ end
Binary file
@@ -0,0 +1,3 @@
1
+ {
2
+ "provider": "kubevirt"
3
+ }
@@ -0,0 +1,18 @@
1
+ require "pathname"
2
+
3
+ require "vagrant-kubevirt/plugin"
4
+
5
+ module VagrantPlugins
6
+ module Kubevirt
7
+ lib_path = Pathname.new(File.expand_path("../vagrant-kubevirt", __FILE__))
8
+ autoload :Action, lib_path.join("action")
9
+ autoload :Errors, lib_path.join("errors")
10
+
11
+ # This returns the path to the source of this plugin.
12
+ #
13
+ # @return [Pathname]
14
+ def self.source_root
15
+ @source_root ||= Pathname.new(File.expand_path("../../", __FILE__))
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,176 @@
1
+ require "pathname"
2
+
3
+ require "vagrant/action/builder"
4
+
5
+ module VagrantPlugins
6
+ module Kubevirt
7
+ module Action
8
+ # Include the built-in modules so we can use them as top-level things.
9
+ include Vagrant::Action::Builtin
10
+
11
+ # This action is called to bring the box up from nothing.
12
+ def self.action_up
13
+ Vagrant::Action::Builder.new.tap do |b|
14
+ b.use ConfigValidate
15
+ b.use ConnectKubevirt
16
+ b.use Call, IsCreated do |env1, b1|
17
+ b1.use SetDomainName
18
+
19
+ if env1[:result]
20
+ b1.use Message,
21
+ I18n.t("vagrant_kubevirt.already_status", :status => "created")
22
+ else
23
+ b1.use CreateVM
24
+ end
25
+ end
26
+
27
+ b.use Provision
28
+ b.use SyncedFolders
29
+
30
+ b.use Call, IsStopped do |env2, b2|
31
+ if env2[:result]
32
+ b2.use StartVM
33
+ b2.use Call, WaitForState, :running, 120 do |env3, b3|
34
+ unless env3[:result]
35
+ b3.use Message,
36
+ I18n.t("vagrant_kubevirt.action_failed", :action => 'Up')
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ # This action is called to halt the remote machine.
45
+ def self.action_halt
46
+ Vagrant::Action::Builder.new.tap do |b|
47
+ b.use ConfigValidate
48
+ b.use Call, IsCreated do |env, b2|
49
+ unless env[:result]
50
+ b2.use Message,
51
+ I18n.t("vagrant_kubevirt.not_created")
52
+ next
53
+ end
54
+
55
+ b2.use ConnectKubevirt
56
+ b2.use SetDomainName
57
+ b2.use StopVM
58
+ b2.use Call, WaitForState, :stopped, 120 do |env2, b3|
59
+ unless env2[:result]
60
+ b2.use Message,
61
+ I18n.t("vagrant_kubevirt.action_failed", :action => 'Halt')
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ # This action is called to terminate the remote machine.
69
+ def self.action_destroy
70
+ Vagrant::Action::Builder.new.tap do |b|
71
+ b.use ConfigValidate
72
+ b.use Call, IsCreated do |env, b2|
73
+ unless env[:result]
74
+ b2.use Message,
75
+ I18n.t("vagrant_kubevirt.not_created")
76
+ next
77
+ end
78
+
79
+ b2.use ConnectKubevirt
80
+ b2.use DestroyVM
81
+ end
82
+ end
83
+ end
84
+
85
+ # This action is called to read the state of the machine. The
86
+ # resulting state is expected to be put into the `:machine_state_id`
87
+ # key.
88
+ def self.action_read_state
89
+ Vagrant::Action::Builder.new.tap do |b|
90
+ b.use ConfigValidate
91
+ b.use ConnectKubevirt
92
+ b.use ReadState
93
+ end
94
+ end
95
+
96
+ # This action is called to read the SSH info of the machine. The
97
+ # resulting state is expected to be put into the `:machine_ssh_info`
98
+ # key.
99
+ def self.action_read_ssh_info
100
+ Vagrant::Action::Builder.new.tap do |b|
101
+ b.use ConfigValidate
102
+ b.use ConnectKubevirt
103
+ b.use ReadSSHInfo
104
+ end
105
+ end
106
+
107
+
108
+ # This action is called to SSH into the machine.
109
+ def self.action_ssh
110
+ Vagrant::Action::Builder.new.tap do |b|
111
+ b.use ConfigValidate
112
+ b.use Call, IsCreated do |env, b2|
113
+ unless env[:result]
114
+ b2.use Message,
115
+ I18n.t("vagrant_kubevirt.not_created")
116
+ next
117
+ end
118
+
119
+ b2.use SSHExec
120
+ end
121
+ end
122
+ end
123
+
124
+ def self.action_ssh_run
125
+ Vagrant::Action::Builder.new.tap do |b|
126
+ b.use ConfigValidate
127
+ b.use Call, IsCreated do |env, b2|
128
+ unless env[:result]
129
+ b2.use Message,
130
+ I18n.t("vagrant_kubevirt.not_created")
131
+ next
132
+ end
133
+
134
+ b2.use SSHRun
135
+ end
136
+ end
137
+ end
138
+
139
+ def self.action_provision
140
+ Vagrant::Action::Builder.new.tap do |b|
141
+ b.use ConfigValidate
142
+ b.use Call, IsCreated do |env, b2|
143
+ unless env[:result]
144
+ b2.use Message,
145
+ I18n.t("vagrant_kubevirt.not_created")
146
+ next
147
+ end
148
+
149
+ b2.use Call, IsStopped do |env2, b3|
150
+ if env2[:result]
151
+ I18n.t("vagrant_kubevirt.not_running")
152
+ next
153
+ end
154
+
155
+ b3.use Provision
156
+ end
157
+ end
158
+ end
159
+ end
160
+
161
+ # The autoload farm
162
+ action_root = Pathname.new(File.expand_path("../action", __FILE__))
163
+ autoload :ConnectKubevirt, action_root.join("connect_kubevirt")
164
+ autoload :CreateVM, action_root.join("create_vm")
165
+ autoload :DestroyVM, action_root.join("destroy_vm")
166
+ autoload :IsCreated, action_root.join("is_created")
167
+ autoload :IsStopped, action_root.join("is_stopped")
168
+ autoload :ReadState, action_root.join("read_state")
169
+ autoload :ReadSSHInfo, action_root.join("read_ssh_info")
170
+ autoload :SetDomainName, action_root.join("set_domain_name")
171
+ autoload :StartVM, action_root.join("start_vm")
172
+ autoload :StopVM, action_root.join("stop_vm")
173
+ autoload :WaitForState, action_root.join("wait_for_state")
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,37 @@
1
+ require 'fog/kubevirt'
2
+
3
+ require "log4r"
4
+
5
+ module VagrantPlugins
6
+ module Kubevirt
7
+ module Action
8
+ class ConnectKubevirt
9
+
10
+ def initialize(app, env)
11
+ @app = app
12
+ @logger = Log4r::Logger.new("vagrant_kubevirt::action::connect_kubevirt")
13
+ end
14
+
15
+
16
+ def call(env)
17
+ # Get config options for kubevirt provider.
18
+ config = env[:machine].provider_config
19
+
20
+ # Build the fog config
21
+ fog_config = {
22
+ :kubevirt_hostname => config.hostname,
23
+ :kubevirt_port => config.port,
24
+ :kubevirt_token => config.token,
25
+ :kubevirt_namespace => config.namespace,
26
+ :kubevirt_log => @logger
27
+ }
28
+
29
+ @logger.info("Connecting to Kubevirt...")
30
+ env[:kubevirt_compute] = Fog::Kubevirt::Compute.new(fog_config)
31
+
32
+ @app.call(env)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end