vagrant-persistent-storage 0.0.2 → 0.0.3

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ data.tar.gz: 5610de0834a33052cd9cfaaab79837b01261e7f2
4
+ metadata.gz: ce4f88ee39f8753b7d3e06bbcffb961d9a8e630b
5
+ SHA512:
6
+ data.tar.gz: 465b23d43aebeb08ea1db75b56ad48dfd0c53a7f9b33f19e1442a51fbf94e44163ee6999c5375863f24209369862e3f34685c3b5623df83b0a0a5283a770fab0
7
+ metadata.gz: 277497dfe4b13ffdab71adade10e74872e66557d204a8e874d6df26d164c270121be216abb3bbfecfa113f3906d1d1215c30db54f1ec7d72c7feaefe03e6577e
data/README.md CHANGED
@@ -5,68 +5,37 @@ A Vagrant plugin that creates a persistent storage and attaches it to guest mach
5
5
 
6
6
  ## Installation
7
7
 
8
- gem 'vagrant-persistent-storage'
9
-
10
- And then execute:
11
-
12
- $ bundle
13
-
14
- Or install it yourself as:
15
-
16
- $ gem install vagrant-persistent-storage
8
+ $ vagrant plugin install vagrant-persistent-storage
17
9
 
18
10
  ## Usage
19
11
 
20
12
  After installing you can set the location and size of the persistent storage.
21
13
 
22
- The following options will create a persistent storage with 5000 MB:
14
+ The following options will create a persistent storage with 5000 MB, named mysql,
15
+ mounted on /var/lib/mysql, in a volume group called 'vagrant'
23
16
  ```ruby
17
+ config.persistent_storage.enabled = true
24
18
  config.persistent_storage.location = "~/development/sourcehdd.vdi"
25
19
  config.persistent_storage.size = 5000
20
+ config.persistent_storage.mountname = 'mysql'
21
+ config.persistent_storage.filesystem = 'ext4'
22
+ config.persistent_storage.mountpoint = '/var/lib/mysql'
23
+ config.persistent_storage.volgroupname = 'myvolgroup'
26
24
  ```
27
25
 
26
+ Device defaults to /dev/sdb
27
+
28
28
  Every `vagrant up` will attach this file as hard disk to the guest machine.
29
- An `vagrant destory` will detach the storage to avoid deletion of the storage by vagrant.
30
- A `vagrant destory` generally destroys all attached drives. See [VBoxMange unregistervm --delete option][vboxmanage_delete].
31
-
32
- ### How to initialize the disk with puppet
33
-
34
- This is a sample puppet setup to create a partition on the guest system:
35
-
36
- ```puppet
37
- class sources::persistent {
38
- exec { "fdisk-sourcehd":
39
- command => "/sbin/fdisk /dev/sdb << EOF
40
- o
41
- n
42
- p
43
- 1
44
-
45
-
46
- w
47
- EOF",
48
- unless => "/bin/grep sdb1 /proc/partitions",
49
- }
50
-
51
- exec { "mkfs-sourcehd":
52
- command => "/sbin/mkfs.ext3 -L sources -b 4096 /dev/sdb1",
53
- unless => "/sbin/dumpe2fs /dev/sdb1"
54
- }
55
-
56
- exec { 'fstab-sourcehd':
57
- command => '/bin/echo "/dev/disk/by-label/sources /mnt/sources ext3 defaults 0 2" >> /etc/fstab',
58
- unless => '/bin/grep ^/dev/disk/by-label/sources /etc/fstab',
59
- }
60
-
61
- exec { 'mount-sourcehd':
62
- command => '/bin/mkdir -p /mnt/sources; /bin/mount /mnt/sources',
63
- subscribe => Exec['fstab-sourcehd'],
64
- refreshonly => true,
65
- }
66
-
67
- Exec['fdisk-sourcehd'] -> Exec['mkfs-sourcehd'] -> Exec['fstab-sourcehd'] -> Exec['mount-sourcehd']
68
- }
69
- ```
29
+ An `vagrant destroy` will detach the storage to avoid deletion of the storage by vagrant.
30
+ A `vagrant destroy` generally destroys all attached drives. See [VBoxMange unregistervm --delete option][vboxmanage_delete].
31
+
32
+ The disk is initialized and added to it's own volume group as specfied in the config;
33
+ this defaults to 'vagrant'. An ext4 filesystem is created and the disk mounted appropriately,
34
+ with entries added to fstab ... subsequent runs will mount this disk with the options specified
35
+
36
+ ## Contributors
37
+
38
+ * [madAndroid](https://github.com/madAndroid)
70
39
 
71
40
  ## TODO
72
41
 
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ Bundler::GemHelper.install_tasks
4
+
@@ -0,0 +1,36 @@
1
+ require "log4r"
2
+
3
+ module VagrantPlugins
4
+ module PersistentStorage
5
+ module Action
6
+ class AttachStorage
7
+
8
+ def initialize(app, env)
9
+ @app = app
10
+ @machine = env[:machine]
11
+ @global_env = @machine.env
12
+ @provider = env[:provider]
13
+ @logger = Log4r::Logger.new('vagrant::persistentstorage::action::attachstorage')
14
+ end
15
+
16
+ def call(env)
17
+ # skip if machine is not running and the action is destroy, halt or suspend
18
+ return @app.call(env) if @machine.state.id != :running && [:destroy, :halt, :suspend].include?(env[:machine_action])
19
+ # skip if machine is saved
20
+ return @app.call(env) if @machine.state.id == :saved
21
+
22
+ return @app.call(env) unless env[:machine].config.persistent_storage.enabled?
23
+ @logger.info '** Attaching Persistent Storage **'
24
+
25
+ env[:ui].info I18n.t("vagrant_persistent_storage.action.attach_storage")
26
+ location = env[:machine].config.persistent_storage.location
27
+ env[:machine].provider.driver.attach_storage(location)
28
+
29
+ @app.call(env)
30
+
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,39 @@
1
+ require "log4r"
2
+
3
+ module VagrantPlugins
4
+ module PersistentStorage
5
+ module Action
6
+ class CreateAdapter
7
+
8
+ def initialize(app, env)
9
+ @app = app
10
+ @machine = env[:machine]
11
+ @global_env = @machine.env
12
+ @provider = env[:provider]
13
+ @logger = Log4r::Logger.new('vagrant::persistent_storage::action::create_adapter')
14
+ end
15
+
16
+ def call(env)
17
+ # skip if machine is not running and the action is destroy, halt or suspend
18
+ return @app.call(env) if @machine.state.id != :running && [:destroy, :halt, :suspend].include?(env[:machine_action])
19
+ # skip if machine is not saved and the action is resume
20
+ return @app.call(env) if @machine.state.id != :saved && env[:machine_action] == :resume
21
+ # skip if machine is powered off and the action is resume
22
+ return @app.call(env) if @machine.state.id == :poweroff && env[:machine_action] == :resume
23
+ # skip if machine is saved
24
+ return @app.call(env) if @machine.state.id == :saved
25
+
26
+ return @app.call(env) unless env[:machine].config.persistent_storage.enabled?
27
+ @logger.info '** Creating Persistent Storage Adapter **'
28
+
29
+ env[:ui].info I18n.t("vagrant_persistent_storage.action.create_adapter")
30
+ env[:machine].provider.driver.create_adapter
31
+
32
+ @app.call(env)
33
+
34
+ end
35
+
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,50 @@
1
+ require "log4r"
2
+
3
+ module VagrantPlugins
4
+ module PersistentStorage
5
+ module Action
6
+ class CreateStorage
7
+
8
+ def initialize(app, env)
9
+ @app = app
10
+ @machine = env[:machine]
11
+ @global_env = @machine.env
12
+ @provider = env[:provider]
13
+ @logger = Log4r::Logger.new('vagrant::persistent_storage::action::create_storage')
14
+ end
15
+
16
+ def call(env)
17
+ # skip if machine is not running and the action is destroy, halt or suspend
18
+ return @app.call(env) if @machine.state.id != :running && [:destroy, :halt, :suspend].include?(env[:machine_action])
19
+ # skip if machine is not saved and the action is resume
20
+ return @app.call(env) if @machine.state.id != :saved && env[:machine_action] == :resume
21
+ # skip if machine is powered off and the action is resume
22
+ return @app.call(env) if @machine.state.id == :poweroff && env[:machine_action] == :resume
23
+ # skip if machine is saved
24
+ return @app.call(env) if @machine.state.id == :saved
25
+
26
+ return @app.call(env) unless env[:machine].config.persistent_storage.enabled?
27
+
28
+ # check config to see if the disk should be created
29
+ return @app.call(env) unless env[:machine].config.persistent_storage.create?
30
+
31
+ if File.exists?(env[:machine].config.persistent_storage.location)
32
+ @logger.info '** Persistent Storage Volume exists, not creating **'
33
+ env[:ui].info I18n.t("vagrant_persistent_storage.action.not_creating")
34
+ @app.call(env)
35
+
36
+ else
37
+ @logger.info '** Creating Persistent Storage **'
38
+ env[:ui].info I18n.t("vagrant_persistent_storage.action.create_storage")
39
+ location = env[:machine].config.persistent_storage.location
40
+ size = env[:machine].config.persistent_storage.size
41
+ env[:machine].provider.driver.create_storage(location, size)
42
+ @app.call(env)
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,34 @@
1
+ require "log4r"
2
+
3
+ module VagrantPlugins
4
+ module PersistentStorage
5
+ module Action
6
+ class DetachStorage
7
+
8
+ def initialize(app, env)
9
+ @app = app
10
+ @machine = env[:machine]
11
+ @global_env = @machine.env
12
+ @provider = env[:provider]
13
+ @logger = Log4r::Logger.new('vagrant::persistent_storage::action::detach_adapter')
14
+ end
15
+
16
+ def call(env)
17
+ # skip if machine is not saved and the action is resume
18
+ return @app.call(env) if @machine.state.id != :saved && env[:machine_action] == :resume
19
+
20
+ return @app.call(env) unless env[:machine].config.persistent_storage.enabled?
21
+ @logger.info '** Detaching Persistent Storage **'
22
+
23
+ env[:ui].info I18n.t("vagrant_persistent_storage.action.detach_storage")
24
+ location = env[:machine].config.persistent_storage.location
25
+ env[:machine].provider.driver.detach_storage(location)
26
+
27
+ @app.call(env)
28
+
29
+ end
30
+
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,44 @@
1
+ require "log4r"
2
+ require 'vagrant-persistent-storage/manage_storage'
3
+
4
+ module VagrantPlugins
5
+ module PersistentStorage
6
+ module Action
7
+ class ManageAll
8
+
9
+ include ManageStorage
10
+
11
+ def initialize(app, env)
12
+ @app = app
13
+ @machine = env[:machine]
14
+ @global_env = @machine.env
15
+ @provider = @machine.provider_name
16
+ @logger = Log4r::Logger.new('vagrant::persistent_storage::action::manage_storage')
17
+ end
18
+
19
+ def call(env)
20
+ # skip if machine is not running and the action is destroy, halt or suspend
21
+ return @app.call(env) if @machine.state.id != :running && [:destroy, :halt, :suspend].include?(env[:machine_action])
22
+ # skip if machine is not saved and the action is resume
23
+ return @app.call(env) if @machine.state.id != :saved && env[:machine_action] == :resume
24
+ # skip if machine is powered off and the action is resume
25
+ return @app.call(env) if @machine.state.id == :poweroff && env[:machine_action] == :resume
26
+ # skip if machine is powered off and the action is resume
27
+ return @app.call(env) if @machine.state.id == :saved && env[:machine_action] == :resume
28
+
29
+ return @app.call(env) unless env[:machine].config.persistent_storage.enabled?
30
+ return @app.call(env) unless env[:machine].config.persistent_storage.manage?
31
+ @logger.info '** Managing Persistent Storage **'
32
+
33
+ env[:ui].info I18n.t('vagrant_persistent_storage.action.manage_storage')
34
+ machine = env[:machine]
35
+ manage_volumes(machine)
36
+
37
+ @app.call(env)
38
+
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,53 @@
1
+ require "vagrant/action/builder"
2
+ require "vagrant-persistent-storage/action"
3
+ require "vagrant-persistent-storage/action/manage_storage"
4
+
5
+ module VagrantPlugins
6
+ module PersistentStorage
7
+ module Action
8
+ include Vagrant::Action::Builtin
9
+
10
+ autoload :CreateAdapter, File.expand_path("../action/create_adapter.rb", __FILE__)
11
+ autoload :CreateStorage, File.expand_path("../action/create_storage.rb", __FILE__)
12
+ autoload :AttachStorage, File.expand_path("../action/attach_storage.rb", __FILE__)
13
+ autoload :DetachStorage, File.expand_path("../action/detach_storage.rb", __FILE__)
14
+ autoload :ManageStorage, File.expand_path("../action/manage_storage.rb", __FILE__)
15
+
16
+ def self.create_adapter
17
+ Vagrant::Action::Builder.new.tap do |builder|
18
+ builder.use ConfigValidate
19
+ builder.use CreateAdapter
20
+ end
21
+ end
22
+
23
+ def self.create_storage
24
+ Vagrant::Action::Builder.new.tap do |builder|
25
+ builder.use ConfigValidate
26
+ builder.use CreateStorage
27
+ end
28
+ end
29
+
30
+ def self.attach_storage
31
+ Vagrant::Action::Builder.new.tap do |builder|
32
+ builder.use ConfigValidate
33
+ builder.use AttachStorage
34
+ end
35
+ end
36
+
37
+ def self.detach_storage
38
+ Vagrant::Action::Builder.new.tap do |builder|
39
+ builder.use ConfigValidate
40
+ builder.use DetachStorage
41
+ end
42
+ end
43
+
44
+ def self.manage_storage
45
+ Vagrant::Action::Builder.new.tap do |builder|
46
+ builder.use ConfigValidate
47
+ builder.use ManageAll
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -1,7 +1,146 @@
1
- module VagrantPersistentStorage
2
- class Config < Vagrant::Config::Base
3
- attr_accessor :location
4
- attr_accessor :size
1
+ require 'pathname'
2
+
3
+ module VagrantPlugins
4
+ module PersistentStorage
5
+ class Config < Vagrant.plugin('2', :config)
6
+
7
+ attr_accessor :size
8
+ attr_accessor :create
9
+ attr_accessor :mount
10
+ attr_accessor :manage
11
+ attr_accessor :format
12
+ attr_accessor :enabled
13
+ attr_accessor :use_lvm
14
+ attr_accessor :location
15
+ attr_accessor :mountname
16
+ attr_accessor :mountpoint
17
+ attr_accessor :diskdevice
18
+ attr_accessor :filesystem
19
+ attr_accessor :volgroupname
20
+
21
+ alias_method :create?, :create
22
+ alias_method :mount?, :mount
23
+ alias_method :manage?, :manage
24
+ alias_method :format?, :format
25
+ alias_method :use_lvm?, :use_lvm
26
+ alias_method :enabled?, :enabled
27
+
28
+ def initialize
29
+ @size = UNSET_VALUE
30
+ @create = true
31
+ @mount = true
32
+ @manage = true
33
+ @format = true
34
+ @use_lvm = true
35
+ @enabled = false
36
+ @location = UNSET_VALUE
37
+ @mountname = UNSET_VALUE
38
+ @mountpoint = UNSET_VALUE
39
+ @diskdevice = UNSET_VALUE
40
+ @filesystem = UNSET_VALUE
41
+ @volgroupname = UNSET_VALUE
42
+ end
43
+
44
+ def finalize!
45
+ @size = 0 if @size == UNSET_VALUE
46
+ @create = true if @create == UNSET_VALUE
47
+ @mount = true if @mount == UNSET_VALUE
48
+ @manage = true if @manage == UNSET_VALUE
49
+ @format = true if @format == UNSET_VALUE
50
+ @use_lvm = true if @use_lvm == UNSET_VALUE
51
+ @enabled = false if @enabled == UNSET_VALUE
52
+ @location = 0 if @location == UNSET_VALUE
53
+ @mountname = 0 if @mountname == UNSET_VALUE
54
+ @mountpoint = 0 if @mountpoint == UNSET_VALUE
55
+ @diskdevice = 0 if @diskdevice == UNSET_VALUE
56
+ @filesystem = 0 if @filesystem == UNSET_VALUE
57
+ @volgroupname = 0 if @volgroupname == UNSET_VALUE
58
+ end
59
+
60
+ def validate(machine)
61
+ errors = []
62
+
63
+ errors << validate_bool('persistent_storage.create', @create)
64
+ errors << validate_bool('persistent_storage.mount', @mount)
65
+ errors << validate_bool('persistent_storage.mount', @manage)
66
+ errors << validate_bool('persistent_storage.mount', @format)
67
+ errors << validate_bool('persistent_storage.mount', @use_lvm)
68
+ errors << validate_bool('persistent_storage.mount', @enabled)
69
+ errors.compact!
70
+
71
+ if !machine.config.persistent_storage.size.kind_of?(String)
72
+ errors << I18n.t('vagrant_persistent_storage.config.not_a_string', {
73
+ :config_key => 'persistent_storage.size',
74
+ :is_class => size.class.to_s,
75
+ })
76
+ end
77
+ if !machine.config.persistent_storage.location.kind_of?(String)
78
+ errors << I18n.t('vagrant_persistent_storage.config.not_a_string', {
79
+ :config_key => 'persistent_storage.location',
80
+ :is_class => location.class.to_s,
81
+ })
82
+ end
83
+ if !machine.config.persistent_storage.mountname.kind_of?(String)
84
+ errors << I18n.t('vagrant_persistent_storage.config.not_a_string', {
85
+ :config_key => 'persistent_storage.mountname',
86
+ :is_class => mountname.class.to_s,
87
+ })
88
+ end
89
+ if !machine.config.persistent_storage.mountpoint.kind_of?(String)
90
+ errors << I18n.t('vagrant_persistent_storage.config.not_a_string', {
91
+ :config_key => 'persistent_storage.mountpoint',
92
+ :is_class => mountpoint.class.to_s,
93
+ })
94
+ end
95
+ if !machine.config.persistent_storage.diskdevice.kind_of?(String)
96
+ errors << I18n.t('vagrant_persistent_storage.config.not_a_string', {
97
+ :config_key => 'persistent_storage.diskdevice',
98
+ :is_class => diskdevice.class.to_s,
99
+ })
100
+ end
101
+ if !machine.config.persistent_storage.filesystem.kind_of?(String)
102
+ errors << I18n.t('vagrant_persistent_storage.config.not_a_string', {
103
+ :config_key => 'persistent_storage.filesystem',
104
+ :is_class => filesystem.class.to_s,
105
+ })
106
+ end
107
+ if !machine.config.persistent_storage.volgroupname.kind_of?(String)
108
+ errors << I18n.t('vagrant_persistent_storage.config.not_a_string', {
109
+ :config_key => 'persistent_storage.volgroupname',
110
+ :is_class => volgroupname.class.to_s,
111
+ })
112
+ end
113
+
114
+ mount_point_path = Pathname.new("#{machine.config.persistent_storage.location}")
115
+ if ! mount_point.path.absolute?
116
+ errors << I18n.t('vagrant_persistent_storage.config.not_a_path', {
117
+ :config_key => 'persistent_storage.location',
118
+ :is_path => location.class.to_s,
119
+ })
120
+ end
121
+
122
+ { 'Persistent Storage configuration' => errors }
123
+
124
+ if ! File.exists?@location.to_s and ! @create == "true"
125
+ return { "location" => ["file doesn't exist, and create set to false"] }
126
+ end
127
+ {}
128
+ end
129
+
130
+ private
131
+
132
+ def validate_bool(key, value)
133
+ if ![TrueClass, FalseClass].include?(value.class) &&
134
+ value != UNSET_VALUE
135
+ I18n.t('vagrant_persistent_storage.config.not_a_bool', {
136
+ :config_key => key,
137
+ :value => value.class.to_s
138
+ })
139
+ else
140
+ nil
141
+ end
142
+ end
143
+
144
+ end
5
145
  end
6
146
  end
7
-
@@ -0,0 +1,98 @@
1
+ require 'tempfile'
2
+ require 'fileutils'
3
+ require 'erb'
4
+
5
+ module VagrantPlugins
6
+ module PersistentStorage
7
+ module ManageStorage
8
+
9
+ def populate_template(m)
10
+ mnt_name = m.config.persistent_storage.mountname
11
+ mnt_point = m.config.persistent_storage.mountpoint
12
+ vg_name = m.config.persistent_storage.volgroupname
13
+ disk_dev = m.config.persistent_storage.diskdevice
14
+ fs_type = m.config.persistent_storage.filesystem
15
+ manage = m.config.persistent_storage.manage
16
+ use_lvm = m.config.persistent_storage.use_lvm
17
+ mount = m.config.persistent_storage.mount
18
+ format = m.config.persistent_storage.format
19
+
20
+ vg_name = 'vps' unless vg_name != 0
21
+ disk_dev = '/dev/sdb' unless disk_dev != 0
22
+ mnt_name = 'vps' unless mnt_name != 0
23
+ fs_type = 'ext3' unless fs_type != 0
24
+ if use_lvm
25
+ device = "/dev/#{vg_name}-vg1/#{mnt_name}"
26
+ else
27
+ device = "#{disk_dev}1"
28
+ end
29
+
30
+ ## shell script to format disk, create/manage LVM, mount disk
31
+ disk_operations_template = ERB.new <<-EOF
32
+ #!/bin/bash
33
+ # fdisk the disk if it's not a block device already:
34
+ [ -b #{disk_dev}1 ] || echo 0,,8e | sfdisk #{disk_dev}
35
+ echo "fdisk returned: $?" >> disk_operation_log.txt
36
+
37
+ <% if use_lvm == true %>
38
+ # Create the physical volume if it doesn't already exist:
39
+ [[ `pvs #{disk_dev}1` ]] || pvcreate #{disk_dev}1
40
+ echo "pvcreate returned: $?" >> disk_operation_log.txt
41
+ # Create the volume group if it doesn't already exist:
42
+ [[ `vgs #{vg_name}-vg1` ]] || vgcreate #{vg_name}-vg1 #{disk_dev}1
43
+ echo "vgcreate returned: $?" >> disk_operation_log.txt
44
+ # Create the logical volume if it doesn't already exist:
45
+ [[ `lvs #{vg_name}-vg1 | grep #{mnt_name}` ]] || lvcreate -l 100%FREE -n #{mnt_name} #{vg_name}-vg1
46
+ echo "lvcreate returned: $?" >> disk_operation_log.txt
47
+ # Activate the volume group if it's inactive:
48
+ [[ `lvs #{vg_name}-vg1 --noheadings --nameprefixes | grep LVM2_LV_ATTR | grep "wi\-a"` ]] || vgchange #{vg_name}-vg1 -a y
49
+ echo "vg activation returned: $?" >> disk_operation_log.txt
50
+ <% end %>
51
+
52
+ <% if format == true %>
53
+ # Create the filesytem if it doesn't already exist
54
+ [[ `blkid | grep #{mnt_name} | grep #{fs_type}` ]] || mkfs.#{fs_type} #{device}
55
+ echo "#{fs_type} creation return: $?" >> disk_operation_log.txt
56
+ <% if mount == true %>
57
+ # Create mountpoint #{mnt_point}
58
+ [ -d #{mnt_point} ] || mkdir -p #{mnt_point}
59
+ # Update fstab with new mountpoint name
60
+ [[ `grep -i #{device} /etc/fstab` ]] || echo #{device} #{mnt_point} #{fs_type} defaults 0 0 >> /etc/fstab
61
+ echo "fstab update returned: $?" >> disk_operation_log.txt
62
+ # Finally, mount the partition
63
+ [[ `mount | grep #{mnt_point}` ]] || mount #{mnt_point}
64
+ echo "#{mnt_point} mounting returned: $?" >> disk_operation_log.txt
65
+ <% end %>
66
+ <% end %>
67
+ exit $?
68
+ EOF
69
+
70
+ buffer = disk_operations_template.result(binding)
71
+ tmp_script = "/tmp/disk_operations_#{mnt_name}.sh"
72
+ target_script = "/tmp/disk_operations_#{mnt_name}.sh"
73
+
74
+ File.open("#{tmp_script}", 'w') do |f|
75
+ f.write buffer
76
+ end
77
+ m.communicate.upload(tmp_script, target_script)
78
+ m.communicate.sudo("chmod 755 #{target_script}")
79
+ end
80
+
81
+ def run_disk_operations(m)
82
+ return unless m.communicate.ready?
83
+ mnt_name = m.config.persistent_storage.mountname
84
+ mnt_name = 'vps' unless mnt_name != 0
85
+ target_script = "/tmp/disk_operations_#{mnt_name}.sh"
86
+ m.communicate.sudo("#{target_script}")
87
+ end
88
+
89
+ def manage_volumes(m)
90
+ populate_template(m)
91
+ if m.config.persistent_storage.manage?
92
+ run_disk_operations(m)
93
+ end
94
+ end
95
+
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,62 @@
1
+ require 'vagrant'
2
+
3
+ module VagrantPlugins
4
+ module PersistentStorage
5
+ class Plugin < Vagrant.plugin('2')
6
+
7
+ include Vagrant::Action::Builtin
8
+
9
+ require_relative "action"
10
+ require_relative "providers/virtualbox/driver/base"
11
+ require_relative "providers/virtualbox/driver/meta"
12
+
13
+ name "persistent_storage"
14
+ description <<-DESC
15
+ This plugin provides config to attach persistent storage
16
+ DESC
17
+
18
+ config "persistent_storage" do
19
+ require_relative "config"
20
+ Config
21
+ end
22
+
23
+ ## NB Currently only works with Virtualbox provider, due to hooks being used
24
+ action_hook(:persistent_storage, :machine_action_up) do |hook|
25
+ hook.after VagrantPlugins::ProviderVirtualBox::Action::SaneDefaults,
26
+ VagrantPlugins::PersistentStorage::Action.create_adapter
27
+ hook.before VagrantPlugins::ProviderVirtualBox::Action::Boot,
28
+ VagrantPlugins::PersistentStorage::Action.create_storage
29
+ hook.before VagrantPlugins::ProviderVirtualBox::Action::Boot,
30
+ VagrantPlugins::PersistentStorage::Action.attach_storage
31
+ hook.after VagrantPlugins::ProviderVirtualBox::Action::CheckGuestAdditions,
32
+ VagrantPlugins::PersistentStorage::Action.manage_storage
33
+ hook.after VagrantPlugins::PersistentStorage::Action.attach_storage,
34
+ VagrantPlugins::PersistentStorage::Action.manage_storage
35
+ end
36
+
37
+ action_hook(:persistent_storage, :machine_action_destroy) do |hook|
38
+ hook.after VagrantPlugins::ProviderVirtualBox::Action::action_halt,
39
+ VagrantPlugins::PersistentStorage::Action.detach_storage
40
+ hook.before VagrantPlugins::ProviderVirtualBox::Action::Destroy,
41
+ VagrantPlugins::PersistentStorage::Action.detach_storage
42
+ end
43
+
44
+ action_hook(:persistent_storage, :machine_action_halt) do |hook|
45
+ hook.after VagrantPlugins::ProviderVirtualBox::Action::GracefulHalt,
46
+ VagrantPlugins::PersistentStorage::Action.detach_storage
47
+ hook.after VagrantPlugins::ProviderVirtualBox::Action::ForcedHalt,
48
+ VagrantPlugins::PersistentStorage::Action.detach_storage
49
+ end
50
+
51
+ action_hook(:persistent_storage, :machine_action_reload) do |hook|
52
+ hook.after VagrantPlugins::ProviderVirtualBox::Action::GracefulHalt,
53
+ VagrantPlugins::PersistentStorage::Action.detach_storage
54
+ hook.after VagrantPlugins::ProviderVirtualBox::Action::ForcedHalt,
55
+ VagrantPlugins::PersistentStorage::Action.detach_storage
56
+ hook.before VagrantPlugins::ProviderVirtualBox::Action::Boot,
57
+ VagrantPlugins::PersistentStorage::Action.attach_storage
58
+ end
59
+
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,38 @@
1
+ module VagrantPlugins
2
+ module ProviderVirtualBox
3
+ module Driver
4
+ class Base
5
+
6
+ def create_adapter
7
+ execute("storagectl", @uuid, "--name", "SATA Controller", "--sataportcount", "2")
8
+ end
9
+
10
+ def create_storage(location, size)
11
+ execute("createhd", "--filename", location, "--size", "#{size}")
12
+ end
13
+
14
+ def attach_storage(location)
15
+ execute("storageattach", @uuid, "--storagectl", "SATA Controller", "--port", "1", "--device", "0", "--type", "hdd", "--medium", "#{location}")
16
+ end
17
+
18
+ def detach_storage(location)
19
+ if location and read_persistent_storage(location) == location
20
+ execute("storageattach", @uuid, "--storagectl", "SATA Controller", "--port", "1", "--device", "0", "--type", "hdd", "--medium", "none")
21
+ end
22
+ end
23
+
24
+ def read_persistent_storage(location)
25
+ ## Ensure previous operations are complete - bad practise yes, not sure how to avoid this:
26
+ sleep 3
27
+ info = execute("showvminfo", @uuid, "--machinereadable", :retryable => true)
28
+ info.split("\n").each do |line|
29
+ return $1.to_s if line =~ /^"SATA Controller-1-0"="(.+?)"$/
30
+ end
31
+ nil
32
+ end
33
+
34
+ end
35
+ end
36
+ end
37
+ end
38
+
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module ProviderVirtualBox
3
+ module Driver
4
+ class Meta
5
+
6
+ def_delegators :@driver,
7
+ :create_storage,
8
+ :attach_storage,
9
+ :detach_storage,
10
+ :read_persistent_storage
11
+
12
+ end
13
+ end
14
+ end
15
+ end
16
+
@@ -1,3 +1,5 @@
1
- module VagrantPersistentStorage
2
- VERSION = "0.0.2"
1
+ module VagrantPlugins
2
+ module PersistentStorage
3
+ VERSION = "0.0.3"
4
+ end
3
5
  end
@@ -1,12 +1,13 @@
1
- require 'vagrant'
2
- require 'vagrant/action/builder'
3
- require 'vagrant-persistent-storage/config'
4
- require 'vagrant-persistent-storage/middleware'
1
+ require 'vagrant-persistent-storage/plugin'
5
2
  require 'vagrant-persistent-storage/version'
6
3
 
7
- Vagrant.config_keys.register(:persistent_storage) { VagrantPersistentStorage::Config }
8
- Vagrant.actions[:start].insert_after(Vagrant::Action::VM::ShareFolders, VagrantPersistentStorage::AttachPersistentStorage)
9
- Vagrant.actions[:destroy].insert_after(Vagrant::Action::VM::PruneNFSExports, VagrantPersistentStorage::DetachPersistentStorage)
4
+ module VagrantPlugins
5
+ module PersistentStorage
6
+ def self.source_root
7
+ @source_root ||= Pathname.new(File.expand_path("../../", __FILE__))
8
+ end
10
9
 
11
- # Add our custom translations to the load path
12
- #I18n.load_path << File.expand_path("../../locales/en.yml", __FILE__)
10
+ I18n.load_path << File.expand_path('locales/en.yml', source_root)
11
+ I18n.reload!
12
+ end
13
+ end
data/locales/en.yml ADDED
@@ -0,0 +1,12 @@
1
+ en:
2
+ vagrant_persistent_storage:
3
+ action:
4
+ create_adapter: "** Creating adapter for persistent storage **"
5
+ create_storage: "** Creating persistent storage **"
6
+ not_creating: "** Persistent Storage Volume exists, not creating **"
7
+ attach_storage: "** Attaching persistent storage **"
8
+ detach_storage: "** Detaching persistent storage **"
9
+ manage_storage: "** Managing persistent storage **"
10
+ config:
11
+ not_a_bool: "A value for %{config_key} can only be true or false, not type '%{value}'"
12
+ not_an_array_or_string: "A value for %{config_key} must be an Array or String, not type '%{is_class}'"
@@ -5,7 +5,7 @@ require 'vagrant-persistent-storage/version'
5
5
 
6
6
  Gem::Specification.new do |gem|
7
7
  gem.name = "vagrant-persistent-storage"
8
- gem.version = VagrantPersistentStorage::VERSION
8
+ gem.version = VagrantPlugins::PersistentStorage::VERSION
9
9
  gem.authors = ["Sebastian Kusnier"]
10
10
  gem.email = ["sebastian@kusnier.net"]
11
11
  gem.description = "A Vagrant plugin that creates a persistent storage and attaches it to guest machine."
@@ -17,8 +17,6 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
19
 
20
- gem.add_dependency 'vagrant'
21
-
22
20
  gem.add_development_dependency 'rake'
23
21
  gem.add_development_dependency 'rspec'
24
22
  end
metadata CHANGED
@@ -1,13 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-persistent-storage
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
5
- prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 2
10
- version: 0.0.2
4
+ version: 0.0.3
11
5
  platform: ruby
12
6
  authors:
13
7
  - Sebastian Kusnier
@@ -15,48 +9,25 @@ autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
11
 
18
- date: 2012-12-04 00:00:00 Z
12
+ date: 2013-09-08 00:00:00 Z
19
13
  dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: vagrant
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 0
31
- version: "0"
32
- type: :runtime
33
- version_requirements: *id001
34
14
  - !ruby/object:Gem::Dependency
35
15
  name: rake
36
16
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
38
- none: false
17
+ requirement: &id001 !ruby/object:Gem::Requirement
39
18
  requirements:
40
- - - ">="
19
+ - &id002
20
+ - ">="
41
21
  - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
22
  version: "0"
46
23
  type: :development
47
- version_requirements: *id002
24
+ version_requirements: *id001
48
25
  - !ruby/object:Gem::Dependency
49
26
  name: rspec
50
27
  prerelease: false
51
28
  requirement: &id003 !ruby/object:Gem::Requirement
52
- none: false
53
29
  requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
30
+ - *id002
60
31
  type: :development
61
32
  version_requirements: *id003
62
33
  description: A Vagrant plugin that creates a persistent storage and attaches it to guest machine.
@@ -72,46 +43,44 @@ files:
72
43
  - .gitignore
73
44
  - Gemfile
74
45
  - README.md
46
+ - Rakefile
75
47
  - lib/vagrant-persistent-storage.rb
48
+ - lib/vagrant-persistent-storage/action.rb
49
+ - lib/vagrant-persistent-storage/action/attach_storage.rb
50
+ - lib/vagrant-persistent-storage/action/create_adapter.rb
51
+ - lib/vagrant-persistent-storage/action/create_storage.rb
52
+ - lib/vagrant-persistent-storage/action/detach_storage.rb
53
+ - lib/vagrant-persistent-storage/action/manage_storage.rb
76
54
  - lib/vagrant-persistent-storage/config.rb
77
- - lib/vagrant-persistent-storage/middleware.rb
78
- - lib/vagrant-persistent-storage/middleware/attachpersistentstorage.rb
79
- - lib/vagrant-persistent-storage/middleware/detachpersistentstorage.rb
55
+ - lib/vagrant-persistent-storage/manage_storage.rb
56
+ - lib/vagrant-persistent-storage/plugin.rb
57
+ - lib/vagrant-persistent-storage/providers/virtualbox/driver/base.rb
58
+ - lib/vagrant-persistent-storage/providers/virtualbox/driver/meta.rb
80
59
  - lib/vagrant-persistent-storage/version.rb
81
- - lib/vagrant_init.rb
60
+ - locales/en.yml
82
61
  - vagrant-persistent-storage.gemspec
83
62
  homepage: https://github.com/kusnier/vagrant-persistent-storage
84
63
  licenses: []
85
64
 
65
+ metadata: {}
66
+
86
67
  post_install_message:
87
68
  rdoc_options: []
88
69
 
89
70
  require_paths:
90
71
  - lib
91
72
  required_ruby_version: !ruby/object:Gem::Requirement
92
- none: false
93
73
  requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- hash: 3
97
- segments:
98
- - 0
99
- version: "0"
74
+ - *id002
100
75
  required_rubygems_version: !ruby/object:Gem::Requirement
101
- none: false
102
76
  requirements:
103
- - - ">="
104
- - !ruby/object:Gem::Version
105
- hash: 3
106
- segments:
107
- - 0
108
- version: "0"
77
+ - *id002
109
78
  requirements: []
110
79
 
111
80
  rubyforge_project:
112
- rubygems_version: 1.8.24
81
+ rubygems_version: 2.0.7
113
82
  signing_key:
114
- specification_version: 3
83
+ specification_version: 4
115
84
  summary: A Vagrant plugin that creates a persistent storage and attaches it to guest machine.
116
85
  test_files: []
117
86
 
@@ -1,26 +0,0 @@
1
- module VagrantPersistentStorage
2
- class AttachPersistentStorage
3
- def initialize(app, env)
4
- @app = app
5
- @env = env
6
- @vm = env[:vm]
7
- end
8
-
9
- def call(env)
10
- options = @vm.config.persistent_storage
11
- if !options.location ^ !options.size
12
- env[:ui].error "Attach Persistent Storage failed. Location and size must be filled out."
13
- elsif options.location
14
- if !File.exists?(options.location)
15
- @vm.config.vm.customize ["createhd", "--filename", options.location, "--size", options.size]
16
- env[:ui].success "Create Persistent Storage."
17
- end
18
- @vm.config.vm.customize ["storageattach", :id, "--storagectl", "SATA Controller", "--port", 1, "--type", "hdd", "--medium", options.location]
19
-
20
- env[:ui].info "Attach Persistent Storage #{options.location} (Size: #{options.size}MB)"
21
- end
22
-
23
- @app.call(env)
24
- end
25
- end
26
- end
@@ -1,29 +0,0 @@
1
- module VagrantPersistentStorage
2
- class DetachPersistentStorage
3
- def initialize(app, env)
4
- @app = app
5
- @env = env
6
- @vm = env[:vm]
7
- end
8
-
9
- def call(env)
10
- options = @vm.config.persistent_storage
11
- if options.location and read_persistent_storage() == options.location
12
- @vm.driver.execute("storageattach", @vm.uuid, "--storagectl", "SATA Controller", "--port", "1", "--type", "hdd", "--medium", "none")
13
- env[:ui].info "Detach Persistent Storage #{options.location} (Size: #{options.size}MB)"
14
- end
15
-
16
- @app.call(env)
17
- end
18
-
19
- def read_persistent_storage
20
- info = @vm.driver.execute("showvminfo", @vm.uuid, "--machinereadable", :retryable => true)
21
- info.split("\n").each do |line|
22
- return $1.to_s if line =~ /^"SATA Controller-1-0"="(.+?)"$/
23
- end
24
-
25
- nil
26
- end
27
-
28
- end
29
- end
@@ -1,3 +0,0 @@
1
- Dir[File.dirname(__FILE__) + '/middleware/**/*.rb'].each do |file|
2
- require file
3
- end
data/lib/vagrant_init.rb DELETED
@@ -1,4 +0,0 @@
1
- # This file is automatically loaded by Vagrant to load any
2
- # plugins. This file kicks off this plugin.
3
-
4
- require 'vagrant-persistent-storage'