Skip to content
This repository has been archived by the owner on Sep 26, 2019. It is now read-only.

Commit

Permalink
Merge "Update status during domain migration"
Browse files Browse the repository at this point in the history
  • Loading branch information
Jenkins authored and openstack-gerrit committed May 9, 2016
2 parents f67cb9f + 3641cd8 commit d83fb7f
Show file tree
Hide file tree
Showing 3 changed files with 190 additions and 20 deletions.
46 changes: 33 additions & 13 deletions poppy/manager/default/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -679,21 +679,42 @@ def migrate_domain(self, project_id, service_id, domain_name, new_cert,
except ValueError as e:
# If service is not found
LOG.warning('Migrating domain failed: Service {0} could not '
'be found.. Error message: {1}'.format(service_id, e))
'be found. Error message: {1}'.format(service_id, e))
raise errors.ServiceNotFound(e)

for provider in provider_details:
provider_details[provider].domains_certificate_status.\
set_domain_certificate_status(domain_name, cert_status)

# Currently there's only one flavor, and thus expect one result
# from the query below. Once additional flavors are added, a
# query for the service object rather than provider details only
# should provide the flavor id to use in the query below
cert_obj = storage_controller.get_certs_by_domain(
domain_name,
project_id=project_id,
cert_type='san'
)

if cert_obj != []:
# cert was found, update the cert status
cert_details = cert_obj.cert_details
cert_details[provider]['extra_info']['status'] = cert_status
cert_details[provider] = json.dumps(cert_details[provider])

storage_controller.update_cert_info(
cert_obj.domain_name,
cert_obj.cert_type,
cert_obj.flavor_id,
cert_details
)

for url in provider_details[provider].access_urls:
if url.get('domain') == domain_name:
if 'operator_url' in url:
access_url = url['operator_url']
dns_controller.modify_cname(access_url, new_cert)
url['provider_url'] = new_cert
storage_controller.update_provider_details(
project_id,
service_id,
provider_details
)
break
else:
links = {}
Expand All @@ -707,10 +728,9 @@ def migrate_domain(self, project_id, service_id, domain_name, new_cert,
'provider_url': new_cert
}
provider_details[provider].access_urls.append(new_url)
provider_details[provider].domains_certificate_status.\
set_domain_certificate_status(domain_name, cert_status)
storage_controller.update_provider_details(
project_id,
service_id,
provider_details
)

storage_controller.update_provider_details(
project_id,
service_id,
provider_details
)
2 changes: 1 addition & 1 deletion tests/api/utils/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ def __init__(self, username, api_key):
self.api_key)

def verify_domain_migration(self, access_url, suffix):
# Note: use rindex to find last occurence of the suffix
# Note: use rindex to find last occurrence of the suffix
shard_name = access_url[:access_url.rindex(suffix) - 1].split('.')[-1]
subdomain_name = '.'.join([shard_name, suffix])

Expand Down
162 changes: 156 additions & 6 deletions tests/unit/manager/default/test_services.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@
from oslo_context import context
import requests
import six
import testtools

from poppy.common import errors
from poppy.distributed_task.taskflow.task import common
from poppy.distributed_task.taskflow.task import create_service_tasks
from poppy.distributed_task.taskflow.task import delete_service_tasks
Expand All @@ -36,6 +38,7 @@
from poppy.manager.default import services
from poppy.model import flavor
from poppy.model.helpers import provider_details
from poppy.model import ssl_certificate
from poppy.transport.pecan.models.request import service
from tests.unit import base

Expand Down Expand Up @@ -110,6 +113,7 @@ def setUp(self, mock_metrics, mock_distributed_task, mock_storage,
# in the reverse order of the arguments present
super(DefaultManagerServiceTests, self).setUp()

self.context = context.RequestContext()
# create mocked config and driver
conf = cfg.ConfigOpts()

Expand Down Expand Up @@ -665,8 +669,6 @@ def test_update(self, update_json):
status=details.get('status', u'unknown'))
providers_details[name] = provider_detail_obj

providers = self.sc._driver.providers

self.sc.storage_controller.get_provider_details.return_value = (
providers_details
)
Expand All @@ -690,9 +692,6 @@ def test_update(self, update_json):
# ensure the manager calls the storage driver with the appropriate data
self.sc.storage_controller.update.assert_called_once()

# and that the providers are notified.
providers.map.assert_called_once()

@ddt.file_data('data_provider_details.json')
def test_delete(self, provider_details_json):
self.provider_details = {}
Expand Down Expand Up @@ -729,7 +728,7 @@ def test_delete(self, provider_details_json):
self.service_id)

@ddt.file_data('data_provider_details.json')
def test_detele_service_worker_success(self, provider_details_json):
def test_delete_service_worker_success(self, provider_details_json):
self.provider_details = {}
for provider_name in provider_details_json:
provider_detail_dict = json.loads(
Expand Down Expand Up @@ -1064,3 +1063,154 @@ def test_set_service_provider_details_missing_provider_details(self):
self.assertTrue(
self.mock_distributed_task.services_controller.submit_task.called
)

def test_migrate_domain_positive_existing_domain(self):
provider_detail_obj = provider_details.ProviderDetail(
provider_service_id='service_id',
access_urls=[
{
'domain': 'domain.com',
'operator_url': 'operator.domain.com'
}
],
status='deployed',
domains_certificate_status={
"domain.com": "deployed"
}
)
mock_provider_details = {
'Akamai': provider_detail_obj
}

ssl_cert_obj = ssl_certificate.SSLCertificate(
"flavor_id",
"domain.com",
"san",
project_id="project_id",
cert_details={
'Akamai': {
'extra_info': {
'status': 'deployed'
}
}
}
)
self.mock_storage.services_controller.\
get_provider_details.return_value = mock_provider_details

self.mock_storage.services_controller.\
get_certs_by_domain.return_value = ssl_cert_obj

self.sc.migrate_domain(
"project_id",
"service_id",
"domain.com",
"new_san_cert",
cert_status='create_in_progress'
)

self.mock_storage.services_controller.\
update_cert_info.assert_called_once_with(
"domain.com",
"san",
"flavor_id",
{
'Akamai': json.dumps({
'extra_info': {
'status': 'create_in_progress'
}
})
}
)

(
project_id_arg,
service_id_arg,
provider_details_arg
), _kwargs = self.mock_storage.services_controller.\
update_provider_details.call_args

self.assertEqual("project_id", project_id_arg)
self.assertEqual("service_id", service_id_arg)
self.assertEqual(
"create_in_progress",
provider_details_arg['Akamai'].domains_certificate_status.
get_domain_certificate_status(
"domain.com"
)
)

def test_migrate_domain_cert_not_found(self):
provider_detail_obj = provider_details.ProviderDetail(
provider_service_id='service_id',
access_urls=[
{
'domain': 'domain.com',
'operator_url': 'operator.domain.com'
}
],
status='deployed',
domains_certificate_status={
"domain.com": "deployed"
}
)
mock_provider_details = {
'Akamai': provider_detail_obj
}

self.mock_storage.services_controller.\
get_provider_details.return_value = mock_provider_details

self.mock_storage.services_controller.\
get_certs_by_domain.return_value = []

self.sc.migrate_domain(
"project_id",
"service_id",
"domain.com",
"new_san_cert",
cert_status='create_in_progress'
)

self.assertFalse(
self.mock_storage.services_controller.update_cert_info.called
)

(
project_id_arg,
service_id_arg,
provider_details_arg
), _kwargs = self.mock_storage.services_controller.\
update_provider_details.call_args

self.assertEqual("project_id", project_id_arg)
self.assertEqual("service_id", service_id_arg)
self.assertEqual(
"create_in_progress",
provider_details_arg['Akamai'].domains_certificate_status.
get_domain_certificate_status(
"domain.com"
)
)

def test_migrate_domain_service_not_found(self):
self.mock_storage.services_controller.\
get_provider_details.side_effect = ValueError

with testtools.ExpectedException(errors.ServiceNotFound):
self.sc.migrate_domain(
"project_id",
"service_id",
"new-domain.com",
"new_san_cert",
cert_status='create_in_progress'
)

self.assertFalse(
self.mock_storage.services_controller.update_cert_info.called
)

self.assertFalse(
self.mock_storage.services_controller.
update_provider_details.called
)

0 comments on commit d83fb7f

Please sign in to comment.