ManageIQ/azure-armrest

View on GitHub
lib/azure/armrest/virtual_machine_extension_service.rb

Summary

Maintainability
A
35 mins
Test Coverage
F
32%
# Azure namespace
module Azure
  # Armrest namespace
  module Armrest
    # Base class for managing virtual machine extensions
    class VirtualMachineExtensionService < VirtualMachineService

      # Creates and returns a new VirtualMachineExtensionService object.
      #
      def initialize(_configuration, options = {})
        super
        set_service_api_version(options, 'virtualMachines/extensions')
      end

      # Creates a new extension for the provided VM with the given +options+.
      # The possible options are:
      #
      # - :location - The location for the extension. Mandatory.
      # - :type - The type of compute resource. The default is "Microsoft.Compute/virtualMachines/extensions".
      # - :tags - A list of key value pairs. Max 10 pairs. Optional.
      # - :properties
      #   - :type - The type of extension. Required.
      #   - :publisher - Name of extension publisher. Default is the provider.
      #   - :typeHandlerVersion - Optional. Specifies the extension version. Default is "1.*".
      #   - :settings - Public configuration that does not require encryption. Optional.
      #     - :fileUris - The script file path.
      #     - :commandToExecute - The command used to execute the script.
      #
      # For convenience, you may also specify a :resource_group as an option.
      #
      def create(vm_name, ext_name, options = {}, rgroup = nil)
        rgroup ||= options.delete(:resource_group) || configuration.resource_group

        raise ArgumentError, "no resource group provided" unless rgroup

        # Optional params with defaults
        options[:type] ||= "Microsoft.Compute/virtualMachines/extensions"
        options[:name] ||= ext_name
        options[:properties][:publisher] ||= @provider
        options[:properties][:typeHandlerVersion] ||= "1.*"

        url = build_url(rgroup, vm_name, ext_name)
        body = options.to_json

        response = rest_put(url, body)
        response.return!
      end

      alias update create

      # Delete the given extension for the provided VM and resource group.
      #
      def delete(vm_name, ext_name, rgroup = configuration.resource_group)
        raise ArgumentError, "no resource group provided" unless rgroup
        url = build_url(rgroup, vm_name, ext_name)
        response = rest_delete(url)
        response.return!
      end

      # Retrieves the settings of an extension for the provided VM.
      # If the +instance_view+ option is true, it will retrieve instance
      # view information instead.
      #
      def get(vm_name, ext_name, rgroup = configuration.resource_group, instance_view = false)
        raise ArgumentError, "no resource group provided" unless rgroup
        url = build_url(rgroup, vm_name, ext_name)
        url << "&expand=instanceView" if instance_view
        response = rest_get(url)
        Azure::Armrest::VirtualMachineExtension.new(response)
      end

      # Shortcut to get an extension in model view.
      def get_model_view(vm_name, ext_name, rgroup = configuration.resource_group)
        raise ArgumentError, "no resource group provided" unless rgroup
        get(vm_name, ext_name, rgroup, false)
      end

      # Shortcut to get an extension in instance view.
      def get_instance_view(vm_name, ext_name, rgroup = configuration.resource_group)
        raise ArgumentError, "no resource group provided" unless rgroup
        get(vm_name, ext_name, rgroup, true)
      end

      # Retrieves a list of extensions on the VM in the provided resource group.
      # If the +instance_view+ option is true, it will retrieve a list of instance
      # view information instead.
      #
      def list(vm_name, rgroup = configuration.resource_group, instance_view = false)
        raise ArgumentError, "no resource group provided" unless rgroup
        url = build_url(rgroup, vm_name)
        url << "&expand=instanceView" if instance_view
        response = rest_get(url)
        Azure::Armrest::ArmrestCollection.create_from_response(response, model_class)
      end

      # Shortcut to get a list in model view.
      def list_model_view(vmname, rgroup = configuration.resource_group)
        raise ArgumentError, "no resource group provided" unless rgroup
        list(vmname, false, rgroup)
      end

      # Shortcut to get a list in instance view.
      def list_instance_view(vmname, rgroup = configuration.resource_group)
        raise ArgumentError, "no resource group provided" unless rgroup
        list(vmname, true, rgroup)
      end

      private

      # Builds a URL based on subscription_id an resource_group and any other
      # arguments provided, and appends it with the api_version.
      #
      def build_url(resource_group, vm, *args)
        url = File.join(
          base_url,
          'resourceGroups',
          resource_group,
          'providers',
          @provider,
          'virtualMachines',
          vm,
          'extensions'
        )

        url = File.join(url, *args) unless args.empty?
        url << "?api-version=#{@api_version}"
      end
    end
  end
end