diff --git a/pkg/pip_requirements.txt b/pkg/pip_requirements.txt index df908f5..7e711f5 100644 --- a/pkg/pip_requirements.txt +++ b/pkg/pip_requirements.txt @@ -1,4 +1,5 @@ spaceone-api google-api-python-client requests -beautifulsoup4 \ No newline at end of file +beautifulsoup4 +PySocks # for proxy support \ No newline at end of file diff --git a/src/cloudforet/plugin/connector/base.py b/src/cloudforet/plugin/connector/base.py index 6909515..48d65d7 100644 --- a/src/cloudforet/plugin/connector/base.py +++ b/src/cloudforet/plugin/connector/base.py @@ -1,8 +1,12 @@ +import logging +import os + import google.oauth2.service_account import googleapiclient import googleapiclient.discovery -import logging - +import httplib2 +import socks +from google_auth_httplib2 import AuthorizedHttp from spaceone.core.connector import BaseConnector DEFAULT_SCHEMA = "google_oauth_client_id" @@ -35,11 +39,26 @@ def __init__(self, *args, **kwargs): secret_data ) ) - self.client = googleapiclient.discovery.build( - self.google_client_service, - self.version, - credentials=self.credentials, - ) + proxy_http = self._create_http_client() + if proxy_http: + self.client = googleapiclient.discovery.build( + self.google_client_service, + self.version, + http=AuthorizedHttp( + self.credentials.with_scopes( + [ + "https://www.googleapis.com/auth/cloud-platform" + ] # FOR PROXY SCOPE SUPPORT + ), + http=proxy_http, + ), + ) + else: + self.client = googleapiclient.discovery.build( + self.google_client_service, + self.version, + credentials=self.credentials, + ) def generate_query(self, **query): query.update( @@ -53,3 +72,33 @@ def list_zones(self, **query): query = self.generate_query(**query) result = self.client.zones().list(**query).execute() return result.get("items", []) + + def _create_http_client(self): + https_proxy = os.environ.get("HTTPS_PROXY") or os.environ.get("https_proxy") + + if https_proxy: + # _LOGGER.info( + # f"** Using proxy in environment variable HTTPS_PROXY/https_proxy: {https_proxy}" + # ) # TOO MANY LOGGING + try: + proxy_url = https_proxy.replace("http://", "").replace("https://", "") + if ":" in proxy_url: + proxy_host, proxy_port = proxy_url.split(":", 1) + proxy_port = int(proxy_port) + + proxy_info = httplib2.ProxyInfo( + proxy_host=proxy_host, + proxy_port=proxy_port, + proxy_type=socks.PROXY_TYPE_HTTP, + ) + + return httplib2.Http( + proxy_info=proxy_info, disable_ssl_certificate_validation=True + ) + except Exception as e: + _LOGGER.warning( + f"Failed to configure proxy. Using direct connection.: {e}. " + ) + return None + else: + return None diff --git a/src/cloudforet/plugin/main.py b/src/cloudforet/plugin/main.py index 100b548..a00c9f6 100644 --- a/src/cloudforet/plugin/main.py +++ b/src/cloudforet/plugin/main.py @@ -1,5 +1,6 @@ -import time import logging +import os +import time from spaceone.inventory.plugin.collector.lib.server import CollectorPluginServer @@ -32,7 +33,13 @@ def collector_collect(params: dict) -> dict: options = params["options"] secret_data = params["secret_data"] schema = params.get("schema") - + + proxy_env = os.environ.get("HTTPS_PROXY") or os.environ.get("https_proxy") + if proxy_env: + _LOGGER.debug( + f"** Using proxy in environment variable HTTPS_PROXY/https_proxy: {proxy_env}" + ) # src/cloudforet/plugin/connector/base.py _create_http_client + resource_mgrs = ResourceManager.list_managers() for manager in resource_mgrs: start_time = time.time()