error handling in azure create_tenant method
This commit is contained in:
parent
c995b0963c
commit
0d942c73fc
@ -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")
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user