vagrant-azure 2.0.0.pre7 → 2.0.0.pre8

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 +4 -4
  2. data/.gitignore +1 -1
  3. data/.rubocop.yml +120 -0
  4. data/.travis.yml +13 -0
  5. data/Gemfile +4 -5
  6. data/README.md +98 -57
  7. data/docs/basic_linux/Vagrantfile +17 -0
  8. data/docs/basic_linux/readme.md +12 -0
  9. data/docs/basic_windows/Vagrantfile +20 -0
  10. data/docs/basic_windows/readme.md +12 -0
  11. data/docs/custom_vhd/Vagrantfile +16 -0
  12. data/docs/custom_vhd/readme.md +48 -0
  13. data/docs/data_disks/Vagrantfile +16 -0
  14. data/docs/data_disks/readme.md +20 -0
  15. data/docs/managed_image/Vagrantfile +15 -0
  16. data/docs/managed_image/readme.md +66 -0
  17. data/docs/readme.md +30 -0
  18. data/lib/vagrant-azure/action/run_instance.rb +95 -69
  19. data/lib/vagrant-azure/config.rb +75 -4
  20. data/lib/vagrant-azure/util/machine_id_helper.rb +4 -0
  21. data/lib/vagrant-azure/util/managed_image_helper.rb +26 -0
  22. data/lib/vagrant-azure/util/template_renderer.rb +54 -0
  23. data/lib/vagrant-azure/util/timer.rb +4 -0
  24. data/lib/vagrant-azure/util/vm_await.rb +4 -0
  25. data/lib/vagrant-azure/util/vm_status_translator.rb +4 -0
  26. data/lib/vagrant-azure/version.rb +1 -1
  27. data/locales/en.yml +6 -0
  28. data/spec/spec_helper.rb +1 -0
  29. data/spec/templates/arm/deployment_spec.rb +169 -0
  30. data/spec/vagrant-azure/config_spec.rb +3 -3
  31. data/templates/arm/deployment.json.erb +50 -258
  32. data/templates/arm/resources/availability_set.json.erb +6 -0
  33. data/templates/arm/resources/data_disk.json.erb +21 -0
  34. data/templates/arm/resources/import_vhd_image.json.erb +23 -0
  35. data/templates/arm/resources/linux_reset_root_ext.json.erb +20 -0
  36. data/templates/arm/resources/network_interface.json.erb +26 -0
  37. data/templates/arm/resources/network_security_group.json.erb +85 -0
  38. data/templates/arm/resources/public_ip_address.json.erb +12 -0
  39. data/templates/arm/resources/storage_account.json.erb +9 -0
  40. data/templates/arm/resources/virtual_machine.json.erb +82 -0
  41. data/templates/arm/resources/virtual_network.json.erb +27 -0
  42. data/templates/arm/resources/windows_reset_access_ext.json.erb +21 -0
  43. data/vagrant-azure.gemspec +4 -6
  44. metadata +38 -40
  45. data/spec/vagrant-azure/services/azure_resource_manager_spec.rb +0 -19
@@ -0,0 +1,12 @@
1
+ # Basic Windows SQL Server 2016 Machine
2
+ This scenario will build a Windows SQL Server 2016 machine.
3
+
4
+ Before you attempt this scenario, ensure you have followed the [getting started docs](../../readme.md#getting-started).
5
+
6
+ ## Vagrant up
7
+ - In this directory, run the following
8
+ ```bash
9
+ vagrant up --provider=azure
10
+ ```
11
+
12
+ To clean up, run `vagrant destroy`
@@ -0,0 +1,16 @@
1
+
2
+ Vagrant.configure("2") do |config|
3
+ config.vm.box = "azure"
4
+
5
+ # use local ssh key to connect to remote vagrant box
6
+ config.ssh.private_key_path = "~/.ssh/id_rsa"
7
+ config.vm.provider :azure do |azure, override|
8
+ azure.location = "westus"
9
+
10
+ # change this URI to your storage account blob within the same region as specified above
11
+ azure.vm_vhd_uri = "https://vagrantimages.blob.core.windows.net/vhds/xenial-server-cloudimg-amd64-disk1.vhd"
12
+ azure.vm_operating_system = "Linux"
13
+ end
14
+
15
+ config.vm.provision "shell", inline: "echo Hello, World"
16
+ end
@@ -0,0 +1,48 @@
1
+ # Ubuntu Xenial Machine from VHD
2
+ This scenario will build a custom image from a prepared Ubuntu Xenial VHD. This will build an Azure Managed
3
+ Image from the custom generalized VHD. The Azure Managed Image will be used to create a new Azure Virtual
4
+ Machine.
5
+
6
+ To see more information about this scenario, see [Prepare an Ubuntu virtual machine for Azure](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/create-upload-ubuntu)
7
+
8
+ Before you attempt this scenario, ensure you have followed the [getting started docs](../../readme.md#getting-started).
9
+
10
+ If you wanted to build a more customized image, you could do the same with your own VHD manually by following these
11
+ [instructions](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/create-upload-ubuntu?toc=%2fazure%2fvirtual-machines%2flinux%2ftoc.json#manual-steps).
12
+
13
+ ## Vagrant up
14
+ We will set this up with Azure CLI and then run Vagrant after we've provisioned the needed Azure resources.
15
+ - Login to Azure CLI (if not already logged in)
16
+ ```bash
17
+ az login
18
+ ```
19
+ - Create a resource group for your VHDs (assuming westus)
20
+ ```bash
21
+ az group create -n vagrantimages -l westus
22
+ ```
23
+ - Create a storage account in the region you'd like to deploy
24
+ ```bash
25
+ # insert your own name for the storage account DNS name (-n)
26
+ az storage account create -g vagrantimages -n vagrantimagesXXXX --sku Standard_LRS -l westus
27
+ ```
28
+ - Download and unzip the VHD from Ubuntu
29
+ ```bash
30
+ wget -qO- -O tmp.zip http://cloud-images.ubuntu.com/releases/xenial/release/ubuntu-16.04-server-cloudimg-amd64-disk1.vhd.zip && unzip tmp.zip && rm tmp.zip
31
+ ```
32
+ - Upload the VHD to your storage account in the vhds container
33
+ ```bash
34
+ conn_string=$(az storage account show-connection-string -g vagrantimages -n vagrantimagesXXXX -o tsv)
35
+ az storage container create -n vhds --connection-string $conn_string
36
+ az storage container create -n vhds vagrantimagesXXXX
37
+ az storage blob upload -c vhds -n xenial-server-cloudimg-amd64-disk1.vhd -f xenial-server-cloudimg-amd64-disk1.vhd --connection-string $conn_string
38
+ ```
39
+ - Update Vagrantfile with the URI of your uploaded blob (`azure.vm_vhd_uri`).
40
+ - Vagrant up
41
+ ```bash
42
+ vagrant up --provider=azure
43
+ ```
44
+
45
+ To clean up, run `vagrant destroy`
46
+
47
+
48
+
@@ -0,0 +1,16 @@
1
+
2
+ Vagrant.configure("2") do |config|
3
+ config.vm.box = "azure"
4
+
5
+ # use local ssh key to connect to remote vagrant box
6
+ config.ssh.private_key_path = "~/.ssh/id_rsa"
7
+ config.vm.provider :azure do |azure, override|
8
+ azure.location = "westus"
9
+
10
+ azure.data_disks = [
11
+ { name: "foo", size_gb: 30 }
12
+ ]
13
+ end
14
+
15
+ config.vm.provision "shell", inline: "echo Hello, World"
16
+ end
@@ -0,0 +1,20 @@
1
+ # Linux Machine with Empty Data Disks
2
+ This scenario will build an Ubuntu 16.04 machine with data disks attached to the virtual machine.
3
+
4
+ To see more information about this scenario, see [How to Attach a Data Disk to a Linux VM](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/classic/attach-disk)
5
+
6
+ Before you attempt this scenario, ensure you have followed the [getting started docs](../../readme.md#getting-started).
7
+
8
+ *Note: data disk support is preview and will likely change before becoming stable*
9
+
10
+ ## Vagrant up
11
+ - In this directory, run the following
12
+ ```bash
13
+ vagrant up --provider=azure
14
+ ```
15
+ - The Vagrant file specifies on data disk named foo. The foo disk is not formatted, nor mounted. If you
16
+ would like to use the disk, you will need to format and mount the drive. For instructions on how to do that,
17
+ see: https://docs.microsoft.com/en-us/azure/virtual-machines/linux/classic/attach-disk#initialize-a-new-data-disk-in-linux.
18
+ In the next rev of data disks, we'll handle mounting and formatting.
19
+
20
+ To clean up, run `vagrant destroy`
@@ -0,0 +1,15 @@
1
+
2
+ Vagrant.configure("2") do |config|
3
+ config.vm.box = "azure"
4
+
5
+ # use local ssh key to connect to remote vagrant box
6
+ config.ssh.private_key_path = "~/.ssh/id_rsa"
7
+ config.vm.provider :azure do |azure, override|
8
+ azure.location = "westus"
9
+
10
+ # replace this with your managed image resource id
11
+ azure.vm_managed_image_id = "/subscriptions/{subscription_id}/resourceGroups/{group}/providers/Microsoft.Compute/images/{image_name}"
12
+ end
13
+
14
+ config.vm.provision "shell", inline: "echo Hello, World"
15
+ end
@@ -0,0 +1,66 @@
1
+ # Ubuntu Machine from a Captured Managed Image
2
+ This scenario will build a machine from a captured managed image. We will build a VM with Azure CLI, capture
3
+ an image of the VM and use that image reference for a new Vagrant machine.
4
+
5
+ To see more information about this scenario, see [Create a VM from the captured image](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/capture-image#step-3-create-a-vm-from-the-captured-image)
6
+
7
+ Before you attempt this scenario, ensure you have followed the [getting started docs](../../readme.md#getting-started).
8
+
9
+ ## Vagrant up
10
+ We will set this up with Azure CLI and then run Vagrant after we've provisioned the needed Azure resources.
11
+ - Login to Azure CLI (if not already logged in)
12
+ ```bash
13
+ az login
14
+ ```
15
+ - Create a resource group for your VHDs (assuming westus)
16
+ ```bash
17
+ az group create -n vagrant -l westus
18
+ ```
19
+ - Create a new VM
20
+ ```bash
21
+ az vm create -g vagrant -n vagrant-box --admin-username deploy --image UbuntuLTS
22
+ ```
23
+ - Capture an image of the VM
24
+ ```bash
25
+ az vm deallocate -g vagrant -n vagrant-box
26
+ az vm generalize -g vagrant -n vagrant-box
27
+ az image create -g vagrant --name vagrant-box-image --source vagrant-box
28
+ ```
29
+ You should see json output from the `az image create` command. Extract the "id" value from below for use in your Vagrantfile.
30
+ ```json
31
+ {
32
+ "id": "/subscriptions/XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX/resourceGroups/vagrant/providers/Microsoft.Compute/images/vagrant-box-image",
33
+ "location": "westus",
34
+ "name": "vagrant-box-image",
35
+ "provisioningState": "Succeeded",
36
+ "resourceGroup": "vagrant",
37
+ "sourceVirtualMachine": {
38
+ "id": "/subscriptions/XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX/resourceGroups/vagrant-test/providers/Microsoft.Compute/virtualMachines/vagrant-box",
39
+ "resourceGroup": "vagrant"
40
+ },
41
+ "storageProfile": {
42
+ "dataDisks": [],
43
+ "osDisk": {
44
+ "blobUri": null,
45
+ "caching": "ReadWrite",
46
+ "diskSizeGb": null,
47
+ "managedDisk": {
48
+ "id": "/subscriptions/XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX/resourceGroups/vagrant-test/providers/Microsoft.Compute/disks/osdisk_5ZglGr7Rj4",
49
+ "resourceGroup": "vagrant"
50
+ },
51
+ "osState": "Generalized",
52
+ "osType": "Linux",
53
+ "snapshot": null
54
+ }
55
+ },
56
+ "tags": null,
57
+ "type": "Microsoft.Compute/images"
58
+ }
59
+ ```
60
+ - Update the Vagrantfile in this directory with the URI of your managed image resource (`azure.vm_managed_image_id`).
61
+ - Vagrant up
62
+ ```bash
63
+ vagrant up --provider=azure
64
+ ```
65
+
66
+ To clean up, run `vagrant destroy`
data/docs/readme.md ADDED
@@ -0,0 +1,30 @@
1
+ # Vagrant Azure Scenario Docs
2
+ Here you can find some common scenarios for using Azure plugin for Vagrant.
3
+
4
+ ## Prerequisites
5
+ Before you attempt any scenario, ensure you have followed the [getting started docs](../readme.md#getting-started).
6
+
7
+ ## Scenarios
8
+
9
+ ### [Basic Linux Setup](./basic_linux)
10
+ Setup a simple Ubuntu 16.04 machine
11
+
12
+ ### [Basic Windows Setup](./basic_windows)
13
+ Setup a Windows SQL Server 2016 machine
14
+
15
+ ### [Ubuntu Xenial Machine from VHD](./custom_vhd)
16
+ Setup an Ubuntu box from a custom VHD
17
+
18
+ ### [Managed Image Reference](./managed_image)
19
+ Setup a VM from a managed image reference captured from a previously created Azure VM.
20
+
21
+ ### [Data Disks (empty disk)](./data_disks)
22
+ Setup an Ubuntu box with an empty attached disk
23
+
24
+ ## Azure Boxes
25
+
26
+ The vagrant-azure plugin provides the ability to use ```Azure``` boxes with Vagrant. Please see the example box
27
+ provided in [example_box](https://github.com/azure/vagrant-azure/tree/v2.0/example_box) directory and follow the
28
+ instructions there to build an `azure` box.
29
+
30
+ For general Vagrant documentation see [Vagrant Docs](http://docs.vagrantup.com/v2/).
@@ -1,13 +1,14 @@
1
1
  # encoding: utf-8
2
2
  # Copyright (c) Microsoft Corporation. All rights reserved.
3
3
  # Licensed under the MIT License. See License in the project root for license information.
4
- require 'log4r'
5
- require 'json'
6
- require 'azure_mgmt_resources'
7
- require 'vagrant/util/template_renderer'
8
- require 'vagrant-azure/util/timer'
9
- require 'vagrant-azure/util/machine_id_helper'
10
- require 'haikunator'
4
+ require "log4r"
5
+ require "json"
6
+ require "azure_mgmt_resources"
7
+ require "vagrant-azure/util/machine_id_helper"
8
+ require "vagrant-azure/util/template_renderer"
9
+ require "vagrant-azure/util/managed_image_helper"
10
+ require "vagrant-azure/util/timer"
11
+ require "haikunator"
11
12
 
12
13
  module VagrantPlugins
13
14
  module Azure
@@ -15,10 +16,11 @@ module VagrantPlugins
15
16
  class RunInstance
16
17
  include Vagrant::Util::Retryable
17
18
  include VagrantPlugins::Azure::Util::MachineIdHelper
19
+ include VagrantPlugins::Azure::Util::ManagedImagedHelper
18
20
 
19
21
  def initialize(app, env)
20
22
  @app = app
21
- @logger = Log4r::Logger.new('vagrant_azure::action::run_instance')
23
+ @logger = Log4r::Logger.new("vagrant_azure::action::run_instance")
22
24
  end
23
25
 
24
26
  def call(env)
@@ -29,14 +31,20 @@ module VagrantPlugins
29
31
 
30
32
  # Get the configs
31
33
  config = machine.provider_config
34
+
35
+ config.dns_name ||= config.vm_name
36
+ config.nsg_name ||= config.vm_name
37
+
32
38
  endpoint = config.endpoint
33
39
  resource_group_name = config.resource_group_name
34
40
  location = config.location
35
41
  ssh_user_name = machine.config.ssh.username
36
42
  vm_name = config.vm_name
37
- vm_password = config.vm_password
38
43
  vm_size = config.vm_size
39
44
  vm_image_urn = config.vm_image_urn
45
+ vm_vhd_uri = config.vm_vhd_uri
46
+ vm_operating_system = config.vm_operating_system
47
+ vm_managed_image_id = config.vm_managed_image_id
40
48
  virtual_network_name = config.virtual_network_name
41
49
  subnet_name = config.subnet_name
42
50
  tcp_endpoints = config.tcp_endpoints
@@ -45,8 +53,8 @@ module VagrantPlugins
45
53
  admin_password = config.admin_password
46
54
  winrm_port = machine.config.winrm.port
47
55
  winrm_install_self_signed_cert = config.winrm_install_self_signed_cert
48
- dns_label_prefix = Haikunator.haikunate(100)
49
- deployment_template = config.deployment_template
56
+ dns_label_prefix = config.dns_name
57
+ nsg_label_prefix = config.nsg_name
50
58
 
51
59
  # Launch!
52
60
  env[:ui].info(I18n.t('vagrant_azure.launching_instance'))
@@ -58,64 +66,79 @@ module VagrantPlugins
58
66
  env[:ui].info(" -- Admin Username: #{admin_user_name}") if admin_user_name
59
67
  env[:ui].info(" -- VM Name: #{vm_name}")
60
68
  env[:ui].info(" -- VM Size: #{vm_size}")
61
- env[:ui].info(" -- Image URN: #{vm_image_urn}")
69
+
70
+ if !vm_vhd_uri.nil?
71
+ env[:ui].info(" -- Custom VHD URI: #{vm_vhd_uri}")
72
+ env[:ui].info(" -- Custom OS: #{vm_operating_system}")
73
+ elsif !vm_managed_image_id.nil?
74
+ env[:ui].info(" -- Managed Image Id: #{vm_managed_image_id}")
75
+ else
76
+ env[:ui].info(" -- Image URN: #{vm_image_urn}")
77
+ end
78
+
62
79
  env[:ui].info(" -- Virtual Network Name: #{virtual_network_name}") if virtual_network_name
63
80
  env[:ui].info(" -- Subnet Name: #{subnet_name}") if subnet_name
64
81
  env[:ui].info(" -- TCP Endpoints: #{tcp_endpoints}") if tcp_endpoints
65
82
  env[:ui].info(" -- Availability Set Name: #{availability_set_name}") if availability_set_name
66
83
  env[:ui].info(" -- DNS Label Prefix: #{dns_label_prefix}")
67
84
 
68
- image_publisher, image_offer, image_sku, image_version = vm_image_urn.split(':')
85
+ image_publisher, image_offer, image_sku, image_version = vm_image_urn.split(":")
69
86
 
70
87
  azure = env[:azure_arm_service]
71
- image_details = nil
72
- env[:metrics]['get_image_details'] = Util::Timer.time do
73
- image_details = get_image_details(azure, location, image_publisher, image_offer, image_sku, image_version)
74
- end
75
- @logger.info("Time to fetch os image details: #{env[:metrics]['get_image_details']}")
88
+ @logger.info("Time to fetch os image details: #{env[:metrics]["get_image_details"]}")
76
89
 
77
90
  deployment_params = {
78
91
  dnsLabelPrefix: dns_label_prefix,
92
+ nsgLabelPrefix: nsg_label_prefix,
79
93
  vmSize: vm_size,
80
94
  vmName: vm_name,
81
- imagePublisher: image_publisher,
82
- imageOffer: image_offer,
83
- imageSku: image_sku,
84
- imageVersion: image_version,
85
95
  subnetName: subnet_name,
86
96
  virtualNetworkName: virtual_network_name,
87
97
  }
88
98
 
89
99
  # we need to pass different parameters depending upon the OS
90
- operating_system = get_image_os(image_details)
100
+ # if custom image, then require vm_operating_system
101
+ operating_system = if vm_vhd_uri
102
+ vm_operating_system
103
+ elsif vm_managed_image_id
104
+ get_managed_image_os(azure, vm_managed_image_id)
105
+ else
106
+ get_image_os(azure, location, image_publisher, image_offer, image_sku, image_version)
107
+ end
91
108
 
92
109
  template_params = {
93
110
  availability_set_name: availability_set_name,
94
- operating_system: operating_system,
95
111
  winrm_install_self_signed_cert: winrm_install_self_signed_cert,
96
112
  winrm_port: winrm_port,
97
113
  dns_label_prefix: dns_label_prefix,
114
+ nsg_label_prefix: nsg_label_prefix,
98
115
  location: location,
99
- deployment_template: deployment_template
116
+ image_publisher: image_publisher,
117
+ image_offer: image_offer,
118
+ image_sku: image_sku,
119
+ image_version: image_version,
120
+ vhd_uri: vm_vhd_uri,
121
+ operating_system: operating_system,
122
+ data_disks: config.data_disks
100
123
  }
101
124
 
102
- if operating_system != 'Windows'
125
+ if operating_system != "Windows"
103
126
  private_key_paths = machine.config.ssh.private_key_path
104
127
  if private_key_paths.nil? || private_key_paths.empty?
105
128
  raise I18n.t('vagrant_azure.private_key_not_specified')
106
129
  end
107
130
 
108
- paths_to_pub = private_key_paths.map{ |k| File.expand_path( k + '.pub') }.select{ |p| File.exists?(p) }
131
+ paths_to_pub = private_key_paths.map { |k| File.expand_path(k + ".pub") }.select { |p| File.exists?(p) }
109
132
  raise I18n.t('vagrant_azure.public_key_path_private_key', private_key_paths.join(', ')) if paths_to_pub.empty?
110
133
  deployment_params.merge!(adminUsername: ssh_user_name)
111
134
  deployment_params.merge!(sshKeyData: File.read(paths_to_pub.first))
112
- communicator_message = 'vagrant_azure.waiting_for_ssh'
135
+ communicator_message = "vagrant_azure.waiting_for_ssh"
113
136
  else
114
137
  env[:machine].config.vm.communicator = :winrm
115
138
  machine.config.winrm.port = winrm_port
116
139
  machine.config.winrm.username = admin_user_name
117
140
  machine.config.winrm.password = admin_password
118
- communicator_message = 'vagrant_azure.waiting_for_winrm'
141
+ communicator_message = "vagrant_azure.waiting_for_winrm"
119
142
  windows_params = {
120
143
  adminUsername: admin_user_name,
121
144
  adminPassword: admin_password,
@@ -124,44 +147,28 @@ module VagrantPlugins
124
147
  deployment_params.merge!(windows_params)
125
148
  end
126
149
 
127
- unless tcp_endpoints.nil?
128
-
129
- if tcp_endpoints.is_a?(Array)
130
- # https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-nsg#Nsg-rules
131
- if tcp_endpoints.length + 133 > 4096
132
- raise I18n.t('vagrant_azure.too_many_tcp_endpoints', count: tcp_endpoints.length)
133
- end
134
- endpoints = tcp_endpoints
135
- elsif tcp_endpoints.is_a?(String) || (tcp_endpoints.is_a?(Integer) && tcp_endpoints > 0)
136
- endpoints = [tcp_endpoints]
137
- else
138
- raise I18n.t('vagrant_azure.unknown_type_as_tcp_endpoints', input: tcp_endpoints)
139
- end
140
- else
141
- endpoints = []
142
- end
143
- template_params.merge!(endpoints: endpoints)
150
+ template_params.merge!(endpoints: get_endpoints(tcp_endpoints))
144
151
 
145
152
  env[:ui].info(" -- Create or Update of Resource Group: #{resource_group_name}")
146
- env[:metrics]['put_resource_group'] = Util::Timer.time do
153
+ env[:metrics]["put_resource_group"] = Util::Timer.time do
147
154
  put_resource_group(azure, resource_group_name, location)
148
155
  end
149
156
  @logger.info("Time to create resource group: #{env[:metrics]['put_resource_group']}")
150
157
 
151
- deployment_params = build_deployment_params(template_params, deployment_params.reject{|_,v| v.nil?})
158
+ deployment_params = build_deployment_params(template_params, deployment_params.reject { |_, v| v.nil? })
152
159
 
153
- env[:ui].info(' -- Starting deployment')
154
- env[:metrics]['deployment_time'] = Util::Timer.time do
160
+ env[:ui].info(" -- Starting deployment")
161
+ env[:metrics]["deployment_time"] = Util::Timer.time do
155
162
  put_deployment(azure, resource_group_name, deployment_params)
156
163
  end
157
- env[:ui].info(' -- Finished deploying')
164
+ env[:ui].info(" -- Finished deploying")
158
165
 
159
166
  # Immediately save the ID since it is created at this point.
160
167
  env[:machine].id = serialize_machine_id(resource_group_name, vm_name, location)
161
168
 
162
169
  @logger.info("Time to deploy: #{env[:metrics]['deployment_time']}")
163
170
  unless env[:interrupted]
164
- env[:metrics]['instance_ssh_time'] = Util::Timer.time do
171
+ env[:metrics]["instance_ssh_time"] = Util::Timer.time do
165
172
  # Wait for SSH/WinRM to be ready.
166
173
  env[:ui].info(I18n.t(communicator_message))
167
174
  network_ready_retries = 0
@@ -194,14 +201,42 @@ module VagrantPlugins
194
201
  @app.call(env)
195
202
  end
196
203
 
197
- def get_image_os(image_details)
204
+ def get_endpoints(tcp_endpoints)
205
+ endpoints = [8443]
206
+ unless tcp_endpoints.nil?
207
+ if tcp_endpoints.is_a?(Array)
208
+ # https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-nsg#Nsg-rules
209
+ if tcp_endpoints.length + 133 > 4096
210
+ raise I18n.t("vagrant_azure.too_many_tcp_endpoints", count: tcp_endpoints.length)
211
+ end
212
+ endpoints = tcp_endpoints
213
+ elsif tcp_endpoints.is_a?(String) || (tcp_endpoints.is_a?(Integer) && tcp_endpoints > 0)
214
+ endpoints = [tcp_endpoints]
215
+ else
216
+ raise I18n.t("vagrant_azure.unknown_type_as_tcp_endpoints", input: tcp_endpoints)
217
+ end
218
+ end
219
+ endpoints
220
+ end
221
+
222
+ def get_image_os(azure, location, publisher, offer, sku, version)
223
+ image_details = get_image_details(azure, location, publisher, offer, sku, version)
198
224
  image_details.os_disk_image.operating_system
199
225
  end
200
226
 
227
+ def get_managed_image_os(azure, image_id)
228
+ _, group, name = image_id_captures(image_id)
229
+ image_details = azure.compute.images.get(group, name)
230
+ image_details.storage_profile.os_disk.os_type
231
+ end
232
+
201
233
  def get_image_details(azure, location, publisher, offer, sku, version)
202
- if version == 'latest'
234
+ if version == "latest"
203
235
  images = azure.compute.virtual_machine_images.list(location, publisher, offer, sku)
204
236
  latest = images.sort_by(&:name).last
237
+ if latest.nil?
238
+ raise "Unrecognized location, publisher, offer, sku, version combination: #{location}, #{publisher}, #{offer}, #{sku}, latest. Run `az vm image list` to ensure the image is available."
239
+ end
205
240
  azure.compute.virtual_machine_images.get(location, publisher, offer, sku, latest.name)
206
241
  else
207
242
  azure.compute.virtual_machine_images.get(location, publisher, offer, sku, version)
@@ -224,37 +259,28 @@ module VagrantPlugins
224
259
  # This method generates the deployment template
225
260
  def render_deployment_template(options)
226
261
  self_signed_cert_resource = nil
227
- if options[:operating_system] == 'Windows' && options[:winrm_install_self_signed_cert]
228
- setup_winrm_powershell = Vagrant::Util::TemplateRenderer.render('arm/setup-winrm.ps1', options.merge({template_root: template_root}))
262
+ if options[:operating_system] == "Windows" && options[:winrm_install_self_signed_cert]
263
+ setup_winrm_powershell = VagrantPlugins::Azure::Util::TemplateRenderer.render("arm/setup-winrm.ps1", options)
229
264
  encoded_setup_winrm_powershell = setup_winrm_powershell.
230
265
  gsub("'", "', variables('singleQuote'), '").
231
266
  gsub("\r\n", "\n").
232
267
  gsub("\n", "; ")
233
- self_signed_cert_resource = Vagrant::Util::TemplateRenderer.render('arm/selfsignedcert.json', options.merge({template_root: template_root, setup_winrm_powershell: encoded_setup_winrm_powershell}))
268
+ self_signed_cert_resource = VagrantPlugins::Azure::Util::TemplateRenderer.render("arm/selfsignedcert.json", options.merge({setup_winrm_powershell: encoded_setup_winrm_powershell}))
234
269
  end
235
- Vagrant::Util::TemplateRenderer.render('arm/deployment.json', options.merge({ template_root: template_root, self_signed_cert_resource: self_signed_cert_resource}))
270
+ VagrantPlugins::Azure::Util::TemplateRenderer.render("arm/deployment.json", options.merge({self_signed_cert_resource: self_signed_cert_resource}))
236
271
  end
237
272
 
238
273
  def build_deployment_params(template_params, deployment_params)
239
274
  params = ::Azure::ARM::Resources::Models::Deployment.new
240
275
  params.properties = ::Azure::ARM::Resources::Models::DeploymentProperties.new
241
- if template_params[:deployment_template].nil?
242
- params.properties.template = JSON.parse(render_deployment_template(template_params))
243
- else
244
- params.properties.template = JSON.parse(template_params[:deployment_template])
245
- end
276
+ params.properties.template = JSON.parse(render_deployment_template(template_params))
246
277
  params.properties.mode = ::Azure::ARM::Resources::Models::DeploymentMode::Incremental
247
278
  params.properties.parameters = build_parameters(deployment_params)
248
279
  params
249
280
  end
250
281
 
251
282
  def build_parameters(options)
252
- Hash[*options.map{ |k, v| [k, {value: v}] }.flatten]
253
- end
254
-
255
- # Used to find the base location of aws-vagrant templates
256
- def template_root
257
- Azure.source_root.join('templates')
283
+ Hash[*options.map { |k, v| [k, { value: v } ] }.flatten]
258
284
  end
259
285
 
260
286
  def terminate(env)