error handling in azure create_tenant method

This commit is contained in:
Philip Kalinsky 2020-02-04 14:31:30 -05:00
parent c995b0963c
commit 0d942c73fc
2 changed files with 59 additions and 25 deletions

View File

@ -6,7 +6,13 @@ from uuid import uuid4
from atst.utils import sha256_hex from atst.utils import sha256_hex
from .cloud_provider_interface import CloudProviderInterface from .cloud_provider_interface import CloudProviderInterface
from .exceptions import AuthenticationException, UserProvisioningException from .exceptions import (
AuthenticationException,
UserProvisioningException,
ConnectionException,
UnknownServerException,
)
from .models import ( from .models import (
SubscriptionCreationCSPPayload, SubscriptionCreationCSPPayload,
SubscriptionCreationCSPResult, SubscriptionCreationCSPResult,
@ -83,7 +89,8 @@ class AzureSDKProvider(object):
self.graphrbac = graphrbac self.graphrbac = graphrbac
self.credentials = credentials self.credentials = credentials
self.identity = identity self.identity = identity
self.exceptions = exceptions self.azure_exceptions = exceptions
self.requests_exceptions = requests.exceptions
self.secrets = secrets self.secrets = secrets
self.requests = requests self.requests = requests
self.cloud = AZURE_PUBLIC_CLOUD self.cloud = AZURE_PUBLIC_CLOUD
@ -116,7 +123,7 @@ class AzureCloudProvider(CloudProviderInterface):
) )
try: try:
return secret_client.set_secret(secret_key, secret_value) return secret_client.set_secret(secret_key, secret_value)
except self.exceptions.HttpResponseError: except self.azure_exceptions.HttpResponseError:
app.logger.error( app.logger.error(
f"Could not SET secret in Azure keyvault for key {secret_key}.", f"Could not SET secret in Azure keyvault for key {secret_key}.",
exc_info=1, exc_info=1,
@ -129,7 +136,7 @@ class AzureCloudProvider(CloudProviderInterface):
) )
try: try:
return secret_client.get_secret(secret_key).value return secret_client.get_secret(secret_key).value
except self.exceptions.HttpResponseError: except self.azure_exceptions.HttpResponseError:
app.logger.error( app.logger.error(
f"Could not GET secret in Azure keyvault for key {secret_key}.", f"Could not GET secret in Azure keyvault for key {secret_key}.",
exc_info=1, exc_info=1,
@ -292,12 +299,31 @@ class AzureCloudProvider(CloudProviderInterface):
"Authorization": f"Bearer {sp_token}", "Authorization": f"Bearer {sp_token}",
} }
try:
result = self.sdk.requests.post( result = self.sdk.requests.post(
f"{self.sdk.cloud.endpoints.resource_manager}/providers/Microsoft.SignUp/createTenant?api-version=2020-01-01-preview", f"{self.sdk.cloud.endpoints.resource_manager}/providers/Microsoft.SignUp/createTenant?api-version=2020-01-01-preview",
json=create_tenant_body, json=create_tenant_body,
headers=create_tenant_headers, headers=create_tenant_headers,
timeout=30,
) )
except self.requests_exceptions.ConnectionError:
app.logger.error(
f"Could not create tenant. Connection Error", exc_info=1,
)
raise ConnectionException("connection error creating tenant")
except self.requests_exceptions.Timeout:
app.logger.error(
f"Could not create tenant. Request timed out.", exc_info=1,
)
raise ConnectionException("timout error creating tenant")
try:
response.raise_for_status()
except requests_exceptions.HTTPError:
raise UnknownServerException("azure application error creating tenant")
if result.status_code == 200: if result.status_code == 200:
result_dict = result.json() result_dict = result.json()
tenant_id = result_dict.get("tenantId") tenant_id = result_dict.get("tenantId")

View File

@ -158,6 +158,7 @@ class PortfolioStateMachine(
payload = event.kwargs.get("csp_data") payload = event.kwargs.get("csp_data")
payload_data_cls = get_stage_csp_class(stage, "payload") payload_data_cls = get_stage_csp_class(stage, "payload")
if not payload_data_cls: if not payload_data_cls:
app.logger.info(f"could not resolve payload data class for stage {stage}") app.logger.info(f"could not resolve payload data class for stage {stage}")
self.fail_stage(stage) self.fail_stage(stage)
@ -178,6 +179,18 @@ class PortfolioStateMachine(
try: try:
func_name = f"create_{stage}" func_name = f"create_{stage}"
response = getattr(self.csp, func_name)(payload_data) response = getattr(self.csp, func_name)(payload_data)
except (ConnectionException, UnknownServerException) as exc:
app.logger.error(
f"CSP api call. Caught exception for {self.__repr__()}.", exc_info=1,
)
self.fail_stage(stage)
if response.get("status") == "error":
self.fail_stage(stage)
elif response.get("status") == "ok":
try:
if self.portfolio.csp_data is None: if self.portfolio.csp_data is None:
self.portfolio.csp_data = {} self.portfolio.csp_data = {}
self.portfolio.csp_data.update(response.dict()) self.portfolio.csp_data.update(response.dict())
@ -192,11 +205,6 @@ class PortfolioStateMachine(
print(exc.json()) print(exc.json())
app.logger.info(payload_data) app.logger.info(payload_data)
self.fail_stage(stage) self.fail_stage(stage)
except (ConnectionException, UnknownServerException) as exc:
app.logger.error(
f"CSP api call. Caught exception for {self.__repr__()}.", exc_info=1,
)
self.fail_stage(stage)
self.finish_stage(stage) self.finish_stage(stage)
@ -214,7 +222,7 @@ class PortfolioStateMachine(
def is_ready_resume_progress(self, event): def is_ready_resume_progress(self, event):
""" """
This function guards advancing states from *_FAILED to *_IN_PROGRESS. This function guards advancing states from FAILED to *_IN_PROGRESS.
""" """
return True return True