Move dcmanager orchestration to a separate process

1) Remove DC manager orchestration from dcmanager-manager process
2) Create dcmanager-orchestrator process and associated files
3) Add new RPC calls for dcmanager-orchestrator process to notify
dcmanager
4) Create/update unit tests, to verify the implementation
changes

Story: 2007267
Task: 40734
Change-Id: Ibbbae77558a8a8fd95b636fa6c3aebb1dfefb514
Signed-off-by: Jessica Castelino <jessica.castelino@windriver.com>
This commit is contained in:
Jessica Castelino
2020-08-24 13:19:14 -04:00
parent 64caf6de7c
commit eb97f4c8b6
62 changed files with 784 additions and 228 deletions

View File

@@ -29,6 +29,7 @@ Source10: dcorch.conf
Source11: dcdbsync.conf Source11: dcdbsync.conf
Source12: clean-dcorch Source12: clean-dcorch
Source13: dcmanager-audit.service Source13: dcmanager-audit.service
Source14: dcmanager-orchestrator.service
BuildArch: noarch BuildArch: noarch
@@ -132,6 +133,7 @@ install -d -m 755 %{buildroot}%{_sysconfdir}/dcmanager/
install -p -D -m 644 %{SOURCE1} %{buildroot}%{_unitdir}/dcmanager-api.service install -p -D -m 644 %{SOURCE1} %{buildroot}%{_unitdir}/dcmanager-api.service
install -p -D -m 644 %{SOURCE2} %{buildroot}%{_unitdir}/dcmanager-manager.service install -p -D -m 644 %{SOURCE2} %{buildroot}%{_unitdir}/dcmanager-manager.service
install -p -D -m 644 %{SOURCE13} %{buildroot}%{_unitdir}/dcmanager-audit.service install -p -D -m 644 %{SOURCE13} %{buildroot}%{_unitdir}/dcmanager-audit.service
install -p -D -m 644 %{SOURCE14} %{buildroot}%{_unitdir}/dcmanager-orchestrator.service
install -p -D -m 644 %{SOURCE9} %{buildroot}%{_tmpfilesdir} install -p -D -m 644 %{SOURCE9} %{buildroot}%{_tmpfilesdir}
# install default config files # install default config files
cd %{_builddir}/%{pypi_name}-%{version} && oslo-config-generator --config-file ./dcmanager/config-generator.conf --output-file %{_builddir}/%{pypi_name}-%{version}%{_sysconfdir}/dcmanager/dcmanager.conf.sample cd %{_builddir}/%{pypi_name}-%{version} && oslo-config-generator --config-file ./dcmanager/config-generator.conf --output-file %{_builddir}/%{pypi_name}-%{version}%{_sysconfdir}/dcmanager/dcmanager.conf.sample
@@ -189,6 +191,8 @@ install -m 755 -D -p %{SOURCE12} %{buildroot}/%{_bindir}/clean-dcorch
%{_unitdir}/dcmanager-api.service %{_unitdir}/dcmanager-api.service
%{_bindir}/dcmanager-audit %{_bindir}/dcmanager-audit
%{_unitdir}/dcmanager-audit.service %{_unitdir}/dcmanager-audit.service
%{_bindir}/dcmanager-orchestrator
%{_unitdir}/dcmanager-orchestrator.service
%{_bindir}/dcmanager-manager %{_bindir}/dcmanager-manager
%{_unitdir}/dcmanager-manager.service %{_unitdir}/dcmanager-manager.service
%{_bindir}/dcmanager-manage %{_bindir}/dcmanager-manage

View File

@@ -0,0 +1,12 @@
[Unit]
Description=DC Manager Orchestrator Service
After=syslog-ng.service network-online.target dcmanager-manager.service
[Service]
Type=simple
User=root
ExecStart=/usr/bin/dcmanager-orchestrator --config-file /etc/dcmanager/dcmanager.conf
Restart=on-failure
[Install]
WantedBy=multi-user.target

View File

@@ -33,7 +33,7 @@ from dcmanager.common import consts
from dcmanager.common import exceptions from dcmanager.common import exceptions
from dcmanager.common.i18n import _ from dcmanager.common.i18n import _
from dcmanager.db import api as db_api from dcmanager.db import api as db_api
from dcmanager.rpc import client as rpc_client from dcmanager.orchestrator import rpcapi as orch_rpc_client
CONF = cfg.CONF CONF = cfg.CONF
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@@ -49,7 +49,7 @@ class SwUpdateStrategyController(object):
def __init__(self): def __init__(self):
super(SwUpdateStrategyController, self).__init__() super(SwUpdateStrategyController, self).__init__()
self.rpc_client = rpc_client.ManagerClient() self.orch_rpc_client = orch_rpc_client.ManagerOrchestratorClient()
@expose(generic=True, template='json') @expose(generic=True, template='json')
def index(self): def index(self):
@@ -172,7 +172,7 @@ class SwUpdateStrategyController(object):
try: try:
# Ask dcmanager-manager to create the strategy. # Ask dcmanager-manager to create the strategy.
# It will do all the real work... # It will do all the real work...
return self.rpc_client.create_sw_update_strategy(context, return self.orch_rpc_client.create_sw_update_strategy(context,
payload) payload)
except RemoteError as e: except RemoteError as e:
pecan.abort(422, e.value) pecan.abort(422, e.value)
@@ -191,7 +191,7 @@ class SwUpdateStrategyController(object):
try: try:
# Ask dcmanager-manager to apply the strategy. # Ask dcmanager-manager to apply the strategy.
# It will do all the real work... # It will do all the real work...
return self.rpc_client.apply_sw_update_strategy( return self.orch_rpc_client.apply_sw_update_strategy(
context, context,
update_type=update_type_filter) update_type=update_type_filter)
except RemoteError as e: except RemoteError as e:
@@ -203,7 +203,7 @@ class SwUpdateStrategyController(object):
try: try:
# Ask dcmanager-manager to abort the strategy. # Ask dcmanager-manager to abort the strategy.
# It will do all the real work... # It will do all the real work...
return self.rpc_client.abort_sw_update_strategy( return self.orch_rpc_client.abort_sw_update_strategy(
context, context,
update_type=update_type_filter) update_type=update_type_filter)
except RemoteError as e: except RemoteError as e:
@@ -223,7 +223,7 @@ class SwUpdateStrategyController(object):
try: try:
# Ask dcmanager-manager to delete the strategy. # Ask dcmanager-manager to delete the strategy.
# It will do all the real work... # It will do all the real work...
return self.rpc_client.delete_sw_update_strategy( return self.orch_rpc_client.delete_sw_update_strategy(
context, context,
update_type=update_type_filter) update_type=update_type_filter)
except RemoteError as e: except RemoteError as e:

View File

@@ -12,6 +12,14 @@ manager.py:
start Manager service start Manager service
python manager.py --config-file=/etc/dcmanager.conf python manager.py --config-file=/etc/dcmanager.conf
audit.py:
start Audit service
python audit.py --config-file=/etc/dcmanager.conf
orchestrator.py:
start Orchestrator service
python orchestrator.py --config-file=/etc/dcmanager.conf
manage.py: manage.py:
CLI interface for dcmanager database management CLI interface for dcmanager database management
dcmanager-manage --config-file /etc/dcmanager.conf db_sync dcmanager-manage --config-file /etc/dcmanager.conf db_sync

View File

@@ -0,0 +1,62 @@
# 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.
#
# Copyright (c) 2020 Wind River Systems, Inc.
#
# The right to copy, distribute, modify, or otherwise make use
# of this software may be licensed only pursuant to the terms
# of an applicable Wind River license agreement.
#
"""
DC Manager Orchestrator Service.
"""
import eventlet
eventlet.monkey_patch()
from oslo_config import cfg
from oslo_i18n import _lazy
from oslo_log import log as logging
from oslo_service import service
from dcmanager.common import config
from dcmanager.common import messaging
CONF = cfg.CONF
LOG = logging.getLogger('dcmanager.orchestrator')
def main():
_lazy.enable_lazy()
config.register_options()
config.register_keystone_options()
logging.register_options(CONF)
CONF(project='dcmanager', prog='dcmanager-orchestrator')
logging.setup(CONF, 'dcmanager-orchestrator')
logging.set_defaults()
messaging.setup()
from dcmanager.orchestrator import service as orchestrator
srv = orchestrator.DCManagerOrchestratorService()
launcher = service.launch(CONF,
srv, workers=cfg.CONF.orch_workers)
LOG.info("Configuration:")
CONF.log_opt_values(LOG, logging.INFO)
launcher.wait()
if __name__ == '__main__':
main()

View File

@@ -145,6 +145,8 @@ scheduler_opts = [
common_opts = [ common_opts = [
cfg.IntOpt('workers', default=1, cfg.IntOpt('workers', default=1,
help='number of workers'), help='number of workers'),
cfg.IntOpt('orch_workers', default=1,
help='number of orchestrator workers'),
cfg.IntOpt('audit_workers', default=1, cfg.IntOpt('audit_workers', default=1,
help='number of audit workers'), help='number of audit workers'),
cfg.StrOpt('host', cfg.StrOpt('host',

View File

@@ -25,7 +25,10 @@ TOPIC_DC_MANAGER = "dcmanager"
TOPIC_DC_MANAGER_AUDIT = "dcmanager-audit" TOPIC_DC_MANAGER_AUDIT = "dcmanager-audit"
TOPIC_DC_MANAGER_ORCHESTRATOR = "dcmanager-orchestrator"
LOADS_VAULT_DIR = "/opt/dc-vault/loads" LOADS_VAULT_DIR = "/opt/dc-vault/loads"
PATCH_VAULT_DIR = "/opt/dc-vault/patches" PATCH_VAULT_DIR = "/opt/dc-vault/patches"
# Well known region names # Well known region names

View File

@@ -36,7 +36,6 @@ from dcmanager.common.i18n import _
from dcmanager.common import messaging as rpc_messaging from dcmanager.common import messaging as rpc_messaging
from dcmanager.common import scheduler from dcmanager.common import scheduler
from dcmanager.manager.subcloud_manager import SubcloudManager from dcmanager.manager.subcloud_manager import SubcloudManager
from dcmanager.manager.sw_update_manager import SwUpdateManager
CONF = cfg.CONF CONF = cfg.CONF
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@@ -78,7 +77,6 @@ class DCManagerService(service.Service):
self.target = None self.target = None
self._rpc_server = None self._rpc_server = None
self.subcloud_manager = None self.subcloud_manager = None
self.sw_update_manager = None
self.audit_rpc_client = None self.audit_rpc_client = None
def init_tgm(self): def init_tgm(self):
@@ -86,10 +84,6 @@ class DCManagerService(service.Service):
def init_managers(self): def init_managers(self):
self.subcloud_manager = SubcloudManager() self.subcloud_manager = SubcloudManager()
self.sw_update_manager = SwUpdateManager()
def stop_managers(self):
self.sw_update_manager.stop()
def start(self): def start(self):
self.dcmanager_id = uuidutils.generate_uuid() self.dcmanager_id = uuidutils.generate_uuid()
@@ -205,38 +199,6 @@ class DCManagerService(service.Service):
self.subcloud_manager.update_subcloud_sync_endpoint_type( self.subcloud_manager.update_subcloud_sync_endpoint_type(
context, subcloud_name, endpoint_type_list, openstack_installed) context, subcloud_name, endpoint_type_list, openstack_installed)
@request_context
def create_sw_update_strategy(self, context, payload):
# Creates a software update strategy
LOG.info("Handling create_sw_update_strategy request of type %s" %
payload.get('type'))
return self.sw_update_manager.create_sw_update_strategy(
context, payload)
@request_context
def delete_sw_update_strategy(self, context, update_type=None):
# Deletes the software update strategy
LOG.info("Handling delete_sw_update_strategy request")
return self.sw_update_manager.delete_sw_update_strategy(
context,
update_type=update_type)
@request_context
def apply_sw_update_strategy(self, context, update_type=None):
# Applies the software update strategy
LOG.info("Handling apply_sw_update_strategy request")
return self.sw_update_manager.apply_sw_update_strategy(
context,
update_type=update_type)
@request_context
def abort_sw_update_strategy(self, context, update_type=None):
# Aborts the software update strategy
LOG.info("Handling abort_sw_update_strategy request")
return self.sw_update_manager.abort_sw_update_strategy(
context,
update_type=update_type)
def _stop_rpc_server(self): def _stop_rpc_server(self):
# Stop RPC connection to prevent new requests # Stop RPC connection to prevent new requests
LOG.debug(_("Attempting to stop engine service...")) LOG.debug(_("Attempting to stop engine service..."))
@@ -252,7 +214,6 @@ class DCManagerService(service.Service):
self._stop_rpc_server() self._stop_rpc_server()
self.TG.stop() self.TG.stop()
self.stop_managers()
# Terminate the engine process # Terminate the engine process
LOG.info("All threads were gone, terminating engine") LOG.info("All threads were gone, terminating engine")

View File

@@ -30,13 +30,13 @@ from dcmanager.common import context
from dcmanager.common import exceptions from dcmanager.common import exceptions
from dcmanager.common import scheduler from dcmanager.common import scheduler
from dcmanager.db import api as db_api from dcmanager.db import api as db_api
from dcmanager.manager.states.firmware.applying_vim_strategy \ from dcmanager.orchestrator.states.firmware.applying_vim_strategy \
import ApplyingVIMStrategyState import ApplyingVIMStrategyState
from dcmanager.manager.states.firmware.creating_vim_strategy \ from dcmanager.orchestrator.states.firmware.creating_vim_strategy \
import CreatingVIMStrategyState import CreatingVIMStrategyState
from dcmanager.manager.states.firmware.finishing_fw_update \ from dcmanager.orchestrator.states.firmware.finishing_fw_update \
import FinishingFwUpdateState import FinishingFwUpdateState
from dcmanager.manager.states.firmware.importing_firmware \ from dcmanager.orchestrator.states.firmware.importing_firmware \
import ImportingFirmwareState import ImportingFirmwareState
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)

View File

@@ -0,0 +1,76 @@
# 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.
#
# Copyright (c) 2020 Wind River Systems, Inc.
#
# The right to copy, distribute, modify, or otherwise make use
# of this software may be licensed only pursuant to the terms
# of an applicable Wind River license agreement.
#
"""
Client side of the DC Manager Orchestrator RPC API.
"""
from dcmanager.common import consts
from dcmanager.common import messaging
class ManagerOrchestratorClient(object):
"""Client side of the DC Manager Orchestrator RPC API.
Version History:
1.0 - Initial version
"""
BASE_RPC_API_VERSION = '1.0'
def __init__(self):
self._client = messaging.get_rpc_client(
topic=consts.TOPIC_DC_MANAGER_ORCHESTRATOR,
version=self.BASE_RPC_API_VERSION)
@staticmethod
def make_msg(method, **kwargs):
return method, kwargs
def call(self, ctxt, msg, version=None):
method, kwargs = msg
if version is not None:
client = self._client.prepare(version=version)
else:
client = self._client
return client.call(ctxt, method, **kwargs)
def cast(self, ctxt, msg, version=None):
method, kwargs = msg
if version is not None:
client = self._client.prepare(version=version)
else:
client = self._client
return client.cast(ctxt, method, **kwargs)
def create_sw_update_strategy(self, ctxt, payload):
return self.call(ctxt, self.make_msg('create_sw_update_strategy',
payload=payload))
def delete_sw_update_strategy(self, ctxt, update_type=None):
return self.call(ctxt, self.make_msg('delete_sw_update_strategy',
update_type=update_type))
def apply_sw_update_strategy(self, ctxt, update_type=None):
return self.call(ctxt, self.make_msg('apply_sw_update_strategy',
update_type=update_type))
def abort_sw_update_strategy(self, ctxt, update_type=None):
return self.call(ctxt, self.make_msg('abort_sw_update_strategy',
update_type=update_type))

View File

@@ -0,0 +1,135 @@
# 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.
#
# Copyright (c) 2020 Wind River Systems, Inc.
#
# The right to copy, distribute, modify, or otherwise make use
# of this software may be licensed only pursuant to the terms
# of an applicable Wind River license agreement.
#
import six
import functools
from oslo_config import cfg
from oslo_log import log as logging
import oslo_messaging
from oslo_service import service
from dcmanager.common import consts
from dcmanager.common import context
from dcmanager.common import exceptions
from dcmanager.common import messaging as rpc_messaging
from dcmanager.common import scheduler
from dcmanager.orchestrator.sw_update_manager import SwUpdateManager
CONF = cfg.CONF
LOG = logging.getLogger(__name__)
def request_context(func):
@functools.wraps(func)
def wrapped(self, ctx, *args, **kwargs):
if ctx is not None and not isinstance(ctx, context.RequestContext):
ctx = context.RequestContext.from_dict(ctx.to_dict())
try:
return func(self, ctx, *args, **kwargs)
except exceptions.DCManagerException:
raise oslo_messaging.rpc.dispatcher.ExpectedException()
return wrapped
class DCManagerOrchestratorService(service.Service):
"""Lifecycle manager for a running orchestrator service."""
def __init__(self):
super(DCManagerOrchestratorService, self).__init__()
self.host = cfg.CONF.host
self.rpc_api_version = consts.RPC_API_VERSION
self.topic = consts.TOPIC_DC_MANAGER_ORCHESTRATOR
# The following are initialized here, but assigned in start() which
# happens after the fork when spawning multiple worker processes
self.TG = None
self.target = None
self._rpc_server = None
self.sw_update_manager = None
def start(self):
self.init_tgm()
self.init_manager()
target = oslo_messaging.Target(version=self.rpc_api_version,
server=self.host,
topic=self.topic)
self.target = target
self._rpc_server = rpc_messaging.get_rpc_server(self.target, self)
self._rpc_server.start()
super(DCManagerOrchestratorService, self).start()
def init_tgm(self):
self.TG = scheduler.ThreadGroupManager()
def init_manager(self):
self.sw_update_manager = SwUpdateManager()
def _stop_rpc_server(self):
# Stop RPC connection to prevent new requests
LOG.debug("Attempting to stop engine service...")
try:
self._rpc_server.stop()
self._rpc_server.wait()
LOG.info('Engine service stopped successfully')
except Exception as ex:
LOG.error('Failed to stop engine service: %s',
six.text_type(ex))
def stop(self):
self._stop_rpc_server()
self.TG.stop()
self.sw_update_manager.stop()
# Terminate the engine process
LOG.info("All threads were gone, terminating engine")
super(DCManagerOrchestratorService, self).stop()
@request_context
def create_sw_update_strategy(self, context, payload):
# Creates a software update strategy
LOG.info("Handling create_sw_update_strategy request of type %s" %
payload.get('type'))
return self.sw_update_manager.create_sw_update_strategy(
context, payload)
@request_context
def delete_sw_update_strategy(self, context, update_type=None):
# Deletes the software update strategy
LOG.info("Handling delete_sw_update_strategy request")
return self.sw_update_manager.delete_sw_update_strategy(
context,
update_type=update_type)
@request_context
def apply_sw_update_strategy(self, context, update_type=None):
# Applies the software update strategy
LOG.info("Handling apply_sw_update_strategy request")
return self.sw_update_manager.apply_sw_update_strategy(
context,
update_type=update_type)
@request_context
def abort_sw_update_strategy(self, context, update_type=None):
# Aborts the software update strategy
LOG.info("Handling abort_sw_update_strategy request")
return self.sw_update_manager.abort_sw_update_strategy(
context,
update_type=update_type)

View File

@@ -9,7 +9,7 @@ from dccommon.drivers.openstack import vim
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common.exceptions import StrategyStoppedException from dcmanager.common.exceptions import StrategyStoppedException
from dcmanager.db import api as db_api from dcmanager.db import api as db_api
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
# Applying the vim update strategy may result in a loss of communication # Applying the vim update strategy may result in a loss of communication

View File

@@ -9,7 +9,7 @@ from dccommon.drivers.openstack import vim
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common.exceptions import StrategyStoppedException from dcmanager.common.exceptions import StrategyStoppedException
from dcmanager.common import utils as dcmanager_utils from dcmanager.common import utils as dcmanager_utils
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
# Max time: 30 minutes = 180 queries x 10 seconds between # Max time: 30 minutes = 180 queries x 10 seconds between
DEFAULT_MAX_QUERIES = 180 DEFAULT_MAX_QUERIES = 180

View File

@@ -5,8 +5,8 @@
# #
from dccommon.drivers.openstack import vim from dccommon.drivers.openstack import vim
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
from dcmanager.manager.states.firmware import utils from dcmanager.orchestrator.states.firmware import utils
from dcmanager.rpc import client as dcmanager_rpc_client from dcmanager.rpc import client as dcmanager_rpc_client
from dcorch.common import consts as dcorch_consts from dcorch.common import consts as dcorch_consts

View File

@@ -6,8 +6,8 @@
import os import os
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
from dcmanager.manager.states.firmware import utils from dcmanager.orchestrator.states.firmware import utils
class ImportingFirmwareState(BaseState): class ImportingFirmwareState(BaseState):

View File

@@ -7,7 +7,7 @@ import time
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common.exceptions import StrategyStoppedException from dcmanager.common.exceptions import StrategyStoppedException
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
# Max time: 10 minutes = 60 queries x 10 seconds # Max time: 10 minutes = 60 queries x 10 seconds
DEFAULT_MAX_QUERIES = 60 DEFAULT_MAX_QUERIES = 60

View File

@@ -7,7 +7,7 @@ import time
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common.exceptions import StrategyStoppedException from dcmanager.common.exceptions import StrategyStoppedException
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
# When an unlock occurs, a reboot is triggered. During reboot, API calls fail. # When an unlock occurs, a reboot is triggered. During reboot, API calls fail.

View File

@@ -7,7 +7,7 @@ import time
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common.exceptions import StrategyStoppedException from dcmanager.common.exceptions import StrategyStoppedException
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
ACTIVATING_COMPLETED_STATES = ['activation-complete', ACTIVATING_COMPLETED_STATES = ['activation-complete',

View File

@@ -8,7 +8,7 @@ import time
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common.exceptions import StrategyStoppedException from dcmanager.common.exceptions import StrategyStoppedException
from dcmanager.db import api as db_api from dcmanager.db import api as db_api
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
# Max time: 10 minutes = 60 queries x 10 seconds between each query # Max time: 10 minutes = 60 queries x 10 seconds between each query

View File

@@ -7,7 +7,7 @@ import time
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common.exceptions import StrategyStoppedException from dcmanager.common.exceptions import StrategyStoppedException
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
# Max time: 10 minutes = 60 queries x 10 seconds between each query # Max time: 10 minutes = 60 queries x 10 seconds between each query

View File

@@ -8,7 +8,7 @@ import time
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common.exceptions import StrategyStoppedException from dcmanager.common.exceptions import StrategyStoppedException
from dcmanager.common import utils from dcmanager.common import utils
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
# Max time: 30 minutes = 180 queries x 10 seconds between # Max time: 30 minutes = 180 queries x 10 seconds between
DEFAULT_MAX_QUERIES = 180 DEFAULT_MAX_QUERIES = 180

View File

@@ -5,7 +5,7 @@
# #
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common import exceptions from dcmanager.common import exceptions
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
# When a license is not installed, this will be part of the API error string # When a license is not installed, this will be part of the API error string
LICENSE_FILE_NOT_FOUND_SUBSTRING = "License file not found" LICENSE_FILE_NOT_FOUND_SUBSTRING = "License file not found"

View File

@@ -11,7 +11,7 @@ import time
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common.exceptions import StrategyStoppedException from dcmanager.common.exceptions import StrategyStoppedException
from dcmanager.db import api as db_api from dcmanager.db import api as db_api
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
ANSIBLE_UPGRADE_PLAYBOOK = \ ANSIBLE_UPGRADE_PLAYBOOK = \

View File

@@ -11,7 +11,7 @@ from dcmanager.common import consts
from dcmanager.common.exceptions import ManualRecoveryRequiredException from dcmanager.common.exceptions import ManualRecoveryRequiredException
from dcmanager.common.exceptions import PreCheckFailedException from dcmanager.common.exceptions import PreCheckFailedException
from dcmanager.db import api as db_api from dcmanager.db import api as db_api
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
# These deploy states should transition to the 'upgrading' state # These deploy states should transition to the 'upgrading' state
VALID_UPGRADE_STATES = [consts.DEPLOY_STATE_PRE_INSTALL_FAILED, VALID_UPGRADE_STATES = [consts.DEPLOY_STATE_PRE_INSTALL_FAILED,

View File

@@ -9,7 +9,7 @@ from dccommon.drivers.openstack.vim import ALARM_RESTRICTIONS_RELAXED
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common.exceptions import StrategyStoppedException from dcmanager.common.exceptions import StrategyStoppedException
from dcmanager.common import utils from dcmanager.common import utils
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
DEFAULT_FORCE_FLAG = False DEFAULT_FORCE_FLAG = False
# Max time 30 minutes = 180 attempts, with 10 seconds between # Max time 30 minutes = 180 attempts, with 10 seconds between

View File

@@ -13,7 +13,7 @@ from dccommon.subcloud_install import SubcloudInstall
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common import utils from dcmanager.common import utils
from dcmanager.db import api as db_api from dcmanager.db import api as db_api
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
from tsconfig.tsconfig import SW_VERSION from tsconfig.tsconfig import SW_VERSION

View File

@@ -28,9 +28,9 @@ from dcmanager.common import consts
from dcmanager.common import exceptions from dcmanager.common import exceptions
from dcmanager.common import manager from dcmanager.common import manager
from dcmanager.db import api as db_api from dcmanager.db import api as db_api
from dcmanager.manager.fw_update_orch_thread import FwUpdateOrchThread from dcmanager.orchestrator.fw_update_orch_thread import FwUpdateOrchThread
from dcmanager.manager.patch_orch_thread import PatchOrchThread from dcmanager.orchestrator.patch_orch_thread import PatchOrchThread
from dcmanager.manager.sw_upgrade_orch_thread import SwUpgradeOrchThread from dcmanager.orchestrator.sw_upgrade_orch_thread import SwUpgradeOrchThread
from dcorch.common import consts as dcorch_consts from dcorch.common import consts as dcorch_consts
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)

View File

@@ -30,20 +30,20 @@ from dcmanager.common import context
from dcmanager.common import exceptions from dcmanager.common import exceptions
from dcmanager.common import scheduler from dcmanager.common import scheduler
from dcmanager.db import api as db_api from dcmanager.db import api as db_api
from dcmanager.manager.states.lock_host import LockHostState from dcmanager.orchestrator.states.lock_host import LockHostState
from dcmanager.manager.states.unlock_host import UnlockHostState from dcmanager.orchestrator.states.unlock_host import UnlockHostState
from dcmanager.manager.states.upgrade.activating import ActivatingUpgradeState from dcmanager.orchestrator.states.upgrade.activating import ActivatingUpgradeState
from dcmanager.manager.states.upgrade.completing import CompletingUpgradeState from dcmanager.orchestrator.states.upgrade.completing import CompletingUpgradeState
from dcmanager.manager.states.upgrade.deleting_load import DeletingLoadState from dcmanager.orchestrator.states.upgrade.deleting_load import DeletingLoadState
from dcmanager.manager.states.upgrade.importing_load import ImportingLoadState from dcmanager.orchestrator.states.upgrade.importing_load import ImportingLoadState
from dcmanager.manager.states.upgrade.installing_license \ from dcmanager.orchestrator.states.upgrade.installing_license \
import InstallingLicenseState import InstallingLicenseState
from dcmanager.manager.states.upgrade.migrating_data \ from dcmanager.orchestrator.states.upgrade.migrating_data \
import MigratingDataState import MigratingDataState
from dcmanager.manager.states.upgrade.pre_check import PreCheckState from dcmanager.orchestrator.states.upgrade.pre_check import PreCheckState
from dcmanager.manager.states.upgrade.starting_upgrade \ from dcmanager.orchestrator.states.upgrade.starting_upgrade \
import StartingUpgradeState import StartingUpgradeState
from dcmanager.manager.states.upgrade.upgrading_simplex \ from dcmanager.orchestrator.states.upgrade.upgrading_simplex \
import UpgradingSimplexState import UpgradingSimplexState
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)

View File

@@ -134,22 +134,6 @@ class ManagerClient(RPCClient):
endpoint_type_list=endpoint_type_list, endpoint_type_list=endpoint_type_list,
openstack_installed=openstack_installed)) openstack_installed=openstack_installed))
def create_sw_update_strategy(self, ctxt, payload):
return self.call(ctxt, self.make_msg('create_sw_update_strategy',
payload=payload))
def delete_sw_update_strategy(self, ctxt, update_type=None):
return self.call(ctxt, self.make_msg('delete_sw_update_strategy',
update_type=update_type))
def apply_sw_update_strategy(self, ctxt, update_type=None):
return self.call(ctxt, self.make_msg('apply_sw_update_strategy',
update_type=update_type))
def abort_sw_update_strategy(self, ctxt, update_type=None):
return self.call(ctxt, self.make_msg('abort_sw_update_strategy',
update_type=update_type))
class DCManagerNotifications(RPCClient): class DCManagerNotifications(RPCClient):
"""DC Manager Notification interface to broadcast subcloud state changed """DC Manager Notification interface to broadcast subcloud state changed

View File

@@ -27,7 +27,7 @@ import webtest
from dcmanager.api.controllers.v1 import sw_update_strategy from dcmanager.api.controllers.v1 import sw_update_strategy
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.rpc import client as rpc_client from dcmanager.orchestrator import rpcapi as rpc_client
from dcmanager.tests.unit.api import test_root_controller as testroot from dcmanager.tests.unit.api import test_root_controller as testroot
from dcmanager.tests import utils from dcmanager.tests import utils
@@ -57,7 +57,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
super(TestSwUpdateStrategy, self).setUp() super(TestSwUpdateStrategy, self).setUp()
self.ctx = utils.dummy_context() self.ctx = utils.dummy_context()
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_post_sw_update(self, mock_db_api, mock_rpc_client): def test_post_sw_update(self, mock_db_api, mock_rpc_client):
data = FAKE_SW_UPDATE_DATA data = FAKE_SW_UPDATE_DATA
@@ -70,7 +70,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
data) data)
self.assertEqual(response.status_int, 200) self.assertEqual(response.status_int, 200)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_post_sw_update_with_force_option(self, mock_db_api, mock_rpc_client): def test_post_sw_update_with_force_option(self, mock_db_api, mock_rpc_client):
data = copy.copy(FAKE_SW_UPDATE_DATA) data = copy.copy(FAKE_SW_UPDATE_DATA)
@@ -85,7 +85,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
data) data)
self.assertEqual(response.status_int, 200) self.assertEqual(response.status_int, 200)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_post_sw_update_bad_type(self, mock_db_api, mock_rpc_client): def test_post_sw_update_bad_type(self, mock_db_api, mock_rpc_client):
data = copy.copy(FAKE_SW_UPDATE_DATA) data = copy.copy(FAKE_SW_UPDATE_DATA)
@@ -94,7 +94,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
self.app.post_json, FAKE_URL, self.app.post_json, FAKE_URL,
headers=FAKE_HEADERS, params=data) headers=FAKE_HEADERS, params=data)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_post_sw_update_bad_apply_type(self, mock_db_api, mock_rpc_client): def test_post_sw_update_bad_apply_type(self, mock_db_api, mock_rpc_client):
data = copy.copy(FAKE_SW_UPDATE_DATA) data = copy.copy(FAKE_SW_UPDATE_DATA)
@@ -103,7 +103,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
self.app.post_json, FAKE_URL, self.app.post_json, FAKE_URL,
headers=FAKE_HEADERS, params=data) headers=FAKE_HEADERS, params=data)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_post_sw_update_bad_max_parallel( def test_post_sw_update_bad_max_parallel(
self, mock_db_api, mock_rpc_client): self, mock_db_api, mock_rpc_client):
@@ -113,7 +113,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
self.app.post_json, FAKE_URL, self.app.post_json, FAKE_URL,
headers=FAKE_HEADERS, params=data) headers=FAKE_HEADERS, params=data)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_post_sw_update_invalid_stop_on_failure_type( def test_post_sw_update_invalid_stop_on_failure_type(
self, mock_db_api, mock_rpc_client): self, mock_db_api, mock_rpc_client):
@@ -123,7 +123,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
self.app.post_json, FAKE_URL, self.app.post_json, FAKE_URL,
headers=FAKE_HEADERS, params=data) headers=FAKE_HEADERS, params=data)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_post_sw_update_invalid_force_type( def test_post_sw_update_invalid_force_type(
self, mock_db_api, mock_rpc_client): self, mock_db_api, mock_rpc_client):
@@ -133,7 +133,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
self.app.post_json, FAKE_URL, self.app.post_json, FAKE_URL,
headers=FAKE_HEADERS, params=data) headers=FAKE_HEADERS, params=data)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_post_sw_update_valid_force_type_missing_cloud_name( def test_post_sw_update_valid_force_type_missing_cloud_name(
self, mock_db_api, mock_rpc_client): self, mock_db_api, mock_rpc_client):
@@ -143,14 +143,14 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
self.app.post_json, FAKE_URL, self.app.post_json, FAKE_URL,
headers=FAKE_HEADERS, params=data) headers=FAKE_HEADERS, params=data)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
def test_post_no_body(self, mock_rpc_client): def test_post_no_body(self, mock_rpc_client):
data = {} data = {}
six.assertRaisesRegex(self, webtest.app.AppError, "400 *", six.assertRaisesRegex(self, webtest.app.AppError, "400 *",
self.app.post_json, FAKE_URL, self.app.post_json, FAKE_URL,
headers=FAKE_HEADERS, params=data) headers=FAKE_HEADERS, params=data)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
def test_post_no_type(self, mock_rpc_client): def test_post_no_type(self, mock_rpc_client):
data = copy.copy(FAKE_SW_UPDATE_DATA) data = copy.copy(FAKE_SW_UPDATE_DATA)
del data['type'] del data['type']
@@ -158,7 +158,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
self.app.post_json, FAKE_URL, self.app.post_json, FAKE_URL,
headers=FAKE_HEADERS, params=data) headers=FAKE_HEADERS, params=data)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_post_sw_update_apply(self, mock_db_api, mock_rpc_client): def test_post_sw_update_apply(self, mock_db_api, mock_rpc_client):
data = FAKE_SW_UPDATE_APPLY_DATA data = FAKE_SW_UPDATE_APPLY_DATA
@@ -169,7 +169,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
mock_rpc_client().apply_sw_update_strategy.assert_called_once() mock_rpc_client().apply_sw_update_strategy.assert_called_once()
self.assertEqual(response.status_int, 200) self.assertEqual(response.status_int, 200)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_scoped_post_sw_update_apply(self, mock_db_api, mock_rpc_client): def test_scoped_post_sw_update_apply(self, mock_db_api, mock_rpc_client):
data = FAKE_SW_UPDATE_APPLY_DATA data = FAKE_SW_UPDATE_APPLY_DATA
@@ -181,7 +181,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
mock_rpc_client().apply_sw_update_strategy.assert_called_once() mock_rpc_client().apply_sw_update_strategy.assert_called_once()
self.assertEqual(response.status_int, 200) self.assertEqual(response.status_int, 200)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_post_sw_update_abort(self, mock_db_api, mock_rpc_client): def test_post_sw_update_abort(self, mock_db_api, mock_rpc_client):
mock_rpc_client().abort_sw_update_strategy.return_value = True mock_rpc_client().abort_sw_update_strategy.return_value = True
@@ -192,7 +192,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
mock_rpc_client().abort_sw_update_strategy.assert_called_once() mock_rpc_client().abort_sw_update_strategy.assert_called_once()
self.assertEqual(response.status_int, 200) self.assertEqual(response.status_int, 200)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_scoped_post_sw_update_abort(self, mock_db_api, mock_rpc_client): def test_scoped_post_sw_update_abort(self, mock_db_api, mock_rpc_client):
mock_rpc_client().abort_sw_update_strategy.return_value = True mock_rpc_client().abort_sw_update_strategy.return_value = True
@@ -204,7 +204,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
mock_rpc_client().abort_sw_update_strategy.assert_called_once() mock_rpc_client().abort_sw_update_strategy.assert_called_once()
self.assertEqual(response.status_int, 200) self.assertEqual(response.status_int, 200)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_post_sw_update_bad_action(self, mock_db_api, mock_rpc_client): def test_post_sw_update_bad_action(self, mock_db_api, mock_rpc_client):
data = copy.copy(FAKE_SW_UPDATE_APPLY_DATA) data = copy.copy(FAKE_SW_UPDATE_APPLY_DATA)
@@ -213,7 +213,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
self.app.post_json, FAKE_URL, self.app.post_json, FAKE_URL,
headers=FAKE_HEADERS, params=data) headers=FAKE_HEADERS, params=data)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_delete_sw_update_strategy(self, mock_db_api, mock_rpc_client): def test_delete_sw_update_strategy(self, mock_db_api, mock_rpc_client):
delete_url = FAKE_URL delete_url = FAKE_URL
@@ -223,7 +223,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
mock.ANY, update_type=None) mock.ANY, update_type=None)
self.assertEqual(response.status_int, 200) self.assertEqual(response.status_int, 200)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_scoped_delete_sw_update_strategy(self, def test_scoped_delete_sw_update_strategy(self,
mock_db_api, mock_db_api,
@@ -235,7 +235,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
mock.ANY, update_type=consts.SW_UPDATE_TYPE_PATCH) mock.ANY, update_type=consts.SW_UPDATE_TYPE_PATCH)
self.assertEqual(response.status_int, 200) self.assertEqual(response.status_int, 200)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_get_sw_update_strategy(self, mock_db_api, mock_rpc_client): def test_get_sw_update_strategy(self, mock_db_api, mock_rpc_client):
get_url = FAKE_URL get_url = FAKE_URL
@@ -243,7 +243,7 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
self.app.get(get_url, headers=FAKE_HEADERS) self.app.get(get_url, headers=FAKE_HEADERS)
self.assertEqual(1, mock_db_api.sw_update_strategy_get.call_count) self.assertEqual(1, mock_db_api.sw_update_strategy_get.call_count)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_scoped_get_sw_update_strategy(self, mock_db_api, mock_rpc_client): def test_scoped_get_sw_update_strategy(self, mock_db_api, mock_rpc_client):
get_url = FAKE_URL + '?type=' + consts.SW_UPDATE_TYPE_PATCH get_url = FAKE_URL + '?type=' + consts.SW_UPDATE_TYPE_PATCH
@@ -251,14 +251,14 @@ class TestSwUpdateStrategy(testroot.DCManagerApiTest):
self.app.get(get_url, headers=FAKE_HEADERS) self.app.get(get_url, headers=FAKE_HEADERS)
self.assertEqual(1, mock_db_api.sw_update_strategy_get.call_count) self.assertEqual(1, mock_db_api.sw_update_strategy_get.call_count)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_get_sw_update_strategy_steps(self, mock_db_api, mock_rpc_client): def test_get_sw_update_strategy_steps(self, mock_db_api, mock_rpc_client):
get_url = FAKE_URL + '/steps' get_url = FAKE_URL + '/steps'
self.app.get(get_url, headers=FAKE_HEADERS) self.app.get(get_url, headers=FAKE_HEADERS)
self.assertEqual(1, mock_db_api.strategy_step_get_all.call_count) self.assertEqual(1, mock_db_api.strategy_step_get_all.call_count)
@mock.patch.object(rpc_client, 'ManagerClient') @mock.patch.object(rpc_client, 'ManagerOrchestratorClient')
@mock.patch.object(sw_update_strategy, 'db_api') @mock.patch.object(sw_update_strategy, 'db_api')
def test_get_sw_update_strategy_single_step( def test_get_sw_update_strategy_single_step(
self, mock_db_api, mock_rpc_client): self, mock_db_api, mock_rpc_client):

View File

@@ -68,27 +68,21 @@ class TestDCManagerService(base.DCManagerTestCase):
self.service_obj.init_tgm() self.service_obj.init_tgm()
self.assertIsNotNone(self.service_obj.TG) self.assertIsNotNone(self.service_obj.TG)
@mock.patch.object(service, 'SwUpdateManager')
@mock.patch.object(service, 'SubcloudManager') @mock.patch.object(service, 'SubcloudManager')
def test_init_managers(self, mock_subcloud_manager, def test_init_managers(self, mock_subcloud_manager):
mock_sw_update_manager):
self.service_obj.init_managers() self.service_obj.init_managers()
self.assertIsNotNone(self.service_obj.subcloud_manager) self.assertIsNotNone(self.service_obj.subcloud_manager)
self.assertIsNotNone(self.service_obj.sw_update_manager)
@mock.patch.object(service, 'SwUpdateManager')
@mock.patch.object(service, 'SubcloudManager') @mock.patch.object(service, 'SubcloudManager')
@mock.patch.object(service, 'rpc_messaging') @mock.patch.object(service, 'rpc_messaging')
def test_start(self, mock_rpc, mock_subcloud_manager, def test_start(self, mock_rpc, mock_subcloud_manager):
mock_sw_update_manager):
self.service_obj.start() self.service_obj.start()
mock_rpc.get_rpc_server.assert_called_once_with( mock_rpc.get_rpc_server.assert_called_once_with(
self.service_obj.target, self.service_obj) self.service_obj.target, self.service_obj)
mock_rpc.get_rpc_server().start.assert_called_once_with() mock_rpc.get_rpc_server().start.assert_called_once_with()
@mock.patch.object(service, 'SwUpdateManager')
@mock.patch.object(service, 'SubcloudManager') @mock.patch.object(service, 'SubcloudManager')
def test_add_subcloud(self, mock_subcloud_manager, mock_sw_update_manager): def test_add_subcloud(self, mock_subcloud_manager):
self.service_obj.init_tgm() self.service_obj.init_tgm()
self.service_obj.init_managers() self.service_obj.init_managers()
self.service_obj.add_subcloud( self.service_obj.add_subcloud(
@@ -96,10 +90,8 @@ class TestDCManagerService(base.DCManagerTestCase):
mock_subcloud_manager().add_subcloud.\ mock_subcloud_manager().add_subcloud.\
assert_called_once_with(self.context, mock.ANY) assert_called_once_with(self.context, mock.ANY)
@mock.patch.object(service, 'SwUpdateManager')
@mock.patch.object(service, 'SubcloudManager') @mock.patch.object(service, 'SubcloudManager')
def test_delete_subcloud(self, mock_subcloud_manager, def test_delete_subcloud(self, mock_subcloud_manager):
mock_sw_update_manager):
self.service_obj.init_tgm() self.service_obj.init_tgm()
self.service_obj.init_managers() self.service_obj.init_managers()
self.service_obj.delete_subcloud( self.service_obj.delete_subcloud(
@@ -107,10 +99,8 @@ class TestDCManagerService(base.DCManagerTestCase):
mock_subcloud_manager().delete_subcloud.\ mock_subcloud_manager().delete_subcloud.\
assert_called_once_with(self.context, mock.ANY) assert_called_once_with(self.context, mock.ANY)
@mock.patch.object(service, 'SwUpdateManager')
@mock.patch.object(service, 'SubcloudManager') @mock.patch.object(service, 'SubcloudManager')
def test_update_subcloud(self, mock_subcloud_manager, def test_update_subcloud(self, mock_subcloud_manager):
mock_sw_update_manager):
self.service_obj.init_tgm() self.service_obj.init_tgm()
self.service_obj.init_managers() self.service_obj.init_managers()
self.service_obj.update_subcloud( self.service_obj.update_subcloud(
@@ -121,20 +111,16 @@ class TestDCManagerService(base.DCManagerTestCase):
mock.ANY, mock.ANY, mock.ANY, mock.ANY,
mock.ANY, mock.ANY) mock.ANY, mock.ANY)
@mock.patch.object(service, 'SwUpdateManager')
@mock.patch.object(service, 'SubcloudManager') @mock.patch.object(service, 'SubcloudManager')
@mock.patch.object(service, 'rpc_messaging') @mock.patch.object(service, 'rpc_messaging')
def test_stop_rpc_server(self, mock_rpc, mock_subcloud_manager, def test_stop_rpc_server(self, mock_rpc, mock_subcloud_manager):
mock_sw_update_manager):
self.service_obj.start() self.service_obj.start()
self.service_obj._stop_rpc_server() self.service_obj._stop_rpc_server()
mock_rpc.get_rpc_server().stop.assert_called_once_with() mock_rpc.get_rpc_server().stop.assert_called_once_with()
@mock.patch.object(service, 'SwUpdateManager')
@mock.patch.object(service, 'SubcloudManager') @mock.patch.object(service, 'SubcloudManager')
@mock.patch.object(service, 'rpc_messaging') @mock.patch.object(service, 'rpc_messaging')
def test_stop(self, mock_rpc, mock_subcloud_manager, def test_stop(self, mock_rpc, mock_subcloud_manager):
mock_sw_update_manager):
self.service_obj.start() self.service_obj.start()
self.service_obj.stop() self.service_obj.stop()
mock_rpc.get_rpc_server().stop.assert_called_once_with() mock_rpc.get_rpc_server().stop.assert_called_once_with()

View File

@@ -8,10 +8,10 @@ import mock
from dccommon.drivers.openstack import vim from dccommon.drivers.openstack import vim
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.manager.states.firmware import applying_vim_strategy from dcmanager.orchestrator.states.firmware import applying_vim_strategy
from dcmanager.tests.unit.manager.states.fakes import FakeVimStrategy from dcmanager.tests.unit.orchestrator.states.fakes import FakeVimStrategy
from dcmanager.tests.unit.manager.states.firmware.test_base \ from dcmanager.tests.unit.orchestrator.states.firmware.test_base \
import TestFwUpdateState import TestFwUpdateState
STRATEGY_READY_TO_APPLY = FakeVimStrategy(state=vim.STATE_READY_TO_APPLY) STRATEGY_READY_TO_APPLY = FakeVimStrategy(state=vim.STATE_READY_TO_APPLY)
@@ -20,11 +20,11 @@ STRATEGY_APPLIED = FakeVimStrategy(state=vim.STATE_APPLIED)
STRATEGY_APPLY_FAILED = FakeVimStrategy(vim.STATE_APPLY_FAILED) STRATEGY_APPLY_FAILED = FakeVimStrategy(vim.STATE_APPLY_FAILED)
@mock.patch("dcmanager.manager.states.firmware.applying_vim_strategy." @mock.patch("dcmanager.orchestrator.states.firmware.applying_vim_strategy."
"DEFAULT_MAX_FAILED_QUERIES", 3) "DEFAULT_MAX_FAILED_QUERIES", 3)
@mock.patch("dcmanager.manager.states.firmware.applying_vim_strategy." @mock.patch("dcmanager.orchestrator.states.firmware.applying_vim_strategy."
"DEFAULT_MAX_WAIT_ATTEMPTS", 3) "DEFAULT_MAX_WAIT_ATTEMPTS", 3)
@mock.patch("dcmanager.manager.states.firmware.applying_vim_strategy." @mock.patch("dcmanager.orchestrator.states.firmware.applying_vim_strategy."
"WAIT_INTERVAL", 1) "WAIT_INTERVAL", 1)
class TestFwUpdateApplyingVIMStrategyStage(TestFwUpdateState): class TestFwUpdateApplyingVIMStrategyStage(TestFwUpdateState):

View File

@@ -4,7 +4,7 @@
# SPDX-License-Identifier: Apache-2.0 # SPDX-License-Identifier: Apache-2.0
# #
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.tests.unit.manager.states.test_base import TestSwUpdate from dcmanager.tests.unit.orchestrator.states.test_base import TestSwUpdate
class TestFwUpdateState(TestSwUpdate): class TestFwUpdateState(TestSwUpdate):

View File

@@ -9,10 +9,10 @@ import mock
from dccommon.drivers.openstack import vim from dccommon.drivers.openstack import vim
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.manager.states.firmware import creating_vim_strategy from dcmanager.orchestrator.states.firmware import creating_vim_strategy
from dcmanager.tests.unit.manager.states.fakes import FakeVimStrategy from dcmanager.tests.unit.orchestrator.states.fakes import FakeVimStrategy
from dcmanager.tests.unit.manager.states.firmware.test_base \ from dcmanager.tests.unit.orchestrator.states.firmware.test_base \
import TestFwUpdateState import TestFwUpdateState
STRATEGY_BUILDING = FakeVimStrategy(state=vim.STATE_BUILDING) STRATEGY_BUILDING = FakeVimStrategy(state=vim.STATE_BUILDING)
@@ -20,9 +20,9 @@ STRATEGY_DONE_BUILDING = FakeVimStrategy(state=vim.STATE_READY_TO_APPLY)
STRATEGY_FAILED_BUILDING = FakeVimStrategy(vim.STATE_BUILD_FAILED) STRATEGY_FAILED_BUILDING = FakeVimStrategy(vim.STATE_BUILD_FAILED)
@mock.patch("dcmanager.manager.states.firmware.creating_vim_strategy." @mock.patch("dcmanager.orchestrator.states.firmware.creating_vim_strategy."
"DEFAULT_MAX_QUERIES", 3) "DEFAULT_MAX_QUERIES", 3)
@mock.patch("dcmanager.manager.states.firmware.creating_vim_strategy." @mock.patch("dcmanager.orchestrator.states.firmware.creating_vim_strategy."
"DEFAULT_SLEEP_DURATION", 1) "DEFAULT_SLEEP_DURATION", 1)
class TestFwUpdateCreatingVIMStrategyStage(TestFwUpdateState): class TestFwUpdateCreatingVIMStrategyStage(TestFwUpdateState):

View File

@@ -7,10 +7,10 @@ import mock
from dccommon.drivers.openstack import vim from dccommon.drivers.openstack import vim
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.manager.states.firmware.finishing_fw_update import FinishingFwUpdateState from dcmanager.orchestrator.states.firmware.finishing_fw_update import FinishingFwUpdateState
from dcmanager.tests.unit.manager.states.fakes import FakeVimStrategy from dcmanager.tests.unit.orchestrator.states.fakes import FakeVimStrategy
from dcmanager.tests.unit.manager.states.firmware.test_base \ from dcmanager.tests.unit.orchestrator.states.firmware.test_base \
import TestFwUpdateState import TestFwUpdateState
STRATEGY_APPLIED = FakeVimStrategy(state=vim.STATE_APPLIED) STRATEGY_APPLIED = FakeVimStrategy(state=vim.STATE_APPLIED)

View File

@@ -8,11 +8,11 @@ import uuid
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.tests.unit.manager.states.fakes import FakeController from dcmanager.tests.unit.orchestrator.states.fakes import FakeController
from dcmanager.tests.unit.manager.states.fakes import FakeDevice from dcmanager.tests.unit.orchestrator.states.fakes import FakeDevice
from dcmanager.tests.unit.manager.states.fakes import FakeDeviceImage from dcmanager.tests.unit.orchestrator.states.fakes import FakeDeviceImage
from dcmanager.tests.unit.manager.states.fakes import FakeDeviceLabel from dcmanager.tests.unit.orchestrator.states.fakes import FakeDeviceLabel
from dcmanager.tests.unit.manager.states.firmware.test_base \ from dcmanager.tests.unit.orchestrator.states.firmware.test_base \
import TestFwUpdateState import TestFwUpdateState
VENDOR_1 = '1001' VENDOR_1 = '1001'

View File

@@ -23,20 +23,20 @@ from oslo_config import cfg
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common import context from dcmanager.common import context
from dcmanager.manager import fw_update_orch_thread from dcmanager.orchestrator import fw_update_orch_thread
from dcmanager.manager import patch_orch_thread from dcmanager.orchestrator import patch_orch_thread
from dcmanager.manager.states.base import BaseState from dcmanager.orchestrator.states.base import BaseState
from dcmanager.manager import sw_update_manager from dcmanager.orchestrator import sw_update_manager
from dcmanager.manager import sw_upgrade_orch_thread from dcmanager.orchestrator import sw_upgrade_orch_thread
from dcmanager.tests import base from dcmanager.tests import base
from dcmanager.tests.unit.manager.states.fakes import FakeKeystoneClient from dcmanager.tests.unit.orchestrator.states.fakes import FakeKeystoneClient
from dcmanager.tests.unit.manager.states.fakes import FakeSysinvClient from dcmanager.tests.unit.orchestrator.states.fakes import FakeSysinvClient
from dcmanager.tests.unit.manager.states.fakes import FakeVimClient from dcmanager.tests.unit.orchestrator.states.fakes import FakeVimClient
from dcmanager.tests.unit.manager.test_sw_update_manager import FakeOrchThread from dcmanager.tests.unit.orchestrator.test_sw_update_manager import FakeOrchThread
from dcmanager.tests.unit.manager.test_sw_update_manager \ from dcmanager.tests.unit.orchestrator.test_sw_update_manager \
import StrategyStep import StrategyStep
from dcmanager.tests.unit.manager.test_sw_update_manager \ from dcmanager.tests.unit.orchestrator.test_sw_update_manager \
import Subcloud import Subcloud
from dcmanager.tests import utils from dcmanager.tests import utils

View File

@@ -8,9 +8,9 @@ import mock
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.manager.states.upgrade import activating from dcmanager.orchestrator.states.upgrade import activating
from dcmanager.tests.unit.manager.states.fakes import FakeUpgrade from dcmanager.tests.unit.orchestrator.states.fakes import FakeUpgrade
from dcmanager.tests.unit.manager.states.upgrade.test_base \ from dcmanager.tests.unit.orchestrator.states.upgrade.test_base \
import TestSwUpgradeState import TestSwUpgradeState
VALID_UPGRADE = FakeUpgrade(state='imported') VALID_UPGRADE = FakeUpgrade(state='imported')
@@ -19,9 +19,9 @@ ACTIVATING_FAILED = FakeUpgrade(state='activation-failed')
ALREADY_ACTIVATED_UPGRADE = FakeUpgrade(state='activation-complete') ALREADY_ACTIVATED_UPGRADE = FakeUpgrade(state='activation-complete')
@mock.patch("dcmanager.manager.states.upgrade.activating.DEFAULT_MAX_QUERIES", @mock.patch("dcmanager.orchestrator.states.upgrade.activating.DEFAULT_MAX_QUERIES",
5) 5)
@mock.patch("dcmanager.manager.states.upgrade.activating.DEFAULT_SLEEP_DURATION", @mock.patch("dcmanager.orchestrator.states.upgrade.activating.DEFAULT_SLEEP_DURATION",
1) 1)
class TestSwUpgradeActivatingStage(TestSwUpgradeState): class TestSwUpgradeActivatingStage(TestSwUpgradeState):

View File

@@ -4,7 +4,7 @@
# SPDX-License-Identifier: Apache-2.0 # SPDX-License-Identifier: Apache-2.0
# #
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.tests.unit.manager.states.test_base import TestSwUpdate from dcmanager.tests.unit.orchestrator.states.test_base import TestSwUpdate
class TestSwUpgradeState(TestSwUpdate): class TestSwUpgradeState(TestSwUpdate):

View File

@@ -6,11 +6,11 @@
import mock import mock
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.manager.states.upgrade import completing from dcmanager.orchestrator.states.upgrade import completing
from dcmanager.tests.unit.manager.states.fakes import FakeSystem from dcmanager.tests.unit.orchestrator.states.fakes import FakeSystem
from dcmanager.tests.unit.manager.states.fakes import FakeUpgrade from dcmanager.tests.unit.orchestrator.states.fakes import FakeUpgrade
from dcmanager.tests.unit.manager.states.upgrade.test_base \ from dcmanager.tests.unit.orchestrator.states.upgrade.test_base \
import TestSwUpgradeState import TestSwUpgradeState
VALID_UPGRADE = FakeUpgrade(state='activation-complete') VALID_UPGRADE = FakeUpgrade(state='activation-complete')
@@ -18,9 +18,9 @@ INVALID_UPGRADE = FakeUpgrade(state='aborting')
UPGRADE_COMPLETING = FakeUpgrade(state='completing') UPGRADE_COMPLETING = FakeUpgrade(state='completing')
@mock.patch("dcmanager.manager.states.upgrade.completing.DEFAULT_MAX_QUERIES", @mock.patch("dcmanager.orchestrator.states.upgrade.completing.DEFAULT_MAX_QUERIES",
3) 3)
@mock.patch("dcmanager.manager.states.upgrade.completing.DEFAULT_SLEEP_DURATION", @mock.patch("dcmanager.orchestrator.states.upgrade.completing.DEFAULT_SLEEP_DURATION",
1) 1)
class TestSwUpgradeCompletingStage(TestSwUpgradeState): class TestSwUpgradeCompletingStage(TestSwUpgradeState):

View File

@@ -8,14 +8,14 @@ import mock
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.common.exceptions import VaultLoadMissingError from dcmanager.common.exceptions import VaultLoadMissingError
from dcmanager.manager.states.upgrade import importing_load from dcmanager.orchestrator.states.upgrade import importing_load
from dcmanager.tests.unit.manager.states.fakes import FakeLoad from dcmanager.tests.unit.orchestrator.states.fakes import FakeLoad
from dcmanager.tests.unit.manager.states.fakes import FakeSystem from dcmanager.tests.unit.orchestrator.states.fakes import FakeSystem
from dcmanager.tests.unit.manager.states.fakes import PREVIOUS_PREVIOUS_VERSION from dcmanager.tests.unit.orchestrator.states.fakes import PREVIOUS_PREVIOUS_VERSION
from dcmanager.tests.unit.manager.states.fakes import PREVIOUS_VERSION from dcmanager.tests.unit.orchestrator.states.fakes import PREVIOUS_VERSION
from dcmanager.tests.unit.manager.states.fakes import UPGRADED_VERSION from dcmanager.tests.unit.orchestrator.states.fakes import UPGRADED_VERSION
from dcmanager.tests.unit.manager.states.upgrade.test_base \ from dcmanager.tests.unit.orchestrator.states.upgrade.test_base \
import TestSwUpgradeState import TestSwUpgradeState
@@ -90,9 +90,9 @@ SUCCESS_DELETE_RESPONSE = {
} }
@mock.patch("dcmanager.manager.states.upgrade.importing_load." @mock.patch("dcmanager.orchestrator.states.upgrade.importing_load."
"DEFAULT_MAX_QUERIES", 3) "DEFAULT_MAX_QUERIES", 3)
@mock.patch("dcmanager.manager.states.upgrade.importing_load." @mock.patch("dcmanager.orchestrator.states.upgrade.importing_load."
"DEFAULT_SLEEP_DURATION", 1) "DEFAULT_SLEEP_DURATION", 1)
class TestSwUpgradeImportingLoadStage(TestSwUpgradeState): class TestSwUpgradeImportingLoadStage(TestSwUpgradeState):

View File

@@ -7,7 +7,7 @@ import mock
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.tests.unit.manager.states.upgrade.test_base \ from dcmanager.tests.unit.orchestrator.states.upgrade.test_base \
import TestSwUpgradeState import TestSwUpgradeState
MISSING_LICENSE_RESPONSE = { MISSING_LICENSE_RESPONSE = {

View File

@@ -7,10 +7,10 @@ import itertools
import mock import mock
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.manager.states import lock_host from dcmanager.orchestrator.states import lock_host
from dcmanager.tests.unit.manager.states.fakes import FakeController from dcmanager.tests.unit.orchestrator.states.fakes import FakeController
from dcmanager.tests.unit.manager.states.upgrade.test_base \ from dcmanager.tests.unit.orchestrator.states.upgrade.test_base \
import TestSwUpgradeState import TestSwUpgradeState
CONTROLLER_0_UNLOCKED = FakeController(administrative=consts.ADMIN_UNLOCKED) CONTROLLER_0_UNLOCKED = FakeController(administrative=consts.ADMIN_UNLOCKED)
@@ -24,8 +24,8 @@ CONTROLLER_0_LOCKING_FAILED = \
task='Swacting') task='Swacting')
@mock.patch("dcmanager.manager.states.lock_host.DEFAULT_MAX_QUERIES", 3) @mock.patch("dcmanager.orchestrator.states.lock_host.DEFAULT_MAX_QUERIES", 3)
@mock.patch("dcmanager.manager.states.lock_host.DEFAULT_SLEEP_DURATION", 1) @mock.patch("dcmanager.orchestrator.states.lock_host.DEFAULT_SLEEP_DURATION", 1)
class TestSwUpgradeLockControllerStage(TestSwUpgradeState): class TestSwUpgradeLockControllerStage(TestSwUpgradeState):
def setUp(self): def setUp(self):

View File

@@ -6,11 +6,11 @@
import mock import mock
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.manager.states.upgrade import migrating_data from dcmanager.orchestrator.states.upgrade import migrating_data
from dcmanager.tests.unit.manager.states.fakes import FakeController from dcmanager.tests.unit.orchestrator.states.fakes import FakeController
from dcmanager.tests.unit.manager.states.fakes import FakeSubcloud from dcmanager.tests.unit.orchestrator.states.fakes import FakeSubcloud
from dcmanager.tests.unit.manager.states.upgrade.test_base \ from dcmanager.tests.unit.orchestrator.states.upgrade.test_base \
import TestSwUpgradeState import TestSwUpgradeState
CONTROLLER_0_LOCKED = FakeController(administrative=consts.ADMIN_LOCKED) CONTROLLER_0_LOCKED = FakeController(administrative=consts.ADMIN_LOCKED)
@@ -22,15 +22,15 @@ CONTROLLER_0_UNLOCKED = \
operational=consts.OPERATIONAL_ENABLED) operational=consts.OPERATIONAL_ENABLED)
@mock.patch("dcmanager.manager.states.upgrade.migrating_data." @mock.patch("dcmanager.orchestrator.states.upgrade.migrating_data."
"DEFAULT_MAX_API_QUERIES", 3) "DEFAULT_MAX_API_QUERIES", 3)
@mock.patch("dcmanager.manager.states.upgrade.migrating_data." @mock.patch("dcmanager.orchestrator.states.upgrade.migrating_data."
"DEFAULT_MAX_FAILED_QUERIES", 3) "DEFAULT_MAX_FAILED_QUERIES", 3)
@mock.patch("dcmanager.manager.states.upgrade.migrating_data." @mock.patch("dcmanager.orchestrator.states.upgrade.migrating_data."
"DEFAULT_API_SLEEP", 1) "DEFAULT_API_SLEEP", 1)
@mock.patch("dcmanager.manager.states.upgrade.migrating_data." @mock.patch("dcmanager.orchestrator.states.upgrade.migrating_data."
"DEFAULT_FAILED_SLEEP", 1) "DEFAULT_FAILED_SLEEP", 1)
@mock.patch("dcmanager.manager.states.upgrade.migrating_data." @mock.patch("dcmanager.orchestrator.states.upgrade.migrating_data."
"DEFAULT_ANSIBLE_SLEEP", 3) "DEFAULT_ANSIBLE_SLEEP", 3)
class TestSwUpgradeMigratingDataStage(TestSwUpgradeState): class TestSwUpgradeMigratingDataStage(TestSwUpgradeState):
@@ -54,7 +54,7 @@ class TestSwUpgradeMigratingDataStage(TestSwUpgradeState):
# Simulate a failed subprocess call to the platform upgrade playbook # Simulate a failed subprocess call to the platform upgrade playbook
# on the subcloud. # on the subcloud.
p = mock.patch( p = mock.patch(
'dcmanager.manager.states.upgrade.migrating_data.migrate_subcloud_data') 'dcmanager.orchestrator.states.upgrade.migrating_data.migrate_subcloud_data')
self.mock_platform_upgrade_call = p.start() self.mock_platform_upgrade_call = p.start()
self.mock_platform_upgrade_call.side_effect = Exception("Bad day!") self.mock_platform_upgrade_call.side_effect = Exception("Bad day!")
self.addCleanup(p.stop) self.addCleanup(p.stop)
@@ -73,7 +73,7 @@ class TestSwUpgradeMigratingDataStage(TestSwUpgradeState):
# Simulate a successful subprocess call to the platform upgrade playbook # Simulate a successful subprocess call to the platform upgrade playbook
# on the subcloud. # on the subcloud.
p = mock.patch( p = mock.patch(
'dcmanager.manager.states.upgrade.migrating_data.migrate_subcloud_data') 'dcmanager.orchestrator.states.upgrade.migrating_data.migrate_subcloud_data')
self.mock_platform_upgrade_call = p.start() self.mock_platform_upgrade_call = p.start()
self.mock_platform_upgrade_call.return_value = 0 self.mock_platform_upgrade_call.return_value = 0
self.addCleanup(p.stop) self.addCleanup(p.stop)
@@ -167,7 +167,7 @@ class TestSwUpgradeMigratingDataStage(TestSwUpgradeState):
# Simulate a successful subprocess call to the platform upgrade playbook # Simulate a successful subprocess call to the platform upgrade playbook
# on the subcloud. # on the subcloud.
p = mock.patch( p = mock.patch(
'dcmanager.manager.states.upgrade.migrating_data.migrate_subcloud_data') 'dcmanager.orchestrator.states.upgrade.migrating_data.migrate_subcloud_data')
self.mock_platform_upgrade_call = p.start() self.mock_platform_upgrade_call = p.start()
self.mock_platform_upgrade_call.return_value = 0 self.mock_platform_upgrade_call.return_value = 0
self.addCleanup(p.stop) self.addCleanup(p.stop)
@@ -196,7 +196,7 @@ class TestSwUpgradeMigratingDataStage(TestSwUpgradeState):
# Simulate a successful subprocess call to the platform upgrade playbook # Simulate a successful subprocess call to the platform upgrade playbook
# on the subcloud. # on the subcloud.
p = mock.patch( p = mock.patch(
'dcmanager.manager.states.upgrade.migrating_data.migrate_subcloud_data') 'dcmanager.orchestrator.states.upgrade.migrating_data.migrate_subcloud_data')
self.mock_platform_upgrade_call = p.start() self.mock_platform_upgrade_call = p.start()
self.mock_platform_upgrade_call.return_value = 0 self.mock_platform_upgrade_call.return_value = 0
self.addCleanup(p.stop) self.addCleanup(p.stop)

View File

@@ -7,9 +7,9 @@ import mock
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.tests.unit.manager.states.fakes import FakeHostFilesystem from dcmanager.tests.unit.orchestrator.states.fakes import FakeHostFilesystem
from dcmanager.tests.unit.manager.states.fakes import FakeSubcloud from dcmanager.tests.unit.orchestrator.states.fakes import FakeSubcloud
from dcmanager.tests.unit.manager.states.upgrade.test_base \ from dcmanager.tests.unit.orchestrator.states.upgrade.test_base \
import TestSwUpgradeState import TestSwUpgradeState
CONTROLLER_0_HOST_FS_SCRATCH_MIN_SIZED = FakeHostFilesystem(size=16) CONTROLLER_0_HOST_FS_SCRATCH_MIN_SIZED = FakeHostFilesystem(size=16)

View File

@@ -7,10 +7,10 @@ import itertools
import mock import mock
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.manager.states.upgrade import starting_upgrade from dcmanager.orchestrator.states.upgrade import starting_upgrade
from dcmanager.tests.unit.manager.states.fakes import FakeUpgrade from dcmanager.tests.unit.orchestrator.states.fakes import FakeUpgrade
from dcmanager.tests.unit.manager.states.upgrade.test_base \ from dcmanager.tests.unit.orchestrator.states.upgrade.test_base \
import TestSwUpgradeState import TestSwUpgradeState
UPGRADE_ABORTING = FakeUpgrade(state='aborting') UPGRADE_ABORTING = FakeUpgrade(state='aborting')
@@ -18,9 +18,9 @@ UPGRADE_STARTING = FakeUpgrade(state='starting')
UPGRADE_STARTED = FakeUpgrade(state='started') UPGRADE_STARTED = FakeUpgrade(state='started')
@mock.patch("dcmanager.manager.states.upgrade.starting_upgrade" @mock.patch("dcmanager.orchestrator.states.upgrade.starting_upgrade"
".DEFAULT_MAX_QUERIES", 3) ".DEFAULT_MAX_QUERIES", 3)
@mock.patch("dcmanager.manager.states.upgrade.starting_upgrade" @mock.patch("dcmanager.orchestrator.states.upgrade.starting_upgrade"
".DEFAULT_SLEEP_DURATION", 1) ".DEFAULT_SLEEP_DURATION", 1)
class TestSwUpgradeStartingUpgradeStage(TestSwUpgradeState): class TestSwUpgradeStartingUpgradeStage(TestSwUpgradeState):

View File

@@ -7,10 +7,10 @@ import itertools
import mock import mock
from dcmanager.common import consts from dcmanager.common import consts
from dcmanager.manager.states import unlock_host from dcmanager.orchestrator.states import unlock_host
from dcmanager.tests.unit.manager.states.fakes import FakeController from dcmanager.tests.unit.orchestrator.states.fakes import FakeController
from dcmanager.tests.unit.manager.states.upgrade.test_base \ from dcmanager.tests.unit.orchestrator.states.upgrade.test_base \
import TestSwUpgradeState import TestSwUpgradeState
CONTROLLER_0_UNLOCKED = \ CONTROLLER_0_UNLOCKED = \
@@ -26,11 +26,11 @@ CONTROLLER_0_UNLOCKING_FAILED = \
task='Swacting') task='Swacting')
@mock.patch("dcmanager.manager.states.unlock_host.DEFAULT_MAX_API_QUERIES", 3) @mock.patch("dcmanager.orchestrator.states.unlock_host.DEFAULT_MAX_API_QUERIES", 3)
@mock.patch("dcmanager.manager.states.unlock_host.DEFAULT_MAX_FAILED_QUERIES", @mock.patch("dcmanager.orchestrator.states.unlock_host.DEFAULT_MAX_FAILED_QUERIES",
3) 3)
@mock.patch("dcmanager.manager.states.unlock_host.DEFAULT_API_SLEEP", 1) @mock.patch("dcmanager.orchestrator.states.unlock_host.DEFAULT_API_SLEEP", 1)
@mock.patch("dcmanager.manager.states.unlock_host.DEFAULT_FAILED_SLEEP", 1) @mock.patch("dcmanager.orchestrator.states.unlock_host.DEFAULT_FAILED_SLEEP", 1)
class TestSwUpgradeUnlockControllerStage(TestSwUpgradeState): class TestSwUpgradeUnlockControllerStage(TestSwUpgradeState):
def setUp(self): def setUp(self):

View File

@@ -28,8 +28,8 @@ from dcmanager.common import consts
from dcmanager.common import context from dcmanager.common import context
from dcmanager.common import exceptions from dcmanager.common import exceptions
from dcmanager.db.sqlalchemy import api as db_api from dcmanager.db.sqlalchemy import api as db_api
from dcmanager.manager import patch_orch_thread from dcmanager.orchestrator import patch_orch_thread
from dcmanager.manager import sw_update_manager from dcmanager.orchestrator import sw_update_manager
from dcmanager.tests import base from dcmanager.tests import base
from dcmanager.tests import utils from dcmanager.tests import utils
from dcorch.common import consts as dcorch_consts from dcorch.common import consts as dcorch_consts

View File

@@ -0,0 +1,322 @@
#!/bin/sh
# OpenStack DC Manager Orchestrator Service (dcmanager-orchestrator)
#
# Description:
# Manages an OpenStack DC Manager Orchestrator Service (dcmanager-orchestrator)
# process as an HA resource
#
# Copyright (c) 2020 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
#
# See usage() function below for more details ...
#
# OCF instance parameters:
# OCF_RESKEY_binary
# OCF_RESKEY_config
# OCF_RESKEY_user
# OCF_RESKEY_pid
# OCF_RESKEY_additional_parameters
#######################################################################
# Initialization:
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
#######################################################################
# Fill in some defaults if no values are specified
OCF_RESKEY_binary_default="/usr/bin/dcmanager-orchestrator"
OCF_RESKEY_config_default="/etc/dcmanager/dcmanager.conf"
OCF_RESKEY_user_default="root"
OCF_RESKEY_pid_default="$HA_RSCTMP/$OCF_RESOURCE_INSTANCE.pid"
: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}
: ${OCF_RESKEY_config=${OCF_RESKEY_config_default}}
: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}}
: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}}
#######################################################################
usage() {
cat <<UEND
usage: $0 (start|stop|validate-all|meta-data|status|monitor)
$0 manages an OpenStack DC Manager Orchestrator service (dcmanager-orchestrator) process as an HA resource
The 'start' operation starts the dcmanager-orchestrator service.
The 'stop' operation stops the dcmanager-orchestrator service.
The 'validate-all' operation reports whether the parameters are valid
The 'meta-data' operation reports this RA's meta-data information
The 'status' operation reports whether the dcmanager-orchestrator service is running
The 'monitor' operation reports whether the dcmanager-orchestrator service seems to be working
UEND
}
meta_data() {
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="dcmanager-orchestrator">
<version>1.0</version>
<longdesc lang="en">
Resource agent for the DC Manager service (dcmanager-orchestrator)
</longdesc>
<shortdesc lang="en">Manages the OpenStack DC Manager Orchestrator Service (dcmanager-orchestrator)</shortdesc>
<parameters>
<parameter name="binary" unique="0" required="0">
<longdesc lang="en">
Location of the DC Manager Orchestrator Service binary (dcmanager-orchestrator)
</longdesc>
<shortdesc lang="en">DC Manager Orchestrator Service binary (dcmanager-orchestrator)</shortdesc>
<content type="string" default="${OCF_RESKEY_binary_default}" />
</parameter>
<parameter name="config" unique="0" required="0">
<longdesc lang="en">
Location of the DC Manager Orchestrator Service (dcmanager-orchestrator) configuration file
</longdesc>
<shortdesc lang="en">DC Manager Orchestrator Service (dcmanager-orchestrator registry) config file</shortdesc>
<content type="string" default="${OCF_RESKEY_config_default}" />
</parameter>
<parameter name="user" unique="0" required="0">
<longdesc lang="en">
User running DC Manager Orchestrator Service (dcmanager-orchestrator)
</longdesc>
<shortdesc lang="en">DC Manager Orchestrator Service (dcmanager-orchestrator) user</shortdesc>
<content type="string" default="${OCF_RESKEY_user_default}" />
</parameter>
<parameter name="pid" unique="0" required="0">
<longdesc lang="en">
The pid file to use for this DC Manager Orchestrator Service (dcmanager-orchestrator) instance
</longdesc>
<shortdesc lang="en">DC Manager Orchestrator Service (dcmanager-orchestrator) pid file</shortdesc>
<content type="string" default="${OCF_RESKEY_pid_default}" />
</parameter>
<parameter name="additional_parameters" unique="0" required="0">
<longdesc lang="en">
Additional parameters to pass on to the dcmanager-orchestrator
</longdesc>
<shortdesc lang="en">Additional parameters for dcmanager-orchestrator</shortdesc>
<content type="string" />
</parameter>
</parameters>
<actions>
<action name="start" timeout="20" />
<action name="stop" timeout="20" />
<action name="status" timeout="20" />
<action name="monitor" timeout="10" interval="5" />
<action name="validate-all" timeout="5" />
<action name="meta-data" timeout="5" />
</actions>
</resource-agent>
END
}
#######################################################################
# Functions invoked by resource manager actions
dcmanager_orchestrator_validate() {
local rc
check_binary $OCF_RESKEY_binary
check_binary curl
check_binary tr
check_binary grep
check_binary cut
check_binary head
# A config file on shared storage that is not available
# during probes is OK.
if [ ! -f $OCF_RESKEY_config ]; then
if ! ocf_is_probe; then
ocf_log err "Config $OCF_RESKEY_config doesn't exist"
return $OCF_ERR_INSTALLED
fi
ocf_log_warn "Config $OCF_RESKEY_config not available during a probe"
fi
getent passwd $OCF_RESKEY_user >/dev/null 2>&1
rc=$?
if [ $rc -ne 0 ]; then
ocf_log err "User $OCF_RESKEY_user doesn't exist"
return $OCF_ERR_INSTALLED
fi
true
}
dcmanager_orchestrator_status() {
local pid
local rc
if [ ! -f $OCF_RESKEY_pid ]; then
ocf_log info "DC Manager Orchestrator Service (dcmanager-orchestrator) is not running"
return $OCF_NOT_RUNNING
else
pid=`cat $OCF_RESKEY_pid`
fi
ocf_run -warn kill -s 0 $pid
rc=$?
if [ $rc -eq 0 ]; then
return $OCF_SUCCESS
else
ocf_log info "Old PID file found, but DC Manager Orchestrator Service (dcmanager-orchestrator) is not running"
rm -f $OCF_RESKEY_pid
return $OCF_NOT_RUNNING
fi
}
dcmanager_orchestrator_monitor() {
local rc
dcmanager_orchestrator_status
rc=$?
# If status returned anything but success, return that immediately
if [ $rc -ne $OCF_SUCCESS ]; then
return $rc
fi
ocf_log debug "DC Manager Orchestrator Service (dcmanager-orchestrator) monitor succeeded"
return $OCF_SUCCESS
}
dcmanager_orchestrator_start() {
local rc
dcmanager_orchestrator_status
rc=$?
if [ $rc -eq $OCF_SUCCESS ]; then
ocf_log info "DC Manager Orchestrator Service (dcmanager-orchestrator) already running"
return $OCF_SUCCESS
fi
# Change the working dir to /, to be sure it's accesible
cd /
# run the actual dcmanager-orchestrator daemon. Don't use ocf_run as we're sending the tool's output
# straight to /dev/null anyway and using ocf_run would break stdout-redirection here.
su ${OCF_RESKEY_user} -s /bin/sh -c "${OCF_RESKEY_binary} --config-file=$OCF_RESKEY_config \
$OCF_RESKEY_additional_parameters"' >> /dev/null 2>&1 & echo $!' > $OCF_RESKEY_pid
# Spin waiting for the server to come up.
# Let the CRM/LRM time us out if required
while true; do
dcmanager_orchestrator_monitor
rc=$?
[ $rc -eq $OCF_SUCCESS ] && break
if [ $rc -ne $OCF_NOT_RUNNING ]; then
ocf_log err "DC Manager Orchestrator Service (dcmanager-orchestrator) start failed"
exit $OCF_ERR_GENERIC
fi
sleep 1
done
ocf_log info "DC Manager Orchestrator Service (dcmanager-orchestrator) started"
return $OCF_SUCCESS
}
dcmanager_orchestrator_confirm_stop() {
local my_bin
local my_processes
my_binary=`which ${OCF_RESKEY_binary}`
my_processes=`pgrep -l -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary}([^\w-]|$)"`
if [ -n "${my_processes}" ]
then
ocf_log info "About to SIGKILL the following: ${my_processes}"
pkill -KILL -f "^(python|/usr/bin/python|/usr/bin/python2) ${my_binary}([^\w-]|$)"
fi
}
dcmanager_orchestrator_stop() {
local rc
local pid
dcmanager_orchestrator_status
rc=$?
if [ $rc -eq $OCF_NOT_RUNNING ]; then
ocf_log info "DC Manager Orchestrator Service (dcmanager-orchestrator) already stopped"
dcmanager_orchestrator_confirm_stop
return $OCF_SUCCESS
fi
# Try SIGTERM
pid=`cat $OCF_RESKEY_pid`
ocf_run kill -s TERM $pid
rc=$?
if [ $rc -ne 0 ]; then
ocf_log err "DC Manager Orchestrator Service (dcmanager-orchestrator) couldn't be stopped"
dcmanager_orchestrator_confirm_stop
exit $OCF_ERR_GENERIC
fi
# stop waiting
shutdown_timeout=15
if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then
shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5))
fi
count=0
while [ $count -lt $shutdown_timeout ]; do
dcmanager_orchestrator_status
rc=$?
if [ $rc -eq $OCF_NOT_RUNNING ]; then
break
fi
count=`expr $count + 1`
sleep 1
ocf_log debug "DC Manager Orchestrator Service (dcmanager-orchestrator) still hasn't stopped yet. Waiting ..."
done
dcmanager_orchestrator_status
rc=$?
if [ $rc -ne $OCF_NOT_RUNNING ]; then
# SIGTERM didn't help either, try SIGKILL
ocf_log info "DC Manager Orchestrator Service (dcmanager-orchestrator) failed to stop after ${shutdown_timeout}s \
using SIGTERM. Trying SIGKILL ..."
ocf_run kill -s KILL $pid
fi
dcmanager_orchestrator_confirm_stop
ocf_log info "DC Manager Orchestrator Service (dcmanager-orchestrator) stopped"
rm -f $OCF_RESKEY_pid
return $OCF_SUCCESS
}
#######################################################################
case "$1" in
meta-data) meta_data
exit $OCF_SUCCESS;;
usage|help) usage
exit $OCF_SUCCESS;;
esac
# Anything except meta-data and help must pass validation
dcmanager_orchestrator_validate || exit $?
# What kind of method was invoked?
case "$1" in
start) dcmanager_orchestrator_start;;
stop) dcmanager_orchestrator_stop;;
status) dcmanager_orchestrator_status;;
monitor) dcmanager_orchestrator_monitor;;
validate-all) ;;
*) usage
exit $OCF_ERR_UNIMPLEMENTED;;
esac

View File

@@ -30,6 +30,7 @@ packages =
console_scripts = console_scripts =
dcmanager-api = dcmanager.cmd.api:main dcmanager-api = dcmanager.cmd.api:main
dcmanager-audit = dcmanager.cmd.audit:main dcmanager-audit = dcmanager.cmd.audit:main
dcmanager-orchestrator = dcmanager.cmd.orchestrator:main
dcmanager-manager = dcmanager.cmd.manager:main dcmanager-manager = dcmanager.cmd.manager:main
dcmanager-manage = dcmanager.cmd.manage:main dcmanager-manage = dcmanager.cmd.manage:main
dcorch-api = dcorch.cmd.api:main dcorch-api = dcorch.cmd.api:main