cheese-chef-provisioning-azurerm 1.0.4 → 1.0.5

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
  SHA1:
3
- metadata.gz: e46d02c74aa1bca38bc1b1b2d8217c40b9f8935f
4
- data.tar.gz: 464f2ec0d5a2e92a2b9f51266116990a9a290731
3
+ metadata.gz: 2a42dcbfec41ef166c44fda1953c68b13cd2ba05
4
+ data.tar.gz: 7394b5f6a7df6532a772040b026852ae7b1a30fb
5
5
  SHA512:
6
- metadata.gz: 3ccdcfe0d51fd4eea33a43b5d7623ac5add998fb9791d38edd58052795235627eefd14422f17cb6f6f29852b94ecc786290e1bd170417ffcdac7579ea46a9251
7
- data.tar.gz: 024a999c276bcd3db08a097f82126ef8c15d3c3dd7edc9e54046dc30f6b02be56d759f7a277b1ebf5668097780d7f3cb1a17e9abe22d58540870db3572e3bdb3
6
+ metadata.gz: 51c90e3f4f5c0de61fc4969035908d23cfb3fb9a29f8dc27b3b01535b2dc710a77a32c9bc185005afa39af01df652e07a7ad0539d165bf57ebd191d89b3171cd
7
+ data.tar.gz: 9463071f66eba7fd6eca9cf1237bc0223cf3d0af94013be9886d9d91e1c30a5b759ff09f9855e17e43f33640868736f05cd62d219ba19e40ddcf6811fec1dae4
@@ -0,0 +1,188 @@
1
+ require 'chef/provisioning/azurerm/azure_provider'
2
+
3
+ class Chef
4
+ class Provider
5
+ class AzureDataDisk < Chef::Provisioning::AzureRM::AzureProvider
6
+ provides :azure_data_disk
7
+
8
+ def whyrun_supported?
9
+ true
10
+ end
11
+
12
+ action :create do
13
+ vm = get_vm_silent
14
+ if vm && !data_disk_attached_to?(vm)
15
+ attach_data_disk(vm)
16
+ else
17
+ create_disk unless data_disk_exist?
18
+ end
19
+ end
20
+
21
+ action :destroy do
22
+ vm = get_vm_silent
23
+ if data_disk_exist?
24
+ action_handler.report_progress "Data disk #{new_resource.name} was found."
25
+ if data_disk_owner_id
26
+ if vm && vm.id == data_disk_owner_id
27
+ action_handler.report_progress "Data disk #{new_resource.name} is attached to #{new_resource.vm} VM."
28
+ detach_data_disk(vm)
29
+ else
30
+ raise "Data disk #{new_resource.name} is attached to a VM. Please provide correct VM information to destroy the disk."
31
+ end
32
+ end
33
+ result = destroy_data_disk
34
+ Chef::Log.debug("result: #{result.inspect}")
35
+ end
36
+ end
37
+
38
+ action :detach do
39
+ vm = get_vm_silent
40
+ if vm
41
+ if data_disk_exist? && data_disk_attached_to?(vm)
42
+ detach_data_disk(vm)
43
+ elsif !data_disk_exist?
44
+ raise "Data disk #{new_resource.name} not found."
45
+ end
46
+ else
47
+ raise "VM not available."
48
+ end
49
+ end
50
+
51
+ action :attach do
52
+ vm = get_vm_silent
53
+ if vm
54
+ if data_disk_exist? && !data_disk_attached_to?(vm)
55
+ attach_data_disk(vm)
56
+ elsif !data_disk_exist?
57
+ raise "Data disk #{new_resource.name} not found."
58
+ end
59
+ else
60
+ raise "VM not available."
61
+ end
62
+ end
63
+
64
+ def create_disk
65
+ action_handler.report_progress "Creating new data disk #{new_resource.name}..."
66
+ disk_params = Azure::ARM::Compute::Models::Disk.new.tap do |disk|
67
+ disk.account_type = new_resource.storage_account_type
68
+ disk.disk_size_gb = new_resource.size
69
+ disk.tags = new_resource.tags if new_resource.tags
70
+ disk.location = new_resource.location
71
+ disk.creation_data = Azure::ARM::Compute::Models::CreationData.new.tap do |creationData|
72
+ creationData.create_option = 'empty'
73
+ end
74
+ end
75
+ compute_management_client.disks.create_or_update(new_resource.resource_group, new_resource.name, disk_params)
76
+ end
77
+
78
+ def get_vm_silent
79
+ try_azure_operation('getting vm', true) do
80
+ compute_management_client.virtual_machines.get(new_resource.resource_group, new_resource.vm) if new_resource.vm
81
+ end
82
+ end
83
+
84
+ def data_disk_exist?
85
+ try_azure_operation('getting data disk', true) do
86
+ compute_management_client.disks.get(new_resource.resource_group, new_resource.name)
87
+ end
88
+ end
89
+
90
+ def data_disk_id
91
+ try_azure_operation('getting data disk') do
92
+ compute_management_client.disks.get(new_resource.resource_group, new_resource.name).id
93
+ end
94
+ end
95
+
96
+ def data_disk_size
97
+ try_azure_operation('getting data disk') do
98
+ compute_management_client.disks.get(new_resource.resource_group, new_resource.name).disk_size_gb
99
+ end
100
+ end
101
+
102
+ def data_disk_owner_id
103
+ try_azure_operation('getting data disk') do
104
+ compute_management_client.disks.get(new_resource.resource_group, new_resource.name).owner_id
105
+ end
106
+ end
107
+
108
+ def data_disk_owner_id_silent
109
+ try_azure_operation('getting data disk', true) do
110
+ compute_management_client.disks.get(new_resource.resource_group, new_resource.name).owner_id
111
+ end
112
+ end
113
+
114
+ def data_disk_attached_to?(vm)
115
+ if data_disk_owner_id_silent
116
+ if data_disk_owner_id == vm.id
117
+ return true
118
+ else
119
+ raise "Disk #{new_resource.name} is attached to some other VM."
120
+ end
121
+ end
122
+ false
123
+ end
124
+
125
+ def data_disk_setup_for(vm)
126
+ data_disk = Azure::ARM::Compute::Models::DataDisk.new.tap do |dd_disk|
127
+ dd_disk.name = new_resource.name
128
+ dd_disk.disk_size_gb = new_resource.size if !data_disk_exist? || new_resource.size > data_disk_size
129
+ Chef::Log.warn("Disk size reduction is not supported") if data_disk_exist? && new_resource.size < data_disk_size
130
+ dd_disk.lun = disk_lun(vm)
131
+ dd_disk.caching = new_resource.caching
132
+ dd_disk.create_option = data_disk_exist? ? 'attach' : 'empty'
133
+ managedDiskInfo = Azure::ARM::Compute::Models::ManagedDiskParameters.new.tap do |managedDisk|
134
+ if data_disk_exist?
135
+ action_handler.report_progress "Data disk with name #{new_resource.name} was found. Using this..."
136
+ managedDisk.id = data_disk_id
137
+ else
138
+ managedDisk.storage_account_type = new_resource.storage_account_type
139
+ end
140
+ end
141
+ dd_disk.managed_disk = managedDiskInfo
142
+ end
143
+ end
144
+
145
+ def detach_data_disk(vm)
146
+ if vm
147
+ vm.storage_profile.data_disks.each do |ddisk|
148
+ if ddisk.name == new_resource.name
149
+ action_handler.report_progress "Removing data disk #{new_resource.name} from VM #{new_resource.vm}."
150
+ (vm.storage_profile.data_disks).delete(ddisk)
151
+ result = compute_management_client.virtual_machines.create_or_update(new_resource.resource_group, new_resource.vm, vm)
152
+ Chef::Log.debug("result: #{result.inspect}")
153
+ end
154
+ end
155
+ else
156
+ raise "VM not available."
157
+ end
158
+ end
159
+
160
+ def attach_data_disk(vm)
161
+ if vm
162
+ data_disk = data_disk_setup_for(vm)
163
+ vm.storage_profile.data_disks.push(data_disk)
164
+ action_handler.report_progress "Updating VM #{new_resource.vm} with data disk #{new_resource.name}..."
165
+ result = compute_management_client.virtual_machines.create_or_update(new_resource.resource_group, new_resource.vm, vm)
166
+ Chef::Log.debug("result: #{result.inspect}")
167
+ else
168
+ raise "VM not available."
169
+ end
170
+ end
171
+
172
+ def destroy_data_disk
173
+ action_handler.report_progress "Deleting data disk #{new_resource.name}."
174
+ compute_management_client.disks.delete(new_resource.resource_group, new_resource.name)
175
+ end
176
+
177
+ def disk_lun(vm)
178
+ if new_resource.lun
179
+ new_resource.lun
180
+ elsif (vm.storage_profile.data_disks.last).nil?
181
+ 2
182
+ else
183
+ vm.storage_profile.data_disks.last.lun + 1
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
@@ -10,7 +10,7 @@ require 'azure_mgmt_network'
10
10
  Chef::Log.info("chef-provisioning-azurerm #{Chef::Provisioning::AzureRM::VERSION}")
11
11
  Chef::Log.info("chef-provisioning #{Chef::Provisioning::VERSION}")
12
12
 
13
- resources = %w(resource_group resource_template storage_account virtual_network network_interface public_ip_address)
13
+ resources = %w(resource_group resource_template storage_account virtual_network network_interface public_ip_address data_disk)
14
14
  resources.each do |r|
15
15
  require "chef/resource/azure_#{r}"
16
16
  require "chef/provider/azure_#{r}"
@@ -1,7 +1,7 @@
1
1
  class Chef
2
2
  module Provisioning
3
3
  module AzureRM
4
- VERSION = '1.0.4'.freeze
4
+ VERSION = '1.0.5'.freeze
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,20 @@
1
+ require 'chef/provisioning/azurerm/azure_resource'
2
+
3
+ class Chef
4
+ class Resource
5
+ class AzureDataDisk < Chef::Provisioning::AzureRM::AzureResource
6
+ resource_name :azure_data_disk
7
+ actions :create, :destroy, :detach, :attach, :nothing
8
+ default_action :create
9
+ attribute :name, kind_of: String, name_attribute: true, regex: /^[\w\-\(\)\.]{0,80}$+(?<!\.)$/i
10
+ attribute :size, kind_of: Integer, default: 10
11
+ attribute :storage_account_type, String, default: 'Standard_LRS'
12
+ attribute :caching, String, default: 'none'
13
+ attribute :location, String
14
+ attribute :lun, Integer
15
+ attribute :vm, String
16
+ attribute :tags, kind_of: Hash
17
+ attribute :resource_group, String, required: true
18
+ end
19
+ end
20
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cheese-chef-provisioning-azurerm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stuart Preston
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-04-10 00:00:00.000000000 Z
12
+ date: 2017-04-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chef
@@ -156,6 +156,7 @@ files:
156
156
  - CHANGELOG.md
157
157
  - LICENSE.txt
158
158
  - README.md
159
+ - lib/chef/provider/azure_data_disk.rb
159
160
  - lib/chef/provider/azure_network_interface.rb
160
161
  - lib/chef/provider/azure_public_ip_address.rb
161
162
  - lib/chef/provider/azure_resource_group.rb
@@ -170,6 +171,7 @@ files:
170
171
  - lib/chef/provisioning/azurerm/driver.rb
171
172
  - lib/chef/provisioning/azurerm/version.rb
172
173
  - lib/chef/provisioning/driver_init/azurerm.rb
174
+ - lib/chef/resource/azure_data_disk.rb
173
175
  - lib/chef/resource/azure_network_interface.rb
174
176
  - lib/chef/resource/azure_public_ip_address.rb
175
177
  - lib/chef/resource/azure_resource_group.rb