vagrant-cosmic 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/CHANGELOG.md +8 -0
  4. data/Docker/.dockerignore +2 -0
  5. data/Docker/Dockerfile +48 -0
  6. data/Docker/Dockerfile.chefdk_0_17 +49 -0
  7. data/Docker/Dockerfile.latest_dependencies +49 -0
  8. data/Docker/README.md +95 -0
  9. data/Docker/vac.ps1 +29 -0
  10. data/Docker/vac.sh +30 -0
  11. data/Gemfile +21 -0
  12. data/Gemfile.lock +187 -0
  13. data/LICENSE +8 -0
  14. data/README.md +409 -0
  15. data/Rakefile +106 -0
  16. data/build_rpm.sh +7 -0
  17. data/functional-tests/basic/Vagrantfile.basic_networking +34 -0
  18. data/functional-tests/basic/basic_spec.rb +15 -0
  19. data/functional-tests/networking/Vagrantfile.advanced_networking +106 -0
  20. data/functional-tests/networking/networking_spec.rb +14 -0
  21. data/functional-tests/rsync/Vagrantfile.advanced_networking +40 -0
  22. data/functional-tests/rsync/rsync_spec.rb +9 -0
  23. data/functional-tests/vmlifecycle/Vagrantfile.advanced_networking +64 -0
  24. data/functional-tests/vmlifecycle/vmlifecycle_spec.rb +25 -0
  25. data/lib/vagrant-cosmic/action/connect_cosmic.rb +47 -0
  26. data/lib/vagrant-cosmic/action/is_created.rb +18 -0
  27. data/lib/vagrant-cosmic/action/is_stopped.rb +18 -0
  28. data/lib/vagrant-cosmic/action/message_already_created.rb +16 -0
  29. data/lib/vagrant-cosmic/action/message_not_created.rb +16 -0
  30. data/lib/vagrant-cosmic/action/message_will_not_destroy.rb +16 -0
  31. data/lib/vagrant-cosmic/action/read_rdp_info.rb +42 -0
  32. data/lib/vagrant-cosmic/action/read_ssh_info.rb +70 -0
  33. data/lib/vagrant-cosmic/action/read_state.rb +38 -0
  34. data/lib/vagrant-cosmic/action/read_transport_info.rb +59 -0
  35. data/lib/vagrant-cosmic/action/read_winrm_info.rb +69 -0
  36. data/lib/vagrant-cosmic/action/run_instance.rb +819 -0
  37. data/lib/vagrant-cosmic/action/start_instance.rb +81 -0
  38. data/lib/vagrant-cosmic/action/stop_instance.rb +28 -0
  39. data/lib/vagrant-cosmic/action/terminate_instance.rb +208 -0
  40. data/lib/vagrant-cosmic/action/timed_provision.rb +21 -0
  41. data/lib/vagrant-cosmic/action/wait_for_state.rb +41 -0
  42. data/lib/vagrant-cosmic/action/warn_networks.rb +19 -0
  43. data/lib/vagrant-cosmic/action.rb +210 -0
  44. data/lib/vagrant-cosmic/capabilities/rdp.rb +12 -0
  45. data/lib/vagrant-cosmic/capabilities/winrm.rb +12 -0
  46. data/lib/vagrant-cosmic/config.rb +422 -0
  47. data/lib/vagrant-cosmic/errors.rb +27 -0
  48. data/lib/vagrant-cosmic/exceptions/exceptions.rb +15 -0
  49. data/lib/vagrant-cosmic/model/cosmic_resource.rb +51 -0
  50. data/lib/vagrant-cosmic/plugin.rb +82 -0
  51. data/lib/vagrant-cosmic/provider.rb +58 -0
  52. data/lib/vagrant-cosmic/service/cosmic_resource_service.rb +76 -0
  53. data/lib/vagrant-cosmic/util/timer.rb +17 -0
  54. data/lib/vagrant-cosmic/version.rb +5 -0
  55. data/lib/vagrant-cosmic.rb +17 -0
  56. data/locales/en.yml +131 -0
  57. data/spec/spec_helper.rb +53 -0
  58. data/spec/vagrant-cosmic/action/read_ssh_info_spec.rb +80 -0
  59. data/spec/vagrant-cosmic/action/retrieve_public_ip_port_spec.rb +94 -0
  60. data/spec/vagrant-cosmic/action/run_instance_spec.rb +573 -0
  61. data/spec/vagrant-cosmic/action/terminate_instance_spec.rb +207 -0
  62. data/spec/vagrant-cosmic/config_spec.rb +340 -0
  63. data/spec/vagrant-cosmic/model/cosmic_resource_spec.rb +95 -0
  64. data/spec/vagrant-cosmic/service/cosmic_resource_service_spec.rb +43 -0
  65. data/spec/vagrant-cosmic/support/be_a_resource.rb +6 -0
  66. data/vagrant-cosmic.gemspec +59 -0
  67. data/vagrant-cosmic.spec +42 -0
  68. metadata +218 -0
@@ -0,0 +1,81 @@
1
+ require "log4r"
2
+ require "vagrant/util/retryable"
3
+ require "vagrant-cosmic/util/timer"
4
+
5
+ module VagrantPlugins
6
+ module Cosmic
7
+ module Action
8
+ # This starts a stopped instance.
9
+ class StartInstance
10
+ include Vagrant::Util::Retryable
11
+
12
+ def initialize(app, env)
13
+ @app = app
14
+ @logger = Log4r::Logger.new("vagrant_cosmic::action::start_instance")
15
+ end
16
+
17
+ def call(env)
18
+ # Initialize metrics if they haven't been
19
+ env[:metrics] ||= {}
20
+
21
+ server = env[:cosmic_compute].servers.get(env[:machine].id)
22
+
23
+ env[:ui].info(I18n.t("vagrant_cosmic.starting"))
24
+
25
+ begin
26
+ server.start
27
+
28
+ domain = env[:machine].provider_config.domain_id
29
+ domain_config = env[:machine].provider_config.get_domain_config(domain)
30
+
31
+ # Wait for the instance to be ready first
32
+ env[:metrics]["instance_ready_time"] = Util::Timer.time do
33
+ tries = domain_config.instance_ready_timeout / 2
34
+
35
+ env[:ui].info(I18n.t("vagrant_cosmic.waiting_for_ready"))
36
+ begin
37
+ retryable(:on => Fog::Errors::TimeoutError, :tries => tries) do
38
+ # If we're interrupted don't worry about waiting
39
+ next if env[:interrupted]
40
+
41
+ # Wait for the server to be ready
42
+ server.wait_for(2) { ready? }
43
+ end
44
+ rescue Fog::Errors::TimeoutError
45
+ # Notify the user
46
+ raise Errors::InstanceReadyTimeout,
47
+ :timeout => domain_config.instance_ready_timeout
48
+ end
49
+ end
50
+ rescue Fog::Cosmic::Compute::Error => e
51
+ raise Errors::FogError, :message => e.message
52
+ end
53
+
54
+ @logger.info("Time to instance ready: #{env[:metrics]["instance_ready_time"]}")
55
+
56
+ if !env[:interrupted]
57
+ env[:metrics]["instance_ssh_time"] = Util::Timer.time do
58
+ # Wait for communicator to be ready.
59
+ communicator = env[:machine].config.vm.communicator
60
+ communicator = "SSH" if communicator.nil?
61
+ env[:ui].info(I18n.t("vagrant_cosmic.waiting_for_communicator", :communicator => communicator.to_s.upcase))
62
+ while true
63
+ # If we're interrupted then just back out
64
+ break if env[:interrupted]
65
+ break if env[:machine].communicate.ready?
66
+ sleep 2
67
+ end
68
+ end
69
+
70
+ @logger.info("Time for SSH ready: #{env[:metrics]["instance_ssh_time"]}")
71
+
72
+ # Ready and booted!
73
+ env[:ui].info(I18n.t("vagrant_cosmic.ready"))
74
+ end
75
+
76
+ @app.call(env)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,28 @@
1
+ require "log4r"
2
+
3
+ module VagrantPlugins
4
+ module Cosmic
5
+ module Action
6
+ # This stops the running instance.
7
+ class StopInstance
8
+ def initialize(app, env)
9
+ @app = app
10
+ @logger = Log4r::Logger.new("vagrant_cosmic::action::stop_instance")
11
+ end
12
+
13
+ def call(env)
14
+ server = env[:cosmic_compute].servers.get(env[:machine].id)
15
+
16
+ if env[:machine].state.id == :stopped
17
+ env[:ui].info(I18n.t("vagrant_cosmic.already_status", :status => env[:machine].state.id))
18
+ else
19
+ env[:ui].info(I18n.t("vagrant_cosmic.stopping"))
20
+ server.stop({'force' => !!env[:force_halt]})
21
+ end
22
+
23
+ @app.call(env)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,208 @@
1
+ require 'log4r'
2
+
3
+ module VagrantPlugins
4
+ module Cosmic
5
+ module Action
6
+ # This terminates the running instance.
7
+ class TerminateInstance
8
+ def initialize(app, env)
9
+ @app = app
10
+ @logger = Log4r::Logger.new('vagrant_cosmic::action::terminate_instance')
11
+ end
12
+
13
+ def call(env)
14
+ # Delete the Firewall rule
15
+ remove_firewall_rules(env)
16
+
17
+ # Disable Static NAT
18
+ remove_static_nat(env)
19
+
20
+ # Delete the Port forwarding rule
21
+ remove_portforwarding(env)
22
+
23
+ # Destroy the server and remove the tracking ID
24
+ if env[:machine].id.nil?
25
+ env[:ui].info(I18n.t('vagrant_cosmic.no_instance_found'))
26
+ return
27
+ else
28
+ server = env[:cosmic_compute].servers.get(env[:machine].id)
29
+
30
+ env[:ui].info(I18n.t('vagrant_cosmic.terminating'))
31
+
32
+ domain = env[:machine].provider_config.domain_id
33
+ domain_config = env[:machine].provider_config.get_domain_config(domain)
34
+ expunge_on_destroy = domain_config.expunge_on_destroy
35
+
36
+ options = {}
37
+ options['expunge'] = expunge_on_destroy
38
+
39
+ job = server.destroy(options)
40
+ wait_for_job_ready(env, job.id, 'Waiting for instance to be deleted')
41
+ end
42
+
43
+ remove_volumes(env)
44
+
45
+ # Delete the vmcredentials file
46
+ remove_stored_credentials(env)
47
+
48
+ # Remove keyname from cosmic
49
+ remove_generated_ssh_key(env)
50
+
51
+ env[:machine].id = nil
52
+
53
+ env[:ui].info(I18n.t('vagrant_cosmic.terminateinstance_done'))
54
+ @app.call(env)
55
+ end
56
+
57
+ def remove_volumes(env)
58
+ volumes_file = env[:machine].data_dir.join('volumes')
59
+ if volumes_file.file?
60
+ env[:ui].info(I18n.t('vagrant_cosmic.deleting_volumes'))
61
+ File.read(volumes_file).each_line do |line|
62
+ volume_id = line.strip
63
+ begin
64
+ resp = env[:cosmic_compute].detach_volume({:id => volume_id})
65
+ job_id = resp['detachvolumeresponse']['jobid']
66
+ wait_for_job_ready(env, job_id)
67
+ rescue Fog::Cosmic::Compute::Error => e
68
+ if e.message =~ /Unable to execute API command detachvolume.*entity does not exist/
69
+ env[:ui].warn(I18n.t('vagrant_cosmic.detach_volume_failed', message: e.message))
70
+ else
71
+ raise Errors::FogError, :message => e.message
72
+ end
73
+ end
74
+ resp = env[:cosmic_compute].delete_volume({:id => volume_id})
75
+ env[:ui].warn(I18n.t('vagrant_cosmic.detach_volume_failed', volume_id: volume_id)) unless resp['deletevolumeresponse']['success'] == 'true'
76
+ end
77
+ volumes_file.delete
78
+ end
79
+ end
80
+
81
+ def remove_generated_ssh_key(env)
82
+ sshkeyname_file = env[:machine].data_dir.join('sshkeyname')
83
+ if sshkeyname_file.file?
84
+ env[:ui].info(I18n.t('vagrant_cosmic.ssh_key_pair_removing'))
85
+ sshkeyname = ''
86
+ File.read(sshkeyname_file).each_line do |line|
87
+ sshkeyname = line.strip
88
+ end
89
+
90
+ begin
91
+ response = env[:cosmic_compute].delete_ssh_key_pair(name: sshkeyname)
92
+ env[:ui].warn(I18n.t('vagrant_cosmic.ssh_key_pair_no_success_removing', name: sshkeyname)) unless response['deletesshkeypairresponse']['success'] == 'true'
93
+ rescue Fog::Cosmic::Compute::Error => e
94
+ env[:ui].warn(I18n.t('vagrant_cosmic.errors.fog_error', :message => e.message))
95
+ end
96
+ sshkeyname_file.delete
97
+ end
98
+ end
99
+
100
+ def remove_stored_credentials(env)
101
+ vmcredentials_file = env[:machine].data_dir.join('vmcredentials')
102
+ vmcredentials_file.delete if vmcredentials_file.file?
103
+ end
104
+
105
+ def remove_portforwarding(env)
106
+ env[:ui].info(I18n.t('vagrant_cosmic.deleting_port_forwarding_rule'))
107
+ port_forwarding_file = env[:machine].data_dir.join('port_forwarding')
108
+ if port_forwarding_file.file?
109
+ File.read(port_forwarding_file).each_line do |line|
110
+ rule_id = line.strip
111
+ begin
112
+ resp = env[:cosmic_compute].delete_port_forwarding_rule({:id => rule_id})
113
+ job_id = resp['deleteportforwardingruleresponse']['jobid']
114
+ wait_for_job_ready(env, job_id)
115
+ rescue Fog::Cosmic::Compute::Error => e
116
+ if e.message =~ /Unable to execute API command deleteportforwardingrule.*entity does not exist/
117
+ env[:ui].warn(" -- Failed to delete portforwarding rule: #{e.message}")
118
+ else
119
+ raise Errors::FogError, :message => e.message
120
+ end
121
+
122
+ end
123
+ end
124
+ port_forwarding_file.delete
125
+ end
126
+
127
+ # Delete the Communicator Port forwording public port file
128
+ # Delete the RDP Port forwording public port file
129
+ %w(pf_public_port pf_public_rdp_port).each do |pf_filename|
130
+ pf_file = env[:machine].data_dir.join(pf_filename)
131
+ pf_file.delete if pf_file.file?
132
+ end
133
+ end
134
+
135
+ def remove_static_nat(env)
136
+ env[:ui].info(I18n.t('vagrant_cosmic.disabling_static_nat'))
137
+ static_nat_file = env[:machine].data_dir.join('static_nat')
138
+ if static_nat_file.file?
139
+ File.read(static_nat_file).each_line do |line|
140
+ ip_address_id = line.strip
141
+ begin
142
+ options = {
143
+ :command => 'disableStaticNat',
144
+ :ipaddressid => ip_address_id
145
+ }
146
+ resp = env[:cosmic_compute].request(options)
147
+ job_id = resp['disablestaticnatresponse']['jobid']
148
+ wait_for_job_ready(env, job_id)
149
+ rescue Fog::Cosmic::Compute::Error => e
150
+ raise Errors::FogError, :message => e.message
151
+ end
152
+ end
153
+ static_nat_file.delete
154
+ end
155
+ end
156
+
157
+ def remove_firewall_rules(env)
158
+ env[:ui].info(I18n.t('vagrant_cosmic.deleting_firewall_rule'))
159
+ firewall_file = env[:machine].data_dir.join('firewall')
160
+ if firewall_file.file?
161
+ File.read(firewall_file).each_line do |line|
162
+ line_items=line.split(",").collect(&:strip)
163
+ rule_id = line_items[0]
164
+ type_string = line_items[1]
165
+
166
+ if type_string == 'firewallrule'
167
+ command_string = 'deleteFirewallRule'
168
+ response_string = 'deletefirewallruleresponse'
169
+ else
170
+ command_string = 'deleteNetworkACL'
171
+ response_string = 'deletenetworkaclresponse'
172
+ end
173
+
174
+ begin
175
+ options = {
176
+ command: command_string,
177
+ id: rule_id
178
+ }
179
+ resp = env[:cosmic_compute].request(options)
180
+ job_id = resp[response_string]['jobid']
181
+ wait_for_job_ready(env, job_id)
182
+ rescue Fog::Cosmic::Compute::Error => e
183
+ if e.message =~ /Unable to execute API command deletefirewallrule.*entity does not exist/
184
+ env[:ui].warn(" -- Failed to delete #{type_string}: #{e.message}")
185
+ else
186
+ raise Errors::FogError, :message => e.message
187
+ end
188
+ end
189
+ end
190
+ firewall_file.delete
191
+ end
192
+ end
193
+
194
+ def wait_for_job_ready(env, job_id, message=nil)
195
+ while true
196
+ response = env[:cosmic_compute].query_async_job_result({:jobid => job_id})
197
+ if response['queryasyncjobresultresponse']['jobstatus'] != 0
198
+ break
199
+ else
200
+ env[:ui].info(message) if message
201
+ sleep 2
202
+ end
203
+ end
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,21 @@
1
+ require "vagrant-cosmic/util/timer"
2
+
3
+ module VagrantPlugins
4
+ module Cosmic
5
+ module Action
6
+ # This is the same as the builtin provision except it times the
7
+ # provisioner runs.
8
+ class TimedProvision < Vagrant::Action::Builtin::Provision
9
+ def run_provisioner(env, pname, p)
10
+ timer = Util::Timer.time do
11
+ super
12
+ end
13
+
14
+ env[:metrics] ||= {}
15
+ env[:metrics]["provisioner_times"] ||= []
16
+ env[:metrics]["provisioner_times"] << [p.class.to_s, timer]
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,41 @@
1
+ require "log4r"
2
+ require "timeout"
3
+
4
+ module VagrantPlugins
5
+ module Cosmic
6
+ module Action
7
+ # This action will wait for a machine to reach a specific state or quit by timeout
8
+ class WaitForState
9
+ # env[:result] will be false in case of timeout.
10
+ # @param [Symbol] state Target machine state.
11
+ # @param [Number] timeout Timeout in seconds.
12
+ def initialize(app, env, state, timeout)
13
+ @app = app
14
+ @logger = Log4r::Logger.new("vagrant_cosmic::action::wait_for_state")
15
+ @state = state
16
+ @timeout = timeout
17
+ end
18
+
19
+ def call(env)
20
+ env[:result] = true
21
+ if env[:machine].state.id == @state
22
+ @logger.info(I18n.t("vagrant_cosmic.already_status", :status => @state))
23
+ else
24
+ @logger.info("Waiting for machine to reach state #{@state}")
25
+ begin
26
+ Timeout.timeout(@timeout) do
27
+ until env[:machine].state.id == @state
28
+ sleep 2
29
+ end
30
+ end
31
+ rescue Timeout::Error
32
+ env[:result] = false # couldn't reach state in time
33
+ end
34
+ end
35
+
36
+ @app.call(env)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,19 @@
1
+ module VagrantPlugins
2
+ module Cosmic
3
+ module Action
4
+ class WarnNetworks
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ if env[:machine].config.vm.networks.length > 0
11
+ env[:ui].warn(I18n.t("vagrant_cosmic.warn_networks"))
12
+ end
13
+
14
+ @app.call(env)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,210 @@
1
+ require "pathname"
2
+ require "vagrant/action/builder"
3
+
4
+ module VagrantPlugins
5
+ module Cosmic
6
+ module Action
7
+ # Include the built-in modules so we can use them as top-level things.
8
+ include Vagrant::Action::Builtin
9
+
10
+ # This action is called to halt the remote machine.
11
+ def self.action_halt
12
+ Vagrant::Action::Builder.new.tap do |b|
13
+ b.use ConfigValidate
14
+ b.use Call, IsCreated do |env, b2|
15
+ if !env[:result]
16
+ b2.use MessageNotCreated
17
+ next
18
+ end
19
+
20
+ b2.use ConnectCosmic
21
+ b2.use StopInstance
22
+ end
23
+ end
24
+ end
25
+
26
+ # This action is called to terminate the remote machine.
27
+ def self.action_destroy
28
+ Vagrant::Action::Builder.new.tap do |b|
29
+ b.use Call, DestroyConfirm do |env, b2|
30
+ if env[:result]
31
+ b2.use ConfigValidate
32
+ b.use Call, IsCreated do |env2, b3|
33
+ if !env2[:result]
34
+ b3.use MessageNotCreated
35
+ next
36
+ end
37
+ end
38
+ b2.use ConnectCosmic
39
+ b2.use TerminateInstance
40
+ else
41
+ b2.use MessageWillNotDestroy
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ # This action is called when `vagrant provision` is called.
48
+ def self.action_provision
49
+ Vagrant::Action::Builder.new.tap do |b|
50
+ b.use ConfigValidate
51
+ b.use Call, IsCreated do |env, b2|
52
+ if !env[:result]
53
+ b2.use MessageNotCreated
54
+ next
55
+ end
56
+
57
+ b2.use Provision
58
+ b2.use SyncedFolders
59
+ end
60
+ end
61
+ end
62
+
63
+ # This action is called to read the WinRM info of the machine. The
64
+ # resulting state is expected to be put into the `:machine_winrm_info`
65
+ # key.
66
+ def self.action_read_rdp_info
67
+ Vagrant::Action::Builder.new.tap do |b|
68
+ b.use ConfigValidate
69
+ b.use ConnectCosmic
70
+ b.use ReadRdpInfo
71
+ end
72
+ end
73
+
74
+ # This action is called to read the WinRM info of the machine. The
75
+ # resulting state is expected to be put into the `:machine_winrm_info`
76
+ # key.
77
+ def self.action_read_winrm_info
78
+ Vagrant::Action::Builder.new.tap do |b|
79
+ b.use ConfigValidate
80
+ b.use ConnectCosmic
81
+ b.use ReadWinrmInfo
82
+ end
83
+ end
84
+
85
+ # This action is called to read the SSH info of the machine. The
86
+ # resulting state is expected to be put into the `:machine_ssh_info`
87
+ # key.
88
+ def self.action_read_ssh_info
89
+ Vagrant::Action::Builder.new.tap do |b|
90
+ b.use ConfigValidate
91
+ b.use ConnectCosmic
92
+ b.use ReadSSHInfo
93
+ end
94
+ end
95
+
96
+ # This action is called to read the state of the machine. The
97
+ # resulting state is expected to be put into the `:machine_state_id`
98
+ # key.
99
+ def self.action_read_state
100
+ Vagrant::Action::Builder.new.tap do |b|
101
+ b.use ConfigValidate
102
+ b.use ConnectCosmic
103
+ b.use ReadState
104
+ end
105
+ end
106
+
107
+ # This action is called to SSH into the machine.
108
+ def self.action_ssh
109
+ Vagrant::Action::Builder.new.tap do |b|
110
+ b.use ConfigValidate
111
+ b.use Call, IsCreated do |env, b2|
112
+ if !env[:result]
113
+ b2.use MessageNotCreated
114
+ next
115
+ end
116
+
117
+ b2.use SSHExec
118
+ end
119
+ end
120
+ end
121
+
122
+ def self.action_ssh_run
123
+ Vagrant::Action::Builder.new.tap do |b|
124
+ b.use ConfigValidate
125
+ b.use Call, IsCreated do |env, b2|
126
+ if !env[:result]
127
+ b2.use MessageNotCreated
128
+ next
129
+ end
130
+
131
+ b2.use SSHRun
132
+ end
133
+ end
134
+ end
135
+
136
+ def self.action_prepare_boot
137
+ Vagrant::Action::Builder.new.tap do |b|
138
+ b.use Provision
139
+ b.use SyncedFolders
140
+ b.use WarnNetworks
141
+ end
142
+ end
143
+
144
+ # This action is called to bring the box up from nothing.
145
+ def self.action_up
146
+ Vagrant::Action::Builder.new.tap do |b|
147
+ b.use ConfigValidate
148
+ b.use ConnectCosmic
149
+ b.use Call, IsCreated do |env1, b1|
150
+ if env1[:result]
151
+ b1.use Call, IsStopped do |env2, b2|
152
+ if env2[:result]
153
+ b2.use action_prepare_boot
154
+ b2.use StartInstance # restart this instance
155
+ else
156
+ b2.use MessageAlreadyCreated # TODO write a better message
157
+ end
158
+ end
159
+ else
160
+ b1.use action_prepare_boot
161
+ b1.use RunInstance # launch a new instance
162
+ end
163
+ end
164
+ end
165
+ end
166
+
167
+ def self.action_reload
168
+ Vagrant::Action::Builder.new.tap do |b|
169
+ b.use ConfigValidate
170
+ b.use ConnectCosmic
171
+ b.use Call, IsCreated do |env, b2|
172
+ if !env[:result]
173
+ b2.use MessageNotCreated
174
+ next
175
+ end
176
+
177
+ b2.use action_halt
178
+ b2.use Call, WaitForState, :stopped, 120 do |env2, b3|
179
+ if env2[:result]
180
+ b3.use action_up
181
+ else
182
+ # TODO we couldn't reach :stopped, what now?
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
188
+
189
+ # The autoload farm
190
+ action_root = Pathname.new(File.expand_path("../action", __FILE__))
191
+ autoload :ConnectCosmic, action_root.join("connect_cosmic")
192
+ autoload :IsCreated, action_root.join("is_created")
193
+ autoload :IsStopped, action_root.join("is_stopped")
194
+ autoload :MessageAlreadyCreated, action_root.join("message_already_created")
195
+ autoload :MessageNotCreated, action_root.join("message_not_created")
196
+ autoload :MessageWillNotDestroy, action_root.join("message_will_not_destroy")
197
+ autoload :ReadSSHInfo, action_root.join("read_ssh_info")
198
+ autoload :ReadWinrmInfo, action_root.join("read_winrm_info")
199
+ autoload :ReadRdpInfo, action_root.join("read_rdp_info")
200
+ autoload :ReadState, action_root.join("read_state")
201
+ autoload :RunInstance, action_root.join("run_instance")
202
+ autoload :StartInstance, action_root.join("start_instance")
203
+ autoload :StopInstance, action_root.join("stop_instance")
204
+ autoload :TimedProvision, action_root.join("timed_provision")
205
+ autoload :WaitForState, action_root.join("wait_for_state")
206
+ autoload :WarnNetworks, action_root.join("warn_networks")
207
+ autoload :TerminateInstance, action_root.join("terminate_instance")
208
+ end
209
+ end
210
+ end
@@ -0,0 +1,12 @@
1
+ module VagrantPlugins
2
+ module Cosmic
3
+ module Cap
4
+ class Rdp
5
+ def self.rdp_info(machine)
6
+ env = machine.action('read_rdp_info')
7
+ env[:machine_rdp_info]
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module VagrantPlugins
2
+ module Cosmic
3
+ module Cap
4
+ class WinRM
5
+ def self.winrm_info(machine)
6
+ env = machine.action('read_winrm_info')
7
+ env[:machine_winrm_info]
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end