vagrant-azure 1.3.0 → 2.0.0.pre1
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 +4 -4
- data/.gitignore +1 -0
- data/.rspec +2 -0
- data/Gemfile +5 -6
- data/LICENSE +21 -4
- data/README.md +36 -178
- data/Rakefile +3 -5
- data/example_box/Vagrantfile +7 -8
- data/lib/vagrant-azure/action/connect_azure.rb +9 -30
- data/lib/vagrant-azure/action/is_created.rb +19 -0
- data/lib/vagrant-azure/action/is_stopped.rb +19 -0
- data/lib/vagrant-azure/action/message_already_created.rb +19 -0
- data/lib/vagrant-azure/action/message_not_created.rb +19 -0
- data/lib/vagrant-azure/action/message_will_not_destroy.rb +19 -0
- data/lib/vagrant-azure/action/read_ssh_info.rb +13 -33
- data/lib/vagrant-azure/action/read_state.rb +28 -26
- data/lib/vagrant-azure/action/restart_vm.rb +11 -11
- data/lib/vagrant-azure/action/run_instance.rb +164 -80
- data/lib/vagrant-azure/action/start_instance.rb +34 -15
- data/lib/vagrant-azure/action/stop_instance.rb +36 -21
- data/lib/vagrant-azure/action/terminate_instance.rb +18 -14
- data/lib/vagrant-azure/action/wait_for_state.rb +17 -23
- data/lib/vagrant-azure/action.rb +49 -124
- data/lib/vagrant-azure/config.rb +107 -111
- data/lib/vagrant-azure/errors.rb +9 -11
- data/lib/vagrant-azure/plugin.rb +8 -32
- data/lib/vagrant-azure/provider.rb +7 -29
- data/lib/vagrant-azure/services/azure_resource_manager.rb +80 -0
- data/lib/vagrant-azure/util/machine_id_helper.rb +20 -0
- data/lib/vagrant-azure/util/timer.rb +15 -0
- data/lib/vagrant-azure/util/vm_await.rb +36 -0
- data/lib/vagrant-azure/util/vm_status_translator.rb +59 -0
- data/lib/vagrant-azure/version.rb +5 -7
- data/lib/vagrant-azure.rb +4 -9
- data/locales/en.yml +74 -3
- data/spec/spec_helper.rb +40 -0
- data/spec/vagrant-azure/config_spec.rb +18 -0
- data/spec/vagrant-azure/services/azure_resource_manager_spec.rb +19 -0
- data/templates/arm/deployment.json.erb +264 -0
- data/vagrant-azure.gemspec +19 -14
- metadata +96 -51
- data/lib/vagrant-azure/action/os_type.rb +0 -34
- data/lib/vagrant-azure/action/powershell_run.rb +0 -28
- data/lib/vagrant-azure/action/rdp.rb +0 -63
- data/lib/vagrant-azure/action/read_winrm_info.rb +0 -57
- data/lib/vagrant-azure/action/sync_folders.rb +0 -64
- data/lib/vagrant-azure/action/vagrant_azure_service.rb +0 -44
- data/lib/vagrant-azure/capabilities/winrm.rb +0 -12
- data/lib/vagrant-azure/command/powershell.rb +0 -43
- data/lib/vagrant-azure/command/rdp.rb +0 -24
- data/lib/vagrant-azure/driver.rb +0 -48
- data/lib/vagrant-azure/monkey_patch/winrm.rb +0 -12
@@ -1,47 +1,41 @@
|
|
1
|
-
|
2
|
-
# Copyright (c) Microsoft
|
3
|
-
#
|
4
|
-
# See License.txt in the project root for license information.
|
5
|
-
#--------------------------------------------------------------------------
|
1
|
+
# encoding: utf-8
|
2
|
+
# Copyright (c) Microsoft Corporation. All rights reserved.
|
3
|
+
# Licensed under the MIT License. See License in the project root for license information.
|
6
4
|
require 'log4r'
|
7
5
|
require 'timeout'
|
8
6
|
|
9
7
|
module VagrantPlugins
|
10
|
-
module
|
8
|
+
module Azure
|
11
9
|
module Action
|
12
10
|
class WaitForState
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
# env[:result] will be false in case of timeout.
|
12
|
+
# @param [Symbol] state Target machine state.
|
13
|
+
# @param [Number] timeout Timeout in seconds.
|
14
|
+
# @param [Object] env vagrant environment
|
15
|
+
def initialize(app, env, state, timeout)
|
16
|
+
@app = app
|
17
|
+
@logger = Log4r::Logger.new('vagrant_azure::action::wait_for_state')
|
18
|
+
@state = state
|
19
|
+
@timeout = timeout
|
20
|
+
@env = env
|
17
21
|
end
|
18
22
|
|
19
23
|
def call(env)
|
20
24
|
env[:result] = true
|
21
|
-
|
22
25
|
if env[:machine].state.id == @state
|
23
|
-
@logger.info(
|
24
|
-
I18n.t('vagrant_azure.already_status', :status => @state)
|
25
|
-
)
|
26
|
+
@logger.info(I18n.t('vagrant_azure.already_status', :status => @state))
|
26
27
|
else
|
27
|
-
timeout = env[:machine].provider_config.state_read_timeout || env[:machine].config.vm.boot_timeout
|
28
|
-
|
29
|
-
env[:ui].info "Waiting for machine to reach state #{@state}"
|
30
28
|
@logger.info("Waiting for machine to reach state #{@state}")
|
31
|
-
|
32
29
|
begin
|
33
|
-
Timeout.timeout(timeout)
|
30
|
+
Timeout.timeout(@timeout) do
|
34
31
|
until env[:machine].state.id == @state
|
35
|
-
sleep
|
32
|
+
sleep 2
|
36
33
|
end
|
37
34
|
end
|
38
|
-
env[:ui].success "Machine reached state #{@state}"
|
39
35
|
rescue Timeout::Error
|
40
|
-
env[:ui].error "Machine failed to reached state '#{@state}' in '#{timeout}' seconds."
|
41
36
|
env[:result] = false # couldn't reach state in time
|
42
37
|
end
|
43
38
|
end
|
44
|
-
|
45
39
|
@app.call(env)
|
46
40
|
end
|
47
41
|
end
|
data/lib/vagrant-azure/action.rb
CHANGED
@@ -1,15 +1,13 @@
|
|
1
|
-
|
2
|
-
# Copyright (c) Microsoft
|
3
|
-
#
|
4
|
-
# See License.txt in the project root for license information.
|
5
|
-
#--------------------------------------------------------------------------
|
1
|
+
# encoding: utf-8
|
2
|
+
# Copyright (c) Microsoft Corporation. All rights reserved.
|
3
|
+
# Licensed under the MIT License. See License in the project root for license information.
|
6
4
|
require 'pathname'
|
7
5
|
|
8
6
|
require 'vagrant/action/builder'
|
9
7
|
require 'vagrant/action/builtin/wait_for_communicator'
|
10
8
|
|
11
9
|
module VagrantPlugins
|
12
|
-
module
|
10
|
+
module Azure
|
13
11
|
module Action
|
14
12
|
# Include the built-in modules so we can use them as top-level things.
|
15
13
|
include Vagrant::Action::Builtin
|
@@ -18,9 +16,9 @@ module VagrantPlugins
|
|
18
16
|
def self.action_halt
|
19
17
|
Vagrant::Action::Builder.new.tap do |b|
|
20
18
|
b.use ConfigValidate
|
21
|
-
b.use Call,
|
22
|
-
|
23
|
-
b2.use
|
19
|
+
b.use Call, IsCreated do |env, b2|
|
20
|
+
unless env[:result]
|
21
|
+
b2.use MessageNotCreated
|
24
22
|
next
|
25
23
|
end
|
26
24
|
|
@@ -36,22 +34,17 @@ module VagrantPlugins
|
|
36
34
|
b.use Call, DestroyConfirm do |env, b2|
|
37
35
|
if env[:result]
|
38
36
|
b2.use ConfigValidate
|
39
|
-
b2.use Call,
|
40
|
-
|
41
|
-
b3.use
|
37
|
+
b2.use Call, IsCreated do |env2, b3|
|
38
|
+
unless env2[:result]
|
39
|
+
b3.use MessageNotCreated
|
42
40
|
next
|
43
41
|
end
|
42
|
+
b3.use ConnectAzure
|
43
|
+
b3.use TerminateInstance
|
44
|
+
b3.use ProvisionerCleanup if defined?(ProvisionerCleanup)
|
44
45
|
end
|
45
|
-
|
46
|
-
b2.use ConnectAzure
|
47
|
-
b2.use TerminateInstance
|
48
|
-
b2.use ProvisionerCleanup if defined?(ProvisionerCleanup)
|
49
46
|
else
|
50
|
-
|
51
|
-
b2.use Message, I18n.t(
|
52
|
-
'vagrant_azure.will_not_destroy',
|
53
|
-
:name => $`
|
54
|
-
)
|
47
|
+
b2.use MessageWillNotDestroy
|
55
48
|
end
|
56
49
|
end
|
57
50
|
end
|
@@ -60,18 +53,14 @@ module VagrantPlugins
|
|
60
53
|
# This action is called when `vagrant provision` is called.
|
61
54
|
def self.action_provision
|
62
55
|
Vagrant::Action::Builder.new.tap do |b|
|
63
|
-
b.use ConnectAzure
|
64
56
|
b.use ConfigValidate
|
65
|
-
b.use
|
66
|
-
|
67
|
-
|
68
|
-
if env[:result]
|
69
|
-
b2.use Message, I18n.t('vagrant_azure.not_created')
|
57
|
+
b.use Call, IsCreated do |env, b2|
|
58
|
+
unless env[:result]
|
59
|
+
b2.use MessageNotCreated
|
70
60
|
next
|
71
61
|
end
|
72
62
|
|
73
63
|
b2.use Provision
|
74
|
-
b2.use SyncFolders
|
75
64
|
end
|
76
65
|
end
|
77
66
|
end
|
@@ -82,27 +71,13 @@ module VagrantPlugins
|
|
82
71
|
Vagrant::Action::Builder.new.tap do |b|
|
83
72
|
b.use ConfigValidate
|
84
73
|
b.use ConnectAzure
|
85
|
-
b.use ReadSSHInfo
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def self.action_read_rdp_info
|
90
|
-
Vagrant::Action::Builder.new.tap do |b|
|
91
|
-
b.use ConfigValidate
|
92
|
-
b.use ConnectAzure
|
93
|
-
b.use ReadSSHInfo, 3389
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def self.action_read_winrm_info
|
98
|
-
Vagrant::Action::Builder.new.tap do |b|
|
99
|
-
b.use ConfigValidate
|
100
|
-
b.use ConnectAzure
|
101
|
-
b.use OSType
|
102
|
-
b.use ReadWinrmInfo
|
74
|
+
b.use ReadSSHInfo
|
103
75
|
end
|
104
76
|
end
|
105
77
|
|
78
|
+
# This action is called to read the state of the machine. The
|
79
|
+
# resulting state is expected to be put into the `:machine_state_id`
|
80
|
+
# key.
|
106
81
|
def self.action_read_state
|
107
82
|
Vagrant::Action::Builder.new.tap do |b|
|
108
83
|
b.use ConfigValidate
|
@@ -111,14 +86,13 @@ module VagrantPlugins
|
|
111
86
|
end
|
112
87
|
end
|
113
88
|
|
114
|
-
# This action is called to SSH into the machine
|
89
|
+
# This action is called to SSH into the machine.
|
115
90
|
def self.action_ssh
|
116
91
|
Vagrant::Action::Builder.new.tap do |b|
|
117
|
-
b.use ConnectAzure
|
118
92
|
b.use ConfigValidate
|
119
|
-
b.use Call,
|
120
|
-
|
121
|
-
b2.use
|
93
|
+
b.use Call, IsCreated do |env, b2|
|
94
|
+
unless env[:result]
|
95
|
+
b2.use MessageNotCreated
|
122
96
|
next
|
123
97
|
end
|
124
98
|
|
@@ -127,49 +101,12 @@ module VagrantPlugins
|
|
127
101
|
end
|
128
102
|
end
|
129
103
|
|
130
|
-
def self.action_powershell_run
|
131
|
-
Vagrant::Action::Builder.new.tap do |b|
|
132
|
-
b.use action_read_winrm_info
|
133
|
-
b.use Call, IsState, :NotCreated do |env, b2|
|
134
|
-
if env[:result]
|
135
|
-
b2.use Message, I18n.t('vagrant_azure.not_created')
|
136
|
-
next
|
137
|
-
end
|
138
|
-
|
139
|
-
b2.use PowerShellRun
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
def self.action_rdp
|
145
|
-
Vagrant::Action::Builder.new.tap do |b|
|
146
|
-
b.use ConnectAzure
|
147
|
-
b.use ConfigValidate
|
148
|
-
b.use Call, IsState, :NotCreated do |env1, b1|
|
149
|
-
if env1[:result]
|
150
|
-
b1.use Message, I18n.t('vagrant_azure.not_created')
|
151
|
-
next
|
152
|
-
end
|
153
|
-
|
154
|
-
b1.use Call, IsState, :ReadyRole do |env2, b2|
|
155
|
-
if !env2[:result]
|
156
|
-
b2.use Message, I18n.t('vagrant_azure.rdp_not_ready')
|
157
|
-
next
|
158
|
-
end
|
159
|
-
|
160
|
-
b2.use Rdp
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
104
|
def self.action_ssh_run
|
167
105
|
Vagrant::Action::Builder.new.tap do |b|
|
168
|
-
b.use ConnectAzure
|
169
106
|
b.use ConfigValidate
|
170
|
-
b.use Call,
|
171
|
-
|
172
|
-
b2.use
|
107
|
+
b.use Call, IsCreated do |env, b2|
|
108
|
+
unless env[:result]
|
109
|
+
b2.use MessageNotCreated
|
173
110
|
next
|
174
111
|
end
|
175
112
|
|
@@ -180,42 +117,31 @@ module VagrantPlugins
|
|
180
117
|
|
181
118
|
def self.action_prepare_boot
|
182
119
|
Vagrant::Action::Builder.new.tap do |b|
|
183
|
-
b.use
|
184
|
-
|
185
|
-
env[:machine].id =~ /@/
|
186
|
-
b1.use Message, I18n.t(
|
187
|
-
'vagrant_azure.vm_started', :name => $`
|
188
|
-
)
|
189
|
-
b1.use action_read_winrm_info
|
190
|
-
b1.use WaitForCommunicator
|
191
|
-
b1.use action_provision
|
192
|
-
end
|
193
|
-
end
|
120
|
+
b.use Provision
|
121
|
+
b.use SyncedFolders
|
194
122
|
end
|
195
123
|
end
|
196
124
|
|
197
|
-
# This action is called to bring the box up from nothing
|
125
|
+
# This action is called to bring the box up from nothing.
|
198
126
|
def self.action_up
|
199
127
|
Vagrant::Action::Builder.new.tap do |b|
|
200
128
|
b.use HandleBox
|
201
129
|
b.use ConfigValidate
|
130
|
+
b.use BoxCheckOutdated
|
202
131
|
b.use ConnectAzure
|
203
|
-
b.use
|
204
|
-
|
205
|
-
|
206
|
-
b1.use Call, IsState, :StoppedDeallocated do |env2, b2|
|
132
|
+
b.use Call, IsCreated do |env1, b1|
|
133
|
+
if env1[:result]
|
134
|
+
b1.use Call, IsStopped do |env2, b2|
|
207
135
|
if env2[:result]
|
208
|
-
b2.use StartInstance # start this instance again
|
209
136
|
b2.use action_prepare_boot
|
137
|
+
b2.use StartInstance # restart this instance
|
210
138
|
else
|
211
|
-
b2.use
|
212
|
-
'vagrant_azure.already_status', :status => 'created'
|
213
|
-
)
|
139
|
+
b2.use MessageAlreadyCreated
|
214
140
|
end
|
215
141
|
end
|
216
142
|
else
|
217
|
-
b1.use RunInstance # Launch a new instance
|
218
143
|
b1.use action_prepare_boot
|
144
|
+
b1.use RunInstance # launch a new instance
|
219
145
|
end
|
220
146
|
end
|
221
147
|
end
|
@@ -225,20 +151,18 @@ module VagrantPlugins
|
|
225
151
|
Vagrant::Action::Builder.new.tap do |b|
|
226
152
|
b.use ConfigValidate
|
227
153
|
b.use ConnectAzure
|
228
|
-
b.use Call,
|
229
|
-
|
230
|
-
b2.use
|
154
|
+
b.use Call, IsCreated do |env, b2|
|
155
|
+
unless env[:result]
|
156
|
+
b2.use MessageNotCreated
|
231
157
|
next
|
232
158
|
end
|
233
159
|
|
234
160
|
b2.use action_halt
|
235
|
-
b2.use Call, WaitForState, :
|
161
|
+
b2.use Call, WaitForState, :stopped, 120 do |env2, b3|
|
236
162
|
if env2[:result]
|
237
|
-
env2[:machine].id =~ /@/
|
238
|
-
b3.use Message, I18n.t('vagrant_azure.vm_stopped', name: $`)
|
239
163
|
b3.use action_up
|
240
164
|
else
|
241
|
-
|
165
|
+
# ??? it didn't stop
|
242
166
|
end
|
243
167
|
end
|
244
168
|
end
|
@@ -248,18 +172,19 @@ module VagrantPlugins
|
|
248
172
|
# The autoload farm
|
249
173
|
action_root = Pathname.new(File.expand_path('../action', __FILE__))
|
250
174
|
autoload :ConnectAzure, action_root.join('connect_azure')
|
251
|
-
autoload :
|
175
|
+
autoload :IsCreated, action_root.join('is_created')
|
176
|
+
autoload :IsStopped, action_root.join('is_stopped')
|
177
|
+
autoload :MessageAlreadyCreated, action_root.join('message_already_created')
|
178
|
+
autoload :MessageNotCreated, action_root.join('message_not_created')
|
179
|
+
autoload :MessageWillNotDestroy, action_root.join('message_will_not_destroy')
|
252
180
|
autoload :ReadSSHInfo, action_root.join('read_ssh_info')
|
253
|
-
autoload :ReadWinrmInfo, action_root.join('read_winrm_info')
|
254
|
-
autoload :PowerShellRun, action_root.join('powershell_run')
|
255
|
-
autoload :OSType, action_root.join('os_type')
|
256
181
|
autoload :ReadState, action_root.join('read_state')
|
257
182
|
autoload :RestartVM, action_root.join('restart_vm')
|
258
183
|
autoload :RunInstance, action_root.join('run_instance')
|
259
184
|
autoload :StartInstance, action_root.join('start_instance')
|
260
185
|
autoload :StopInstance, action_root.join('stop_instance')
|
261
|
-
autoload :SyncFolders, action_root.join('sync_folders')
|
262
186
|
autoload :TerminateInstance, action_root.join('terminate_instance')
|
187
|
+
autoload :TimedProvision, action_root.join('timed_provision')
|
263
188
|
autoload :WaitForState, action_root.join('wait_for_state')
|
264
189
|
end
|
265
190
|
end
|
data/lib/vagrant-azure/config.rb
CHANGED
@@ -1,151 +1,147 @@
|
|
1
|
-
|
2
|
-
# Copyright (c) Microsoft
|
3
|
-
#
|
4
|
-
# See License.txt in the project root for license information.
|
5
|
-
#--------------------------------------------------------------------------
|
1
|
+
# encoding: utf-8
|
2
|
+
# Copyright (c) Microsoft Corporation. All rights reserved.
|
3
|
+
# Licensed under the MIT License. See License in the project root for license information.
|
6
4
|
require 'vagrant'
|
7
|
-
require '
|
5
|
+
require 'haikunator'
|
8
6
|
|
9
7
|
module VagrantPlugins
|
10
|
-
module
|
8
|
+
module Azure
|
11
9
|
class Config < Vagrant.plugin('2', :config)
|
12
10
|
|
13
|
-
|
14
|
-
|
11
|
+
# The Azure Active Directory Tenant ID -- ENV['AZURE_TENANT_ID']
|
12
|
+
#
|
13
|
+
# @return [String]
|
14
|
+
attr_accessor :tenant_id
|
15
|
+
|
16
|
+
# The Azure Active Directory Application Client ID -- ENV['AZURE_CLIENT_ID']
|
17
|
+
#
|
18
|
+
# @return [String]
|
19
|
+
attr_accessor :client_id
|
20
|
+
|
21
|
+
# The Azure Active Directory Application Client Secret -- ENV['AZURE_CLIENT_SECRET']
|
22
|
+
#
|
23
|
+
# @return [String]
|
24
|
+
attr_accessor :client_secret
|
25
|
+
|
26
|
+
# The Azure Subscription ID to use -- ENV['AZURE_SUBSCRIPTION_ID']
|
27
|
+
#
|
28
|
+
# @return [String]
|
15
29
|
attr_accessor :subscription_id
|
16
|
-
attr_accessor :storage_acct_name
|
17
|
-
attr_accessor :storage_access_key
|
18
30
|
|
31
|
+
# (Optional) Name of the resource group to use.
|
32
|
+
#
|
33
|
+
# @return [String]
|
34
|
+
attr_accessor :resource_group_name
|
35
|
+
|
36
|
+
# (Optional) Azure location to build the VM -- defaults to 'westus'
|
37
|
+
#
|
38
|
+
# @return [String]
|
39
|
+
attr_accessor :location
|
40
|
+
|
41
|
+
# (Optional) Name of the virtual machine
|
42
|
+
#
|
43
|
+
# @return [String]
|
19
44
|
attr_accessor :vm_name
|
20
|
-
|
45
|
+
|
46
|
+
# Password for the VM -- This is not recommended for *nix deployments
|
47
|
+
#
|
48
|
+
# @return [String]
|
21
49
|
attr_accessor :vm_password
|
22
|
-
attr_accessor :vm_image
|
23
|
-
attr_accessor :vm_location
|
24
|
-
attr_accessor :vm_affinity_group
|
25
|
-
attr_accessor :vm_virtual_network_name
|
26
50
|
|
27
|
-
|
28
|
-
|
29
|
-
|
51
|
+
# (Optional) VM size to be used -- defaults to 'Standard_D1'. See: https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-linux-sizes/
|
52
|
+
#
|
53
|
+
# @return [String]
|
54
|
+
attr_accessor :vm_size
|
30
55
|
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
attr_accessor :
|
35
|
-
alias :ssh_private_key_file :private_key_file
|
36
|
-
alias :ssh_private_key_file= :private_key_file=
|
56
|
+
# (Optional) Name of the virtual machine image urn to use -- defaults to 'canonical:ubuntuserver:16.04.0-DAILY-LTS:latest'. See: https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-linux-cli-ps-findimage/
|
57
|
+
#
|
58
|
+
# @return [String]
|
59
|
+
attr_accessor :vm_image_urn
|
37
60
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
attr_accessor :
|
42
|
-
|
61
|
+
# (Optional) Name of the virtual network resource
|
62
|
+
#
|
63
|
+
# @return [String]
|
64
|
+
attr_accessor :virtual_network_name
|
65
|
+
|
66
|
+
# (Optional) Name of the virtual network subnet resource
|
67
|
+
#
|
68
|
+
# @return [String]
|
69
|
+
attr_accessor :subnet_name
|
70
|
+
|
71
|
+
# (Optional) TCP endpoints to open up for the VM
|
72
|
+
#
|
73
|
+
# @return [String]
|
74
|
+
attr_accessor :tcp_endpoints
|
75
|
+
|
76
|
+
# (Optional) Name of the virtual machine image
|
77
|
+
#
|
78
|
+
# @return [String]
|
43
79
|
attr_accessor :availability_set_name
|
44
80
|
|
45
|
-
|
81
|
+
# (Optional) The timeout to wait for an instance to become ready -- default 120 seconds.
|
82
|
+
#
|
83
|
+
# @return [Fixnum]
|
84
|
+
attr_accessor :instance_ready_timeout
|
85
|
+
|
86
|
+
# (Optional) The interval to wait for checking an instance's state -- default 2 seconds.
|
87
|
+
#
|
88
|
+
# @return [Fixnum]
|
89
|
+
attr_accessor :instance_check_interval
|
90
|
+
|
91
|
+
# (Optional) The Azure Management API endpoint -- default 'https://management.azure.com' seconds -- ENV['AZURE_MANAGEMENT_ENDPOINT'].
|
92
|
+
#
|
93
|
+
# @return [String]
|
94
|
+
attr_accessor :endpoint
|
46
95
|
|
47
96
|
def initialize
|
48
|
-
@
|
49
|
-
@
|
50
|
-
@
|
51
|
-
@
|
97
|
+
@tenant_id = UNSET_VALUE
|
98
|
+
@client_id = UNSET_VALUE
|
99
|
+
@client_secret = UNSET_VALUE
|
100
|
+
@endpoint = UNSET_VALUE
|
52
101
|
@subscription_id = UNSET_VALUE
|
53
|
-
|
102
|
+
@resource_group_name = UNSET_VALUE
|
103
|
+
@location = UNSET_VALUE
|
54
104
|
@vm_name = UNSET_VALUE
|
55
|
-
@vm_user = UNSET_VALUE
|
56
105
|
@vm_password = UNSET_VALUE
|
57
|
-
@
|
58
|
-
@
|
59
|
-
@
|
60
|
-
@vm_virtual_network_name = UNSET_VALUE
|
61
|
-
|
62
|
-
@cloud_service_name = UNSET_VALUE
|
63
|
-
@deployment_name = UNSET_VALUE
|
106
|
+
@vm_image_urn = UNSET_VALUE
|
107
|
+
@virtual_network_name = UNSET_VALUE
|
108
|
+
@subnet_name = UNSET_VALUE
|
64
109
|
@tcp_endpoints = UNSET_VALUE
|
65
|
-
@private_key_file = UNSET_VALUE
|
66
|
-
@ssh_port = UNSET_VALUE
|
67
110
|
@vm_size = UNSET_VALUE
|
68
|
-
@winrm_transport = UNSET_VALUE
|
69
|
-
@winrm_http_port = UNSET_VALUE
|
70
|
-
@winrm_https_port = UNSET_VALUE
|
71
111
|
@availability_set_name = UNSET_VALUE
|
72
|
-
@
|
112
|
+
@instance_ready_timeout = UNSET_VALUE
|
113
|
+
@instance_check_interval = UNSET_VALUE
|
73
114
|
end
|
74
115
|
|
75
116
|
def finalize!
|
76
|
-
@
|
77
|
-
@storage_access_key = ENV['AZURE_STORAGE_ACCESS_KEY'] if @storage_access_key == UNSET_VALUE
|
78
|
-
@mgmt_certificate = ENV['AZURE_MANAGEMENT_CERTIFICATE'] if @mgmt_certificate == UNSET_VALUE
|
79
|
-
@mgmt_endpoint = ENV['AZURE_MANAGEMENT_ENDPOINT'] if @mgmt_endpoint == UNSET_VALUE
|
117
|
+
@endpoint = (ENV['AZURE_MANAGEMENT_ENDPOINT'] || 'https://management.azure.com') if @endpoint == UNSET_VALUE
|
80
118
|
@subscription_id = ENV['AZURE_SUBSCRIPTION_ID'] if @subscription_id == UNSET_VALUE
|
119
|
+
@tenant_id = ENV['AZURE_TENANT_ID'] if @tenant_id == UNSET_VALUE
|
120
|
+
@client_id = ENV['AZURE_CLIENT_ID'] if @client_id == UNSET_VALUE
|
121
|
+
@client_secret = ENV['AZURE_CLIENT_SECRET'] if @client_secret == UNSET_VALUE
|
81
122
|
|
82
|
-
@vm_name =
|
83
|
-
@
|
123
|
+
@vm_name = Haikunator.haikunate(100) if @vm_name == UNSET_VALUE
|
124
|
+
@resource_group_name = Haikunator.haikunate(100) if @resource_group_name == UNSET_VALUE
|
84
125
|
@vm_password = nil if @vm_password == UNSET_VALUE
|
85
|
-
@
|
86
|
-
@
|
87
|
-
@
|
88
|
-
@
|
89
|
-
|
90
|
-
@cloud_service_name = nil if @cloud_service_name == UNSET_VALUE
|
91
|
-
@deployment_name = nil if @deployment_name == UNSET_VALUE
|
126
|
+
@vm_image_urn = 'canonical:ubuntuserver:16.04.0-DAILY-LTS:latest' if @vm_image_urn == UNSET_VALUE
|
127
|
+
@location = 'westus' if @location == UNSET_VALUE
|
128
|
+
@virtual_network_name = nil if @virtual_network_name == UNSET_VALUE
|
129
|
+
@subnet_name = nil if @subnet_name == UNSET_VALUE
|
92
130
|
@tcp_endpoints = nil if @tcp_endpoints == UNSET_VALUE
|
93
|
-
@
|
94
|
-
|
95
|
-
@ssh_port = nil if @ssh_port == UNSET_VALUE
|
96
|
-
@vm_size = nil if @vm_size == UNSET_VALUE
|
97
|
-
@winrm_transport = nil if @winrm_transport == UNSET_VALUE
|
98
|
-
@winrm_http_port = nil if @winrm_http_port == UNSET_VALUE
|
99
|
-
@winrm_https_port = nil if @winrm_https_port == UNSET_VALUE
|
131
|
+
@vm_size = 'Standard_D1' if @vm_size == UNSET_VALUE
|
100
132
|
@availability_set_name = nil if @availability_set_name == UNSET_VALUE
|
101
133
|
|
102
|
-
@
|
103
|
-
|
104
|
-
utils = Class.new.extend(Azure::Core::Utility)
|
105
|
-
|
106
|
-
# This done due to a bug in Ruby SDK - it doesn't generate a storage
|
107
|
-
# account name if add_role = true
|
108
|
-
if @storage_acct_name.nil? || @storage_acct_name.empty?
|
109
|
-
@storage_acct_name = utils.random_string("#{@vm_name}storage").gsub(/[^0-9a-z ]/i, '').downcase[0..23]
|
110
|
-
end
|
111
|
-
|
112
|
-
if @cloud_service_name.nil? || @cloud_service_name.empty?
|
113
|
-
@cloud_service_name = utils.random_string("#{@vm_name}-service-")
|
114
|
-
end
|
134
|
+
@instance_ready_timeout = 120 if @instance_ready_timeout == UNSET_VALUE
|
135
|
+
@instance_check_interval = 2 if @instance_check_interval == UNSET_VALUE
|
115
136
|
end
|
116
137
|
|
117
138
|
def validate(machine)
|
118
139
|
errors = _detected_errors
|
119
140
|
|
120
141
|
# Azure connection properties related validation.
|
121
|
-
errors << 'vagrant_azure.subscription_id.required' if @subscription_id.nil?
|
122
|
-
errors << 'vagrant_azure.
|
123
|
-
errors << 'vagrant_azure.
|
124
|
-
|
125
|
-
# Azure Virtual Machine related validation
|
126
|
-
errors << 'vagrant_azure.vm_name.required' if @vm_name.nil?
|
127
|
-
|
128
|
-
paths = machine.config.ssh.private_key_path
|
129
|
-
unless @vm_password || machine.config.ssh.password || @private_key_file || (paths && paths.count > 0)
|
130
|
-
errors << 'You must provide one of the following: ssh.private_key_path, azure.private_key_file, ssh.password or azure.vm_password.'
|
131
|
-
end
|
132
|
-
|
133
|
-
if (@private_key_file || (paths && paths.count > 0)) && (@vm_password || machine.config.ssh.password)
|
134
|
-
machine.config.ssh.password = @vm_password = nil
|
135
|
-
machine.ui.warn('You specified both private_key and password. Vagrant-Azure will only use the private_key in this case.')
|
136
|
-
end
|
137
|
-
|
138
|
-
if machine.config.ssh.password.nil? && @vm_password
|
139
|
-
machine.config.ssh.password = @vm_password
|
140
|
-
elsif machine.config.ssh.password && @vm_password.nil?
|
141
|
-
@vm_password = machine.config.ssh.password
|
142
|
-
end
|
143
|
-
|
144
|
-
if machine.config.ssh.private_key_path.nil? && @private_key_file
|
145
|
-
machine.config.ssh.private_key_path = [File.expand_path(@private_key_file)]
|
146
|
-
elsif machine.config.ssh.private_key_path && @private_key_file.nil?
|
147
|
-
@private_key_file = File.expand_path(paths.first)
|
148
|
-
end
|
142
|
+
errors << I18n.t('vagrant_azure.subscription_id.required') if @subscription_id.nil?
|
143
|
+
errors << I18n.t('vagrant_azure.mgmt_endpoint.required') if @endpoint.nil?
|
144
|
+
errors << I18n.t('vagrant_azure.auth.required') if @tenant_id.nil? || @client_secret.nil? || @client_id.nil?
|
149
145
|
|
150
146
|
{ 'Microsoft Azure Provider' => errors }
|
151
147
|
end
|
data/lib/vagrant-azure/errors.rb
CHANGED
@@ -1,25 +1,23 @@
|
|
1
|
-
|
2
|
-
# Copyright (c) Microsoft
|
3
|
-
#
|
4
|
-
# See License.txt in the project root for license information.
|
5
|
-
#--------------------------------------------------------------------------
|
1
|
+
# encoding: utf-8
|
2
|
+
# Copyright (c) Microsoft Corporation. All rights reserved.
|
3
|
+
# Licensed under the MIT License. See License in the project root for license information.
|
6
4
|
|
7
5
|
module VagrantPlugins
|
8
|
-
module
|
6
|
+
module Azure
|
9
7
|
module Errors
|
10
|
-
class
|
11
|
-
error_namespace(
|
8
|
+
class AzureError < Vagrant::Errors::VagrantError
|
9
|
+
error_namespace('vagrant_azure.errors')
|
12
10
|
end
|
13
11
|
|
14
|
-
class WinRMNotReady <
|
12
|
+
class WinRMNotReady < AzureError
|
15
13
|
error_key(:win_rm_not_ready)
|
16
14
|
end
|
17
15
|
|
18
|
-
class ServerNotCreated <
|
16
|
+
class ServerNotCreated < AzureError
|
19
17
|
error_key(:server_not_created)
|
20
18
|
end
|
21
19
|
|
22
|
-
class CreateVMFailure <
|
20
|
+
class CreateVMFailure < AzureError
|
23
21
|
error_key(:create_vm_failure)
|
24
22
|
end
|
25
23
|
|