CDN-256 Asynchronously create service on providers side
Change-Id: Ic8063b857dd38537f404048d3693345782a1018e
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
# Copyright (c) 2014 Rackspace, Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
# implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from poppy.model.helpers import provider_details
|
||||
from poppy.openstack.common import log
|
||||
|
||||
LOG = log.getLogger(__name__)
|
||||
|
||||
|
||||
def service_create_worker(providers_list, service_controller,
|
||||
project_id, service_name, service_obj):
|
||||
responders = []
|
||||
# try to create all service from each provider
|
||||
for provider in providers_list:
|
||||
responder = service_controller.provider_wrapper.create(
|
||||
service_controller._driver.providers[provider],
|
||||
service_obj)
|
||||
responders.append(responder)
|
||||
|
||||
provider_details_dict = {}
|
||||
for responder in responders:
|
||||
for provider_name in responder:
|
||||
if 'error' not in responder[provider_name]:
|
||||
provider_details_dict[provider_name] = (
|
||||
provider_details.ProviderDetail(
|
||||
provider_service_id=responder[provider_name]['id'],
|
||||
access_urls=[link['href'] for link in
|
||||
responder[provider_name]['links']])
|
||||
)
|
||||
if 'status' in responder[provider_name]:
|
||||
provider_details_dict[provider_name].status = (
|
||||
responder[provider_name]['status'])
|
||||
else:
|
||||
provider_details_dict[provider_name].status = (
|
||||
'deployed')
|
||||
else:
|
||||
provider_details_dict[provider_name] = (
|
||||
provider_details.ProviderDetail(
|
||||
error_info=responder[provider_name]['error_detail']
|
||||
)
|
||||
)
|
||||
provider_details_dict[provider_name].status = 'failed'
|
||||
|
||||
service_controller.storage_controller.update_provider_details(
|
||||
project_id,
|
||||
service_name,
|
||||
provider_details_dict)
|
||||
@@ -16,8 +16,8 @@
|
||||
import multiprocessing
|
||||
|
||||
from poppy.manager import base
|
||||
from poppy.manager.default.service_async_workers import create_service_worker
|
||||
from poppy.manager.default.service_async_workers import delete_service_worker
|
||||
from poppy.model.helpers import provider_details
|
||||
|
||||
|
||||
class DefaultServicesController(base.ServicesController):
|
||||
@@ -52,42 +52,20 @@ class DefaultServicesController(base.ServicesController):
|
||||
except ValueError as e:
|
||||
raise e
|
||||
|
||||
responders = []
|
||||
for provider in providers:
|
||||
responder = self.provider_wrapper.create(
|
||||
self._driver.providers[provider],
|
||||
service_obj)
|
||||
responders.append(responder)
|
||||
|
||||
provider_details_dict = {}
|
||||
for responder in responders:
|
||||
for provider_name in responder:
|
||||
if 'error' not in responder[provider_name]:
|
||||
provider_details_dict[provider_name] = (
|
||||
provider_details.ProviderDetail(
|
||||
provider_service_id=responder[provider_name]['id'],
|
||||
access_urls=[link['href'] for link in
|
||||
responder[provider_name]['links']])
|
||||
)
|
||||
if 'status' in responder[provider_name]:
|
||||
provider_details_dict[provider_name].status = (
|
||||
responder[provider_name]['status'])
|
||||
else:
|
||||
provider_details_dict[provider_name].status = (
|
||||
'deployed')
|
||||
else:
|
||||
provider_details_dict[provider_name] = (
|
||||
provider_details.ProviderDetail(
|
||||
error_info=responder[provider_name]['error_detail']
|
||||
)
|
||||
)
|
||||
provider_details_dict[provider_name].status = 'failed'
|
||||
|
||||
self.storage_controller.update_provider_details(project_id,
|
||||
service_name,
|
||||
provider_details_dict)
|
||||
|
||||
return responders
|
||||
self.storage_controller._driver.close_connection()
|
||||
p = multiprocessing.Process(
|
||||
name='Process: create poppy service %s for'
|
||||
' project id: %s' %
|
||||
(service_name,
|
||||
project_id),
|
||||
target=create_service_worker.service_create_worker,
|
||||
args=(
|
||||
providers,
|
||||
self,
|
||||
project_id,
|
||||
service_name, service_obj))
|
||||
p.start()
|
||||
return
|
||||
|
||||
def update(self, project_id, service_name, service_obj):
|
||||
self.storage_controller.update(
|
||||
|
||||
@@ -73,4 +73,4 @@ class MockDBStorageDriver(base.Driver):
|
||||
return ""
|
||||
|
||||
def close_connection(self):
|
||||
return ""
|
||||
return None
|
||||
|
||||
@@ -20,6 +20,7 @@ import mock
|
||||
from oslo.config import cfg
|
||||
|
||||
from poppy.manager.default import driver
|
||||
from poppy.manager.default.service_async_workers import create_service_worker
|
||||
from poppy.manager.default.service_async_workers import delete_service_worker
|
||||
from poppy.manager.default import services
|
||||
from poppy.model import flavor
|
||||
@@ -163,6 +164,85 @@ class DefaultManagerServiceTests(base.TestCase):
|
||||
self.project_id,
|
||||
service_obj)
|
||||
|
||||
@ddt.file_data('data_provider_details.json')
|
||||
def test_create_service_worker(self, provider_details_json):
|
||||
service_obj = service.load_from_json(self.service_json)
|
||||
|
||||
self.provider_details = {}
|
||||
for provider_name in provider_details_json:
|
||||
provider_detail_dict = json.loads(
|
||||
provider_details_json[provider_name]
|
||||
)
|
||||
provider_service_id = provider_detail_dict.get('id', None)
|
||||
access_urls = provider_detail_dict.get('access_urls', None)
|
||||
status = provider_detail_dict.get('status', u'deployed')
|
||||
provider_detail_obj = provider_details.ProviderDetail(
|
||||
provider_service_id=provider_service_id,
|
||||
access_urls=access_urls,
|
||||
status=status)
|
||||
self.provider_details[provider_name] = provider_detail_obj
|
||||
|
||||
providers = self.sc._driver.providers
|
||||
|
||||
def get_provider_extension_by_name(name):
|
||||
if name == 'cloudfront':
|
||||
return_mock = {
|
||||
'CloudFront': {
|
||||
'id':
|
||||
'08d2e326-377e-11e4-b531-3c15c2b8d2d6',
|
||||
'links': [{'href': 'www.mysite.com',
|
||||
'rel': 'access_url'}],
|
||||
'status': 'deploy_in_progress'
|
||||
}
|
||||
}
|
||||
service_controller = mock.Mock(
|
||||
create=mock.Mock(return_value=return_mock)
|
||||
)
|
||||
return mock.Mock(obj=mock.Mock(
|
||||
provider_name='CloudFront',
|
||||
service_controller=service_controller)
|
||||
)
|
||||
elif name == 'fastly':
|
||||
return_mock = {
|
||||
'Fastly': {'error': "fail to create servcice",
|
||||
'error_detail': 'Fastly Create failed'
|
||||
' because of XYZ'}
|
||||
}
|
||||
service_controller = mock.Mock(
|
||||
create=mock.Mock(return_value=return_mock)
|
||||
)
|
||||
return mock.Mock(obj=mock.Mock(
|
||||
provider_name='MaxCDN',
|
||||
service_controller=service_controller)
|
||||
)
|
||||
else:
|
||||
return_mock = {
|
||||
name.title(): {
|
||||
'id':
|
||||
'08d2e326-377e-11e4-b531-3c15c2b8d2d6',
|
||||
'links': [
|
||||
{'href': 'www.mysite.com',
|
||||
'rel': 'access_url'}]
|
||||
}
|
||||
}
|
||||
service_controller = mock.Mock(
|
||||
create=mock.Mock(return_value=return_mock)
|
||||
)
|
||||
return mock.Mock(obj=mock.Mock(
|
||||
provider_name=name.title(),
|
||||
service_controller=service_controller)
|
||||
)
|
||||
|
||||
providers.__getitem__.side_effect = get_provider_extension_by_name
|
||||
providers_list = ['mock', 'cloudfront', 'fastly']
|
||||
# worker process returns None
|
||||
res = create_service_worker.service_create_worker(providers_list,
|
||||
self.sc,
|
||||
self.project_id,
|
||||
self.service_name,
|
||||
service_obj)
|
||||
self.assertTrue(res is None)
|
||||
|
||||
@ddt.file_data('data_provider_details.json')
|
||||
def test_update(self, provider_details_json):
|
||||
self.provider_details = {}
|
||||
|
||||
@@ -26,3 +26,8 @@ class MockProviderDriverTest(base.TestCase):
|
||||
|
||||
def test_mock_provider_driver_working(self):
|
||||
self.assertTrue(self.driver.is_alive())
|
||||
|
||||
def test_mock_provider_service_controller(self):
|
||||
self.assertTrue(
|
||||
self.driver.service_controller is not None
|
||||
)
|
||||
|
||||
@@ -39,7 +39,7 @@ class MockDBStorageDriverTests(base.TestCase):
|
||||
self.assertTrue(self.mockdb_driver.connection is None)
|
||||
|
||||
def test_close_connection(self):
|
||||
self.assertTrue(self.mockdb_driver.close_connection() == "")
|
||||
self.assertTrue(self.mockdb_driver.close_connection() is None)
|
||||
|
||||
def test_services_controller(self):
|
||||
self.assertTrue(self.mockdb_driver.services_controller.session is None)
|
||||
|
||||
Reference in New Issue
Block a user