From 1252ca73704d3bac6277d94a3de9509d5f53d945 Mon Sep 17 00:00:00 2001 From: Bilal Naeem Date: Tue, 20 Feb 2018 14:44:30 +0500 Subject: [PATCH 1/5] Faraday working implementation --- lib/fog/azurerm.rb | 1 + .../resources/check_resource_group_exists.rb | 32 +++++++++++++------ lib/fog/azurerm/resources.rb | 7 ++++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/lib/fog/azurerm.rb b/lib/fog/azurerm.rb index f56093a23..d508ff769 100644 --- a/lib/fog/azurerm.rb +++ b/lib/fog/azurerm.rb @@ -16,6 +16,7 @@ require 'fog/azurerm/models/storage/sku_name' require 'fog/azurerm/models/storage/sku_tier' require 'fog/azurerm/models/storage/kind' +require 'faraday' module Fog # Autoload Module for Credentials diff --git a/lib/fog/azurerm/requests/resources/check_resource_group_exists.rb b/lib/fog/azurerm/requests/resources/check_resource_group_exists.rb index 789659c51..5dae1e234 100644 --- a/lib/fog/azurerm/requests/resources/check_resource_group_exists.rb +++ b/lib/fog/azurerm/requests/resources/check_resource_group_exists.rb @@ -6,16 +6,30 @@ class Real def check_resource_group_exists(resource_group_name) msg = "Checking Resource Group #{resource_group_name}" Fog::Logger.debug msg + + url = 'https://management.azure.com/subscriptions/' + + connection = Faraday.new(url: url) begin - flag = @rmc.resource_groups.check_existence(resource_group_name) - if flag - Fog::Logger.debug "Resource Group #{resource_group_name} exists." - else - Fog::Logger.debug "Resource Group #{resource_group_name} doesn't exist." + response = connection.get "#{@subscription_id}/resourcegroups/#{@resource_group_name}?api-version=2017-05-10" do |request| + request.headers['Content-Type'] = 'application/json' + request.headers['authorization'] = @token + request.body = '{}' end - flag - rescue MsRestAzure::AzureOperationError => e - raise_azure_exception(e, msg) + + # response = connection.get + puts response.inspect + # flag = @rmc.resource_groups.check_existence(resource_group_name) + # if flag + # Fog::Logger.debug "Resource Group #{resource_group_name} exists." + # else + # Fog::Logger.debug "Resource Group #{resource_group_name} doesn't exist." + # end + # flag + # rescue MsRestAzure::AzureOperationError => e + # raise_azure_exception(e, msg) + rescue => e + raise e end end end @@ -27,4 +41,4 @@ def check_resource_group_exists(*) end end end -end \ No newline at end of file +end diff --git a/lib/fog/azurerm/resources.rb b/lib/fog/azurerm/resources.rb index a0e689eb5..5a6afe8e2 100644 --- a/lib/fog/azurerm/resources.rb +++ b/lib/fog/azurerm/resources.rb @@ -64,6 +64,13 @@ def initialize(options) @rmc = ::Azure::ARM::Resources::ResourceManagementClient.new(credentials, resource_manager_endpoint_url(options[:environment])) @rmc.subscription_id = options[:subscription_id] @rmc.add_user_agent_information(telemetry) + + @tenant_id = options[:tenant_id] + @client_id = options[:client_id] + @subscription_id = options[:subscription_id] + @client_secret = options[:client_secret] + + @token = Fog::Credentials::AzureRM.get_token(@tenant_id, @client_id, @client_secret) end end end From 155c1c352937b0d3fec6a89444b3b46a69a45325 Mon Sep 17 00:00:00 2001 From: Bilal Naeem Date: Fri, 23 Feb 2018 16:59:29 +0500 Subject: [PATCH 2/5] Updated NetworkAdapter and Created CustomException --- lib/fog/azurerm.rb | 4 +- lib/fog/azurerm/constants.rb | 12 ++++++ lib/fog/azurerm/custom_exception.rb | 19 ++++++++++ lib/fog/azurerm/network_adapter.rb | 38 +++++++++++++++++++ .../resources/check_resource_group_exists.rb | 31 ++++++--------- .../resources/create_resource_group.rb | 35 +++++++++++++---- .../resources/delete_resource_group.rb | 12 ++++-- lib/fog/azurerm/resources.rb | 6 --- lib/fog/azurerm/utilities/general.rb | 5 +++ 9 files changed, 124 insertions(+), 38 deletions(-) create mode 100644 lib/fog/azurerm/custom_exception.rb create mode 100644 lib/fog/azurerm/network_adapter.rb diff --git a/lib/fog/azurerm.rb b/lib/fog/azurerm.rb index d508ff769..8bcc5aa4b 100644 --- a/lib/fog/azurerm.rb +++ b/lib/fog/azurerm.rb @@ -69,9 +69,11 @@ module KeyVault autoload :AzureRM, File.expand_path('azurerm/key_vault', __dir__) end - # Autoload Module for Response::Asynchronous + # Autoload Module for Response::Asynchronous, NetworkAdapter and CustomException module AzureRM autoload :AsyncResponse, File.expand_path('azurerm/async_response', __dir__) + autoload :NetworkAdapter, File.expand_path('azurerm/network_adapter', __dir__) + autoload :CustomException, File.expand_path('azurerm/custom_exception', __dir__) end # Main AzureRM fog Provider Module diff --git a/lib/fog/azurerm/constants.rb b/lib/fog/azurerm/constants.rb index ae3969906..0cb6c1d15 100755 --- a/lib/fog/azurerm/constants.rb +++ b/lib/fog/azurerm/constants.rb @@ -69,3 +69,15 @@ TEMPORARY_STORAGE_ACCOUNT_TAG_VALUE = 'delete'.freeze HTTP_NOT_FOUND = 404 + +GET_METHOD = 'get'.freeze +PUT_METHOD = 'put'.freeze +DELETE_METHOD = 'delete'.freeze + +SUCCESS = 'success'.freeze +FAILURE = 'failure'.freeze + +STATUS_CODES = { + success: [200, 201, 202, 203, 204], + failure: [400, 401, 402, 403, 404, 500, 501, 502, 503] +} \ No newline at end of file diff --git a/lib/fog/azurerm/custom_exception.rb b/lib/fog/azurerm/custom_exception.rb new file mode 100644 index 000000000..39b0ecb47 --- /dev/null +++ b/lib/fog/azurerm/custom_exception.rb @@ -0,0 +1,19 @@ +module Fog + module AzureRM + class CustomException < StandardError + attr_accessor :request + attr_accessor :response + attr_accessor :body + attr_accessor :error_message + attr_accessor :error_code + + def initialize(exception) + @request = exception.env.request + @response = exception.env.response + @body = exception.env.body + @error_message = @body.error.message + @error_code = @body.error.code + end + end + end +end \ No newline at end of file diff --git a/lib/fog/azurerm/network_adapter.rb b/lib/fog/azurerm/network_adapter.rb new file mode 100644 index 000000000..782a4c5df --- /dev/null +++ b/lib/fog/azurerm/network_adapter.rb @@ -0,0 +1,38 @@ +module Fog + module AzureRM + class NetworkAdapter + def self.get(url, token) + create_faraday_connection + + create_faraday_request(url, token, nil, GET_METHOD) + end + + def self.put(url, token, body) + create_faraday_connection + + create_faraday_request(url, token, body, PUT_METHOD) + end + + def self.delete(url, token) + create_faraday_connection + + create_faraday_request(url, token, nil, DELETE_METHOD) + end + + private + + def self.create_faraday_connection + @connection = Faraday.new(url: AZURE_RESOURCE) + end + + def self.create_faraday_request(url, token, body, method_type) + response = @connection.send(method_type, url) do |request| + request.headers['accept'] = 'application/json' + request.headers['Content-type'] = 'application/json' + request.headers['authorization'] = token + request.body = body.nil? ? '{}' : body + end + end + end + end +end diff --git a/lib/fog/azurerm/requests/resources/check_resource_group_exists.rb b/lib/fog/azurerm/requests/resources/check_resource_group_exists.rb index 5dae1e234..5c8d85081 100644 --- a/lib/fog/azurerm/requests/resources/check_resource_group_exists.rb +++ b/lib/fog/azurerm/requests/resources/check_resource_group_exists.rb @@ -7,30 +7,21 @@ def check_resource_group_exists(resource_group_name) msg = "Checking Resource Group #{resource_group_name}" Fog::Logger.debug msg - url = 'https://management.azure.com/subscriptions/' - - connection = Faraday.new(url: url) + url = "subscriptions/#{@subscription_id}/resourcegroups/#{resource_group_name}?api-version=2017-05-10" + begin - response = connection.get "#{@subscription_id}/resourcegroups/#{@resource_group_name}?api-version=2017-05-10" do |request| - request.headers['Content-Type'] = 'application/json' - request.headers['authorization'] = @token - request.body = '{}' - end - - # response = connection.get - puts response.inspect - # flag = @rmc.resource_groups.check_existence(resource_group_name) - # if flag - # Fog::Logger.debug "Resource Group #{resource_group_name} exists." - # else - # Fog::Logger.debug "Resource Group #{resource_group_name} doesn't exist." - # end - # flag - # rescue MsRestAzure::AzureOperationError => e - # raise_azure_exception(e, msg) + response = Fog::AzureRM::NetworkAdapter.get(url, @token) rescue => e raise e end + + response_status = parse_response(response) + + if response_status.eql?(SUCCESS) + response.env.body + else + raise Fog::AzureRM::CustomException(response) + end end end # This class provides the mock implementation for unit tests. diff --git a/lib/fog/azurerm/requests/resources/create_resource_group.rb b/lib/fog/azurerm/requests/resources/create_resource_group.rb index 4d92a9da3..ad15d9745 100644 --- a/lib/fog/azurerm/requests/resources/create_resource_group.rb +++ b/lib/fog/azurerm/requests/resources/create_resource_group.rb @@ -6,16 +6,35 @@ class Real def create_resource_group(name, location, tags) msg = "Creating Resource Group: #{name}." Fog::Logger.debug msg - resource_group = Azure::ARM::Resources::Models::ResourceGroup.new - resource_group.location = location - resource_group.tags = tags + + body = create_resource_group_body(location, tags).to_json + + url = "subscriptions/#{@subscription_id}/resourcegroups/#{name}?api-version=2017-05-10" begin - resource_group = @rmc.resource_groups.create_or_update(name, resource_group) - rescue MsRestAzure::AzureOperationError => e - raise_azure_exception(e, msg) + response = Fog::AzureRM::NetworkAdapter.put( + url, + @token, + body + ) + rescue => e + raise e + end + + response_status = parse_response(response) + + if response_status.eql?(SUCCESS) + Fog::Logger.debug "Resource Group #{name} created successfully." + response.env.body + else + raise Fog::AzureRM::CustomException(response) end - Fog::Logger.debug "Resource Group #{name} created successfully." - resource_group + end + + def create_resource_group_body(location, tags) + parameters = { + location: location, + properties: {} + } end end diff --git a/lib/fog/azurerm/requests/resources/delete_resource_group.rb b/lib/fog/azurerm/requests/resources/delete_resource_group.rb index 14dc41a41..7ed7266ad 100644 --- a/lib/fog/azurerm/requests/resources/delete_resource_group.rb +++ b/lib/fog/azurerm/requests/resources/delete_resource_group.rb @@ -6,10 +6,16 @@ class Real def delete_resource_group(name) msg = "Deleting Resource Group: #{name}." Fog::Logger.debug msg + + url = "subscriptions/#{@subscription_id}/resourcegroups/#{name}?api-version=2017-05-10" + begin - @rmc.resource_groups.delete(name) - rescue MsRestAzure::AzureOperationError => e - raise_azure_exception(e, msg) + Fog::AzureRM::NetworkAdapter.delete( + url, + @token + ) + rescue => e + raise e end Fog::Logger.debug "Resource Group #{name} deleted successfully." true diff --git a/lib/fog/azurerm/resources.rb b/lib/fog/azurerm/resources.rb index 5a6afe8e2..f6cb3bb8f 100644 --- a/lib/fog/azurerm/resources.rb +++ b/lib/fog/azurerm/resources.rb @@ -59,12 +59,6 @@ def initialize(options) options[:environment] = 'AzureCloud' if options[:environment].nil? - credentials = Fog::Credentials::AzureRM.get_credentials(options[:tenant_id], options[:client_id], options[:client_secret], options[:environment]) - telemetry = "fog-azure-rm/#{Fog::AzureRM::VERSION}" - @rmc = ::Azure::ARM::Resources::ResourceManagementClient.new(credentials, resource_manager_endpoint_url(options[:environment])) - @rmc.subscription_id = options[:subscription_id] - @rmc.add_user_agent_information(telemetry) - @tenant_id = options[:tenant_id] @client_id = options[:client_id] @subscription_id = options[:subscription_id] diff --git a/lib/fog/azurerm/utilities/general.rb b/lib/fog/azurerm/utilities/general.rb index f53e6bb56..9d5147693 100755 --- a/lib/fog/azurerm/utilities/general.rb +++ b/lib/fog/azurerm/utilities/general.rb @@ -177,3 +177,8 @@ def resource_not_found?(azure_operation_error) def get_image_name(id) id.split('/').last end + +def parse_response(response) + status_code = response.env.status + STATUS_CODES[:success].include? status_code ? SUCCESS : FAILURE +end From 0f8ada75e88bde2cb2c2e11b2074b46f873efe8d Mon Sep 17 00:00:00 2001 From: Bilal Naeem Date: Mon, 26 Feb 2018 18:32:21 +0500 Subject: [PATCH 3/5] Made a generic CustomException --- lib/fog/azurerm/custom_exception.rb | 10 +++++++--- .../requests/resources/create_resource_group.rb | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/fog/azurerm/custom_exception.rb b/lib/fog/azurerm/custom_exception.rb index 39b0ecb47..3e1cccbf1 100644 --- a/lib/fog/azurerm/custom_exception.rb +++ b/lib/fog/azurerm/custom_exception.rb @@ -10,9 +10,13 @@ class CustomException < StandardError def initialize(exception) @request = exception.env.request @response = exception.env.response - @body = exception.env.body - @error_message = @body.error.message - @error_code = @body.error.code + @body = JSON.decode(exception.env.body) + @error_message = @body['error']['message'] + @error_code = @body['error']['code'] + end + + def to_s + puts "#{@body}" end end end diff --git a/lib/fog/azurerm/requests/resources/create_resource_group.rb b/lib/fog/azurerm/requests/resources/create_resource_group.rb index ad15d9745..0371de3ef 100644 --- a/lib/fog/azurerm/requests/resources/create_resource_group.rb +++ b/lib/fog/azurerm/requests/resources/create_resource_group.rb @@ -26,7 +26,7 @@ def create_resource_group(name, location, tags) Fog::Logger.debug "Resource Group #{name} created successfully." response.env.body else - raise Fog::AzureRM::CustomException(response) + raise Fog::AzureRM::CustomException.new(response) end end From fa2c5a92e14db1d674f2aa2970745175fa3f6f7e Mon Sep 17 00:00:00 2001 From: Bilal Naeem Date: Tue, 27 Feb 2018 12:01:08 +0500 Subject: [PATCH 4/5] Modified CustomException message --- lib/fog/azurerm/custom_exception.rb | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/fog/azurerm/custom_exception.rb b/lib/fog/azurerm/custom_exception.rb index 3e1cccbf1..589fbb0d5 100644 --- a/lib/fog/azurerm/custom_exception.rb +++ b/lib/fog/azurerm/custom_exception.rb @@ -13,10 +13,19 @@ def initialize(exception) @body = JSON.decode(exception.env.body) @error_message = @body['error']['message'] @error_code = @body['error']['code'] + super end def to_s - puts "#{@body}" + exception = {} + + exception['message'] = @error_message + exception['code'] = @error_code + exception['body'] = @body + exception['request'] = @request + exception['response'] = @response + + Fog::JSON.encode(exception) end end end From 54092fe0c35c36801aa70dd373aa19609e2adff1 Mon Sep 17 00:00:00 2001 From: Bilal Naeem Date: Thu, 1 Mar 2018 12:02:59 +0500 Subject: [PATCH 5/5] Review changes --- lib/fog/azurerm/network_adapter.rb | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/lib/fog/azurerm/network_adapter.rb b/lib/fog/azurerm/network_adapter.rb index 782a4c5df..6d66f0655 100644 --- a/lib/fog/azurerm/network_adapter.rb +++ b/lib/fog/azurerm/network_adapter.rb @@ -2,31 +2,23 @@ module Fog module AzureRM class NetworkAdapter def self.get(url, token) - create_faraday_connection - - create_faraday_request(url, token, nil, GET_METHOD) + send_request(url, token, nil, GET_METHOD) end def self.put(url, token, body) - create_faraday_connection - - create_faraday_request(url, token, body, PUT_METHOD) + send_request(url, token, body, PUT_METHOD) end def self.delete(url, token) - create_faraday_connection - - create_faraday_request(url, token, nil, DELETE_METHOD) + send_request(url, token, nil, DELETE_METHOD) end private - def self.create_faraday_connection - @connection = Faraday.new(url: AZURE_RESOURCE) - end + def self.send_request(url, token, body, method_type) + connection = Faraday.new - def self.create_faraday_request(url, token, body, method_type) - response = @connection.send(method_type, url) do |request| + response = connection.send(method_type, url) do |request| request.headers['accept'] = 'application/json' request.headers['Content-type'] = 'application/json' request.headers['authorization'] = token