kitchen-azurerm 1.5.2 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 20aa37ca60b29d9b0902d8741de326baa5fbe19fde0d37a9874dac2191b97b1f
4
- data.tar.gz: f219f48b5b966faf7033fe0f78d8dd2f7638c77118c66f8c6bbae7c53e9f939c
3
+ metadata.gz: 3b15b8e19fac4c6f6bf58cc6d346f9a9c31c8faf11d95465f4c54e2472f0c8cd
4
+ data.tar.gz: 6373c26bd5e70bc53ffc03f90743ea2da8aa4d145ba3b2841c6bf510dfb25de3
5
5
  SHA512:
6
- metadata.gz: 1ca9ed3f8eb461263d65f752299e46aded16a7e9b4fd3b73a06f66bacabd7ad5c7e566be1bfc299ed9abb0514ad386807b713bdf3740969883595a64a6afb7a0
7
- data.tar.gz: 95988ebe08533122dc27d847cc817e799f07b72e4e13666170d6515bd9b9db5e37d6568722892f30388713ce9227653e04b72899c8d7f8d657fc83f078ca12b9
6
+ metadata.gz: 4c30c971dc9a1b1e285f5d7413f8ea39f81261d694e7723ef503156bb7395682407016d0966e38392c06f7981c55011ad57ea289a1219fe1f1da5a12d35e7e48
7
+ data.tar.gz: 2da6c5540a4651423f09d49a0172d30d5529b6e3605e1a3035352d4d73904cda94106512d0593646a92a480bb3e6d48ab08494009bc8667f35200d030b08df82
@@ -57,14 +57,12 @@ module Kitchen
57
57
  end
58
58
 
59
59
  def credentials
60
- @credentials ||= begin
61
- if File.file?(config_path)
62
- IniFile.load(config_path)
63
- else
64
- warn "#{config_path} was not found or not accessible."
65
- {}
66
- end
67
- end
60
+ @credentials ||= if File.file?(config_path)
61
+ IniFile.load(config_path)
62
+ else
63
+ warn "#{config_path} was not found or not accessible."
64
+ {}
65
+ end
68
66
  end
69
67
 
70
68
  def credentials_property(property)
@@ -84,9 +84,7 @@ module Kitchen
84
84
  SecureRandom.base64(25)
85
85
  end
86
86
 
87
- default_config(:vm_name) do |_config|
88
- "vm"
89
- end
87
+ default_config :vm_name, nil
90
88
 
91
89
  default_config(:nic_name) do |_config|
92
90
  ""
@@ -253,7 +251,7 @@ module Kitchen
253
251
  end
254
252
 
255
253
  if config[:nic_name].to_s == ""
256
- vmnic = "nic-#{config[:vm_name]}"
254
+ vmnic = "nic-#{state[:vm_name]}"
257
255
  else
258
256
  vmnic = config[:nic_name]
259
257
  end
@@ -376,9 +374,10 @@ module Kitchen
376
374
  # @return [Hash] Updated Hash of state values.
377
375
  def validate_state(state = {})
378
376
  state[:uuid] = SecureRandom.hex(8) unless existing_state_value?(state, :uuid)
377
+ state[:vm_name] = config[:vm_name] || "tk-#{state[:uuid][0..11]}" unless existing_state_value?(state, :vm_name)
379
378
  state[:server_id] = "vm#{state[:uuid]}" unless existing_state_value?(state, :server_id)
380
379
  state[:azure_resource_group_name] = azure_resource_group_name unless existing_state_value?(state, :azure_resource_group_name)
381
- %i{subscription_id vm_name azure_environment use_managed_disks}.each do |config_element|
380
+ %i{subscription_id azure_environment use_managed_disks}.each do |config_element|
382
381
  state[config_element] = config[config_element] unless existing_state_value?(state, config_element)
383
382
  end
384
383
  state.delete(:password) unless instance.transport[:ssh_key].nil?
@@ -779,13 +778,11 @@ module Kitchen
779
778
  # If user_data is a file reference, lets read it as such
780
779
  return nil if config[:custom_data].nil?
781
780
 
782
- @custom_data ||= begin
783
- if File.file?(config[:custom_data])
784
- Base64.strict_encode64(File.read(config[:custom_data]))
785
- else
786
- Base64.strict_encode64(config[:custom_data])
787
- end
788
- end
781
+ @custom_data ||= if File.file?(config[:custom_data])
782
+ Base64.strict_encode64(File.read(config[:custom_data]))
783
+ else
784
+ Base64.strict_encode64(config[:custom_data])
785
+ end
789
786
  end
790
787
 
791
788
  private
@@ -40,10 +40,9 @@
40
40
  "description": "Unique DNS Name for the Public IP used to access the Virtual Machine."
41
41
  }
42
42
  },
43
- <%- if public_ip_sku %>
44
43
  "publicIPSKU": {
45
44
  "type": "string",
46
- "defaultValue": "Standard",
45
+ "defaultValue": "Basic",
47
46
  "metadata": {
48
47
  "description": "SKU name for the Public IP used to access the Virtual Machine."
49
48
  }
@@ -55,12 +54,11 @@
55
54
  "description": "SKU name for the Public IP used to access the Virtual Machine."
56
55
  }
57
56
  },
58
- <%- end %>
59
57
  <%- unless os_disk_size_gb.to_s.empty? -%>
60
58
  "osDiskSizeGb": {
61
59
  "type": "int",
62
60
  "minValue": 1,
63
- "maxValue": 1023,
61
+ "maxValue": 2048,
64
62
  "metadata": {
65
63
  "description": "Size of the OS disks in GB."
66
64
  }
@@ -261,9 +259,9 @@
261
259
  "type": "Microsoft.Network/publicIPAddresses",
262
260
  "name": "[variables('publicIPAddressName')]",
263
261
  "location": "[variables('location')]",
264
- "sku": {
265
- "name": "[parameters('publicIPSKU')]"
266
- },
262
+ "sku": {
263
+ "name": "[parameters('publicIPSKU')]"
264
+ },
267
265
  "properties": {
268
266
  "publicIPAllocationMethod": "[parameters('publicIPAddressType')]",
269
267
  "dnsSettings": {
data/templates/public.erb CHANGED
@@ -44,7 +44,7 @@
44
44
  "osDiskSizeGb": {
45
45
  "type": "int",
46
46
  "minValue": 1,
47
- "maxValue": 1023,
47
+ "maxValue": 2048,
48
48
  "metadata": {
49
49
  "description": "Size of the OS disks in GB."
50
50
  }
@@ -163,6 +163,20 @@
163
163
  "description": "The nic name created inside of the resource group."
164
164
  }
165
165
  },
166
+ "publicIPSKU": {
167
+ "type": "string",
168
+ "defaultValue": "Basic",
169
+ "metadata": {
170
+ "description": "SKU name for the Public IP used to access the Virtual Machine."
171
+ }
172
+ },
173
+ "publicIPAddressType": {
174
+ "type": "string",
175
+ "defaultValue": "Dynamic",
176
+ "metadata": {
177
+ "description": "SKU name for the Public IP used to access the Virtual Machine."
178
+ }
179
+ },
166
180
  "storageAccountType": {
167
181
  "type": "string",
168
182
  "defaultValue": "<%= storage_account_type %>",
@@ -201,7 +215,6 @@
201
215
  "subnetPrefix": "10.0.0.0/24",
202
216
  "storageAccountType": "[parameters('storageAccountType')]",
203
217
  "publicIPAddressName": "publicip",
204
- "publicIPAddressType": "Dynamic",
205
218
  "vmStorageAccountContainerName": "vhds",
206
219
  "vmName": "[parameters('vmName')]",
207
220
  "vmSize": "[parameters('vmSize')]",
@@ -213,7 +226,7 @@
213
226
  "resources": [
214
227
  {
215
228
  "apiVersion": "2017-05-10",
216
- "name": "pid-18d63047-6cdf-4f34-beed-62f01fc73fc2",
229
+ "name": "pid-18d63047-6cdf-4f34-beed-62f01fc73fc2",
217
230
  "type": "Microsoft.Resources/deployments",
218
231
  "properties": {
219
232
  "mode": "Incremental",
@@ -241,16 +254,19 @@
241
254
  <%- end -%>
242
255
  <%- end -%>
243
256
  {
244
- "apiVersion": "2015-05-01-preview",
257
+ "apiVersion": "2017-08-01",
245
258
  "type": "Microsoft.Network/publicIPAddresses",
246
259
  "name": "[variables('publicIPAddressName')]",
247
260
  "location": "[variables('location')]",
248
261
  "properties": {
249
- "publicIPAllocationMethod": "[variables('publicIPAddressType')]",
262
+ "publicIPAllocationMethod": "[parameters('publicIPAddressType')]",
250
263
  "dnsSettings": {
251
264
  "domainNameLabel": "[parameters('dnsNameForPublicIP')]"
252
265
  }
253
266
  },
267
+ "sku": {
268
+ "name": "[parameters('publicIPSKU')]"
269
+ },
254
270
  "tags": {
255
271
  <%= vm_tags unless vm_tags.empty? %>
256
272
  }
@@ -362,12 +378,12 @@
362
378
  },
363
379
  <%- end -%>
364
380
  <%- if use_ephemeral_osdisk -%>
365
- "osDisk": {
366
- "diffDiskSettings": {
367
- "option": "Local"
368
- },
369
- "caching": "ReadOnly",
370
- "createOption": "FromImage"
381
+ "osDisk": {
382
+ "diffDiskSettings": {
383
+ "option": "Local"
384
+ },
385
+ "caching": "ReadOnly",
386
+ "createOption": "FromImage"
371
387
  }
372
388
  <%- elsif use_managed_disks -%>
373
389
  "osDisk": {
@@ -408,7 +424,7 @@
408
424
  }
409
425
  <%- end -%>
410
426
  <%- unless data_disks_for_vm_json.nil? -%>
411
- ,"dataDisks":
427
+ ,"dataDisks":
412
428
  <%= data_disks_for_vm_json %>
413
429
  <%- end -%>
414
430
  },
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-azurerm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.2
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stuart Preston
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-19 00:00:00.000000000 Z
11
+ date: 2021-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: azure_mgmt_network
@@ -99,7 +99,7 @@ dependencies:
99
99
  version: '1.20'
100
100
  - - "<"
101
101
  - !ruby/object:Gem::Version
102
- version: '3.0'
102
+ version: '4.0'
103
103
  type: :runtime
104
104
  prerelease: false
105
105
  version_requirements: !ruby/object:Gem::Requirement
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: '1.20'
110
110
  - - "<"
111
111
  - !ruby/object:Gem::Version
112
- version: '3.0'
112
+ version: '4.0'
113
113
  description: Test Kitchen driver for the Microsoft Azure Resource Manager (ARM) API
114
114
  email:
115
115
  - stuart@chef.io
@@ -118,7 +118,6 @@ extensions: []
118
118
  extra_rdoc_files: []
119
119
  files:
120
120
  - LICENSE
121
- - README.md
122
121
  - lib/kitchen/driver/azure_credentials.rb
123
122
  - lib/kitchen/driver/azurerm.rb
124
123
  - templates/empty.erb
@@ -143,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
142
  - !ruby/object:Gem::Version
144
143
  version: '0'
145
144
  requirements: []
146
- rubygems_version: 3.1.4
145
+ rubygems_version: 3.2.22
147
146
  signing_key:
148
147
  specification_version: 4
149
148
  summary: Test Kitchen driver for Azure Resource Manager.
data/README.md DELETED
@@ -1,780 +0,0 @@
1
- # kitchen-azurerm
2
-
3
- [![Gem Version](https://badge.fury.io/rb/kitchen-azurerm.svg)](https://badge.fury.io/rb/kitchen-azurerm)
4
- ![CI](https://github.com/test-kitchen/kitchen-azurerm/workflows/CI/badge.svg?branch=master)
5
-
6
- **kitchen-azurerm** is a driver for the popular test harness [Test Kitchen](http://kitchen.ci) that allows Microsoft Azure resources to be provisioned before testing. This driver uses the new Microsoft Azure Resource Management REST API via the [azure-sdk-for-ruby](https://github.com/azure/azure-sdk-for-ruby).
7
-
8
- This version has been tested on Windows, macOS, and Ubuntu. If you encounter a problem on your platform, please raise an issue.
9
-
10
- ## Quick-start
11
-
12
- ### Installation
13
-
14
- This plugin ships in Chef Workstation out of the box so there is no need to install it when using Chef Workstation[https://downloads.chef.io/products/workstation].
15
-
16
- If you're not using Chef Workstation and need to install the plugin as a gem run:
17
-
18
- ```$ gem install kitchen-azurerm```
19
-
20
- ### Configuration
21
-
22
- For the driver to interact with the Microsoft Azure Resource management REST API, a Service Principal needs to be configured with Contributor rights against the specific subscription being targeted. Using an Organizational (AAD) account and related password is no longer supported. To create a Service Principal and apply the correct permissions, you will need to [create an Azure service principal with the Azure CLI](https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli?view=azure-cli-latest#create-a-service-principal) using the [Azure CLI](https://azure.microsoft.com/en-us/documentation/articles/xplat-cli-install/). Make sure you stay within the section titled 'Authenticate service principal with password - Azure CLI'.
23
-
24
- If the above is TLDR then try this after `az login` using your target subscription ID and the desired SP name:
25
-
26
- ```bash
27
- # Create a Service Principal using the desired subscription id from the command above
28
- az ad sp create-for-rbac --name="kitchen-azurerm" --role="Contributor" --scopes="/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
29
-
30
- #Output
31
- #
32
- #{
33
- # "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", <- Also known as the Client ID
34
- # "displayName": "azure-cli-2018-12-12-14-15-39",
35
- # "name": "http://azure-cli-2018-12-12-14-15-39",
36
- # "password": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
37
- # "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
38
- #}
39
- ```
40
-
41
- NOTE: Don't forget to save the values from the output -- most importantly the `password`.
42
-
43
- You will also need to ensure you have an active Azure subscription (you can get started [for free](https://azure.microsoft.com/en-us/free/) or use your [MSDN Subscription](https://azure.microsoft.com/en-us/pricing/member-offers/msdn-benefits/)).
44
-
45
- You are now ready to configure kitchen-azurerm to use the credentials from the service principal you created above. You will use four elements from the steps in that article:
46
-
47
- 1. **Subscription ID**: available from the Azure portal
48
- 2. **Client ID**: this will be the Application Id from the application in step 2.
49
- 3. **Client Secret/Password**: this will be the password you supplied in the command in step 2.
50
- 4. **Tenant ID**: use the command detailed in "Manually provide credentials through Azure CLI" step 1 to get the TenantId.
51
-
52
- Using a text editor, open or create the file ```~/.azure/credentials``` and add the following section, noting there is one section per Subscription ID. **Make sure you save the file with UTF-8 encoding**
53
-
54
- ```ruby
55
- [ADD-YOUR-AZURE-SUBSCRIPTION-ID-HERE-IN-SQUARE-BRACKET]
56
- client_id = "your-azure-client-id-here"
57
- client_secret = "your-client-secret-here"
58
- tenant_id = "your-azure-tenant-id-here"
59
- ```
60
-
61
- If preferred, you may also set the following environment variables, however this would be incompatible with supporting multiple Azure subscriptions.
62
-
63
- ```ruby
64
- AZURE_CLIENT_ID="your-azure-client-id-here"
65
- AZURE_CLIENT_SECRET="your-client-secret-here"
66
- AZURE_TENANT_ID="your-azure-tenant-id-here"
67
- ```
68
-
69
- Note that the environment variables, if set, take preference over the values in a configuration file.
70
-
71
- After adjusting your ```~/.azure/credentials``` file you will need to adjust your ```kitchen.yml``` file to leverage the azurerm driver. Use the following examples to achieve this, then check your configuration with standard kitchen commands. For example,
72
-
73
- ```bash
74
- % kitchen list
75
- Instance Driver Provisioner Verifier Transport Last Action Last Error
76
- wsus-windows-2019 Azurerm ChefZero Inspec Winrm <Not Created> <None>
77
- wsus-windows-2016 Azurerm ChefZero Inspec Winrm <Not Created> <None>
78
- ```
79
-
80
- ### .kitchen.yml example 1 - Linux/Ubuntu
81
-
82
- Here's an example ```.kitchen.yml``` file that provisions an Ubuntu Server, using Chef Zero as the provisioner and SSH as the transport. Note that if the key does not exist at the specified location, it will be created. Also note that if ```ssh_key``` is supplied, Test Kitchen will use this in preference to any default/configured passwords that are supplied.
83
-
84
- ```yaml
85
- ---
86
- driver:
87
- name: azurerm
88
- subscription_id: 'your-azure-subscription-id-here'
89
- location: 'West Europe'
90
- machine_size: 'Standard_D1'
91
-
92
- transport:
93
- ssh_key: ~/.ssh/id_kitchen-azurerm
94
-
95
- provisioner:
96
- name: chef_zero
97
-
98
- platforms:
99
- - name: ubuntu-14.04
100
- driver:
101
- image_urn: Canonical:UbuntuServer:14.04.4-LTS:latest
102
- vm_name: trusty-vm
103
-
104
- suites:
105
- - name: default
106
- run_list:
107
- - recipe[kitchentesting::default]
108
- attributes:
109
- ```
110
-
111
- ### Concurrent execution
112
-
113
- Concurrent execution of create/converge/destroy is supported via the --concurrency parameter. Each machine is created in its own Azure Resource Group so it has no shared lifecycle with the other machines in the test run. To take advantage of parallel execution use the following command:
114
-
115
- ```kitchen test --concurrency <n>```
116
-
117
- Where n is the number of threads to create. Note that any failure (e.g. an AzureOperationError) will cause the whole test to fail, though resources already in creation will continue to be created.
118
-
119
- ### .kitchen.yml example 2 - Windows
120
-
121
- Here's a further example ```.kitchen.yml``` file that will provision a Windows Server 2019 [smalldisk] instance, using WinRM as the transport. An [ephemeral os disk](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/ephemeral-os-disks) is used. The resource created in Azure will enable itself for remote access at deployment time (it does this by customizing the machine at provisioning time) and tags the Azure Resource Group with metadata using the ```resource_group_tags``` property. Notice that the ```vm_tags``` and ```resource_group_tags``` properties use a simple ```key : value``` structure per line:
122
-
123
- ```yaml
124
- ---
125
- driver:
126
- name: azurerm
127
- subscription_id: 'your-subscription-id-here'
128
- location: 'West Europe'
129
- machine_size: 'Standard_DS2_v2'
130
-
131
- provisioner:
132
- name: chef_zero
133
-
134
- platforms:
135
- - name: windows2019
136
- driver:
137
- image_urn: MicrosoftWindowsServer:WindowsServer:2019-Datacenter-smalldisk:latest
138
- use_ephemeral_osdisk: true
139
- resource_group_tags:
140
- project: 'My Cool Project'
141
- contact: 'me@somewhere.com'
142
- vm_tags:
143
- my_tag: its value
144
- another_tag: its awesome value
145
- transport:
146
- name: winrm
147
- suites:
148
- - name: default
149
- run_list:
150
- - recipe[kitchentesting::default]
151
- attributes:
152
- ```
153
-
154
- ### .kitchen.yml example 3 - "pre-deployment" ARM template
155
-
156
- The following example introduces the ```pre_deployment_template``` and ```pre_deployment_parameters``` properties in the configuration file.
157
- You can use this capability to execute an ARM template containing Azure resources to provision before the system under test is created.
158
-
159
- In the example the ARM template in the file ```predeploy.json``` would be executed with the parameters that are specified under ```pre_deployment_parameters```.
160
- These resources will be created in the same Azure Resource Group as the VM under test, and therefore will be destroyed when you type ```kitchen destroy```.
161
-
162
- ```yaml
163
- ---
164
- driver:
165
- name: azurerm
166
- subscription_id: 'your-azure-subscription-id-here'
167
- location: 'West Europe'
168
- machine_size: 'Standard_D1'
169
- pre_deployment_template: predeploy.json
170
- pre_deployment_parameters:
171
- test_parameter: 'This is a test.'
172
-
173
- transport:
174
- ssh_key: ~/.ssh/id_kitchen-azurerm
175
-
176
- provisioner:
177
- name: chef_zero
178
-
179
- platforms:
180
- - name: ubuntu-1404
181
- driver:
182
- image_urn: Canonical:UbuntuServer:14.04.4-LTS:latest
183
-
184
- suites:
185
- - name: default
186
- run_list:
187
- - recipe[kitchen-azurerm-demo::default]
188
- attributes:
189
- ```
190
-
191
- Example predeploy.json:
192
-
193
- ```json
194
- {
195
- "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
196
- "contentVersion": "1.0.0.0",
197
- "parameters": {
198
- "test_parameter": {
199
- "type": "string",
200
- "defaultValue": ""
201
- }
202
- },
203
- "variables": {
204
-
205
- },
206
- "resources": [
207
- {
208
- "name": "uniqueinstancenamehere01",
209
- "type": "Microsoft.Sql/servers",
210
- "location": "[resourceGroup().location]",
211
- "apiVersion": "2014-04-01-preview",
212
- "properties": {
213
- "version": "12.0",
214
- "administratorLogin": "azure",
215
- "administratorLoginPassword": "P2ssw0rd"
216
- }
217
- }
218
- ],
219
- "outputs": {
220
- "parameter testing": {
221
- "type": "string",
222
- "value": "[parameters('test_parameter')]"
223
- }
224
- }
225
- }
226
- ```
227
-
228
- ### .kitchen.yml example 4 - deploy VM to existing virtual network/subnet (use for ExpressRoute/VPN scenarios)
229
-
230
- The following example introduces the ```vnet_id``` and ```subnet_id``` properties under "driver" in the configuration file. This can be applied at the top level, or per platform.
231
- You can use this capability to create the VM on an existing virtual network and subnet created in a different resource group.
232
-
233
- In this case, the public IP address is not used unless ```public_ip``` is set to ```true```
234
-
235
- ```yaml
236
- ---
237
- driver:
238
- name: azurerm
239
- subscription_id: 'your-azure-subscription-id-here'
240
- location: 'West Europe'
241
- machine_size: 'Standard_D1'
242
-
243
- transport:
244
- ssh_key: ~/.ssh/id_kitchen-azurerm
245
-
246
- provisioner:
247
- name: chef_zero
248
-
249
- platforms:
250
- - name: ubuntu-1404
251
- driver:
252
- image_urn: Canonical:UbuntuServer:14.04.4-LTS:latest
253
- vnet_id: /subscriptions/b6e7eee9-YOUR-GUID-HERE-03ab624df016/resourceGroups/pendrica-infrastructure/providers/Microsoft.Network/virtualNetworks/pendrica-arm-vnet
254
- subnet_id: subnet-10.1.0
255
-
256
- suites:
257
- - name: default
258
- run_list:
259
- - recipe[kitchen-azurerm-demo::default]
260
- attributes:
261
- ```
262
-
263
- ### .kitchen.yml example 5 - deploy VM to existing virtual network/subnet with a Standard SKU public IP (use for ExpressRoute/VPN scenarios)
264
-
265
- The following example introduces the ```vnet_id``` and ```subnet_id``` properties under "driver" in the configuration file. This can be applied at the top level, or per platform.
266
- You can use this capability to create the VM on an existing virtual network and subnet created in a different resource group.
267
-
268
- This enables scenarios that require a Standard SKU public IP resource, for example when a NAT gateway is present on the target subnet.
269
-
270
-
271
- ```yaml
272
- ---
273
- driver:
274
- name: azurerm
275
- subscription_id: 'your-azure-subscription-id-here'
276
- location: 'West Europe'
277
- machine_size: 'Standard_D1'
278
-
279
- transport:
280
- ssh_key: ~/.ssh/id_kitchen-azurerm
281
-
282
- provisioner:
283
- name: chef_zero
284
-
285
- platforms:
286
- - name: ubuntu-1404
287
- driver:
288
- image_urn: Canonical:UbuntuServer:14.04.4-LTS:latest
289
- vnet_id: /subscriptions/b6e7eee9-YOUR-GUID-HERE-03ab624df016/resourceGroups/pendrica-infrastructure/providers/Microsoft.Network/virtualNetworks/pendrica-arm-vnet
290
- subnet_id: subnet-10.1.0
291
- public_ip: true
292
- public_ip_sku: Standard
293
-
294
- suites:
295
- - name: default
296
- run_list:
297
- - recipe[kitchen-azurerm-demo::default]
298
- attributes:
299
- ```
300
-
301
- ### .kitchen.yml example 6 - deploy VM to existing virtual network/subnet (use for ExpressRoute/VPN scenarios) with Private Managed Image
302
-
303
- This example is the same as above, but uses a private managed image to provision the vm.
304
-
305
- Note: The image must be available first. On deletion the disk and everything is removed.
306
-
307
- ```yaml
308
- ---
309
- driver:
310
- name: azurerm
311
- subscription_id: 'your-azure-subscription-id-here'
312
- location: 'West Europe'
313
- machine_size: 'Standard_D1'
314
-
315
- transport:
316
- ssh_key: ~/.ssh/id_kitchen-azurerm
317
-
318
- provisioner:
319
- name: chef_zero
320
-
321
- platforms:
322
- - name: ubuntu-1404
323
- driver:
324
- image_id: /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/RESGROUP/providers/Microsoft.Compute/images/IMAGENAME
325
- vnet_id: /subscriptions/b6e7eee9-YOUR-GUID-HERE-03ab624df016/resourceGroups/pendrica-infrastructure/providers/Microsoft.Network/virtualNetworks/pendrica-arm-vnet
326
- subnet_id: subnet-10.1.0
327
- use_managed_disk: true
328
-
329
- suites:
330
- - name: default
331
- run_list:
332
- - recipe[kitchen-azurerm-demo::default]
333
- attributes:
334
- ```
335
-
336
- ### .kitchen.yml example 7 - deploy VM to existing virtual network/subnet (use for ExpressRoute/VPN scenarios) with Private Classic OS Image
337
-
338
- This example a classic Custom VM Image (aka a VHD file) is used. As the Image VHD must be in the same storage account then the disk of the instance, the os disk is created in an existing image account.
339
-
340
- Note: When the resource group ís deleted, the os disk is left in the existing storage account blob. You must clean up manually.
341
-
342
- This example will:
343
-
344
- * use the customized image <https://yourstorageaccount.blob.core.windows.net/system/Microsoft.Compute/Images/images/Cent7_P4-osDisk.170dd1b7-7dc3-4496-b248-f47c49f63965.vhd> (can be built with packer)
345
- * set the disk url of the vm to <https://yourstorageaccount.blob.core.windows.net/vhds/osdisk-kitchen-XXXXX.vhd>
346
- * set the os type to linux
347
-
348
- ```yaml
349
- ---
350
- driver:
351
- name: azurerm
352
- subscription_id: 'your-azure-subscription-id-here'
353
- location: 'West Europe'
354
- machine_size: 'Standard_D1'
355
-
356
- transport:
357
- ssh_key: ~/.ssh/id_kitchen-azurerm
358
-
359
- provisioner:
360
- name: chef_zero
361
-
362
- platforms:
363
- - name: ubuntu-1404
364
- driver:
365
- image_url: https://yourstorageaccount.blob.core.windows.net/system/Microsoft.Compute/Images/images/Cent7_P4-osDisk.170dd1b7-7dc3-4496-b248-f47c49f63965.vhd
366
- existing_storage_account_blob_url: https://yourstorageaccount.blob.core.windows.net
367
- os_type: linux
368
- use_managed_disk: false
369
- vnet_id: /subscriptions/b6e7eee9-YOUR-GUID-HERE-03ab624df016/resourceGroups/pendrica-infrastructure/providers/Microsoft.Network/virtualNetworks/pendrica-arm-vnet
370
- subnet_id: subnet-10.1.0
371
-
372
- suites:
373
- - name: default
374
- run_list:
375
- - recipe[kitchen-azurerm-demo::default]
376
- attributes:
377
- ```
378
-
379
- ### .kitchen.yml example 8 - deploy VM to existing virtual network/subnet (use for ExpressRoute/VPN scenarios) with Private Classic OS Image and providing custom data and extra large os disk
380
-
381
- This is the same as above, but uses custom data to customize the instance.
382
-
383
- Note: Custom data can be custom data or a file to custom data. Please also note that if you use winrm communication to non-nano windows servers custom data is not supported, as winrm is enabled via custom data.
384
-
385
- ```yaml
386
- ---
387
- driver:
388
- name: azurerm
389
- subscription_id: 'your-azure-subscription-id-here'
390
- location: 'West Europe'
391
- machine_size: 'Standard_D1'
392
-
393
- transport:
394
- ssh_key: ~/.ssh/id_kitchen-azurerm
395
-
396
- provisioner:
397
- name: chef_zero
398
-
399
- platforms:
400
- - name: ubuntu-1404
401
- driver:
402
- image_url: https://yourstorageaccount.blob.core.windows.net/system/Microsoft.Compute/Images/images/Cent7_P4-osDisk.170dd1b7-7dc3-4496-b248-f47c49f63965.vhd
403
- existing_storage_account_blob_url: https://yourstorageaccount.blob.core.windows.net
404
- os_type: linux
405
- use_managed_disk: false
406
- vnet_id: /subscriptions/b6e7eee9-YOUR-GUID-HERE-03ab624df016/resourceGroups/pendrica-infrastructure/providers/Microsoft.Network/virtualNetworks/pendrica-arm-vnet
407
- subnet_id: subnet-10.1.0
408
- os_disk_size_gb: 100
409
- #custom_data: /tmp/customdata.txt
410
- custom_data: |
411
- #cloud-config
412
- fqdn: myhostname
413
- preserve_hostname: false
414
- runcmd:
415
- - yum install -y telnet
416
-
417
- suites:
418
- - name: default
419
- run_list:
420
- - recipe[kitchen-azurerm-demo::default]
421
- attributes:
422
- ```
423
-
424
- ### .kitchen.yml example 9 - Windows 2016 VM with additional data disks
425
-
426
- This example demonstrates how to add 3 additional Managed data disks to a Windows Server 2016 VM. Not supported with legacy (pre-managed disk) storage accounts.
427
-
428
- Note the availability of a `format_data_disks` option (default: `false`). When set to true, a PowerShell script will execute at first boot to initialize and format the disks with an NTFS filesystem. This option does not affect Linux machines.
429
-
430
- ```yaml
431
- ---
432
- driver:
433
- name: azurerm
434
- subscription_id: 'your-azure-subscription-id-here'
435
- location: 'West Europe'
436
- machine_size: 'Standard_F2s'
437
-
438
- provisioner:
439
- name: chef_zero
440
-
441
- platforms:
442
- - name: windows2016-noformat
443
- driver:
444
- image_urn: MicrosoftWindowsServer:WindowsServer:2016-Datacenter:latest
445
- data_disks:
446
- - lun: 0
447
- disk_size_gb: 128
448
- - lun: 1
449
- disk_size_gb: 128
450
- - lun: 2
451
- disk_size_gb: 128
452
- # format_data_disks: false
453
-
454
- suites:
455
- - name: default
456
- run_list:
457
- - recipe[kitchentesting::default]
458
- attributes:
459
- ```
460
-
461
- ### .kitchen.yml example 10 - "post-deployment" ARM template with MSI authentication
462
-
463
- The following example introduces the ```post_deployment_template``` and ```post_deployment_parameters``` properties in the configuration file.
464
- You can use this capability to execute an ARM template containing Azure resources to provision after the system under test is created.
465
-
466
- In the example the ARM template in the file ```postdeploy.json``` would be executed with the parameters that are specified under ```post_deployment_parameters```.
467
- These resources will be created in the same Azure Resource Group as the VM under test, and therefore will be destroyed when you type ```kitchen destroy```.
468
-
469
- ```yaml
470
- ---
471
- driver:
472
- name: azurerm
473
- subscription_id: 'your-azure-subscription-id-here'
474
- location: 'West Europe'
475
- machine_size: 'Standard_D1'
476
- post_deployment_template: postdeploy.json
477
- post_deployment_parameters:
478
- test_parameter: 'This is a test.'
479
-
480
- transport:
481
- ssh_key: ~/.ssh/id_kitchen-azurerm
482
-
483
- provisioner:
484
- name: chef_zero
485
-
486
- platforms:
487
- - name: ubuntu-1404
488
- driver:
489
- image_urn: Canonical:UbuntuServer:14.04.4-LTS:latest
490
-
491
- suites:
492
- - name: default
493
- run_list:
494
- - recipe[kitchen-azurerm-demo::default]
495
- attributes:
496
- ```
497
-
498
- Example postdeploy.json to enable MSI extention on VM:
499
-
500
- ```json
501
- {
502
- "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
503
- "contentVersion": "1.0.0.0",
504
- "parameters": {
505
- "vmName": {
506
- "type": "String"
507
- },
508
- "location": {
509
- "type": "String"
510
- },
511
- "msiExtensionName": {
512
- "type": "String"
513
- }
514
- },
515
- "resources": [
516
- {
517
- "type": "Microsoft.Compute/virtualMachines",
518
- "name": "[parameters('vmName')]",
519
- "apiVersion": "2017-12-01",
520
- "location": "[parameters('location')]",
521
- "identity": {
522
- "type": "systemAssigned"
523
- }
524
- },
525
- {
526
- "type": "Microsoft.Compute/virtualMachines/extensions",
527
- "name": "[concat( parameters('vmName'), '/' , parameters('msiExtensionName') )]",
528
- "apiVersion": "2017-12-01",
529
- "location": "[parameters('location')]",
530
- "properties": {
531
- "publisher": "Microsoft.ManagedIdentity",
532
- "type": "[parameters('msiExtensionName')]",
533
- "typeHandlerVersion": "1.0",
534
- "autoUpgradeMinorVersion": true,
535
- "settings": {
536
- "port": 50342
537
- }
538
- },
539
- "dependsOn": [
540
- "[concat('Microsoft.Compute/virtualMachines/', parameters('vmName'))]"
541
- ]
542
- }
543
- ]
544
- }
545
- ```
546
-
547
- ### .kitchen.yml example 11 - Enabling Managed Service Identities
548
-
549
- This example demonstrates how to enable a System Assigned Identity and User Assigned Identities on a Kitchen VM.
550
- Any combination of System and User assigned identities may be enabled, and multiple User Assigned Identities can be supplied.
551
-
552
- See the [Managed identities for Azure resources](https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview) documentation for more information on using Managed Service Identities.
553
-
554
- ```yaml
555
- ---
556
- driver:
557
- name: azurerm
558
- subscription_id: 'your-azure-subscription-id-here'
559
- location: 'West Europe'
560
- machine_size: 'Standard_D1'
561
-
562
- transport:
563
- ssh_key: ~/.ssh/id_kitchen-azurerm
564
-
565
- provisioner:
566
- name: chef_zero
567
-
568
- platforms:
569
- - name: ubuntu-1404
570
- driver:
571
- image_urn: Canonical:UbuntuServer:14.04.4-LTS:latest
572
- system_assigned_identity: true
573
- user_assigned_identities:
574
- - /subscriptions/4801fa9d-YOUR-GUID-HERE-b265ff49ce21/resourcegroups/test-kitchen-user/providers/Microsoft.ManagedIdentity/userAssignedIdentities/test-kitchen-user
575
-
576
- suites:
577
- - name: default
578
- run_list:
579
- - recipe[kitchentesting::default]
580
- attributes:
581
- ```
582
-
583
- ### .kitchen.yml example 12 - deploy VM with key vault certificate
584
-
585
- This following example introduces ```secret_url```, ```vault_name```, and ```vault_resource_group``` properties under "driver" in the configuration file. You can use this capability to create a VM with a specified key vault certificate.
586
-
587
- ```yaml
588
- ---
589
- driver:
590
- name: azurerm
591
- subscription_id: 'your-azure-subscription-id-here'
592
- location: 'CentralUS'
593
- machine_size: 'Standard_D2s_v3'
594
- secret_url: 'https://YOUR-SECRET-PATH'
595
- vault_name: 'YOUR-VAULT-NAME'
596
- vault_group_name: 'YOUR-VAULT-GROUP-NAME'
597
- transport:
598
- name: winrm
599
- elevated: true
600
- provisioner:
601
- name: chef_zero
602
- platforms:
603
- - name: win2012R2-sql2016
604
- driver:
605
- image_urn: MicrosoftSQLServer:SQL2016SP2-WS2012R2:SQLDEV:latest
606
-
607
- suites:
608
- - name: default
609
- run_list:
610
- - recipe[kitchentesting::default]
611
- attributes:
612
- ```
613
-
614
- ## Support for Government and Sovereign Clouds (China and Germany)
615
-
616
- Starting with v0.9.0 this driver has support for Azure Government and Sovereign Clouds via the use of the ```azure_environment``` setting. Valid Azure environments are ```Azure```, ```AzureUSGovernment```, ```AzureChina``` and ```AzureGermanCloud```
617
-
618
- Note that the ```use_managed_disks``` option should be set to false until supported by AzureUSGovernment.
619
-
620
- ### Example .kitchen.yml for Azure US Government cloud
621
-
622
- ```yaml
623
- ---
624
- driver:
625
- name: azurerm
626
- subscription_id: 'your-azure-subscription-id-here'
627
- azure_environment: 'AzureUSGovernment'
628
- location: 'US Gov Iowa'
629
- machine_size: 'Standard_D2_v2_Promo'
630
- use_managed_disks: false
631
-
632
- provisioner:
633
- name: chef_zero
634
-
635
- verifier:
636
- name: inspec
637
-
638
- platforms:
639
- - name: ubuntu1604
640
- driver:
641
- image_urn: Canonical:UbuntuServer:16.04-LTS:latest
642
- transport:
643
- ssh_key: ~/.ssh/id_kitchen-azurerm
644
-
645
- suites:
646
- - name: default
647
- run_list:
648
- - recipe[vmtesting::default]
649
- ```
650
-
651
- ### How to retrieve the image_urn
652
-
653
- You can use the azure (azure-cli) command line tools to interrogate for the Urn. All 4 parts of the Urn must be specified, though the last part can be changed to "latest" to indicate you always wish to provision the latest operating system and patches.
654
-
655
- ```$ azure vm image list "West Europe" Canonical UbuntuServer```
656
-
657
- This will return a list like the following, from which you can derive the Urn.
658
- *this list has been shortened for readability*
659
-
660
- ```bash
661
- data: Publisher Offer Sku Version Location Urn
662
- data: --------- ------------ ----------------- --------------- ---------- --------------------------------------------------------
663
- data: Canonical UbuntuServer 12.04.5-LTS 12.04.201507301 westeurope Canonical:UbuntuServer:12.04.5-LTS:12.04.201507301
664
- data: Canonical UbuntuServer 12.04.5-LTS 12.04.201507311 westeurope Canonical:UbuntuServer:12.04.5-LTS:12.04.201507311
665
- data: Canonical UbuntuServer 12.04.5-LTS 12.04.201508190 westeurope Canonical:UbuntuServer:12.04.5-LTS:12.04.201508190
666
- data: Canonical UbuntuServer 12.04.5-LTS 12.04.201509060 westeurope Canonical:UbuntuServer:12.04.5-LTS:12.04.201509060
667
- data: Canonical UbuntuServer 12.04.5-LTS 12.04.201509090 westeurope Canonical:UbuntuServer:12.04.5-LTS:12.04.201509090
668
- data: Canonical UbuntuServer 12.10 12.10.201212180 westeurope Canonical:UbuntuServer:12.10:12.10.201212180
669
- data: Canonical UbuntuServer 14.04.3-DAILY-LTS 14.04.201509110 westeurope Canonical:UbuntuServer:14.04.3-DAILY-LTS:14.04.201509110
670
- data: Canonical UbuntuServer 14.04.3-DAILY-LTS 14.04.201509160 westeurope Canonical:UbuntuServer:14.04.3-DAILY-LTS:14.04.201509160
671
- data: Canonical UbuntuServer 14.04.3-DAILY-LTS 14.04.201509220 westeurope Canonical:UbuntuServer:14.04.3-DAILY-LTS:14.04.201509220
672
- data: Canonical UbuntuServer 14.04.3-LTS 14.04.201508050 westeurope Canonical:UbuntuServer:14.04.3-LTS:14.04.201508050
673
- data: Canonical UbuntuServer 14.04.3-LTS 14.04.201509080 westeurope Canonical:UbuntuServer:14.04.3-LTS:14.04.201509080
674
- data: Canonical UbuntuServer 15.04 15.04.201506161 westeurope Canonical:UbuntuServer:15.04:15.04.201506161
675
- data: Canonical UbuntuServer 15.04 15.04.201507070 westeurope Canonical:UbuntuServer:15.04:15.04.201507070
676
- data: Canonical UbuntuServer 15.04 15.04.201507220 westeurope Canonical:UbuntuServer:15.04:15.04.201507220
677
- data: Canonical UbuntuServer 15.04 15.04.201507280 westeurope Canonical:UbuntuServer:15.04:15.04.201507280
678
- data: Canonical UbuntuServer 15.10-DAILY 15.10.201509170 westeurope Canonical:UbuntuServer:15.10-DAILY:15.10.201509170
679
- data: Canonical UbuntuServer 15.10-DAILY 15.10.201509180 westeurope Canonical:UbuntuServer:15.10-DAILY:15.10.201509180
680
- data: Canonical UbuntuServer 15.10-DAILY 15.10.201509190 westeurope Canonical:UbuntuServer:15.10-DAILY:15.10.201509190
681
- data: Canonical UbuntuServer 15.10-DAILY 15.10.201509210 westeurope Canonical:UbuntuServer:15.10-DAILY:15.10.201509210
682
- data: Canonical UbuntuServer 15.10-DAILY 15.10.201509220 westeurope Canonical:UbuntuServer:15.10-DAILY:15.10.201509220
683
- info: vm image list command OK
684
- ```
685
-
686
- ### Additional parameters that can be specified in your `kitchen.yml` or added to your personal `kitchen.local.yml`
687
-
688
- * Note that the ```driver``` section can also take explicit values for ```username``` and ```password```. Otherwise, the default username is "azure" and the password is a randomly generated 24 character password that can be found in your local kitchen state file (typically `.kitchen/<instance-name>.yml`) if you require it for any reason.
689
-
690
- * The ```storage_account_type``` parameter defaults to 'Standard_LRS' and allows you to switch to premium storage (e.g. 'Premium_LRS')
691
-
692
- * The ```enable_boot_diagnostics``` parameter defaults to 'true' and allows you to switch off boot diagnostics in case you are using premium storage.
693
-
694
- * The optional ```vm_tags``` parameter allows you to define key:value pairs to tag VMs with on creation.
695
-
696
- * The optional ```plan``` parameter allows you to define plan information when creating VMs from Marketplace images. Please refer to [Deploy an image with Marketplace terms](https://aka.ms/azuremarketplaceapideployment) for more details. Not all Marketplace images support programmatic deployment, and support is controlled by the image publisher.
697
-
698
- * Managed disks are now enabled by default, to use the Storage account set ```use_managed_disks``` (default: true).
699
-
700
- * The ```image_url``` (unmanaged disks only) parameter can be used to specify a custom vhd (This VHD must be in the same storage account as the disks of the VM, therefore ```existing_storage_account_blob_url``` must also be set and ```use_managed_disks``` must be set to false)
701
-
702
- * The ```image_id``` (managed disks only) parameter can be used to specify an image by id (managed disk). This works only with managed disks.
703
-
704
- * The ```existing_storage_account_blob_url``` can be specified to specify an url to an existing storage account (needed for ```image_url```)
705
-
706
- * The ```custom_data``` parameter can be used to specify custom data to provide to the instance. This can be a file or the data itself. This module handles base64 encoding for you.
707
-
708
- * The ```os_disk_size_gb``` parameter can be used to specify a custom os disk size.
709
-
710
- * The ```azure_resource_group_prefix``` and ```azure_resource_group_suffix``` can be used to further disambiguate Azure resource group names created by the driver.
711
-
712
- * The ```explicit_resource_group_name``` and ```destroy_explicit_resource_group``` (default: "true") parameters can be used in scenarios where you are provided a pre-created Resource Group. Example usage: ```explicit_resource_group_name: kitchen-<%= ENV["USERNAME"] %>```. The ```destroy_explicit_resource_group``` option can now be used after using the ```destroy_resource_group_contents``` option creates an empty resource group to destroy the resource group previously created.
713
-
714
- * The ```destroy_resource_group_contents``` (default: "false") parameter can be used when you want to destroy the resources within a resource group without destroying the resource group itself. For example, the following configuration options used in combination would use an existing resource group (or create one if it doesn't exist) and will destroy the contents of the resource group in the ```kitchen destroy``` phase. If you wish to destroy the empty resource group created after you empty the resource group with this flag you can now set the ```destroy_explicit_resource_group``` to "true" to destroy the empty resource group.
715
-
716
- * The ```destroy_explicit_resource_group_tags``` (default: "true") parameter can be used when you want to remove tags associated with an explicit resource group. The default setting is set to "true" to remain consistent with previous behavior. This should be used in combination with an ```explicit_resource_group_name``` and will be honored during the ```kitchen destroy``` phase.
717
-
718
- ```yaml
719
- ---
720
- driver:
721
- explicit_resource_group_name: stuart-rg-demo-001
722
- destroy_explicit_resource_group: false
723
- destroy_resource_group_contents: true
724
- ```
725
-
726
- * The ```use_ephemeral_osdisk``` (default: false) parameter can be used if you wish to use [ephemeral OS disk functionality](https://docs.microsoft.com/en-us/azure/virtual-machines/linux/ephemeral-os-disks).
727
-
728
- * The ```secret_url```, ```vault_name```, and ```vault_resource_group``` parameters can be used to deploy VM with specified key vault certificate.
729
-
730
- * The ```use_fqdn_hostname``` (default: "false") parameter can be used to determine how kitchen communicates with the Virtual Machine. When true, Kitchen will use the FQDN that is assigned to the Virtual Machine. When false, kitchen will use the public IP address of the machine. This may overcome issues with Corporate firewalls or VPNs blocking Public IP addresses.
731
-
732
- ## Enabling alternative WinRM configurations
733
-
734
- * By default on Windows machines, a PowerShell script runs that enables WinRM over the SSL transport, for Basic, Negotiate and CredSSP connections. To supply your own PowerShell script (e.g. to enable HTTP), use the `winrm_powershell_script` parameter. Windows 2008 R2 example:
735
-
736
- ```yaml
737
- platforms:
738
- - name: windows2008-r2
739
- driver_config:
740
- image_urn: MicrosoftWindowsServer:WindowsServer:2008-R2-SP1:latest
741
- winrm_powershell_script: |-
742
- winrm quickconfig -q
743
- winrm set winrm/config/winrs '@{MaxMemoryPerShellMB="512"}'
744
- winrm set winrm/config '@{MaxTimeoutms="1800000"}'
745
- winrm set winrm/config/service '@{AllowUnencrypted="true"}'
746
- winrm set winrm/config/service/auth '@{Basic="true"}'
747
-
748
- ```
749
-
750
- ## Contributing
751
-
752
- Contributions to the project are welcome via submitting Pull Requests.
753
-
754
- 1. Fork it ( <https://github.com/test-kitchen/kitchen-azurerm/fork> )
755
- 2. Create your feature branch (`git checkout -b my-new-feature`)
756
- 3. Commit your changes (`git commit -am 'Add some feature'`)
757
- 4. Push to the branch (`git push origin my-new-feature`)
758
- 5. Create a new Pull Request
759
-
760
- ## Author
761
-
762
- Stuart Preston
763
-
764
- ## License and Copyright
765
-
766
- Copyright 2015-2020, Chef Software, Inc.
767
-
768
- ```
769
- Licensed under the Apache License, Version 2.0 (the "License");
770
- you may not use this file except in compliance with the License.
771
- You may obtain a copy of the License at
772
-
773
- http://www.apache.org/licenses/LICENSE-2.0
774
-
775
- Unless required by applicable law or agreed to in writing, software
776
- distributed under the License is distributed on an "AS IS" BASIS,
777
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
778
- See the License for the specific language governing permissions and
779
- limitations under the License.
780
- ```