fix: null provider_service_id when DNS failed

Change-Id: Idc1cd078961d683406b4f08eb4727169f691e569
This commit is contained in:
tonytan4ever 2016-01-08 16:05:38 -05:00
parent 29ee86f155
commit 110aff8d78
9 changed files with 71 additions and 0 deletions

View File

@ -98,6 +98,7 @@ class CreateServiceDNSMappingTask(task.Task):
def execute(self, responders, retry_sleep_time, project_id, service_id):
service_controller, dns = \
memoized_controllers.task_controllers('poppy', 'dns')
dns_responder = dns.create(responders)
for provider_name in dns_responder:
if 'error' in dns_responder[provider_name]:
@ -145,10 +146,29 @@ class CreateServiceDNSMappingTask(task.Task):
'to failed'.format(service_id, project_id))
provider_details_dict = {}
result = kwargs['result']
service_controller, self.storage_controller = \
memoized_controllers.task_controllers('poppy', 'storage')
try:
service_obj = self.storage_controller.get(project_id,
service_id)
except ValueError:
msg = 'Creating service {0} from Poppy failed. ' \
'No such service exists'.format(service_id)
LOG.info(msg)
raise Exception(msg)
for responder in responders:
for provider_name in responder:
provider_service_id = (
service_controller._driver.
providers[provider_name.lower()].obj.
service_controller.
get_provider_service_id(service_obj))
provider_details_dict[provider_name] = (
provider_details.ProviderDetail(
provider_service_id=provider_service_id,
error_info=result.traceback_str,
status='failed',
error_message='Failed after '

View File

@ -113,6 +113,7 @@ class UpdateServiceDNSMappingTask(task.Task):
return dns_responder
def revert(self, responders, retry_sleep_time,
service_old, service_obj,
project_id, service_id, **kwargs):
if self.name in kwargs['flow_failures'].keys():
retries = conf[DNS_GROUP].retries
@ -133,10 +134,22 @@ class UpdateServiceDNSMappingTask(task.Task):
'to failed'.format(service_id, project_id))
provider_details_dict = {}
result = kwargs['result']
service_controller, self.storage_controller = \
memoized_controllers.task_controllers('poppy', 'storage')
service_obj_json = json.loads(service_obj)
service_obj = service.load_from_json(service_obj_json)
for responder in responders:
for provider_name in responder:
provider_service_id = (
service_controller._driver.
providers[provider_name.lower()].obj.
service_controller.
get_provider_service_id(service_obj))
provider_details_dict[provider_name] = (
provider_details.ProviderDetail(
provider_service_id=provider_service_id,
error_info=result.traceback_str,
status='failed',
error_message='Failed after '

View File

@ -993,3 +993,12 @@ class ServiceController(base.ServiceBase):
datetime.datetime.today().weekday() % len(self.san_cert_cnames))
return self.san_cert_cnames[find_idx]
def get_provider_service_id(self, service_obj):
id_list = []
for domain in service_obj.domains:
dp_obj = {'policy_name': domain.domain,
'protocol': domain.protocol,
'certificate': domain.certificate}
id_list.append(dp_obj)
return json.dumps(id_list)

View File

@ -76,6 +76,15 @@ class ServicesControllerBase(controller.ProviderControllerBase):
"""
raise NotImplementedError
@abc.abstractmethod
def get_provider_service_id(self, service_obj):
"""Get the provider side service id for the service object.
:param service_obj
:raises NotImplementedError
"""
raise NotImplementedError
def _map_service_name(self, service_name):
"""Map poppy service name to provider's specific service name.

View File

@ -96,6 +96,9 @@ class ServiceController(base.ServiceBase):
except Exception as e:
return self.responder.failed(str(e))
def get_provider_service_id(self, service_obj):
return service_obj.name
@decorators.lazy_property(write=False)
def current_customer(self):
# TODO(tonytan4ever/obulpathi): Implement cloudfront's current_customer

View File

@ -245,3 +245,6 @@ class ServiceController(base.ServiceBase):
@decorators.lazy_property(write=False)
def current_customer(self):
return self.client.get_current_customer()
def get_provider_service_id(self, service_obj):
return service_obj.service_id

View File

@ -134,6 +134,9 @@ class ServiceController(base.ServiceBase):
else:
return hashlib.sha1(service_name.encode("utf-8")).hexdigest()[:30]
def get_provider_service_id(self, service_obj):
return self._map_service_name(service_obj.name)
@decorators.lazy_property(write=False)
def current_customer(self):
# This returns the current customer account info

View File

@ -50,6 +50,9 @@ class ServiceController(base.ServiceBase):
def get(self, service_name):
return self.responder.get([], [], [])
def get_provider_service_id(self, service_obj):
return []
@decorators.lazy_property(write=False)
def current_customer(self):
'''return current_customer for Mock. We can return a None.'''

View File

@ -412,6 +412,14 @@ class TestServices(base.TestCase):
self.assertTrue(origin_rule_valid)
def get_provider_service_id(self):
controller = services.ServiceController(self.driver)
provider_service_id = controller.get(self.service_obj)
self.assertTrue(provider_service_id is not None)
self.assertTrue(isinstance(provider_service_id, str))
for domain_obj in self.service_obj.domains:
self.assertTrue(domain_obj.domain in provider_service_id)
def test_process_restriction_rules(self):
controller = services.ServiceController(self.driver)
rule_entry = rule.Rule('index',