Merge pull request #7 from chef/russellseymour/vm-resources

Added more VM resource controls
This commit is contained in:
Russell Seymour 2017-02-20 10:08:24 +00:00 committed by GitHub
commit c2bc6dc40d
4 changed files with 151 additions and 20 deletions

View file

@ -114,6 +114,16 @@ end
| azure_vm | publisher | Publisher that provided the image in the marketplace |
| | offer | The offer of the image |
| | sku | The SKU being used |
| | size | The size of the machine |
| | location | Where the machine has been deployed |
| | boot_diagnostics? | Whether boot diagnostics have been enabled or not |
| | nic_count | How many network cards are attached to the machine |
| | username | The admin username that has been assigned to the machine |
| | computername | Computer name of the machine in the operating system. This maybe different to the VM name as seen in Azure |
| | hostname | Alias for computername |
| | password_authentication? | If password authentication is enabled. For Windows machines this is always true |
| | ssh_key_count | How many SSH public keys have been added to the machine. For Windows this is always 0 |
| | os_type | Tyep type of operating system. Linux or Windows |
- `azure_vm_datadisks` - Resource to read the data disks for a machine and check that they are of the correct size etc

View file

@ -12,5 +12,13 @@ control 'azure-vm-1.0' do
its('sku') { should eq '16.04-LTS' }
its('publisher') { should eq 'Canonical' }
its('offer') { should eq 'UbuntuServer' }
its('size') { should eq 'Standard_DS1_v2' }
its('location') { should eq 'westeurope' }
its('boot_diagnostics?') { should be true }
its('nic_count') { should eq 1 }
its('username') { should eq 'azure' }
its('password_authentication?') { should be false }
its('ssh_key_count') { should eq 1 }
its('os_type') { should eq 'Linux' }
end
end

View file

@ -14,39 +14,144 @@ class AzureVm < Inspec.resource(1)
end
"
attr_accessor :vm
# Load the configuration file on initialisation
def initialize(opts)
@opts = opts
@helpers = Helpers.new
opts = opts
helpers = Helpers.new
@vm = helpers.get_vm(opts[:host], opts[:resource_group])
# Ensure that the vm is an object
raise format('An error has occured: %s', vm) if vm.instance_of?(String)
end
# Determine the SKU used to create the machine
#
# == Returns:
# String showing the sku, e.g. 16.04.0-LTS
#
def sku
vm = @helpers.get_vm(@opts[:host], @opts[:resource_group])
if vm.instance_of?(String)
vm
else
vm.storage_profile.image_reference.sku
end
vm.storage_profile.image_reference.sku
end
# Determine the publisher of the SKU
#
# == Returns:
# String of the publisher, e.g. Canonical
#
def publisher
vm = @helpers.get_vm(@opts[:host], @opts[:resource_group])
vm.storage_profile.image_reference.publisher
end
if vm.instance_of?(String)
vm
# Determine the offer from the publisher
#
# == Returns:
# String of the offer, e.g. UbuntuServer
#
def offer
vm.storage_profile.image_reference.offer
end
# Determine the size of the machine
#
# == Returns:
# String showing the size of the machine, e.g. Standard_DS1_v2
#
def size
vm.hardware_profile.vm_size
end
# Determine the location of the vm
#
# == Returns:
# String representing the location of the machinem, e.g. westeurope
#
def location
vm.location
end
# State if boot diagnostics is enabled
#
# == Returns:
# Boolean
#
def boot_diagnostics?
vm.diagnostics_profile.boot_diagnostics.enabled
end
# Determine how many network cards are connected to the machine
#
# == Returns:
# Integer
#
def nic_count
vm.network_profile.network_interfaces.length
end
# The admin username for the machine
#
# == Returns:
# String of the admin username when the machine was created, e.g. azure
#
def username
vm.os_profile.admin_username
end
# The computername as seen by the operating system
# This might be different to the VM name as seen in Azure
#
# == Returns:
# String of the computername
#
def computername
vm.os_profile.computer_name
end
# Alias for computername
#
# == Returns:
# String of the computername
#
def hostname
computername
end
# Determine if password authentication is enabled
# For Windows this is always True. On Linux this will be determined
#
# == Returns:
# Boolean
#
def password_authentication?
# if the vm has a linux configuration then interrogate that, otherwise return true
if !vm.os_profile.linux_configuration.nil?
!vm.os_profile.linux_configuration.disable_password_authentication
else
vm.storage_profile.image_reference.publisher
true
end
end
def offer
vm = @helpers.get_vm(@opts[:host], @opts[:resource_group])
if vm.instance_of?(String)
vm
# How many SSH keys have been added to the machine
# For Windows this will be 0, for Linux this will be determined
#
# == Returns:
# Integer
#
def ssh_key_count
if !vm.os_profile.linux_configuration.nil?
vm.os_profile.linux_configuration.ssh.public_keys.length
else
vm.storage_profile.image_reference.offer
0
end
end
# Determine the Operating system type using the os_disk object
#
# == Returns:
# String of the OS type, e.g. Windows or Linux
#
def os_type
vm.storage_profile.os_disk.os_type
end
end

View file

@ -29,7 +29,7 @@ class AzureVmDataDisks < Inspec.resource(1)
@params = parse_data_disks(vm.storage_profile.data_disks)
end
# Create a filter table for testing
# Create a FilterTable which can be used by controls to interogate the data disks
filter = FilterTable.create
filter.add_accessor(:where)
.add_accessor(:entries)
@ -46,10 +46,18 @@ class AzureVmDataDisks < Inspec.resource(1)
filter.connect(self, :params)
# Determine how many data disks have been applied to the machine
#
# == Returns:
# Integer
def count
entries.length
end
# Determine if any data disks are attached to the machine
#
# == Returns:
# Boolean
def has_disks?
entries.!empty?
end